JBlog自动构建环境搭建 实战练习jenkins+sh+spring+java+github webhook 自动构建博客系统

今天实战练习了一下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* -yjava -version导入环境变量vim /etc/profile---修改在尾部追加export JAVA_HOME=/usr/lib/jvm/javaexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jarexport 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.gztar -zxvf apache-maven-3.5.4-bin.tar.gzvi /etc/profileexport MAVEN_HOME=/data/apache-maven-3.5.4export PATH=$MAVEN_HOME/bin:$PATHsource /etc/profilemvn -version

操作步骤

一、安装jenkins

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 想不到需要连接国外网络!连上国外网络后,正常安装。

二、配置构建

2.1 jenkins job配置

采用Pipeline script form SCM,脚本直接在git配置中的Jenkinsfile文件中。

2.2 解读Jenkinsfile

pipeline {  agent any  environment {    //目标服务器IP以及登陆名    TAG_SERVER = 'guohai@guohai.org'    //目标服务器程序部署路径    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项目持续集成环境 。

2.3 站点重启bash脚本

Jenkinsfile仅完成jar传输,真正对站点进行重启操作还靠sh脚本完成。这个过程尝试了好多次,寻找了好久的问题。对原始的spring-boot.sh进行了调整,让其支持指定启动配置文件。

#!/bin/bashSpringBoot=$2startConfig=$3echo $startConfigif [ "$1" = "" ];then    echo -e "\033[0;31m 未输入操作名 \033[0m  \033[0;34m {start|stop|restart|status} \033[0m"    exit 1fiif [ "$SpringBoot" = "" ];then    echo -e "\033[0;31m 未输入应用名 \033[0m"    exit 1fifunction 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中提交代码后,会自动完成构建部署,可以看到最底下的版本号发生变化了!​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Delphi的网络远程唤醒代码,网络上的代码错误很多,这是修改好的可执行源代码,经过测试,能正常唤醒支持网络唤醒的计算机。该代码非常实用。 procedure WakeUp(SAddr: string); var WSAData: TWSAData; MSocket: TSocket; SockAddrIn: TSockAddrIn; RetVal, OptVal, i: Integer; MacAddr: array[0..5] of Byte; MagicData: array[0..101] of Byte; Position: Longint; begin try if Length(SAddr) 17 then Abort; for i := 1 to Length(SAddr) do if i in [3, 6, 9, 12, 15] then if SAddr[i] '-' then Abort; for i := 0 to High(MacAddr) do begin if Pos('-', SAddr) > 0 then MacAddr[i] := StrToInt(HexDisplayPrefix + Copy(SAddr, 1, Pos('-', SAddr) - 1)) else MacAddr[i] := StrToInt(HexDisplayPrefix + SAddr); //Delete 是删除一个 字符串中的 某部分字符 //Delete(str, index, count) // str, //被删除的字符串 // index, //从第几个字符开始删除 // count //删除几个 //Delete(S, 2, 2); 就是从S中的第二个开始删除,删除2个字符即2、3. //Pos(a,b); 取出子串a,在父串b中第一次出现的位置; //Pos'b','abcd'); 返回结果是:2 Delete(SAddr, 1, Pos('-', SAddr)); end; except //application.MessageBox('网卡地址错误','警告',MB_ICONWARING); 错误:MB_ICONWARING application.MessageBox('网卡地址错误', '警告', MB_ICONWARNING); exit; end; try CheckWinSockResult(WSAStartup($0101, WSAData), 'WSAStartup'); MSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); if MSocket = INVALID_SOCKET then CheckWinSockResult(MSocket, 'socket'); OptVal := 1; CheckWinSockResult(setsockopt(MSocket, SOL_SOCKET, SO_BROADCAST, PChar(@OptVal), SizeOf(OptVal)), 'setsockopt'); FillChar(MagicData, SizeOf(MagicData), $FF); Position := LEN_PHYSADDR; while Position < SizeOf(MagicData) do begin Move(MacAddr, Pointer(Longint(@MagicData) + Position)^, LEN_PHYSADDR); Inc(Position, LEN_PHYSADDR); end; SockAddrIn.sin_family := AF_INET; SockAddrIn.sin_addr.S_addr := Longint(INADDR_BROADCAST); RetVal := sendto(MSocket, MagicData, SizeOf(MagicData), 0, SockAddrIn, SizeOf(SockAddrIn)); if RetVal = SOCKET_ERROR then CheckWinSockResult(RetVal, 'sendto'); CheckWinSockResult(closesocket(MSocket), 'closesocket'); CheckWinSockResult(WSACleanup, 'WSACleanup'); except exit; end; end;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值