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私有变量在文件里引用,建议每组设置一个,组内通用。

