蔚蓝触点 Azuretouch

Azuretouch
Touch your future

搭建基于 GitLab 的 CI 环境

公司内部使用的是基于 Azure 的 CI/CD 环境。而我自己有个搭建的临时环境是基于 GitLab 的,于是突发奇想是否在 GitLab 上也搭建一个 CI 环境。

说做就做吧(我的测试环境是 Centos 7 + GitLab 8 社区版)。

CI 定义

网上很多大神都有解释,我这里就不多说了,借用三张能简单说明定义的图吧。

「持续集成(Continuous Integration)」
CI.jpg
「持续交付(Continuous Delivery)」
CD1.jpg
「持续部署(Continuous Deployment)」
CD2.jpg

安装 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,便会看到:
TIM截图20190331000013.png
接下来,用以下命令来配置 Runner 到 GitLab, 注意配置中 gitlab-ci coordinator URL 和 token,就是使用上面你找到的那两个参数。另外选择 executor 的时候,这里我选择了 shell,因为我部署的是 python 项目,很简单。如果是 .Net Core 项目的话,可以使用 docker + microsoft/dotnet:latest 。

[[email protected] ~]# 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 [email protected]$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 项目(包括编译),或者是单元测试,等等等等。

TIM截图20190401101323.png

TIM截图20190401101306.png

备注

如何添加项目的私有变量

对于一些会经常改变的内容,我们可以设置项目的私有变量来操作,这样不用频繁修改代码文件了。
具体设置的路径在项目->设置->变量
TIM截图20190401080527.png

关于 SSH 密钥连接的设置

这里要介绍两个 SSH 的密钥设置。一个是免密连接远程服务器,另一个是免密 PULL 和 CLONE 代码

免密连接远程服务器

#首先生成一对RSA密钥
ssh-keygen -t rsa -P ''
#然后添加服务器远程权限
ssh-copy-id [email protected]服务器IP地址
#id_rsa里的内容,就是远程密钥了
#你可以将此密钥添加到私有变量
cat /root/.ssh/id_rsa

免密对 GitLab 仓库进行操作

刚刚我们生成了远程服务器的秘钥,当然这对秘钥也可以用于 GitLab 的操作。
但是先要把共钥(id_rsa.pub 里的内容)添加到项目中的部署密钥里,设置路径为项目->项目设置->密钥路径
TIM截图20190401100920.png

参考文献:

  1. GitLab Runner
  2. 一步一步完成GitLab Runner持续化自动部署
  3. 使用Docker和GitLab构建一个CI/CD Pipeline
未经允许不得转载:蔚蓝触点 Azuretouch » 搭建基于 GitLab 的 CI 环境

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址