配合Gitlab-CI自动编译部署Java Web项目

根据上一篇Docker环境下的Gitlab搭建和Gitlab-CI相关配置已经配置好了Gitlab和Gitlab-runner,这次就对公司的一个比较复杂的Spring Web项目配置自动部署。这里只介绍到了Gitlab CI的部分功能,没有介绍到的功能或者是付费版以上的功能,可以参考官方文档

添加.gitlab-ci.yml

在项目的根目录新增一个.gitlab-ci.yml文件

job

job是最基础的脚本单位,每一个job就是一个或是一组命令的集合,用我的一个job作为例子:

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
deploytest:
stage : deploytest
only:
- test
script :
- mvn clean deploy -f test-domain/pom.xml -q
- mvn clean deploy -f test-service-api/pom.xml -q
- mvn clean package -Psit -Dmaven.test.skip=true -q
- cp test-web/target/test-web-1.1-SNAPSHOT.war test-web-1.1-SNAPSHOT.war
- java -jar update.jar
- export LANG="en_US.UTF-8"
- ssh [email protected] "rm -rf /oracle/apps/test-web/temp"
- ssh [email protected] "rm -rf /oracle/apps/test-web/tempfile"
- ssh [email protected] "rm -rf /oracle/apps/test-web/WEB-INF/view/jsp/sysgen"
- ssh [email protected] "tar -zcf /oracle/apps/backup/test-web-bk`date +%Y%m%d%H%M%S`.tar.gz -C /oracle/apps/test-web ."
- scp -r product/test-web [email protected]:/oracle/apps
- ssh [email protected] "ps -ef|grep java|grep node_server1|grep -v grep|awk '{ print $2 }' | xargs kill -9 ||echo ok"
- ssh [email protected] "source /etc/profile;sh /oracle/wls12210/user_projects/domains/base_domain/bin/startNode_server1.sh"

sonar:
stage : test
tags :
- sonar
script :
- mvn --batch-mode package sonar:sonar -Dsonar.host.url=http://10.0.1.111:9000 -Dsonar.login=8c4c42038edc106c273a88bc03549f3bfafc6260 -Dsonar.gitlab.project_id=$CI_PROJECT_ID -Dsonar.analysis.mode=preview -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME

在这里定义了两个job,deploytest和sonar
deploytest这个job的名称和stage相同,里面的stage定义了他属于deploytest这个阶段
only标签指定了这个job只能在test分支运行,除了test分支以外的分支触发的pipeline是不会运行这个job的
script就是每个工作的命令组,runner会按顺序执行这些命令,在例子里,首先运行了打包的命令,然后运行了一个我自己写的jar包,根据git diff --name-only HEAD HEAD~1取出了增量的更新文件,然后删除服务器上的临时文件,部署最新的代码,并重启服务器
sonar是每次代码更新以后,都会在SonarQube服务器进行一次代码检查,出现代码质量问题时,开发人员不能将自己的分支合并进主分支
tag指定了只能有sonar tag的runner才能执行,这样可以区分开不同的工作流程

stages

stage是脚本执行中定义的“阶段”,例如:

1
2
3
4
stages:
- build
- test
- deploy

分别指定了构建,测试和部署三个阶段,每个阶段可以设定多个job,同一个阶段可以多线程执行多个job,但根据顺序,一个阶段执行完成以后,下一个阶段才能执行,不过一般不是很大的项目,搞太多的stage和分层job会搞得更麻烦,下面是我的项目stages代码,我设置的每一个stage只有一个job

1
2
3
4
stages:
- deploytest
- deployuat
- test

三个stage分别对应了测试分支的部署,准生产环境的部署和每个分支更新后都会执行的静态代码检查

before_script

before_script是在每一个pipeline执行前所执行的命令,在这一次pipeline中所有的job共享

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
before_script:
- 'which ssh-agent||(apt-get update -y && apt-get install openssh-client -y)'
- eval $(ssh-agent -s)
- chmod 600 key
- ssh-add key
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan 10.0.1.111 >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- '[[ -f /.dockerinit ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
- echo '<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
https://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>'$PWD'/.m2</localRepository>
</settings>' > $HOME/.m2/settings.xml

我这里主要设置了ssh私钥登录服务器,指定了maven的home路径,用于做cache提高速度

cache

1
2
3
cache:
paths:
- .m2/

cache的配置比较简单,主要是为了节省下载各类jar包的时间,加快编译速度,我这里把maven的目录做了缓存