CI/CD—使用新版云效流水線自動部署Java項目
兩大基本前提:
1、有一個自己的云服務(wù)器
2、項目代碼已經(jīng)提交到代碼倉庫,如gitee,github等
為什么需要流水線
1、除了第一次需要新建流水線,配置腳本外,后續(xù)所有的部署只需要提交代碼后,點擊運行流水線就行 。
2、流水線還可以回滾,此功能太過友好了。
3、當(dāng)然,你也可以選擇jenkins,這就仁者見仁,智者見智了。
由于我的服務(wù)器已經(jīng)部署過Java項目,所以相應(yīng)的部署環(huán)境都有了,包括JDK,MySQL,redis等等,所以此博客不再贅述如何安裝各種環(huán)境,如果沒有服務(wù)器,也沒有部署過項目,可參考我的另一篇博客,詳細講述了如何申請免費服務(wù)器,準(zhǔn)備項目運行所需環(huán)境,以及具體如何部署的細節(jié):
從零開始,Java個人項目部署上線,并能在公網(wǎng)訪問
一、流水線配置
1、百度搜索“云效流水線”,進入云效
2、選擇免費使用,并登陸阿里云賬號
3、選擇我的流水線—>新建流水線
4、選擇流水線模板(可以根據(jù)需求選擇不同模板)
5、流水線配置
①選擇代碼源:比如碼云就是gitee,這里以碼云示例
②添加服務(wù)器連接:碼云的授權(quán),非常簡單,按提示操作
③代碼倉庫:配置服務(wù)器連接后,自動掃描獲取到了你的所有項目
④選擇默認分支:一般是開發(fā)分支,而不是master分支,具體看平時提交到哪個分支
⑤開啟分支模式(企業(yè)中肯定是要開啟的,這里只是個人項目,不需要開啟)
⑥工作目錄:可以自定義,也可以不需要管,我這里不管
6、流水線:Java構(gòu)建上傳編輯
注意一下:
這里分為Java構(gòu)建 和 構(gòu)建物上傳,Java構(gòu)建一目了然,一般情況下不需要改就行,構(gòu)建物上傳的話,就需要特別注意打包路徑了,我這里需要配置兩行,一行是jar包配置,一行是部署腳本配置。部署腳本后面會提供并解釋(我一直擔(dān)心各位看不清圖片,試試右鍵在新標(biāo)簽頁打開圖片吧)。
推薦本地打包一下,查看打包后的jar包名稱是什么,別配置錯了。各位此處唯一需要更改的就是jar包名稱。
7、流水線:主機部署編輯
可以看到,需要注意三點,其他不需要變,直接選擇即可:
主機組:新建主機組,可以根據(jù)實際情況,如果是購買的阿里云的服務(wù)器,選第一個,如果是騰訊云,華為云之類的非阿里云服務(wù)器,選第二個?;蛘邲]有服務(wù)器,選第三個。我這里是選擇的第一個作為示例。這方面我沒遇到任何阻礙,很簡單,自行摸索。
下載路徑:這個下載路徑可以不需要更改,只需要注意記住就是,后面的部署腳本需要填寫這個配置。
部署腳本:由于前面阿里云已經(jīng)構(gòu)建完成,在下載路徑會有對應(yīng)的package.tar的壓縮包,所以部署腳本存在的目的,就是解壓這個壓縮包到指定路徑,并執(zhí)行我們項目中的腳本文件,我的部署腳本如下:
mkdir -p /home/admin/spring-boot-template-1.0-SNAPSHOT
tar zxvf /home/admin/app/package.tgz -C /home/admin/spring-boot-template-1.0-SNAPSHOT/
sh /home/admin/spring-boot-template-1.0-SNAPSHOT/deploy.sh restart
非常好理解:各位唯一需要對應(yīng)更改的地方就是將腳本中所有的spring-boot-template-1.0-SNAPSHOT更改為你的jar包名稱即可,其他無需更改。
部署策略:隨便都行,看你自己選,不影響部署結(jié)果。
至此,流水線配置完成了。雖然我寫的多,那是我習(xí)慣性的保姆意識導(dǎo)致的,其實流程非常短,且簡單。
二、項目配置
項目配置需要注意兩點:
其一腳本文件deploy.sh,其二pom文件打包命令
注意一下,別混淆了項目中的腳本文件,和流水線中的部署腳本。流水線中的部署腳本用于解壓項目構(gòu)建后的壓縮包,以及執(zhí)行deploy.sh文件。而deploy.sh文件則是具體的部署腳本,包含了最基本的nohup java -jar xxx.jar &這個基本的部署命令。
1、腳本文件deploy
文件位置:項目最外層,與pom文件同一層級
文件內(nèi)容:
#!/bin/bash
#修改APP_NAME為云效上的應(yīng)用名
APP_NAME=spring-boot-template-1.0-SNAPSHOT
PROG_NAME=$0
ACTION=$1
APP_START_TIMEOUT=20 # 等待應(yīng)用啟動的時間
APP_PORT=8088 # 應(yīng)用端口
HEALTH_CHECK_URL=http://127.0.0.1:${APP_PORT}/first # 應(yīng)用健康檢查URL
HEALTH_CHECK_FILE_DIR=/home/admin/status # 腳本會在這個目錄下生成nginx-status文件
APP_HOME=/home/admin/${APP_NAME} # 從package.tgz中解壓出來的jar包放到這個目錄下
JAR_NAME=${APP_HOME}/target/${APP_NAME}.jar # jar包的名字
JAVA_OUT=${APP_HOME}/logs/start.log #應(yīng)用的啟動日志
#創(chuàng)建出相關(guān)目錄
mkdir -p ${HEALTH_CHECK_FILE_DIR}
mkdir -p ${APP_HOME}/logs
usage() {
echo "Usage: $PROG_NAME {start|stop|restart}"
exit 2
}
health_check() {
exptime=0
echo "checking ${HEALTH_CHECK_URL}"
while true
do
status_code=`/usr/bin/curl -L -o /dev/null --connect-timeout 5 -s -w %{http_code} ${HEALTH_CHECK_URL}`
if [ "$?" != "0" ]; then
echo -n -e "\rapplication not started"
else
echo "code is $status_code"
if [ "$status_code" == "200" ];then
break
fi
fi
sleep 1
((exptime++))
echo -e "\rWait app to pass health check: $exptime..."
if [ $exptime -gt ${APP_START_TIMEOUT} ]; then
echo 'app start failed'
exit 1
fi
done
echo "check ${HEALTH_CHECK_URL} success"
}
start_application() {
echo "starting java process"
nohup java -jar ${JAR_NAME} > ${JAVA_OUT} 2>&1 &
echo "started java process"
}
stop_application() {
checkjavapid=`ps -ef | grep java | grep ${APP_NAME} | grep -v grep |grep -v 'deploy.sh'| awk '{print$2}'`
if [[ ! $checkjavapid ]];then
echo -e "\rno java process"
return
fi
echo "stop java process"
times=60
for e in $(seq 60)
do
sleep 1
COSTTIME=$(($times - $e ))
checkjavapid=`ps -ef | grep java | grep ${APP_NAME} | grep -v grep |grep -v 'deploy.sh'| awk '{print$2}'`
if [[ $checkjavapid ]];then
kill -9 $checkjavapid
echo -e "\r -- stopping java lasts `expr $COSTTIME` seconds."
else
echo -e "\rjava process has exited"
break;
fi
done
echo ""
}
start() {
start_application
health_check
}
stop() {
stop_application
}
case "$ACTION" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
usage
;;
esac
內(nèi)容很長,不管,直接負責(zé)粘貼即可,需要更改的地方就三個。
其一是APP_NAME改為你的jar包名稱;
其二是APP_PORT改為你的項目端口號;
其三是健康檢查接口,改為你自己項目的隨便一個接口,最好是個無需登錄授權(quán)的接口;
2、pom文件
pom打包插件如下配置:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<includeSystemScope>true</includeSystemScope>
<mainClass>cn.ycl.DemoApplication</mainClass>
</configuration>
</plugin>
唯一需要改的是mainClass,改為你自己的啟動類(寫到這里突然發(fā)現(xiàn),我腦子里已經(jīng)沒有ssm了,只有spring boot。話說現(xiàn)在才搞持續(xù)部署,應(yīng)該是新項目吧,新項目不可能是ssm吧)
我這里貼出我的健康檢查接口,僅供參考
將以上所有更改提交并push到線上git,然后就可以回到流水線,直接點運行了。
3、特別注意一下:
其一,如果你的前文提到的流水線打包路徑配的不正確,有可能會出現(xiàn)構(gòu)建成功,部署成功,但是其實壓根啥都沒運行的情況,所以構(gòu)建日志一點要看,尤其是構(gòu)建的最后一步,構(gòu)建物上傳,請仔細查看,是否出現(xiàn)No file or directory find 之類的語句,出現(xiàn)了,代表你工作目錄配錯了。
其二,部署日志也要看,只有出現(xiàn)如下健康檢查接口通過了,才是部署成功
如果部署失敗了,別急,去看項目日志,根據(jù)deploy.sh文件中的配置,應(yīng)用的啟動日志在這里:
JAVA_OUT=${APP_HOME}/logs/start.log
如果start.log中確實有錯誤提示,那么就是你jar包的問題,流水線是沒問題的。要么百度,要么直接修改,解決了重新運行流水線就行。
4、我的項目地址
https://gitee.com/judgebymom/spring-boot-template.git
如果各位使用自己的項目無法進行流水線部署,或者說總是失敗,可以使用我這個項目試一下,可以fork到自己倉庫,方便gitee授權(quán)。如此,任何更改都不需要,直接創(chuàng)建流水線,運行即可。用于參照。祝各位一次成功,無需我的項目。
博主也是自己摸索成功的,走了非常多的彎路,上面所有的“注意一下”,以及"特別提醒",都是我走過的彎路,一些更離譜的錯誤,如果根據(jù)文章按部就班操作,是不會出現(xiàn)的,就不提了。文章來源:http://www.zghlxwxcb.cn/news/detail-455347.html
–我是“道祖且長”,一個在互聯(lián)網(wǎng)"茍且偷生"的Java程序員
“有任何問題,可評論,我看到就會回復(fù)”文章來源地址http://www.zghlxwxcb.cn/news/detail-455347.html
到了這里,關(guān)于CI/CD---使用新版云效流水線自動部署Java項目的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!