一 背景
项目采用SpringBoot架构,如果用传统的构建+发布的模式,QA要记录很多的环境配置,做很多机械的操作,容易增加出错的可能,工作效率比较低。
为了解决这个问题,我使用Jenkins作为持续集成工具,写了一个Shell脚本,可以自动清理服务器环境和启动对应的服务,大大提高了QA部署服务的工作效率。
二 使用资源
1)Gitee工程、Gitee账号。(公司项目是用codehub维护,我这里使用码云来演示)
2)Ubuntu18测试环境服务器。
3)Windows10 开发机器。
4)Shell脚本,主要功能清理服务器部署环境、启动服务。
4)Jenkin的web程序包。
三 操作时序图
四 安装和设置Jenkins
1)下载jenkins.war
下载地址:https://jenkins.io/download/
页面下部,点击红框里面的文件下载。
2)启动Jenkins
在任一安装了java环境的机器上都可以启动jenkins程序包
java -jar jenkins.war
在控制台会jenkins会输出初始化密钥
同样可以去电脑对应的文件目录里面找到这个key
b111033f1a404d799251929b4db3e14f
3)安装Jenkins
jenkins默认8080端口,访问 http://127.0.0.1:8080,输入上面的初始化密钥
点击继续,
选择安装推荐的插件
网络快的话,大概几分钟
创建一个自己的用户,保存并继续,
保存继续,
完成设置。
4)设置Jenkins
- 安装扩展插件
选择 可选插件
安装这几个[Pipeline Maven Integration]、[Maven Integration]、[Publish Over SSH]和[Gitee]。
勾选并选择直接安装。
- 系统设置
拉到页面的下部,配置远程测试服务器,
增加服务配置,
- 全局工具配置
分配设置maven配置文件、jdk目录、git安装目录和maven目录。
自己电脑上安装了git后,会默认读取git的安装进程的
- 创建构建任务
输入一个名字,例如我输入:helloPudding
进入配置页面,配置源代码,
构建环境中,选择 [Send files or execute commands over SSH after the build runs]
分两步操作
第一步 清理服务器环境 和 第二步 启动服务
服务器opt目录的树形结构是
goaloneService.sh 的脚步内容如下:
#!/bin/sh ## java env export JAVA_HOME=/lib/jvm/jdk1.8.0_181 export JRE_HOME=$JAVA_HOME/jre ## exec shell name EXEC_SHELL_NAME=$1\.sh ## service name SERVICE_NAME=$1 SERVICE_DIR=/opt JAR_NAME=$SERVICE_NAME\-0.0.1-SNAPSHOT.jar TIME_STR=$(date +%Y%m%d%H%M%S) PID=pid/$SERVICE_NAME\.pid WORK_DIR=$SERVICE_DIR/servicespace/$1 #function start start(){ cd $WORK_DIR if [ ! -d "log" ]; then mkdir log fi nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME > log/$SERVICE_NAME.out 2>&1 & echo $! > $PID echo "**************** start $SERVICE_NAME success ****************" } # function stop stop(){ cd $WORK_DIR if [ -f "$PID" ]; then kill `cat $PID` rm -rf $PID fi echo "**************** stop $SERVICE_NAME ****************" sleep 6 TEMP_PID=`ps -ef | grep -w "$SERVICE_NAME" | grep "java" | awk '{print $2}'` if [ "$TEMP_PID" = "" ]; then echo "**************** $SERVICE_NAME process not exists or stop success ****************" else echo "**************** $SERVICE_NAME process pid is [$TEMP_PID] ****************" kill -9 $TEMP_PID fi echo "**************** stop $SERVICE_NAME success ****************" } # function clean clean(){ cd $WORK_DIR if [ ! -d "lastDeploy" ]; then mkdir lastDeploy fi if [ -f "$JAR_NAME" ]; then mv $JAR_NAME lastDeploy/$JAR_NAME$TIME_STR fi } case "$2" in start) start ;; stop) stop ;; restart) stop sleep 2 start echo "**************** restart $SERVICE_NAME success ****************" ;; clean) stop sleep 2 clean echo "**************** clean $SERVICE_NAME success ****************" ;; *) ## restart stop sleep 2 start ;; esac exit 0
配置maven打包命令,并跳过单元测试。
- 执行构建任务
控制台输出部分日志:
[INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.670 s [INFO] Finished at: 2018-08-30T18:25:56+08:00 [INFO] Final Memory: 35M/333M [INFO] ------------------------------------------------------------------------ Waiting for Jenkins to finish collecting data [JENKINS] Archiving C:\Users\xxx\.jenkins\workspace\helloPudding\pom.xml to com.goalone/helloPudding/0.0.1-SNAPSHOT/helloPudding-0.0.1-SNAPSHOT.pom [JENKINS] Archiving C:\Users\xxx\.jenkins\workspace\helloPudding\target\helloPudding-0.0.1-SNAPSHOT.jar to com.goalone/helloPudding/0.0.1-SNAPSHOT/helloPudding-0.0.1-SNAPSHOT.jar SSH: Connecting from host [DESKTOP-DFCKDKK] SSH: Connecting with configuration [Test182] ... channel stopped SSH: EXEC: STDOUT/STDERR from command [cd /opt sh ./goaloneService.sh helloPudding clean] ... **************** stop helloPudding **************** **************** helloPudding process not exists or stop success **************** **************** stop helloPudding success **************** **************** clean helloPudding success **************** SSH: EXEC: completed after 8,230 ms SSH: EXEC: STDOUT/STDERR from command [cd /opt sh ./goaloneService.sh helloPudding start] ... **************** start helloPudding success **************** SSH: EXEC: completed after 202 ms SSH: Disconnecting configuration [Test182] ... SSH: Transferred 1 ( 0 + 1 ) file(s) Finished: SUCCESS
部署成功。
五 讨论扩展
- jenkins是主流的持续集成工具,配置简单,使用方便,配合shell脚本很容易操作服务器。类似的产品也有很多,详情请来 https://www.oschina.net/p/jenkins/related 了解。
- 这里是通过java命令启动jar包,现在虚拟化技术比较流行,可以配合docker进行持续集成。
- jenkins的功能还有很多,有时间可以详细挖掘一下。
六 参考资料
https://www.jianshu.com/p/ba09cdc53343