在GitLab CI中设置一次性/设置作业

52次阅读
没有评论

问题描述

正在设置一个流水线,用于编译和构建新的Docker镜像,然后将这些镜像部署到测试的Kubernetes集群中。他正在使用一个shell runner。他需要设置他的kubectl客户端,以指向测试的Kubernetes集群(即设置集群和上下文)。
根据他的理解,他只需要运行一次。是否有办法在.gitlab-ci.yaml中定义这个只运行一次的操作?或者每次都在before_script中重复设置步骤是否可以?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在GitLab CI中,可以使用GitLab组的”secrets”功能,并在before_script中设置kubectl。这样做的好处是,如果将来需要迁移到容器中,这个设置是幂等的。以下是具体步骤:
1. 在GitLab组的”secrets”中设置一个名为kube_config的变量,并将集群配置文件的内容进行base64编码。
2. 在.gitlab-ci.yaml文件中的before_script中添加以下命令,将base64编码的集群配置文件解码并保存到~/.kube/config文件中:

before_script:
  - echo -n $kube_config | base64 -d > ~/.kube/config
  1. 在GitLab Runner的环境变量中设置一个名为KUBERNETES_IMAGE的变量,值为你的新镜像的地址,例如:
variables:
  KUBERNETES_IMAGE: registry.gitlab.com/MY_USERNAME/MY_REPO_NAME/MY_IMAGE_NAME:latest
  1. 确保你的新镜像可以正常工作,可以通过添加一个测试阶段来测试:
stages:
  - build
  - test
  - release

variables:
  CONTAINER_TEST_IMAGE: $CI_REGISTRY_IMAGE/gitlab_runner:$CI_COMMIT_REF_NAME
  CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE/gitlab_runner:latest

before_script:
  - apt-get update && apt-get install docker.io -y
  - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY

Build Image:
  stage: build
  script:
    - docker build --build-arg kube_config=${kube_config} -t ${CONTAINER_TEST_IMAGE} .
    - docker push ${CONTAINER_TEST_IMAGE}
  except:
    - master

Test Kubectl:
  stage: test
  script:
    - docker pull ${CONTAINER_TEST_IMAGE}
    - docker run --rm ${CONTAINER_TEST_IMAGE} kubectl get deployments -n kube-system
  except:
    - master

Test Helm:
  stage: test
  script:
    - docker pull ${CONTAINER_TEST_IMAGE}
    - docker run --rm ${CONTAINER_TEST_IMAGE} helm ls
  except:
    - master

Test Docker:
  stage: test
  script:
    - docker pull ${CONTAINER_TEST_IMAGE}
    - docker run --rm -v /var/run/docker.sock:/var/run/docker.sock ${CONTAINER_TEST_IMAGE} docker images
  except:
    - master

release-image:
  stage: release
  script:
    - docker pull $CONTAINER_TEST_IMAGE
    - docker tag $CONTAINER_TEST_IMAGE $CONTAINER_RELEASE_IMAGE
    - docker push $CONTAINER_RELEASE_IMAGE
  only:
    - master

在上面的示例中,我们首先在before_script中安装了docker,并登录到GitLab Registry。然后,在build阶段中,我们使用docker build命令构建镜像,并将其推送到GitLab Registry。在test阶段中,我们使用docker run命令运行镜像,并执行一些kubectl、helm和docker命令来测试镜像。在release阶段中,我们将测试镜像重新打标签,并推送到GitLab Registry。
请注意,这个示例是基于使用GitLab Runner的情况。如果你使用的是shell runner,那么上面的解决方案可能不适用。

方案2

使用GitLab Runner直接在集群上构建和部署可能有一些优势,但可能会增加复杂性。
另一种方法是直接在集群上使用GitLab Runner构建和部署。你可以在GitLab Runner的环境中设置kubectl,并在before_script中执行一次性的设置步骤。以下是具体步骤:
1. 在GitLab Runner的环境中安装kubectl,并设置环境变量指向测试的Kubernetes集群。
2. 在.gitlab-ci.yaml文件的before_script中添加kubectl的设置命令,例如:

before_script:
  - kubectl config set-cluster <cluster-name> --server=<cluster-server>
  - kubectl config set-context <context-name> --cluster=<cluster-name> --user=<user-name>
  - kubectl config use-context <context-name>

请将<cluster-name><cluster-server><context-name><user-name>替换为你的实际值。
3. 确保你的GitLab Runner可以访问测试的Kubernetes集群,并且kubectl命令可以正常工作。
请注意,这个解决方案需要在GitLab Runner的环境中安装kubectl,并且需要确保GitLab Runner可以访问测试的Kubernetes集群。此外,这种方法可能会增加一些复杂性,并且需要确保设置步骤只运行一次。

正文完