-
Jenkins
-
GitLab CI
-
TeamCity
-
Travis CI
-
Bamboo
-
CircleCI
GitLab
是一个利用
Ruby on Rails
开发的开源应用程序,实现一个自托管的 Git 项目仓库,可通过 Web 界面进行访问公开的或者私人项目。它拥有与
GitHub
类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。
GitLab CI/CD
是
GitLab Continuous Integration
(Gitlab持续集成)的简称。GitLab 自
GitLab 8.0
开始提供了持续集成的功能,且对所有项目默认开启。只要在项目仓库的根目录添加
.gitlab-ci.yml
文件,并且配置了Runner(运行器),那么每一次
push
或者合并请求(
Merge Request
)都会触发
CI Pipeline
。
GitLab Runner
GitLab Runner
是一个开源项目,可以运行在 GNU / Linux,macOS 和 Windows 操作系统上。每次
push
的时候 GitLab CI 会根据
.gitlab-ci.yml
配置文件运行你流水线(
Pipeline
)中各个阶段的任务(
Job
),并将结果发送回 GitLab。GitLab Runner 是基于 Gitlab CI 的 API 进行构建的相互隔离的机器(或虚拟机)。GitLab Runner 不需要和 Gitlab 安装在同一台机器上,且考虑到 GitLab Runner 的资源消耗问题和安全问题,也不建议这两者安装在同一台机器上。
Gitlab Runner 分为三种:
-
共享Runner(
Shared runners
)
-
专享Runner(
Specific runners
)
-
分组Runner(
Group Runners
)
Pipelines
中文称为流水线,是分阶段执行的构建任务。如:安装依赖、运行测试、打包、部署开发服务器、部署生产服务器等流程。每一次
push
或者
Merge Request
都会触发生成一条新的Pipeline。
下面是流水线示例图:
Stages
表示构建阶段,可以理解为上面所说“安装依赖”、“运行测试”等环节的流程。我们可以在一次 Pipeline 中定义多个 Stages,这些 Stages 会有以下特点:
-
所有 Stages 会按照顺序运行,即当一个 Stage 完成后,下一个 Stage 才会开始(当然可以在
.gitlab-ci.yml
文件中配置上一阶段失败时下一阶段也执行)
-
只有当所有 Stages 完成后,该构建任务 (Pipeline) 才会成功
-
如果任何一个 Stage 失败,那么后面的 Stages 不会执行,该构建任务 (Pipeline) 失败
下面是一个流水线内的阶段任务示例图:
Jobs
表示构建的作业(或称之为任务),表示某个 Stage 里面执行的具体任务。我们可以在 Stages 里面定义多个 Jobs,这些 Jobs 会有以下特点:
-
相同 Stage 中的 Jobs 无执行顺序要求,会并行执行
-
相同 Stage 中的 Jobs 都执行成功时,该 Stage 才会成功
-
如果任何一个 Job 失败,那么该 Stage 失败,即该构建任务 (Pipeline) 也失败(可以在
.gitlab-ci.yml
文件中配置允许某 Job 可以失败,也算该 Stage 成功)
YAML
文件
.gitlab-ci.yml
来管理项目构建配置。该文件需要存放于项目仓库的根目录(默认路径,可在 GitLab 中修改),它定义该项目的 CI/CD 如何配置。所以,我们只需要在
.gitlab-ci.yml
配置文件中定义流水线的各个阶段,以及各个阶段中的若干作业(任务)即可。
下面是
.gitlab-ci.yml
文件的一个简单的
Hello World
示例:
stages:
- test
- package
package-job:
stage: package
script:
- echo "Hello, package-job"
- echo "I am in package stage"
test-job:
stage: test
script:
- echo "Hello, test-job"
- echo "I am in test stage"
以上配置中,用 stages 关键字来定义 Pipeline 中的各个构建阶段,然后用一些非关键字来定义 jobs。每个 job 中可以可以再用 stage 关键字来指定该 job 对应哪个 stage。job 里面的
script
关键字是每个 job 中必须要包含的,它表示每个 job 要执行的命令。
注
:猜猜上面例子的运行结果?
Badges
即:
徽章
,当 Pipelines 执行过程中或者执行完成时会生成徽章,你可以将这些徽章加入到你的
README.md
文件中,便于从仓库主页看到最新的构建状态。
徽章的链接形如下:
http://example.gitlab.com/namespace/project/badges/branch/build.svg
我们用 GitLab 项目的徽章作为例子,效果如下:
这里
有 GitLab Runner安装相关的资源和文档可供大家参考。以下仅以咱们公司常用的
Centos
为例来做安装说明。
这里
下载。
注册一个 Runner
,注册的交互式命令如下:
sudo gitlab-runner register
命令的交互式的过程如下:
sudo gitlab-runner register
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
http://gitlab.xxxx.com/
Please enter the gitlab-ci token for this runner
Please enter the gitlab-ci description for this runner
[hostame] my-runner
Please enter the gitlab-ci tags for this runner (comma separated):
my-tag,another-tag
Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
shell
以上流程注册成功之后,就可以在你的项目仓库中
Settings
->
CI/CD
->
Runners settings
看到这个 Runner 了。
Gitlab Runner命令
,以供参考:
gitlab-runner run
运行一个runner服务
gitlab-runner register
注册一个新的runner
gitlab-runner start
gitlab-runner stop
gitlab-runner restart
gitlab-runner status
查看各个runner的状态
gitlab-runner unregister
注销掉某个runner
gitlab-runner list
显示所有运行着的runner
gitlab-runner verify
检查已注册的运行程序是否可以连接到GitLab,但它不验证GitLab Runner服务是否正在使用运行程序。
使用docker镜像
services
所使用的docker服务,查阅
使用docker镜像
stage
定义job stage(默认:
test
)
stage
的别名(已弃用)
variables
定义job级别的变量
定义一列git分支,并为其创建job
except
定义一列git分支,不创建job
定义一列tags,用来指定选择哪个Runner(同时Runner也要设置tags)
allow_failure
允许job失败。失败的job不影响commit状态
定义何时开始job。可以是
on_success
,
on_failure
,
always
或者
manual
dependencies
定义job依赖关系,这样他们就可以互相传递artifacts
cache
定义应在后续运行之间缓存的文件列表
before_script
重写一组在作业前执行的命令
after_script
重写一组在作业后执行的命令
environment
定义此作业完成部署的环境名称
coverage
定义给定作业的代码覆盖率设置
定义在发生故障时可以自动重试作业的时间和次数
parallel
定义应并行运行的作业实例数
YAML锚点
的替代方案,并且更加灵活和可读:
.tests:
script: rake test
stage: test
only:
refs:
- branches
rspec:
extends: .tests
script: rake rspec
only:
variables:
- $RSPEC
在上面的示例中,
rspec
作业继承自
.tests
模板作业。 GitLab 将根据键执行反向深度合并。 GitLab将:
将
rspec
内容以递归方式合并到
.tests
中。
不合并键的值。
这实际生成的是以下
rspec
作业:
rspec:
script: rake rspec
stage: test
only:
refs:
- branches
variables:
- $RSPEC
注
:
rake test
已被
rake rspec
脚本覆盖。
a separate document
。
variables
的介绍。
预定义变量
。
默认key是默认设置的这个项目缓存,因此默认情况下,从GitLab 9.0开始,每个 pipelines 和 jobs 中可以共享一切。
缓存每个job:
cache:
key: "$CI_JOB_NAME"
untracked: true
缓存每个分支:
cache:
key: "$CI_COMMIT_REF_NAME"
untracked: true
缓存每个 job 且每个分支:
cache:
key: "$CI_JOB_NAME/$CI_COMMIT_REF_NAME"
untracked: true
缓存每个分支且每个stage:
cache:
key: "$CI_JOB_STAGE/$CI_COMMIT_REF_NAME"
untracked: true
如果使用的Windows Batch(windows批处理)来跑脚本需要用%替代$:
cache:
key: "%CI_JOB_STAGE%/%CI_COMMIT_REF_NAME%"
untracked: true
依赖关系
。以下是一些例子:
发送
binaries
和
.config
中的所有文件:
artifacts:
paths:
- binaries/
- .config
发送所有没有被Git跟踪的文件:
artifacts:
untracked: true
发送没有被Git跟踪和
binaries
中的所有文件:
artifacts:
untracked: true
paths:
- binaries/
查看更多
。
GitLab Pages
是用于托管静态文件的服务。而
pages
是一个特殊的job,用于将静态的内容上传到GitLab,可用于为您的网站提供服务。它有特殊的语法,因此必须满足以下两个要求:
任何静态内容必须放在
public/
目录下
artifacts必须定义在
public/
目录下
下面的这个例子是将所有文件从项目根目录移动到
public/
目录。
.public
工作流是
cp
,并且它不会循环复制
public/
本身。
pages:
stage: deploy
script:
- mkdir .public
- cp -r * .public
- mv .public public
artifacts:
paths:
- public
only:
- master
更多内容请查看
GitLab Pages用户文档
。
官方文档地址
segmentfault yaml配置中文翻译
本文章由
blinkfox
原创,本站仅仅为学习转发