實現結果:
根據用戶所選操作不同,任務直接運行或需要經過審批、管理員執行任務,通過郵件發送審批信息,審批人或操作人登錄jenkins后進行審批
pipeline腳本內容如下:
def skipRemainingStages = false,skipApprove = false,Exec = false,timeout_mins = 4320,Applier_id,Applier_name,Applier_mail,Approver_mail,Operator_mail,input_message pipeline{ agent any //調用顏色插件 options { ansiColor('xterm') } environment { Applier_name = "" Applier_mail = "" Approver_mail = "" Operator_mail = "" input_message = "" } stages{ stage("任務申請"){ steps{ wrap([$class: 'BuildUser']) { script { //獲取當前登錄用戶賬戶、姓名、郵箱 Applier_id = "${BUILD_USER_ID}" Applier_name = "${env.BUILD_USER}" Applier_mail = "${env.BUILD_USER_EMAIL}" } } script{ // 判斷是否需要審批 if ("$Mode" == "Query" || "$Mode" == "Lock" || "$Mode" == "Unlock"){ skipApprove = true Exec = true // echo "\033[32m 該操作無需審批,待自動執行。 \033[0m" return } if ("$Approver" != ""){ Approver = "$Approver".split('@')[0] //只取審批人@前面字符 //如果審批人為自己,則退出任務 if (Applier_id == Approver){ echo "\033[31m 審批人不能為本人,任務已終止。 \033[0m" skipRemainingStages = true //跳過下一個stage currentBuild.result = 'ABORTED' //當前stage build result設置為 aborted return } }else{ echo "\033[31m 審批人不能為空,任務已終止。 \033[0m" skipRemainingStages = true currentBuild.result = 'ABORTED' return } //定義發送給審批者和執行者的郵件內容(詳述任務內容) switch ("$Mode") { case "Extend": input_message = "$Applier_name 申請將域賬號 $UserName 延期$Days 天" break; case "Disable": input_message = "$Applier_name 申請禁用域賬號 $UserName" break; case "Enable": input_message = "$Applier_name 申請啟用域賬號 $UserName" break; } Approver_mail = "$Approver"+"@x.com" //Send Approve mail to Approver emailext( subject:"【請審批】${env.JOB_NAME}(#${env.BUILD_NUMBER})", body:"""$input_message <br> <a href="${BUILD_URL}input">請點擊該鏈接使用域賬號登錄后審批</a>""", to:"$Approver_mail" ) echo "\033[32m 申請完成,待$Approver 審批。 \033[0m" } } } stage("等待審批"){ when { expression {!skipRemainingStages} expression {!skipApprove} } steps{ script{ //等待審批人審批,並通過timeout設置任務過期時間,防止任務永遠掛起 def userInput timeout(timeout_mins){ try { userInput = input( id: 'inputap', message: "$input_message", ok:"同意", submitter:"$Approver", parameters: [ [$class: 'BooleanParameterDefinition', defaultValue: true, description: '', name: '確認'] ]) } catch(err) { // input false def user = err.getCauses()[0].getUser() userInput = false echo "\033[31m 任務已被審批人 ${user} 拒絕。 \033[0m" currentBuild.result = 'ABORTED' } } if (userInput == true) { //發郵件待系統管理員執行任務 echo "\033[32m 已審批完成,待系統管理員執行。 \033[0m" Operator_mail = "$Operator"+"@xin.com" emailext( subject:"【請執行】${env.JOB_NAME}(#${env.BUILD_NUMBER})", body:"""$input_message ,$Approver 已審批完成。 <br> <a href="${BUILD_URL}input">請點擊該鏈接使用域賬號登錄后審批</a>""", to:"$Operator_mail" ) //等待系統管理員決定是否執行任務 def userInput2 timeout(timeout_mins){ try { userInput2 = input( id: 'inputop', message: "$input_message", ok:"執行", submitter:"$Operator_users", parameters: [ [$class: 'BooleanParameterDefinition', defaultValue: true, description: '', name: '確認'] ]) } catch(err) { // input false def user = err.getCauses()[0].getUser() userInput2 = false echo "\033[31m 任務已被系統管理員 ${user} 拒絕。 \033[0m" currentBuild.result = 'ABORTED' } } if (userInput2 == true) { Exec = true } else { emailext( subject:"【拒絕】${env.JOB_NAME}(#${env.BUILD_NUMBER})", body:"""系統管理員拒絕了您的申請任務 ${env.JOB_NAME}(#${env.BUILD_NUMBER})。<br> <a href="${JOB_URL}">點擊該鏈接可查看任務</a><br><br>如您有任何疑問請聯系 ITSupport@xin.com""", to:"$Applier_mail" ) return } } else { emailext( subject:"【拒絕】${env.JOB_NAME}(#${env.BUILD_NUMBER})", body:"""審批人$Approver 未通過您的申請任務 ${env.JOB_NAME}(#${env.BUILD_NUMBER})。<br> <a href="${JOB_URL}">點擊該鏈接可查看任務</a>""", to:"$Applier_mail" ) return } } } } stage("任務執行"){ when { expression {Exec} } steps{ script{ sh """ set +x echo "\033[34m 任務執行結果: \033[0m" python3 /data/py/SaltAPI.py --host "10.10.3.25" --script "http://autoit.x.com:8999/Useradmin.ps1" --args "$Mode $Applier_id $UserName $Days" """ // echo "任務已執行完成。" } } } } }
結果: