目标:
- 本文介绍 基于 gitlab + k8s 的持续集成&发布的环境。
- 关于gitlab/docker/k8s本身细节的介绍,文章网上非常多,请自行查阅
流程
我们先从全局视角出发
java应用的发布流程(这里以java应用为例子,js等其它应用类似):
发布到k8s
image.png
k8s管理容器,其容器的运行环境一般为docker。
所有下面docker镜像也可以发布到docker,不依赖k8s。
本文主要面向k8s,但也适用于直接docker。
image.png
上面发布到k8s流程结合自动化和k8s(gitlab cicd)的整体流程为。
image.png
提交代码
提交代码这里最关键的一点是要跟gitlab的cicd关联,这样才能让gitlab为你运行特定的任务。
核心文件:.gitlab-ci.yml
创建.gitlab-ci.yml并放在项目根目录。
.gitlab-ci.yml
#结构
build_and_publish:#任务名称
script:
echo "hello word" #执行的shell命令
gitrunner
2运行的pielines实际是运行在gitlabrunner上,运行的内容就是.gitlab-ci.yml script片段定义的shell命令。
gitlabrunner是单独安装并注册到gitlab的,是gitlab cicd的任务运行器,
这里以机器安装和shell命令模式为例子(gitlabruner安装方式为机器和docker,运行脚本模式为shell,docker...等,安装细节自定google)
我们已经有了.gitlab-ci.yml(执行什么命令) 和 gitrunner(命令的执行者),那么如何达到编译和发布的目的就很清楚了,就是在.gitlab-ci.yml
定义我们的任务。
//编译
java编译一般是
mvn clean package
//打包镜像
docker build -t .
//当然也可以用mvn插件把编译和打包镜像一起
mvn clean package docker:build //包含了编译和打包镜像
//发布镜像到仓库
docker push registry-vpc.cn-hangzhou.aliyuncs.com/私有仓库名/... //这里发布到阿里云私有仓库
//通过k8s命令更新应用
kubectl set image deploy...
上面的单独命令组合在一起就是.gitlab-ci.yml的定义
build_and_publish:
script:
- mvn clean package docker:build
- docker push registry-vpc.cn-hangzhou.aliyuncs.com...
kubectl set image deploy...
//看一个相对完成的定义
stages:
- build #命令所属的阶段,名字自己定义,一般为build,release等
build_and_publish:
stage: build #指定任务所属的阶段
only:
- /^release\/.+/ #release开头的分支有变动时触发任务
script:
- mvn clean package docker:build
- docker push registry-vpc.cn-hangzhou.aliyuncs.com...
kubectl set image deploy...
总结下:
release分支有变化(有提交,有merge等),
由于定义了.gitlab-ci.yml,gitlab会让gitlabruner执行.gitlab-ci.yml script定义的内容
以上命令涵盖了编译代码,打包镜像,上传镜像到仓库,通知k8s更新应用镜像。
网友评论