今天实战练习了一下jblog的全自动构建环境配置,演练了一下jenkins安装配置,github webhook配置,sh脚本调整,一点点把jblog的全自动构建环境配置好!之所以搭建一个全自动构建环境,这是CI/CD系统学习之路的开端,终点是要消化一套支持java,ios,android.net的全能自动构建系统,有兴趣的可以关注公众号,坐等分享。
快速组建Java项目持续集成环境
https://github.com/guohai163/jblog
https://github.com/Lancker/jblog
https://jblog.joke.dog/
https://www.vultr.com/?ref=8078200 (大概30元一个月,就可以拥有一个自主实验环境,各种操作系统任性安装与更换)
安装jdk (免费的openjdk)
yum install java-1.8.0-openjdk* -y
java -version
导入环境变量
vim /etc/profile
---修改在尾部追加
export JAVA_HOME=/usr/lib/jvm/java
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar
export PATH=$PATH:$JAVA_HOME/bin
安装maven (jenkins也可自动安装,可以跳过)
yum -y install wget (如果没有wget可以安装一下)
wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz
tar -zxvf apache-maven-3.5.4-bin.tar.gz
vi /etc/profile
export MAVEN_HOME=/data/apache-maven-3.5.4
export PATH=$MAVEN_HOME/bin:$PATH
source /etc/profile
mvn -version
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
后台启动
nohup java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war --httpPort=8080 &
划重点:nohup一直执行,末尾的&是后台执行,java后带的参数指的是构建退出不要把相关的进程杀掉。
PS:这种情况出现在,构建机器与生产机器合用的情况,如果是远程到另一台机器,就不会有这个问题!可以使用另一种启动脚本
nohup java -jar /data/jenkins.war --httpPort=8080 &
依据提示登陆到jenkins安装界面,启动安装报错
无法连接到Jenkins 想不到需要连接国外网络 !连上国外网络后,正常安装。
采用Pipeline script form SCM,脚本直接在git配置中的Jenkinsfile文件中。
pipeline {
agent any
environment {
//目标服务器IP以及登陆名
TAG_SERVER = '[email protected]'
//目标服务器程序部署路径
TAG_PATH = '/data/jblog.guohai.org'
//目标服务器启动停止springboot脚本路径
TAG_SCRIPT = '/data/spring-boot.sh'
}
stages {
//构建块
stage ('build') {
steps {
script{
//获得maven程序路径
def mvnHome = tool 'maven 3.6.0'
//打包
sh "${mvnHome}/bin/mvn clean package"
echo "build over"
}
}
}
//联署块
stage ('deploy') {
steps {
//计算本地文件MD5
sh "md5sum ${WORKSPACE}/target/*.jar"
//因为我们要使用私钥来操作远程服务器内容,下面的代码块需要使用withCredentials括起来,其中credentialsId为在Jenkins里配置的证书。keyFileVariable为代码块中可以使用的变量名
// withCredentials([sshUserPrivateKey(credentialsId: 'guohai.org', keyFileVariable: 'guohai_org_key', passphraseVariable: '', usernameVariable: '')]) {
//拷贝本地JAR文件到服务器上
// sh "scp -i ${guohai_org_key} ${WORKSPACE}/target/*.jar ${TAG_SERVER}:${TAG_PATH}/${JOB_BASE_NAME}.jar"
//计算拷贝到服务器上的文件 MD5,确保与本地一致。避免因传输产生的错误。
// sh "ssh -i ${guohai_org_key} ${TAG_SERVER} md5sum ${TAG_PATH}/${JOB_BASE_NAME}.jar"
//使用脚本重启spring boot
// sh "ssh -i ${guohai_org_key} ${TAG_SERVER} ${TAG_SCRIPT} restart ${TAG_PATH}/${JOB_BASE_NAME}.jar"
// }
sh "${TAG_SCRIPT} stop ${TAG_PATH}/${JOB_BASE_NAME}.jar"
sh "cp ${WORKSPACE}/target/*.jar ${TAG_PATH}/${JOB_BASE_NAME}.jar"
sh "md5sum ${TAG_PATH}/${JOB_BASE_NAME}.jar"
sh "${TAG_SCRIPT} restart ${TAG_PATH}/${JOB_BASE_NAME}.jar --spring.config.location=/data/config/application.yml"
}
}
}
}
因为是同一台机器上进行自动构建与发布,所以对Jenkinsfile进行了适当调整,注释掉了跨服务器拷贝jar包的操作,新写了cp在当前服务器进行操作的sh脚本。真实的环境,应该是将构建服务器与生产服务器分开,所以这里仅注释掉,想在生产环境尝试的小伙伴,可以试试。具体可以参考 快速组建Java项目持续集成环境 。
Jenkinsfile仅完成jar传输,真正对站点进行重启操作还靠sh脚本完成。这个过程尝试了好多次,寻找了好久的问题。对原始的spring-boot.sh进行了调整,让其支持指定启动配置文件。
#!/bin/bash
SpringBoot=$2
startConfig=$3
echo $startConfig
if [ "$1" = "" ];
then
echo -e "/033[0;31m 未输入操作名 /033[0m /033[0;34m {start|stop|restart|status} /033[0m"
exit 1
fi
if [ "$SpringBoot" = "" ];
then
echo -e "/033[0;31m 未输入应用名 /033[0m"
exit 1
fi
function start()
{
count=`ps -ef |grep java|grep $SpringBoot|grep -v grep|wc -l`
if [ $count != 0 ];then
echo "$SpringBoot is running..."
else
echo "Start $SpringBoot success..."
BUILD_ID=dontKillMe nohup java -jar -Dlogging.path=/data/logs $SpringBoot $startConfig > /data/logs/nohup.out 2>&1 &
fi
}
function stop()
{
echo "Stop $SpringBoot"
boot_id=`ps -ef |grep java|grep $SpringBoot|grep -v grep|awk '{print $2}'`
count=`ps -ef |grep java|grep $SpringBoot|grep -v grep|wc -l`
if [ $count != 0 ];then
kill $boot_id
count=`ps -ef |grep java|grep $SpringBoot|grep -v grep|wc -l`
boot_id=`ps -ef |grep java|grep $SpringBoot|grep -v grep|awk '{print $2}'`
kill -9 $boot_id
fi
}
function restart()
{
stop
sleep 2
start
}
function status()
{
count=`ps -ef |grep java|grep $SpringBoot|grep -v grep|wc -l`
if [ $count != 0 ];then
echo "$SpringBoot is running..."
else
echo "$SpringBoot is not running..."
fi
}
case $1 in
start)
start;;
stop)
stop;;
restart)
restart;;
status)
status;;
*)
echo -e "/033[0;31m Usage: /033[0m /033[0;34m sh $0 {start|stop|restart|status} {SpringBootJarName} /033[0m/033[0;31m Example: /033[0m/033[0;33m sh $0 start esmart-test.jar /033[0m"
esac
其中startConfig是新增加,为了方便查看启动日志,调整了启动脚本。
一个是将输出定位到/data/logs/nohup.out,另一个则是开启了spring log.
BUILD_ID=dontKillMe nohup java -jar -Dlogging.path=/data/logs $SpringBoot $startConfig > /data/logs/nohup.out 2>&1 &
三,Github远程激活构建
提交代码后,让构建自动执行,省去人肉点。github提供了webhook功能。
3.1 找到jenkins的git webhook 配置
管理Jenkins->系统配置->git 高级,选择” 为 Github 指定另外一个 Hook URL ”
3.2 在github的仓库里找到项目的webhook配置,将刚才找到的url填写进去
收尾
今天的实验遇到的问题有几个,别人1小时能搞定的时候,花了一天啦!看看都有哪些坑?1,就是站点部署脚本跑完后,站点自动关掉了。这个是因为站点与构建环境在一台服务器上,jenkins部署脚本跑完后,启动的服务被关掉了。找到一串启动参数搞定。2.部署启动脚本,不支持指定配置文件,经过改造后支持了。
预告
这是持续集成系列的开端,到java,ios,android.net的全能自动构建系统,到云打包平台!关注公众号,坐等最新分享!
部署完成效果
在 github中提交代码后,会自动完成构建部署,可以看到最底下的版本号发生变化了!