使用Generic Webhook Trigger插件實現Jenkins+WebHooks(雲效)持續集成


使用Generic Webhook Trigger插件實現Jenkins+WebHooks(雲效)持續集成

一,業務背景

我們在開發的時候,特別是前后端分離的時候,前端需要我們后端提供的API接口,可能需要每次有一個接口的變動都需要重新部署到dev環境上,例如:最常見的Git工作流的方式,develop和master是分開的,在開發過程中提交的代碼首先合並到develop上,如下圖:

如果,使用Jenkins做集成工具,每次有代碼合並的時候,也需要手動的去構建:

這是一件很繁瑣的事情,如何實現當代碼自動提交到develop分支的時候自動觸發構建功能,目前,有效的解決方案是使用“鈎子”。

鈎子功能(callback),是幫助用戶push了代碼后,自動回調一個您設定的http地址。 這是一個通用的解決方案,用戶可以自己根據不同的需求,來編寫自己的腳本程序(比如發郵件,自動部署等)。

這里就學習一下代碼托管在雲效平台上,使用通用的“Generic Webhook Trigger” 插件實現。

關於“雲效”WebHooks的介紹及使用請參考:https://thoughts.aliyun.com/sharespace/5e8c37eb546fd9001aee8242/docs/5fe1ba4220764b001fa6b725

二,准備工作

1.安裝Generic Webhook Trigger插件

在“系統設置–插件管理–可選插件”界面搜索:Generic Webhook Trigger,可以看到,點擊安裝,然后重啟。

這里是我已經裝過,所以在“已安裝”界面給大家看一下!

三,搭建工作

一、創建Job

這里我的是自由風格項目,

二、配置Job

1)源碼管理

2)構建觸發器

由HTTP請求觸發http://JENKINS_URL/generic-webhook觸發器/調用

Git存儲庫中有一些配置示例。

你可以在這里擺弄JSONPath。您可能還想在這里檢查語法。

您可以在這里擺弄XPath。您可能還想在這里檢查語法。

你可以在這里擺弄正則表達式。您可能還想在這里檢查語法。

如果您的作業沒有參數化,那么解析的變量只會貢獻給構建。如果您的作業是參數化的,並且您解析了與這些參數同名的變量,那么在觸發作業時插件將填充這些參數。例如,這意味着您可以將參數與SCM插件(如GIT插件)結合使用來選擇分支。

3)定義post請求中的變量

4)post 請求url加密令牌

5)拉取代碼倉庫的條件

6)構建作業的條件

7) 執行shell開始構建作業

四,構建shell代碼

# 定義打印變量信息的函數
function print_info() {
	echo "${ref}"
	echo "${project}"
}

print_info
# 開始編譯代碼
mvn clean package -DskipTests

# 定義dev分支的函數
function branch_dev() {
	echo "dev"
	service_ip=`netstat -lntp | grep 9181 | awk '{print $7}' | awk -F'/' '{print $1}'`
	api_ip=`netstat -lntp | grep 9100 | awk '{print $7}' | awk -F'/' '{print $1}'`
        kill -9 $service_ip $api_ip
	sleep 3
	cd /app/apps/ && tar czf skyfish.tar.gz skyfish-core-service*.jar skyfish-shop-api*.jar
	mkdir  /yunyu_down/${BUILD_NUMBER}
	mv /app/apps/*.tar.gz  /yunyu_down/${BUILD_NUMBER}/
	cp /var/lib/jenkins/workspace/skyfish-test/skyfish-shop-api/target/*.jar /app/apps/
	cp /var/lib/jenkins/workspace/skyfish-test/skyfish-core-service-build/target/*.jar /app/apps/
        bash /root/test_execute.sh
}

    # 腳本的代碼
[root@skyfish-studio-test ~]# vim test_execute.sh 
sleep 3
nohup java -jar  -Xms128M -Xmx1024M /app/apps/skyfish-core-service-build*.jar --spring.config.location=/app/apps/config/skyfish-core-service-build/ >> /app/logs/skyfish-core-service-build/catalina.out &
nohup java -jar  -Xms128M -Xmx1024M /app/apps/skyfish-shop-api-0.0.1*.jar --spring.config.location=/app/apps/config/skyfish-shop-api/ >> /app/logs/skyfish-shop-api/catalina.out &


# 定義master分支的函數
function branch_master() {
	echo "master"
	rsync skyfish-core-service-build/target/*.jar root@172.16.1.1:/app/apps/
	rsync skyfish-shop-api/target/*.jar root@172.16.1.1:/app/apps/
	
	cat > /root/master_excute.sh <<- ENDEOF
	cd /app/apps/ && tar czf skyfish.tar.gz skyfish-core-service*.jar skyfish-shop-api*.jar
	mkdir -p  /yunyu_down/${BUILD_NUMBER}/
	mv /app/apps/*.tar.gz  /yunyu_down/${BUILD_NUMBER}/
	api_port=\$(netstat -lntp | grep 9100 | awk '{print \$7}' | awk -F'/' '{print \$1}')
	service_port=\$(netstat -lntp | grep 9181 | awk '{print \$7}' | awk -F'/' '{print \$1}')
	if [[ -z \$api_port ]];then 
	    echo '沒有啟動api服務 不用kill掉 直接啟動就好了'; 
	else 
	    kill -9 \$api_port &> /dev/null 
	fi
	
	if [[ -z \$service_port ]];then 
	    echo '沒有啟動service服務 不用kill掉 直接啟動就好了'; 
	else 
	    kill -9 \$service_port &> /dev/null 
	fi
	ENDEOF
	chmod +x /root/master_excute.sh
	rsync /root/master_excute.sh root@172.16.1.1:/root/
	expect <<- EOF
	spawn ssh -tt 172.16.1.1
	expect {
	"Compute Service !" {send "bash /root/master_excute.sh\r"}}
	expect eof
	EOF
}
	
# 判斷post請求觸發的那個分下的環境 代碼部署到相應的環境中
if [ $ref == "refs/heads/master" ];then
	branch_master
	sleep 3
	expect <<- EOF
	spawn ssh -tt 172.16.1.1
	expect {
	"Compute Service !" {send "nohup java -jar -Xms128M -Xmx2048M /app/apps/skyfish-core-service-build-0.0.1-SNAPSHOT.jar --spring.config.location=/app/apps/config/skyfish-core-service-build/ >> /app/logs/skyfish-core-service-build/catalina.out &\r";exp_continue}
	"stderr to stdout" {send "nohup java -jar  -Xms128M -Xmx2048M /app/apps/skyfish-shop-api-0.0.1-SNAPSHOT.jar --spring.config.location=/app/apps/config/skyfish-shop-api/ >> /app/logs/skyfish-shop-api/catalina.out &\r"}
	}
	expect eof
	EOF
elif [ $ref == "refs/heads/dev" ];then
	 branch_dev
fi


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM