开发环境:Gitlab社区版11.3 集成k8s集群与gitlab-runner
以下简单介绍在.gitlab-ci.yml文件中自动生成应用版本号及在job中传递版本号过程
Gitlab中有三种变量使用方式:预定义变量、后台(UI)中设置及自定义环境变量
详细参考这里:GitLab CI/CD variables | GitLab
我们规划每次发版时,自动取系统日期的yyyymmddhhmm形式作为版本号,因此,这里必须采用自定义变量形式。
实现原理是在build阶段生成版本号,并使用artifacts将其传递到其他job。
由于gitlab版本比较低,因此在写脚本时和其他版本稍有不同,比如"needs“关键字它就不支持
$ cat .gitlab-ci.yml
stages:
- build
- deploy
build:
image: 192.168.xx.xx:8082/docker:latest
stage: build
variables:
DOCKER_HOST: unix:///var/run/docker.sock
services:
- name: docker:dind
command: ["--insecure-registry=192.168.xx.xx:8082"]
script:
- VERSION=`date +%Y%m%d%H%M`
- echo "VERSION=$VERSION" > .version
- docker build -t 192.168.xx.xx:8082/helloworld:$VERSION .
- docker login -u admin -p XXXX 192.168.xx.xx:8082
- docker push 192.168.xx.xx:8082/helloworld:$VERSION
- echo "OK, 本次镜像已成功上传到本地仓库 !"
artifacts:
paths:
- .version # 版本号传递到下一个job
expire_in: 1 days
only:
- master
when: manual
deploy-k8s:
image: 192.168.xx.xx:8082/docker-kubectl:v1.1
stage: deploy
variables:
DOCKER_HOST: unix:///var/run/docker.sock
services:
- name: docker:dind
command: ["--insecure-registry=192.168.xx.xx:8082"]
script:
- echo "开始向k8s集群部署..."
- if [ ! -f ./.version ];
then
echo "任务执行失败,请先执行build任务!";
exit 1;
fi
- source ./.version
# - cat .version
- docker login -u admin -p admin123 192.168.xx.xx:8082
- docker pull 192.168.xx.xx:8082/helloworld:$VERSION
# - kubectl config set-context default --namespace=my-stg-ns
# 以下"web"对应于deployment中container name
- kubectl set image deployment helloworld web=192.168.xx.xx:8082/helloworld:$VERSION -n my-stg-ns
- kubectl describe deployment helloworld -n my-stg-ns | grep Image
- echo "OK!更新完成!Bye-Bye."
dependencies:
- build
only:
- master
when: manual
简单说明:
1. 本例中简单地设置了两个job,手工触发;
2. 192.168.xx.xx:8082 是私库地址;
3. 使用VERSION=date +%Y%m%d%H%M
生成版本号,并用.version文件传递到其他job;
4. 因为采用docker in docker形式,所以要设置变量“DOCKER_HOST: unix:///var/run/docker.sock ”,并且通过“command: ["--insecure-registry=192.168.xx.xx:8082"] ”将私库地址传递进去,否则gitlab-runner拉起的pod无法docker push/pull;
5. kubectl set image 一行中,"web"对应于deployment中container name
总结:gitlabCi挺好用,就是共享动态变量有点费劲:)
网友评论