项目使用 gitlab-ci 做持续集成持续部署

本教程中使用到的 maven、gradle、docker、docker-compose、shell 类型 runner,需要提前创建好,参考:gitlab-runner 配置

Maven 项目构建

.gitlab-ci.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
pre:
stage: .pre
tags:
# 如果需要使用到 mvn 命令,这里 tags 需要指定 maven,如果同时用到 docker 命令,可配置多个:比如 maven、docker
- maven
before_script:
- mvn -v
script:
# 当前在项目根目录
- pwd
# 执行打包
- mvn clean package -DskipTests=true
artifacts:
paths:
# 把打包好的项目缓存起来,供后续的 stage 阶段使用
- ./target/*.jar

Gradle 项目构建

.gitlab-ci.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
pre:
stage: .pre
tags:
# 如果需要使用到 gradle 命令,这里 tags 需要指定 gradle
- gradle
before_script:
- gradle -v
script:
- pwd
# -x test:跳过测试;--build cache:开启cache、--parallel:开启并行模式,减少构建时间
- gradle build -x test --parallel --build-cache --warning-mode all --stacktrace
artifacts:
paths:
# 把打包好的项目缓存起来,供后续的 stage 阶段使用
- ./build/libs/maxkey-mgt.jar

构建 Docker 镜像

这里使用的几个变量是在 gitlab 配置好的
harbor地址:$CI_HARBOR_REGISTRY
harbor登录用户:$CI_HARBOR_REGISTRY_USER
harbor登录密码:$CI_HARBOR_REGISTRY_PASSWORD

.gitlab-ci.yml

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
30
31
build_mgt:
stage: build
tags:
# 如果单单用到 docker 命令,tags 可以指定 docker 即可
# - docker
# 如果同时用到 docker 和 docker-compose 命令,tags 可以指定 docker-compose
- docker-compose
variables:
BUILD_IMAGE_NAME: "wx-admin:$CI_PIPELINE_ID"
BUILD_PATH: wx-admin
script:
- pwd
- cd $BUILD_PATH
- pwd
# 进入到有 Dockerfile 的目录,执行命令构建镜像,注意最后的‘.’号
- docker build -t $BUILD_IMAGE_NAME .
# 如果需要 push 到 harbor,需要 tag 一下
- docker tag $BUILD_IMAGE_NAME $CI_HARBOR_REGISTRY_IMAGE/$BUILD_IMAGE_NAME
# 登录 harbor
- docker login $CI_HARBOR_REGISTRY -u $CI_HARBOR_REGISTRY_USER -p $CI_HARBOR_REGISTRY_PASSWORD
# 将镜像 push 到远端 harbor
- docker push $CI_HARBOR_REGISTRY_IMAGE/$BUILD_IMAGE_NAME
# 镜像已经 push 到远端 harbor,本地镜像可删除掉,节省空间
- docker rmi $CI_HARBOR_REGISTRY_IMAGE/$BUILD_IMAGE_NAME
- docker rmi $BUILD_IMAGE_NAME
# docker-compose 中可以使用环境变量
- export IMAGE=$CI_HARBOR_REGISTRY_IMAGE/$BUILD_IMAGE_NAME
- export FOLDER=/data/docker/wx-admin
# 使用 docker-compose 部署项目
- docker-compose down
- docker-compose up -d

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
version: '3.8'

services:
wx-admin:
image: "${IMAGE}"
container_name: wx-admin
volumes:
- "${FOLDER}/logs:/home/grg/logs"
environment:
- "TZ=Asia/Shanghai"
ports:
- 8080:8080
restart: always

SSH 部署到远程主机

.gitlab-ci.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
deploy_mgt:
stage: deploy
tags:
# 如果需要用到 ssh、scp等命令,这里 tage 需要指定 shell
- shell
variables:
- SERVER: yl@127.0.0.1
- IMAGE: "wx-admin:$CI_PIPELINE_ID"
- FOLDER: /data/docker/wx-admin
script:
# 需要先在受控主机上建好项目部署目录
- ssh -t $SERVER "mkdir -p $FOLDER"
# 进入目录
- cd $FOLDER
# 发送项目的 docker-compose.yml 文件到目录先
- scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -r docker-compose.yml $SERVER:$FOLDER
- ssh -t $SERVER "cd $FOLDER && export IMAGE=$IMAGE && export FOLDER=$FOLDER && docker-compose down && docker-compose up -d"

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
version: '3.8'

services:
wx-admin:
image: "${IMAGE}"
container_name: wx-admin
volumes:
- "${FOLDER}/logs:/home/grg/logs"
environment:
- "TZ=Asia/Shanghai"
ports:
- 8080:8080
restart: always

gitlab-runner 免密登录受控主机

情况一:受控主机已经存在~/.ssh/authorized_keys

将 gitlab-runner 的 id_rsa.pub 追加到 受控主机的 authorized_keys 文件

参考命令

1
2
3
4
5
6
7
# 使用 gitlab-runner 用户登录 gitlab-runner 容器
docker exec -it -u gitlab-runner gitlab-runner sh
# 容器内执行
## 进入用户目录
cd ~
## 拷贝公钥到受控主机
ssh-copy-id -i .ssh/id_rsa.pub -p22 user@ip

也可以自己手动 copy 过去。

注意:容器内.ssh/id_rsa.pub已经最好持久化到宿主机。

情况二:受控主机不存在~/.ssh/ authorized_keys

在受控主机创建目录和文件

1
2
3
4
5
6
# 如果没有.ssh目录,手动创建
cd ~
mkdir .ssh
# 如果没有 authorized_keys 文件,手动创建一个
cd .ssh
touch authorized_keys

配置权限

1
2
3
4
5
6
# 将.ssh目录的权限为700
cd ~
chmod -R 700 .ssh
# 将 authorized_keys 目录的权限为600
cd ~/.ssh
chmod -R 600 authorized_keys

接下来可按照情况一步骤操作。

  • 本文作者: forever杨
  • 本文链接: https://blog.yl-online.top/posts/837de91.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。如果文章内容对你有用,请记录到你的笔记中。本博客站点随时会停止服务,请不要收藏、转载!