公司内部使用的是基于 Azure 的 CI/CD 环境。而我自己有个搭建的临时环境是基于 GitLab 的,于是突发奇想是否在 GitLab 上也搭建一个 CI 环境。
说做就做吧(我的测试环境是 Centos 7 + GitLab 8 社区版)。
CI 定义
网上很多大神都有解释,我这里就不多说了,借用三张能简单说明定义的图吧。
「持续集成(Continuous Integration)」
「持续交付(Continuous Delivery)」
「持续部署(Continuous Deployment)」
安装 GitLab Runner
GitLab Runner 就是为了触发执行一系列脚本,来达到 CI 的目的。所以一定是配合 CI 使用的。
安装 Runner 很简单
#添加源
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
#安装
yum install gitlab-ci-multi-runner
但是,在这里为了方便,我使用的是 Docker 来安装 Runner。
docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
特别注意
GitLab 和 GitLab Runner 的版本要对应,因为高版本和低版本的交叉使用会产生一些问题。这里使用的 Runner 的 Image 是最新的,而我本地的 GitLab 是 8.x,所以要换成 1.11.5 的, 在 Docker 网站上找的到,修改上面命令中 Image 的路径为 gitlab/gitlab-runner:v1.11.5
就可以了。
使用以下命令查看 Runner 版本
docker exec -it gitlab-runner gitlab-runner help
配置 GitLab Runner
首先,获取你的 GitLab CI 链接和项目的授权码。访问你的 GitLab 服务器,打开项目设置页面,点击 Runner,便会看到:
接下来,用以下命令来配置 Runner 到 GitLab, 注意配置中 gitlab-ci coordinator URL 和 token,就是使用上面你找到的那两个参数。另外选择 executor 的时候,这里我选择了 shell,因为我部署的是 python 项目,很简单。如果是 .Net Core 项目的话,可以使用 docker + microsoft/dotnet:latest 。
[root@localhost ~]# docker exec -it gitlab-runner gitlab-runner register
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://127.0.0.1:8099/ci
Please enter the gitlab-ci token for this runner:
9z3xAGZ7jj5gFoghZZbh
Please enter the gitlab-ci description for this runner:
[3c239b5d4f84]: true
Please enter the gitlab-ci tags for this runner (comma separated):
demo
Whether to run untagged builds [true/false]:
[false]: true
Registering runner... succeeded runner=9z3xAGZ7
Please enter the executor: docker, docker+machine, docker-ssh+machine, ssh, virtualbox, kubernetes, docker-ssh, parallels, shell:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
配置完,便可以看到 Runner 注册成功。你也可以在刚刚找到项目授权码的页面,看到已经注册了一个 Runner。
添加配置文件 .gitlab-ci.yml
.gitlab-ci.yml 是触发 CI 的必要条件。我们可以通过该文件来告诉服务器,什么时候需要触发 CI,触发后需要做点什么。
before_script:
# Install ssh-agent if not already installed, it is required by Docker.
# (change apt-get to yum if you use a CentOS-based image)
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
# Run ssh-agent (inside the build environment)
- eval $(ssh-agent -s)
# Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store
# error: https://gitlab.com/gitlab-examples/ssh-private-key/issues/1
# - echo "$SSH_PRIVATE_KEY_DEV"
- ssh-add <(echo "$SSH_PRIVATE_KEY_DEV")
# For Docker builds disable host key checking. Be aware that by adding that
# you are suspectible to man-in-the-middle attacks.
# WARNING: Use this only with the Docker executor, if you use it with shell
# you will overwrite your user's SSH config.
- mkdir -p ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
stages:
- build
build:
stage: build
script:
# 执行pull操作
- ssh root@$DEPLOY_SERVER_DEV "cd /www/wwwroot/test&&ls" #git pull origin master"
only:
# 只有master分支才执行
- master
以上是我的一个例子,只有在 master 分支上更新,才会触发并将 master 的代码 pull 到服务器的目录中。其中用到了两个关键点,一个是项目私有变量,一个是如何使用 SSH 密钥来连接远程服务器。请看下面的帮助。
最后,我们可以看到更新了 master 分支以后,就会触发 pipeline,然后自动构建并部署到服务器中。你可以在 yml 文件中编写更加复杂的脚本,比如说安装部署的 requirements,或者是部署 .Net Core 项目(包括编译),或者是单元测试,等等等等。
备注
如何添加项目的私有变量
对于一些会经常改变的内容,我们可以设置项目的私有变量来操作,这样不用频繁修改代码文件了。
具体设置的路径在项目->设置->变量
关于 SSH 密钥连接的设置
这里要介绍两个 SSH 的密钥设置。一个是免密连接远程服务器,另一个是免密 PULL 和 CLONE 代码
免密连接远程服务器
#首先生成一对RSA密钥
ssh-keygen -t rsa -P ''
#然后添加服务器远程权限
ssh-copy-id root@服务器IP地址
#id_rsa里的内容,就是远程密钥了
#你可以将此密钥添加到私有变量
cat /root/.ssh/id_rsa
免密对 GitLab 仓库进行操作
刚刚我们生成了远程服务器的秘钥,当然这对秘钥也可以用于 GitLab 的操作。
但是先要把共钥(id_rsa.pub 里的内容)添加到项目中的部署密钥里,设置路径为项目->项目设置->密钥路径
参考文献: