Gitlab CI 自动部署

作为个人私有项目的仓库,Gitlab 是不错的选择。Gitlab 版本更新迭代也蛮快的。最近在研究 Gitlab 的 CI/CD。

需求

代码 push 到 gitlab 后,自动部署到自己的服务器上。

实现过程

文档托管在gitlab上, 每次代码更新, 会自动出发gitlab-ci构建
在构建脚本中, 通过ssh 登录远程服务器执行git拉取文档的命令

步骤:

  • 首先需要在服务器上生成ssh证书

注意该证书的用户必须与ssh远程登录的用户一样, 例如我们的用户名是 markday
将公钥添加到gitlab上, 以便于该用于可以拉取代码
在 CI/CD Piplines中设置 Secret Variables, 包括 DEPLOY_SERVER 和 SSH_PRIVATE_KEY
其中 SSH_PRIVATE_KEY 的内容是服务器上的私钥, DEPLOY_SERVER 是服务器地址

  • 编写 .gitlab-ci.yml 文件, 注入密钥, 通过ssh执行远程命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 使用alpine镜像, 该镜像很少,只有几兆 test
image: alpine
stages:
- deploy
before_script:
# 预先装 ssh-agent
- 'which ssh-agent || ( apk update && apk add openssh-client)'
# 启动服务
- eval $(ssh-agent -s)
# 将私钥写入deploy.key 文件
- echo "$SSH_PRIVATE_KEY" > deploy.key
# 配置较低权限
- chmod 0600 deploy.key
# 注入密钥
- ssh-add deploy.key
- mkdir -p ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
release-doc:
stage: deploy
script:
# 连接远程服务器并执行拉取代码的命令
- ssh markday@$DEPLOY_SERVER "cd /path/to/site && git pull origin master"
only:
- master
environment:
name: production
url: http://$DEPLOY_SERVER

过程中需要注意几点

  • 把服务器上生成的public key 添加到 authorized_keys
  • 在代码目录中添加 gitlab 远程仓库地址