Jenkins+pipeline+參數構建+人工干預
實現了以下功能
1. 可以選擇環境,單選;可以選擇需要發布的項目,多選
2.發布過程可視化
3. 可以人工干預是否繼續發布。
初始化配置需要很久,比如拉鏡像這些事情,我可以提前操作。配置做好之后,等到下班時間,再進行發布操作。有時候會遇到,我初始化配置做好之后,測試通知還有變動。我可以人工干預,不進行繼續發布。再次進行配置初始化后再發布。
4.查看日志,鼠標停留在藍色進度圖時,會自動出現Log提示按鈕
5.點擊Log,可以看日志。
6.點擊日志里面的文字,可以看日志詳細情況
7.日志詳細情況
實現上述功能的步驟
1.安裝啟動Jenkins:我以容器的方式啟動。
docker run -itd -p 8080:8080 -p 50000:50000 --name jenkins --privileged=true -m 1500M -v /data/jenkins_home/:/var/jenkins_home -v /usr/bin/dos2unix:/usr/bin/dos2unix -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker -v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime -v /etc/timezone:/etc/timezone jenkins
2.安裝插件:Extended Choice Parameter Plug-In 和 Pipeline
3.自己按照工作環境進行shell腳本編寫。
初始化配置的腳本:
[root@cloud_250 shell]# cat init_configure_choice.sh #!/bin/bash #對比文件,獲取需要發布的文件 ID1=`git log -1|grep commit|awk '{print $2}'` ID2=`git log -2|grep commit|awk '{print $2}'|tail -n 1` echo "本次有變更的配置是:" git diff ${ID1} ${ID2}|grep diff|grep "template/stack"|awk -F"/" '{print $5}' uptime=`date +%Y-%m-%d" "%H:%M` echo "$WORKSPACE/template/pull_images_and_check_md5.sh" sh $WORKSPACE/template/pull_images_and_check_md5.sh if [ "$?" != "0" ];then exit 251 fi #調用Jenkins中選擇的環境變量,注意要與Jenkins上配置的名稱一樣,我在截圖中會框出來。 /usr/bin/python conf_to_stack.py --type=${Environment} cat $WORKSPACE/template/address.txt > $WORKSPACE/${Environment}/address.txt git add . git status iplist_zyx_p="192.168...." iplist_zyx="192.168.5......" iplist_emp="192.168.5X.XX" #根據環境名稱確定ip列表,這個zyx,zyx_p是對應Jenkins中可以選擇的環境參數選項。 if [ "${Environment}" = "zyx_p" ];then iplist=$iplist_zyx_p fi if [ "${Environment}" = "emp" ];then iplist=$iplist_emp fi if [ "${Environment}" = "zyx" ];then iplist=$iplist_zyx fi #將更新內容同步到服務器,拉取鏡像 for ip in $iplist; do echo $ip ssh root@$ip "/usr/bin/rm -rf /data/git/${Environment}/*" scp -r $WORKSPACE/${Environment}/ root@$ip:/data/git/ ssh root@$ip "cd /data/git/${Environment};/usr/bin/sh /data/git/${Environment}/pull_images.sh" return=`ssh root@$ip "/usr/bin/cat /data/git/${Environment}/return"` if [ "${return}" != "0" ];then exit $return else continue fi done
部署腳本:
[root@cloud_250 shell]# cat deploy_choice.sh #!/bin/bash #由於Jenkins提供的選擇的多個項目名稱會以“name1,name2,name3”的方式提供,我們需要進行字符串切割處理,去掉逗號,和雙引號。 projectlist=`echo ${ProjectName} | sed -r 's/,/ /g'| sed -r 's/"/ /g'` #根據環境進行判斷,選擇需要發布的服務器節點。 if [ "${Environment}" = "zyx_p" ];then ipnode=192.168.x fi if [ "${Environment}" = "zyx" ];then ipnode=192.168.x fi if [ "${Environment}" = "emp" ];then ipnode=192.168.x fi #發布,ssh遠程到服務器上進行啟動服務 for NAME in ${projectlist}; do ssh root@$ipnode "docker stack deploy -c /data/git/$Environment/stack_$NAME.yaml $NAME" sleep 30s done
3. Jenkins上創建一個pipeline的項目
紅色框框,ProjectName 是會作為變量傳給shell腳本的。check Boxes 類型是表示能選擇多個項目。delimiter 填寫 “,” 表示項目名稱以逗號隔開。
value ,填寫項目名稱,並且以“,”隔開。
添加pipeline的腳本:
node { stage('初始化配置 ') { // for display purposes git 'git@192.168.0.75:/data/git/zyx_t' sh "/var/jenkins_home/shell/init_configure_choice.sh" 調用初始化配置的shell腳本 } } #人工干預是否繼續發布。 stage '確定是否發布' input 'Do you approve deployment?' #確定發布后,在進行部署 node{ stage('部署') { sh "/var/jenkins_home/shell/deploy_choice.sh" 調用發布的shell腳本 } }