#!groovy
pipeline {

    agent {
      label 'live'
    }

    parameters{
        choice(
          name: 'Operation',
          choices: ['deploy','rollback'],
          description: 'deploy：发布git仓库当前最新版本 <br> rollback：回退至上个提交版本'
          )

        choice(
          name: "Module",
          choices: ["Nginx_App_Inbound", "Nginx_App_Internal", "Nginx_Partner", "Nginx_Ops", "Nginx_Core", "Nginx_Sms", "Nginx_Openapi", "Nginx_Instapay", "Nginx_Cooper_Inbound"],
          description:"Nginx_App_Inbound: 10.163.78.1、10.163.78.2<br>Nginx_App_Internal: 10.163.74.1、10.163.74.2<br>Nginx_Partner: 10.163.66.195、10.163.66.196<br>Nginx_Ops: 10.163.80.1、10.163.80.2<br>Nginx_Core: 10.163.94.1、10.163.94.2<br>Nginx_Sms: 10.163.66.212、10.163.66.213<br>Nginx_Openapi:10.163.66.218、10.163.66.219<br>Nginx_Instapay:10.163.66.193、10.163.66.194<br>Nginx_Cooper_Inbound:10.163.78.3、10.163.78.4<br>"
          )

        booleanParam(
          name: 'deploy_slave',
          defaultValue: false,
          description: '只在slave做发布'
          )

        booleanParam(
          name: 'deploy_force',
          defaultValue: false,
          description: '强制发布，不做gitlab与服务器的配置检查，会有覆盖在服务器添加的配置的风险，请知悉'
          )

        booleanParam(
          name: 'PIC_Double_Check',
          defaultValue: false,
          description: '本次发布已知会给PIC，并进行了double check'
          )

        booleanParam(
          name: 'AM_Approval',
          defaultValue: false,
          description: '本次发布遵循变更流程，已提交变更申请并获得审批'
          )
        

    }

    stages {

        stage('Prepare') {
            steps {
                echo '========Prepare========'
                script {

                    sh """
                      ls -d ph-live-nginx || git clone https://ops_bot:Qwer1234@gitlab.ph.seabank.io/bke-ops/ph-live-nginx.git
                      cd ph-live-nginx
                      git pull origin master
                    """

                    if ( params.Operation == 'rollback' ) {
                    sh """
                      cd ph-live-nginx
                      git reset --hard HEAD~1
                    """
                    }

                    GIT_COMMIT = sh (script: "cd ph-live-nginx && git rev-parse --short HEAD", returnStdout: true).trim()
                    GIT_MSG = sh (script: "cd ph-live-nginx && git log --pretty=format:'%s' HEAD -1", returnStdout: true).trim()

                }

            }
        }

        stage('Deploy') {
            steps {
                echo '========Deploy========'
                script {

                    if ( params.PIC_Double_Check == false ) {
                            echo 'PIPELINE ABORTED, NEED PIC DOUBLE CHECK'
                            currentBuild.result = 'ABORTED'
                            return
                    }

                    if ( params.AM_Approval == false ) {
                            echo 'PIPELINE ABORTED, SHOULD SEND APPLY EMAIL FIRST AND GET AM APPROVAL'
                            currentBuild.result = 'ABORTED'
                            return
                    }

                    if ( params.deploy_slave == true ) {

                        if ( params.Module == "Nginx_App_Inbound") {
                            sh """
                            cd ph-live-nginx
                            ansible-playbook -u deployop -i hosts --become --become-user=root --extra-vars deploy_force=$params.deploy_force Slave_Nginx_App_Inbound-Terminal.yaml
                        """
                        }

                        else if ( params.Module == "Nginx_App_Internal" ) {
                        sh """
                            cd ph-live-nginx
                            ansible-playbook -u deployop -i hosts --become --become-user=root --extra-vars deploy_force=$params.deploy_force Slave_Nginx_App_Internal-Terminal.yaml
                        """
                        }

                        else if ( params.Module == "Nginx_Partner" ) {
                        sh """
                            cd ph-live-nginx
                            ansible-playbook -u deployop -i hosts --become --become-user=root --extra-vars deploy_force=$params.deploy_force Slave_Nginx_Partner-Terminal.yaml
                        """
                        }

			            else if ( params.Module == "Nginx_Instapay" ) {
                        sh """
                            cd ph-live-nginx
                            ansible-playbook -u deployop -i hosts --become --become-user=root --extra-vars deploy_force=$params.deploy_force Slave_Nginx_Instapay-Terminal.yaml
                        """
                        }


                        else if ( params.Module == "Nginx_Ops" ) {
                        sh """
                            cd ph-live-nginx
                            ansible-playbook -u deployop -i hosts --become --become-user=root --extra-vars deploy_force=$params.deploy_force Slave_Nginx_Ops-Terminal.yaml
                        """
                        }

                        else if ( params.Module == "Nginx_Core" ) {
                        sh """
                            cd ph-live-nginx
                            ansible-playbook -u deployop -i hosts --become --become-user=root --extra-vars deploy_force=$params.deploy_force Slave_Nginx_Core-Terminal.yaml
                        """
                        }

                        else if ( params.Module == "Nginx_Sms" ) {
                        sh """
                            cd ph-live-nginx
                            ansible-playbook -u deployop -i hosts --become --become-user=root --extra-vars deploy_force=$params.deploy_force Slave_Nginx_Sms-Terminal.yaml
                        """
                        }

                        else if ( params.Module == "Nginx_Openapi" ) {
                        sh """
                            cd ph-live-nginx
                            ansible-playbook -u deployop -i hosts --become --become-user=root --extra-vars deploy_force=$params.deploy_force Slave_Nginx_Openapi-Terminal.yaml
                        """
                        }

                        else if ( params.Module == "Nginx_Cooper_Inbound" ) {
                        sh """
                            cd ph-live-nginx
                            ansible-playbook -u deployop -i hosts --become --become-user=root --extra-vars deploy_force=$params.deploy_force Slave_Nginx_Cooper_Inbound-Terminal.yaml
                        """
                        }

                        else {
                        sh """
                            echo "Error"
                        """
                        }

                    }

                    else if (params.deploy_slave == false){

                        if ( params.Module == "Nginx_App_Inbound") {
                        sh """
                            cd ph-live-nginx
                            ansible-playbook -u deployop -i hosts --become --become-user=root --extra-vars deploy_force=$params.deploy_force Nginx_App_Inbound-Terminal.yaml
                        """
                        }

                        else if ( params.Module == "Nginx_App_Internal" ) {
                        sh """
                            cd ph-live-nginx
                            ansible-playbook -u deployop -i hosts --become --become-user=root --extra-vars deploy_force=$params.deploy_force Nginx_App_Internal-Terminal.yaml
                        """
                        }

                        else if ( params.Module == "Nginx_Partner" ) {
                        sh """
                            cd ph-live-nginx
                            ansible-playbook -u deployop -i hosts --become --become-user=root --extra-vars deploy_force=$params.deploy_force Nginx_Partner-Terminal.yaml
                        """
                        }

			            else if ( params.Module == "Nginx_Instapay" ) {
                        sh """
                            cd ph-live-nginx
                            ansible-playbook -u deployop -i hosts --become --become-user=root --extra-vars deploy_force=$params.deploy_force Nginx_Instapay-Terminal.yaml
                        """
                        }

                        else if ( params.Module == "Nginx_Ops" ) {
                        sh """
                            cd ph-live-nginx
                            ansible-playbook -u deployop -i hosts --become --become-user=root --extra-vars deploy_force=$params.deploy_force Nginx_Ops-Terminal.yaml
                        """
                        }

                        else if ( params.Module == "Nginx_Core" ) {
                        sh """
                            cd ph-live-nginx
                            ansible-playbook -u deployop -i hosts --become --become-user=root --extra-vars deploy_force=$params.deploy_force Nginx_Core-Terminal.yaml
                        """
                        }

                        else if ( params.Module == "Nginx_Sms" ) {
                        sh """
                            cd ph-live-nginx
                            ansible-playbook -u deployop -i hosts --become --become-user=root --extra-vars deploy_force=$params.deploy_force Nginx_Sms-Terminal.yaml
                        """
                        }

                        else if ( params.Module == "Nginx_Openapi" ) {
                        sh """
                            cd ph-live-nginx
                            ansible-playbook -u deployop -i hosts --become --become-user=root --extra-vars deploy_force=$params.deploy_force Nginx_Openapi-Terminal.yaml
                        """
                        }

                        else if ( params.Module == "Nginx_Cooper_Inbound" ) {
                        sh """
                            cd ph-live-nginx
                            ansible-playbook -u deployop -i hosts --become --become-user=root --extra-vars deploy_force=$params.deploy_force Nginx_Cooper_Inbound-Terminal.yaml
                        """
                        }

                        else {
                        sh """
                            echo "Error"
                        """
                        }
                    }

                }

            }
        }
    }

    post {
        always{
            wrap([$class: 'BuildUser']) {
            buildName "${currentBuild.number}-Live-${BUILD_USER}"
            buildDescription "<div><li>branch: master</li><li>module: <strong><span style=\"color:green;font-size: 200%\">${params.Module}</span></strong></li><li>commit: <strong><span style=\"color:blue;font-size: 200%\">${GIT_COMMIT}</span></strong></li><li>message: ${GIT_MSG}</li> "
            }
        }
    }


}
