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 = '[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項目持續集成環境 。

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中提交代碼後,會自動完成構建部署,可以看到最底下的版本號發生變化了!​

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章