Spring Boot使用GitLab CI自动部署

定义场景

spring boot应用在手动部署过程中主要分为两步,打包编译与上传部署(也可能存在测试环境,但由于该项目目前只有我开发,并未写测试用例)。同样的在gitlab-ci文件中也定义相应的两步骤

1
2
3
stages:
- build
- deploy

编译

使用GitLab公共CI服务为Spring Boot打包编译。image定义所使用的docker镜像,stage指定场景,script打包脚本(跳过测试阶段),artifacts定义需要归档的文件,only指定仅release分支打包(支持正则表达式)

1
2
3
4
5
6
7
8
9
release-build:
image: maven:3.5.2-jdk-8
stage: build
script: "mvn package -B -Dmaven.test.skip=true"
artifacts:
paths:
- target/bill-server.jar
only:
- /^release-.*$/

部署

配置文件的结构与编译的基本一直,这里使用ubuntu镜像,如果您使用的yam请替换相应的命令。如果您使用自己的CI Runner(shell),建议密钥存放在自己的服务器上,手动配置实现对部署服务器的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
30
31
32
33
34
35
36
release-deploy:
image: ubuntu
stage: deploy
script:

- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client git -y )'
- eval $(ssh-agent -s)
##
## Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store
## We're using tr to fix line endings which makes ed25519 keys work
## without extra base64 encoding.
## https://gitlab.com/gitlab-examples/ssh-private-key/issues/1#note_48526556
##
# Generate the private/public key pair using:
#
# ssh-keygen -f deploy_key -N ""
#
# then set the $SSH_PRIVATE_KEY environment variable in the CI (Travis-CI,
# GitLab-CI, ...) to the base64 encoded private key:
#
# cat deploy_key | base64 -w0
#
# and add the public key `deploy_key.pub` into the target git repository (with
# write permissions).
- ssh-add <(echo "$SSH_PRIVATE_KEY" | base64 --decode)

- mkdir -p ~/.ssh
- chmod 700 ~/.ssh

- ssh-keyscan 119.28.1.107 >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- scp target/bill-server.jar ubuntu@119.28.1.107:bill
- ssh ubuntu@119.28.1.107 "cd bill; sh bill-start.sh"

only:
- /^release-.*$/

其中shell脚本,与我的另一篇博客类似,稍做修改就行

参考文档