使用GitLab CI在Kubernetes服务上运行GitLab Runner并执行Pipeline
本文主要演示如何在Kubernetes集群中安装、注册GitLab Runner,添加Kubernetes类型的executor来执行构建,并以此为基础完成一个Java源码示例项目从编译构建、镜像打包到应用部署的CICD过程。
背景信息
本文以构建一个Java软件项目并将其部署到阿里云容器服务Kubernetes集群中为例,说明如何使用GitLab CI在阿里云Kubernetes服务上运行GitLab
Runner、配置Kubernetes类型的executor,并执行Pipeline。
创建GitLab源码项目并上传示例代码
在Kubernetes集群中安装GitLab Runner
缓存配置
GitLab Runner对缓存方案的支持有限,所以您需要使用挂载volume的方式做缓存。在上面的示例中,安装GitLab Runner时默认使用/opt/cache目录作为缓存空间。您也可以通过修改values.yaml文件中的runners.cachePath
字段修改缓存目录。
variables
下添加MAVEN_OPTS
变量并指定本地缓存目录:
variables:
KUBECONFIG: /etc/deploy/config
MAVEN_OPTS: "-Dmaven.repo.local=/opt/cache/.m2/repository"
cat >>/home/gitlab-runner/.gitlab-runner/config.toml <<EOF
[[runners.kubernetes.volumes.pvc]]
name = "gitlab-runner-cache"
mount_path = "{{ .Values.runners.cachePath }}"
EOF
即在GitLab Runner进行register后,run之前,修改config.toml的配置。
设置全局变量
编写.gitlab-ci.yml
编写.gitlab-ci.yml文件,完成java demo源码项目的编译构建、镜像推送和应用部署(可参考gitlabci-java-demo源码项目中的.gitlab-ci.yml.example)。
image: docker:stable
stages:
- package
- docker_build
- deploy_k8s
variables:
KUBECONFIG: /etc/deploy/config
mvn_build_job:
image: registry.cn-beijing.aliyuncs.com/codepipeline/public-blueocean-codepipeline-slave-java:0.1-63b99a20
stage: package
tags:
- k8s-runner
script:
- mvn package -B -DskipTests
- cp target/demo.war /opt/cache
docker_build_job:
image: registry.cn-beijing.aliyuncs.com/codepipeline/public-blueocean-codepipeline-slave-java:0.1-63b99a20
stage: docker_build
tags:
- k8s-runner
script:
- docker login -u $REGISTRY_USERNAME -p $REGISTRY_PASSWORD registry.cn-beijing.aliyuncs.com
- mkdir target
- cp /opt/cache/demo.war target/demo.war
- docker build -t registry.cn-beijing.aliyuncs.com/gitlab-demo/java-demo:$CI_PIPELINE_ID .
- docker push registry.cn-beijing.aliyuncs.com/gitlab-demo/java-demo:$CI_PIPELINE_ID
deploy_k8s_job:
image: registry.cn-beijing.aliyuncs.com/codepipeline/public-blueocean-codepipeline-slave-java:0.1-63b99a20
stage: deploy_k8s
tags:
- k8s-runner
script:
- mkdir -p /etc/deploy
- echo $kube_config |base64 -d > $KUBECONFIG
- sed -i "s/IMAGE_TAG/$CI_PIPELINE_ID/g" deployment.yaml
- cat deployment.yaml
- kubectl apply -f deployment.yaml
image: docker:stable # Pipeline中各个步骤阶段的构建镜像没有指定时, 默认使用docker:stable镜像
stages:
- package # 源码打包阶段
- docker_build # 镜像构建和打包推送阶段
- deploy_k8s # 应用部署阶段
variables:
KUBECONFIG: /etc/deploy/config # 定义全局变量KUBECONFIG
- maven源码打包阶段:
mvn_build_job: # job名称 image: registry.cn-beijing.aliyuncs.com/codepipeline/public-blueocean-codepipeline-slave-java:0.1-63b99a20 # 本阶段构建使用的构建镜像 stage: package # 关联的阶段名称 tags: # GitLab Runner的tag - k8s-runner script: - mvn package -B -DskipTests # 执行构建脚本 - cp target/demo.war /opt/cache # 构建物保存至缓存区
- 镜像构建和打包推送阶段:
docker_build_job: # job名称 image: registry.cn-beijing.aliyuncs.com/codepipeline/public-blueocean-codepipeline-slave-java:0.1-63b99a20 # 本阶段构建使用的构建镜像 stage: docker_build # 关联的阶段名称 tags: # GitLab Runner的tag - k8s-runner script: - docker login -u REGISTRY_USERNAME -p $REGISTRY_PASSWORD registry.cn-beijing.aliyuncs.com # 登录镜像仓库 - mkdir target - cp /opt/cache/demo.war target/demo.war - docker build -t registry.cn-beijing.aliyuncs.com/gitlab-demo/java-demo:$CI_PIPELINE_ID . # 打包Docker镜像,使用的tag为本次Pipeline的ID - docker push registry.cn-beijing.aliyuncs.com/gitlab-demo/java-demo:$CI_PIPELINE_ID # 推送Docker镜像
- 应用部署阶段:
deploy_k8s_job: # job名称 image: registry.cn-beijing.aliyuncs.com/codepipeline/public-blueocean-codepipeline-slave-java:0.1-63b99a20 # 本阶段构建使用的构建镜像 stage: deploy_k8s # 关联的阶段名称 tags: # GitLab Runner的tag - k8s-runner script: - mkdir -p /etc/deploy - echo $kube_config |base64 -d > $KUBECONFIG # 配置连接Kubernetes集群的config文件 - sed -i "s/IMAGE_TAG/$CI_PIPELINE_ID/g" deployment.yaml # 动态替换部署文件中的镜像tag - kubectl apply -f deployment.yaml
执行Pipeline


访问服务
$ kubectl -n gitlab get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
java-demo LoadBalancer 172.19.9.252 xx.xx.xx.xx 80:32349/TCP 1m
浏览器访问xx.xx.xx.xx/demo进行验证。
了解更多容器服务的相关内容,请参见容器服务。
了解更多GitLab CI的相关内容,请参见GitLab CI。
发布者:佚, 佚名,转转请注明出处:https://www.cms2.cn/aliyun/csk/5123.html