用 GitLab CI 实现持续集成

最近搞 bangu.me,更新的有点频繁,于是弄了下 GitLab CI 做持续集成,躺了些坑,稍微记录下。

安装 gitlab-ci-multi-runner

因为 GitLab CI 是通过 GitLab Runner 来构建任务的,所以我们必须在服务器或者开发机跑 GitLab Runner,GitLab CI 本身是管理各个项目的构建状态。安装如下:

# for CentOS
$ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | bash
$yum install gitlab-ci-multi-runner

# for MacOS
brew install gitlab-ci-multi-runner

注册、启动 Runner

注册并启动 Runner 跟 GitLab CI 绑定连接。我这里只用 Specific Runner,在 GitLab 设置的 CI/CD Pipelines 中可以看到 Specific Runner 的 setup 说明,下面的 url 和 token 是注册时要用到的

$ gitlab-ci-multi-runner register

根据提示分别输入 url,token,runner executor(我用 docker),因为是 node 项目,image 我用了 node:latest

注册完成,启动 Runner

$ gitlab-ci-multi-runner install
$ gitlab-ci-multi-runner start

这时候可以在 GitLab 中看到 Runner 的状态为 online 了

配置 .gitlab-ci.yml

然后我们需要在项目中新建 .gitlab-ci.yml,来实现代码合并更新后自动执行任务,我主要做的任务是打包并同步相关文件到服务器。我的 .gitlab-ci.yml 配置大致如下:

image: node:latest

stages:
  - build
  - deploy

cache:
  paths:
    - node_modules/

build:
  before_script:
    - npm install
  stage: build
  only:
    - master
  script:
    - npm run build

deploy:
  before_script:
    - apt-get update && apt-get upgrade -y && apt-get dist-upgrade -y && apt-get install -y rsync
    - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
    - eval $(ssh-agent -s)
    - ssh-add <(echo "$SSH_PRIVATE_KEY")
    - mkdir -p ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\\n\\tStrictHostKeyChecking no\\n\\n" > ~/.ssh/config'
  stage: deploy
  only:
    - master
  script:
    - bash deploy.sh

这里遇到的坑主要是 deploy 这一步,主要是设置问题,我用的 rsync 来同步,需用服务器的 ssh private key,在你生成 key 后,需要把 public key 放到 authorized_keys 中。

SSH Key 的配置介绍参考官方文档

拿到服务器的 ssh private key 后,需要配置到 GitLab 的 Secret Variables 中,添加 variable,key 为 SSH_PRIVATE_KEY,Value 为你的 ssh private key。

这样,每次更新代码后我就不用去管打包发布了。

Refs.

Alan

Frontend Engineer