GitLab CI 示例:Docker 镜像打包发布 & SSH 部署

目标

当我们 push 代码到 git 仓库时,将项目部署到目标服务器上,具体步骤:

- 基于代码仓库中的 Dockerfile 构建代码镜像
- 将构建的代码镜像推送到我们的私有镜像仓库
- 通过 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
29
stages:
- build
- deploy

variables:
TARGET_IMAGE: $REGISTRY_ADDR/maslow/ci-example-app:latest
DOCKER_DRIVER: overlay2

build:
image: docker:stable
stage: build
script:
- docker login -u $REGISTRY_USER -p $REGISTRY_PASSWORD $REGISTRY_ADDR
- docker pull $TARGET_IMAGE || true # for docker build caching
- docker build --cache-from $TARGET_IMAGE --tag $TARGET_IMAGE .
- docker push $TARGET_IMAGE

deploy:
image: ubuntu:latest
stage: deploy
script:
- 'which ssh-agent || (apt-get update -y && apt-get install openssh-client -y)'
- eval $(ssh-agent -s)
- echo "$SERVER_SSH_PRIV_KEY" > deploy.key
- mkdir -p ~/.ssh
- chmod 0600 deploy.key
- ssh-add deploy.key
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
- ssh root@$SERVER_ADDR "docker run -d -P ${TARGET_IMAGE}"

这段 CI 脚本有两个 stage:

- build  # 根据代码目录下的 Dockerfile 构建镜像,并 push 到镜像仓库
- deploy # 通过 ssh 连接目标服务器,远程执行部署指令

其中用到了一些预定义了一些环境变量:

- REGISTRY_ADDR   # 私有镜像仓库的地址,例如:registry.cn-hangzhou.aliyuncs.com
- REGISTRY_USER   # 私有镜像仓库用户名
- REGISTRY_PASSWORD     # 私有镜像仓库密码
- SERVER_SSH_PRIV_KEY   # 登陆目标服务器的私钥
- SERVER_ADDR           # 目标服务器的地址

预定义的环境变量并不在 .gitlab-ci.yml 中定义,因为它们往往是一些敏感信息,具体的设置方式是提前在 GitLab Web 端代码仓库设置页面填写:Settings > CI/CD > Variables

参考链接