1. Gitlab-CI介绍
1.1 持续集成简单
Gitlab-ci全称是gitlab continuous integration的意思,也就是持续集成。就是将代码的构建、测试、发布、运维
整个流程形成一个闭环,推动开发、测试QA、运维等部门相互促力,快速迭代,减少人工出错,提高生产效率。
1.2 Gitlab CI流程
当每次开发push代码到gitlab的时候,都会触发一次脚本构建执行,脚本的内容由.gitlab-ci.yml定义,包括编译,测试,部署等一系列自定义的内容,主要流程如下。
安装注册Gitlab Runners
--> GitLab配置Gitlab Runners
--> 编辑.gitlab-ci.yml
文件指定CI/CD动作 --> push代码触发CI --> Gitlab CI
调度任务 --> Gitlab Runners
执行工作
名词概念:
GitLab-CI
:GitLab 提供的持续集成系统,管理项目的构建状态,通过 GitLab Runner 来执行构建任务。GitLab-Runner
:用于执行构建任务,.gitlab-ci.yml 的 script 部分的运行就是由 GitLab-Runner 来完成。.gitlab-ci.yml
:放在git项目的根目录下的一个文件,记录了一系列的阶段和执行规则。GitLab-CI 在 git push 后会解析它,根据里面的内容调用 GitLab-Runner 来执行。Pipeline
:一次 Pipeline 相当于一次构建任务,里面可以包含多个流程,比如安装依赖、运行测试、编译、部署测试服务器、部署生产服务器等流程。Stages
:构建阶段,在一次 Pipeline 中可以定义多个 Stages,所有 Stages 会按照顺序运行,如果任何一个 Stage 失败,那么后面的 Stages 不会执行。Jobs
:构建任务,每个 Stage 里面执行的任务。一个 Stage 可以有多个 Job ,全部 Job 会并行执行。
.gitlab-ci.yml内容示例,Java环境:
# 本项目使用的镜像,这里的设置会覆盖在注册Runner的时候填写的镜像
# 如果不写的话就会使用在注册Runner的时候填写的镜像
image: regitry.chegva.com/online/ci:maven-jdk-8-onbuild
# 缓存设置
# .m2/的缓存设置可以避免每次编译的时候都去maven上拉包
# /builds/$CI_PROJECT_PATH/target的缓存设置可以在job中共享该项目的打包编译结果
cache:
paths:
- .m2/
- /builds/$CI_PROJECT_PATH/target
variables:
MAVEN_OPTS: "-Dmaven.repo.local=.m2"
# CI步骤设置
stages:
- build
- unit-test
- inte-test
- deploy
- e2e-test
# 第一步:编译
build:
stage: build
script:
- mvn -U clean package
artifacts:
#发布时,会以target的下级目录为根目录发布,如下:只发布*.war文件
paths:
- target/*.war
untracked: false
# 第二步:获取单元测试结果,并显示覆盖率
test:
stage: unit-test
script:
- mvn package jacoco:report -Pjacoco
- cat target/site/jacoco/index.html
# 第三步:集成测试
integration test:
stage: inte-test
script:
- mvn package
- do "一般情况下需要启动你的服务并做接口测试"
# 第四步:自动部署
# 在java8-maven的镜像中封装了对部署系统的调用
# 使用/home/work/bin/deploy-sdk/deploy.php脚本就可以自动完成部署
# 其中的only段的意思是自动部署只对staging这个分支生效
auto-deploy:
stage: deploy
script:
- php /home/work/bin/deploy-sdk/deploy.php $CI_COMMIT_REF_NAME $CI_COMMIT_SHA $STAGING_DEPLOY_JOB
environment:
name: staging
url: http://chegva.com/deploy
only:
- staging
# 第四步:端到端测试
e2e:
stage: e2e-test
script:
- do "调用测试组的端到端测试"
only:
- staging
# 添加.gitlab-ci.yml,提交仓库
$ git add .gitlab-ci.yml
$ git commit -m "Add .gitlab-ci.yml"
$ git push origin master
测试可以集成codereview、sonar等工具,或者自己开发;部署更好的方式可以使用触发hooks的方式由部署平台托管
1.3 Gitlab CI使用
具体使用比较简单,看完下边文档就会了:
2. Gitlab Runners配置
以使用docker构建为例,打包的动作会在docker ci容器里进行,使用步骤:
搞几台物理机,安装注册Gitlab Runner,安装配置好docker环境
提前打好CI镜像,包括Go、JAVA、PHP、Python等,也可以自行创建,推到私有仓库中,registry或harbor都可以
在开机启动文件加入docker login做仓库认证,编辑runner配置文件
/etc/gitlab-runner/config.toml
,可以配置多个runner构建CI任务,验证runners是否正常运行,对于通用的CI任务,注册Shared Runner,对于特殊,或个人测试的任务,注册Specific Runner
2.1 Gitlab Runner注册
注册 Runner 就是把 Runner 绑定到一个 GitLab 实例的过程。Runner分为两种:shared runner
和specific runner
。
shared runner
:可以为多个项目运行job,只需要在Gitlab上配置即可为所有项目使用,只有管理员能创建。
specific runner
: 为某些特殊需求的项目运行CI任务。也可以用group的方式应用在多个项目上,需要在每个项目中配置才能使用,只有指定了的仓库才能使用。
注册runner需要根据是shared runner还是specfic runner来获取相应的token。
执行:gitlab-runner register
Please enter the gitlab-ci coordinator URL:
# gitlab-ci 的 URL 地址,这里配置为 GitLab 地址的/ci路径
> https://gitlab.chegva.com/ci
Please enter the gitlab-ci token for this runner: [admin area] -> [settings] -> [CI/CD]
> xxxxxx
Please enter the gitlab-ci description for this runner:
> gitlab-ci
Please enter the gitlab-ci tags for this runner (comma separated):
# 给runner标记tag,用于分组调用,tag名字可以随便取,符合规范就行
> docker
Whether to run untagged builds [true/false]:
# 选择 Runner 是否接收未指定 tags 的任务(默认值:false),选true
> true
Please enter the executor: docker, parallels, shell, kubernetes, docker-ssh, ssh, virtualbox, docker+machine, docker-ssh+machine:
# 以何种方式执行CI任务,这里选docker
> docker
Please enter the default Docker image (e.g. ruby:2.1):
# 设置默认的docker镜像,保底的镜像,非必需
> registry.chegva.com/online/ci:golang-1.9.2-onbuild
2.2 Gitlab Runner配置文件
# 20个并发
concurrent = 20
check_interval = 0
[[runners]]
name = "gitlab-ci"
url = "https://gitlab.chegva.com/ci"
# runner注册后gitlab自动分配
token = "xxx"
executor = "docker"
[runners.docker]
tls_verify = false
image = "docker:dind"
privileged = false
disable_cache = false
# docker in docker,挂载缓存目录
volumes = ["/var/run/docker.sock:/var/run/docker.sock","/home/work/cache:/cache"]
# 可以加多个runner
[[runners]]
...
2.3 Gitlab Runner常用命令
# 查看runner状态
gitlab-runner status
# 查看注册runner
gitlab-runner list
# 重启runner
gitlab-runner restart
# 查看runner日志
# systemctl status -l gitlab-runner
# journalctl -u gitlab-runner
# 查看帮助
gitlab-runner -h
2.4 Gitlab Runner启动文件
# gitlab-runner.service
[Unit]
Description=GitLab Runner
After=syslog.target network.target
ConditionFileIsExecutable=/usr/lib/gitlab-runner/gitlab-runner
[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/lib/gitlab-runner/gitlab-runner "run" "--working-directory" "/home/gitlab-runner" "--config" "/etc/gitlab-runner/config.toml" "--service" "gitlab-runner" "--syslog" "--user" "gitlab-runner"
Restart=always
RestartSec=120
[Install]
WantedBy=multi-user.target
2.5 Gitlab Runner升级
1. 先备份 /etc/gitlab-runner/config.toml 文件
2. 升级gitlab-runner
# gitlab-runner stop
# curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
# yum install -y gitlab-runner
# gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
3. 将备份的配置文件覆盖新生成的/etc/gitlab-runner/config.toml
4. 重启runner:gitlab-runner start && gitlab-runner list
runner指定dns
# 启动dnsmasq容器
docker run -d -p 53:53/udp -p 53:53/tcp --cap-add=NET_ADMIN --name dns-server andyshinn/dnsmasq
# runner容器指定dns,一般用于测试
vim /etc/gitlab-runner/config.toml 添加如下配置
dns = ["172.17.0.10"]
# 或者在宿主机/etc/hosts里绑定域名,再挂载
volumes = ["/etc/hosts:/etc/hosts"]
3. Gitlab Runner使用遇到的问题
1. 注册gitlab-runner时,提示报错:
GitLab Runner >= 9.0 can be used ONLY with GitLab CE/EE >= 9.0
这个因为默认gitlab runner安装时最新版的,与我们正在使用的gitlab版本不匹配,那么我们找到匹配的gitlab-runner版本安装即可
2. 有时runner会连接不上,或者在项目仓库->设置->runner里呈灰色,这有可能是runner机器上没有启动gitlab-runner引起的,可以执行ps -ef | grep gitlab看看是否存在gitlab-runner的进程,如果没有则执行gitlab-runner start 命令启动runner服务
3. 已经配置好了gitlab-runner,执行push,pipeline状态一直是pending,并且提示:
This build is stuck, because the project doesn't have any runners online assigned to it. Go to Runners page
这个是因为未找到对应的runner导致的,有以下几种情况:
1) gitlab-runner注册失败
2) gitlab-ci.yml配置文件里面配置了tags但是没有匹配到已注册可用的runner
3)runner被disable了
4)runner出问题了,hang死,重启一下即可,然后看看日志,查找原因
4. Gitlab和Gitlab Runner要分开部署,Runner最好有多个,修改配置完成后,记得要重启gitlab-runner生效
5. Gitlab迁移或者重新部署后,Runner最好重新注册一次,配置文件可以用老的覆盖。
6. 为了加快CI,建议使用缓存,引用的镜像事先全部放到私有仓库里,内网调用。
7. CI的容器建议尽量精简化,最小化原则。
8. .gitlab.yml里要引用token或密码的话,一定要定义CI私有变量在文件里引用,建议每组设置一个,组内通用。