过去我们团队的开发模式是,开发人员提交代码后,测试人员去拉取代码,然后编译启动,并开始测试。
这种方式:1 增加了测试人员的工作量 2 测试人员手动更新代码,编译启动,遇到问题不能自己解决,需要开发人员协助。很浪费时间。
gitlab的CI/CD功能可以实现项目的自动部署,开发人员提交代码后自动编译部署,无需人工干预。使开发和测试衔接的更紧密。
下面说说我们团队使用CI/CD的思路 1 提交代码后自动编译生成.jar 文件。 2 将 .jar 文件拷贝到指定目录。 3 运行 .jar
前期准备工作
- 需要 安装gitlab-runner
- 注册runner
- 编写.gitlab-ci.yml
- 编写 自动部署的shell 脚本
安装gitlab-runner ,注册runner 网上资料较多可自行百度
编写 .gitlab-ci.yml 脚本需要需要根据部署思路
variables:
VAR_PATH: "/home/gitlab-runner/aaa/bbb"
MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"
MAVEN_OPTS: "-Daven.repo.local=.m2/repository"
PID: 0
stages:
- build
- deploy
job1:
stage: build
only:
- master
script:
- ls -la ~/.ssh/
- cat ~/.ssh/known_hosts
- echo $CI_PROJECT_DIR
- cd $CI_PROJECT_DIR
- ls
- pwd
- mvn $MAVEN_CLI_OPTS clean package
artifacts:
paths:
- target/*.jar
job2:
stage: deploy
script:
- ls
- cp -rf target/*.jar $VAR_PATH
- bash deploy.sh helloword
# - cd $VAR_PATH
dependencies:
- job1
自动部署的shell 脚本
#!/bin/bash
if [ $# -ne 1 ]
then
echo "arguments error!"
exit 1
else
jarname=$1
echo $jarname
pid=`ps -ef | grep "$jarname-0.0.1-SNAPSHOT.jar"|grep -v grep|awk '{print $2}'`
for id in $pid
do
echo $id
kill -9 $id
echo "killed $id"
done
nohup java -jar /home/gitlab-runner/aaa/bbb/$jarname-0.0.1-SNAPSHOT.jar > /home/gitlab-runner/aaa/bbb/$jarname-log.log 2>&1 &
fi
过程中遇到的问题
最开始的时候不想 写deploy.sh脚本,因为在.gitlab-ci.yml 可以写 shell 脚本,但是在判断进程中是否已经运行,如果运行就需要先杀死进程再启动 .jar 程序。但是 .gitlab-ci.yml 中编写的linux shell 指令 无内容返回时 就会报错
$ ps -ef|grep helloword-0.0.1-SNAPSHOT.jar
gitlab-+ 10925 10923 0 11:34 ? 00:00:00 grep helloword-0.0.1-SNAPSHOT.jar
$ ps -ef|grep helloword-0.0.1-SNAPSHOT.jar|grep -v grep
ERROR: Job failed: exit status 1
在网上这篇文章的启发 编写了 shell脚本 部署成功