使用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
