Jenkins Pipeline審批


實現結果:

根據用戶所選操作不同,任務直接運行或需要經過審批、管理員執行任務,通過郵件發送審批信息,審批人或操作人登錄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 "任務已執行完成。"
                }
                
                
            }
        }
    }
    
}

結果:

 


免責聲明!

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



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