GItLab提供了CI/CD持续集成的功能,为了提升效率研究一下如何使用。
首先,对一个项目设置CI/CD配置,是需要对应权限的。这是Gitlab上,CI/CD的权限表。
配置CI/CD需要是项目的Maintainer或者Admin。
Action | Guest, Reporter | Developer | Maintainer | Admin |
---|---|---|---|---|
See commits and jobs | ✓ | ✓ | ✓ | ✓ |
Retry or cancel job | ✓ | ✓ | ✓ | |
Erase job artifacts and trace | ✓ 5 | ✓ | ✓ | |
Remove project | ✓ | ✓ | ||
Create project | ✓ | ✓ | ||
Change project configuration | ✓ | ✓ | ||
Add specific runners | ✓ | ✓ | ||
Add shared runners | ✓ | |||
See events in the system | ✓ | |||
Admin interface | ✓ |
在确保自己的权限足够时,我们进入到下一步。
为了模拟现实环境,我们需要使用到至少两台主机。
一台是Gitlab的主机,不想折腾也可以直接到GitLab的官网注册一下就行。
另一台可以是自己的主机,可以是虚拟机,也可以是vps,只要可以联网就行。
主机 | 环境 |
ubuntu server 1台 | GitLab搭建 |
ubuntu desktop 1台 | GitLab-runner等 |
我手上这两台主机,搭建GitLab的是同事搭建完的,只需要完整安装GitLab以及一些依赖项即可。
另一台是ubuntu desktop 16.04,下面开始实际操作阶段。
安装环境
- 首先我们要安装的是sdk,这一步,请按自己的需求安装,我这里安装的是dotnet sdk,按照官方文档一步一步进行ubuntu 相关sdk的安装即可。
- 安装zip(可选)
- docker(可选)
- GitLab-Runner(按官方文档安装)
- tcl
- expect(5.6的作用是写脚本,expect是基于tcl的,可选)
注册Runner
Gitlab-Runner 我的理解是可以把一台主机变成一个角色,它可以根据你定义好的配置文件,帮你完成每次都需要完成的重复工作,比如测试、构建、发布等。当你提交代码时,可以触发runner自动完成工作,减少不必要的工作。
我们以专用runner为例。
在ubuntu命令行里面输入
gitlab-runner register
1.提示你输入url。这个url在所需要设置runner的项目页面的settings-CI/CD-Runners settings里面。
输入图中步骤2的地址。
2.输入token令牌
输入上图中步骤3提供的令牌。
3.输入描述
这一步就自己随便填写了,可以填主机名之类的。
4.输入tag
这里同样可以随意填写。
5.输入脚本
这边我选择的是shell。
注册完成以后,输入命令
gitlab-runner run
让runner run起来。不然在代码提交更新后,会提示当前的流水线stucked。
配置CI/CD
在项目页面中,可以新建文件来实现文件的添加。
选择tpye为.gitlab-ci.yml
接着后面会提供语言选择,可以选择自己使用的语言,会根据语言生成范例文本。此处,我也提供一个流程文本的范例。
stages:
- build
- deploy
- trans
build_job:
stage: build
script:
- cd $(dirname $0); pwd
- dotnet build
only:
- cicd_test
deploy_job:
stage: deploy
script:
- dotnet publish -c release -o /home/dev/CICD
only:
- cicd_test
trans_job:
stage: trans
script:
- cd /home/dev/expect
- ./scp.sh
only:
- cicd_test
这里有三个stage,每个stage可以创建对应的job(不可少)。
在job中script是具体执行的Runner所在环境的命令。至于能执行什么样的命令,就根据Runner所在的系统环境决定。
下面我解释下示例流程文本的意思。
首先三个stage:
build、deploy、trans
这三个stage会依次执行。
上一个stage执行完成后,才会进入到下一个stage。
第一个stage:build
这个stage所对应的job就是build_job。
在build_job中
stage中写的就是所对应的stage名称。
script中写的就是Runner所执行的命令。在build_job中,这里执行的命令是CD到当前目录下。因为我测试用的是.net core项目。所以,下一步执行的是dotnet build,等待执行完成。到这一步,build的流程算是走完了。
build执行完下面就是deploy。
第二个stage:deploy
在这个步骤中,我使用的命令是:dotnet publish -c release -o /home/dev/CICD。这一句的意思就是,以release版本的形式发布并输出到/home/dev/CICD这个目录下。执行完成后进入到下一个步骤。
第三个stage:trans
在这里,我CD到/home/dev/expect目录下,执行了scp.sh的脚本。
scp脚本的内容是:
spawn scp -r /home/dev/CICD/ dev@123.123.123.123:/C:/
expect {
"*password:" {send "123456\r"}
}
expect eof
这是一个linux通过scp传输文件的脚本,通过脚本直接把CICD目录下的文件传输到ip地址为123.123.123.123的机器的C盘下(这里123这台机器是一台windows server),通过这一步,我可以直接把编译好的发布完成的文件传输到IIS对应的目录下,方便实现跨系统传输。ssh的方式对我来说比较麻烦,有条件的朋友可以选用。expect脚本在这里的意义就是当需要输入密码的时候输入“123456”这样的密码。(windows端需要使用BvSshServer软件来配合。)文件传输完成。这一个stage也就完成了。
到这里,三个步骤完成。可以在项目的流水线中看到每个步骤的执行情况,是否错误什么样的错误(执行失败会发邮件通知)。在项目的CICD设置当中,可以设置如何触发Runner,比如提交后触发这样的,也可以在流水线的schedule中配置计划,每月每周每天几时执行。
配置好流程文件以后提交完代码之后就不再需要手动部署程序了。当然,也可以通过配置参数命令的形式,完成更多的操作,比如对程序的单元测试等,以便节省出时间做很多别的工作。