Gitlab持续集成详细配置与工作原理
Gitlab Runner 窍门
解决gitlab Runner 执行 job时反复拉取镜像的问题
编辑 /etc/gitlab-runner/config.toml
找到 shm_size = 0 段
添加
1  | pull_policy = "if-not-present"  | 
每次都要cache的内容可直接放到配置文件中
因为在docker方式中,每次job拉起镜像,都是崭新的,所以在构建Java项目时,.m2文件夹不存在,导致每次都需要重新下载全量jar包。
的确可以通过 gitlab-ci.yml中的cache段来解决,但每次写实在太麻烦,所以这个配置,也可以通过编辑 /etc/gitlab-runner/config.toml来解决。
找到 volumes = ["/cache"]段,修改为
1  | volumes = ["/cache","/dockerdata/gitlab-runner-java01/root/.m2:/root/.m2"]  | 
其中"/dockerdata/gitlab-runner-java01/root/.m2:/root/.m2" 与docker -v参数的传值类似,冒号前面是宿主机路径,后面是容器内路径。
基本原理
- 不管我们用什么方式安装的gitlab,本身并不具备cicd功能,需要安装配套的
Runner来具体做事。 - Docker方式部署的runner也不直接做打包发布的事情,而是通过定义不同环节用哪个docker容器来完成任务,这种方式下的runner,其实就是个管控器。
 - 何时触发构建动作、由谁执行构建动作、如何构建,需要在项目根目录下的 
gitlab-ci.yml来定义。 
运行方式
触发
gitlab的 pipeline既可以自动触发,也可以通过gitlab界面的cicd相关页面手动触发,这取决于在gitlab-ci.yml中如何配置。
- 手动触发:
gitlab项目页面->左侧"CI/CD"->右侧按钮"Run Pipeline" - 自动触发:
gitlab-ci.yml中,每个job的only段,方式非常灵活,可按照 分支提交动作、文件修改动作 等等方式。 
only案例,修改文件触发构建
作为开发人员,最方便的莫过于修改本地文件然后提交了,以下方式,只需要在项目根目录创建两个文件dev_ver和test_ver,分别对应自动部署到开发版和测试版。
当gitlab获取到提交请求时,会自动扫描gitlab-ci.yml文件,如果对应的文件有修改,则进行对应的构建和发布操作。
1  | only:  | 
only案例,手动触发
如果想通在gitlab网页界面上操作,可采用这种变量传值方式:
1  | only:  | 
此时,gitlab项目页面 -> 左侧"CI/CD" -> 右侧按钮"Run Pipeline",在对应的页面中变量栏key输入 RELEASE,value栏输入dev,则会触发此规则。
阶段
以下信息描述了两个阶段 prepare和deploy阶段
1  | stages:  | 
当然,可以制定更多的阶段(Job),对于docker方式的Runner而言,每个阶段都会临时启动一个docker来执行对应的任务。
执行
在每个执行阶段中,我们需要定义:
- 触发规则 only
 - 采用的镜像 image
 - 运行的脚本 script
 - 缓冲(为了下一环节能用到上一环节的作业成果) cache
 
执行案例
1  | # 定义了两个流程  | 
以上这个案例,定义了两个环节 prepare和deploy,有三个job:
prepare:在dev_ver或test_ver被修改时会被触发deploy_dev:在dev_ver被修改时会被触发deploy_test:在test_ver被修改时会被触发
那么,如果:
- 项目根目录下的 
dev_ver被修改,则会触发prepare:和deploy_dev: - 项目根目录下的 
test_ver被修改,则会触发prepare:和deploy_test: 
