pipeline{
    options {
        gitLabConnection('gitlab')
		timeout(time: 12, unit: 'MINUTES')
    }
    agent any
    environment {
        CURRENT_JOB_NAME = sh(
                returnStdout: true,
                script: "echo ${JOB_BASE_NAME}-${BUILD_NUMBER}"
        ).replaceAll("\\s","")
        APP_GROUP = "logagent"
        APP_NAME = "logtransfer"
    }
    parameters {
        choice (
            choices: ['Deploy', 'Rollback'],
            description: '''Deploy:【发布】
Rollback:【回滚】''',
            name: 'Deploy'
        )
        gitParameter (
            requiredParameter: true,
            description: 'Version:【版本】',
            name: 'DeployVersion',
            selectedValue: 'TOP',
            sortMode: 'DESCENDING_SMART',
            type: 'PT_TAG'
        )
    }
		triggers {
        GenericTrigger (
            // 构建时的标题
            causeString: 'Triggered by $ref',
            // 获取POST参数中的变量，key指的是变量名，通过$ref来访问对应的值，value指的是JSON匹配值（参考Jmeter的JSON提取器）
            // ref指的是推送的分支，格式如：refs/heads/master
            genericVariables: [[key: 'ref', value: '$.ref']],
            // 打印获取的变量的key-value，此处会打印如：ref=refs/heads/master
            printContributedVariables: true,
            // 打印POST传递的参数
            printPostContent: true,
            // regexpFilterExpression与regexpFilterExpression成对使用
            // 当两者相等时，会触发对应分支的构建
            regexpFilterExpression: '^refs/heads/(main|developer)',
            regexpFilterText: '$ref',
            // 与webhook中配置的token参数值一致
            token: '18e75cb18358fdb6417f50973d8b9198'
        )
    }
    stages {

        stage('Fetch Code') {
            steps {
                updateGitlabCommitStatus name: "${CURRENT_JOB_NAME}-${Deploy}-${env.BRANCH_NAME}", state: 'running'
                script {
					if (params.Deploy == "Rollback" && env.BRANCH_NAME == "main") {
                        echo "回滚到 $DeployVersion 版本"
                        sh "git reset --hard $DeployVersion"
                    } else if (env.BRANCH_NAME == "main") {
                        echo "拉取 $DeployVersion 版本"
                        sh "git checkout $DeployVersion"
                    } else {
                        echo "拉取 最新 development 版本"
                        sh "git checkout"
                    }
                }
            }
            post {
                success {
                    echo "代码检出成功:)"
                }
            }
        }

        stage('Build Image') {
            steps {
                // 只有发布的时候去打最新版的包，回滚不需要打包，那个版本的镜像已经有了
                script {
                    if(env.BRANCH_NAME == "main") {
                       	echo "镜像构建..."
                        sh "mv -f logtransfer-main.conf logtransfer.conf"
                        sh "docker build --platform linux/amd64 -t docker.ijiwei.com/$APP_GROUP/$APP_NAME:$DeployVersion ."
                    	echo "正在上传Harbor..."
                    	sh "docker push docker.ijiwei.com/$APP_GROUP/$APP_NAME:$DeployVersion"
                   		sh "docker tag docker.ijiwei.com/$APP_GROUP/$APP_NAME:$DeployVersion docker.ijiwei.com/$APP_GROUP/$APP_NAME:latest"
                   		sh "docker push docker.ijiwei.com/$APP_GROUP/$APP_NAME:latest"
                   		sh "docker image rm docker.ijiwei.com/$APP_GROUP/$APP_NAME:$DeployVersion"
                   		echo "清除无用镜像..."
						sh "docker image prune -f"
                    } else {
						echo "镜像构建..."
                        sh "mv -f logtransfer-dev.conf logtransfer.conf"
                        sh "docker build --platform linux/amd64 -t docker.ijiwei.com/$APP_GROUP/$APP_NAME:dev ."
                    	echo "正在上传Harbor..."
                    	sh "docker push docker.ijiwei.com/$APP_GROUP/$APP_NAME:dev"
                   		sh "docker image rm docker.ijiwei.com/$APP_GROUP/$APP_NAME:dev"
                   		echo "清除无用镜像..."
						sh "docker image prune -f"
                    } 
                }
            }
        }
        stage('Deploy For Development') {
			when {
                branch 'developer'
            }
            steps {
                script {
 				    sshPublisher(
                        failOnError: true,
                        publishers: [
                            sshPublisherDesc(
                                configName: 'dev_www',
                                transfers: [
                                    //注意路径！
                                    sshTransfer(
                                        cleanRemote: false, 
                                        excludes: '', 
                                        execCommand: "docker pull docker.ijiwei.com/${APP_GROUP}/${APP_NAME}:dev && docker tag  docker.ijiwei.com/${APP_GROUP}/${APP_NAME}:dev ${APP_NAME}:dev && docker image rm  docker.ijiwei.com/${APP_GROUP}/${APP_NAME}:dev && echo '运行镜像更新到 Development 版本'", 
                                        execTimeout: 120000, 
                                        flatten: false, 
                                        makeEmptyDirs: false, 
                                        noDefaultExcludes: false, 
                                        patternSeparator: '[, ]+', 
                                        remoteDirectory: '', 
                                        remoteDirectorySDF: false, 
                                        removePrefix: '', 
                                        sourceFiles: ''
                                        ),
                                    sshTransfer(
                                        cleanRemote: false, 
                                        excludes: '', 
                                        execCommand: "docker stop ${APP_NAME} && docker rm ${APP_NAME} && cd /home/www/${APP_NAME} && docker run --restart=always -d --name=${APP_NAME} -v \$(pwd)/log:/app/log ${APP_NAME}:dev && docker image prune -f", 
                                        execTimeout: 120000, 
                                        flatten: false, 
                                        makeEmptyDirs: false, 
                                        noDefaultExcludes: false, 
                                        patternSeparator: '[, ]+', 
                                        remoteDirectory: '', 
                                        remoteDirectorySDF: false, 
                                        removePrefix: '', 
                                        sourceFiles: ''
                                        )
                                ],
                                usePromotionTimestamp: false,
                                useWorkspaceInPromotion: false,
                                verbose: true
                            )
                        ]
                    )
                }
            }
            post {
                success {
                    echo "CCenter Dashboard 测试服务重启成功:)"
                }
                failure {
                    echo "CCenter Dashboard 测试服务重启失败:("
                }
            }
        }

        stage('Deploy App') {
			when {
                branch 'main'
            }
            steps {
				updateGitlabCommitStatus name: "${CURRENT_JOB_NAME}-${Deploy}-${env.BRANCH_NAME}", state: 'pending'
				input message: "是否确认发布${DeployVersion}版本? (Click \"Proceed\" to continue)"
                script {
                    def TargetVersion = "latest"
                    def MethodType = "发布"
                    // 回滚的话取目标版本，否则事最新的
                    if (params.Deploy == "Rollback") {
                        TargetVersion = DeployVersion
                        MethodType = "回滚"
                    }
 				    sshPublisher(
                        failOnError: true,
                        publishers: [
                            sshPublisherDesc(
                                configName: 'local_www',
                                transfers: [
                                    //注意路径！
                                    sshTransfer(
                                        cleanRemote: false, 
                                        excludes: '', 
                                        execCommand: "docker pull docker.ijiwei.com/${APP_GROUP}/${APP_NAME}:${TargetVersion} && docker tag  docker.ijiwei.com/${APP_GROUP}/${APP_NAME}:${TargetVersion} ${APP_NAME}:latest && docker image rm  docker.ijiwei.com/${APP_GROUP}/${APP_NAME}:${TargetVersion} && echo '运行镜像${MethodType}到 ${TargetVersion} 版本'", 
                                        execTimeout: 120000, 
                                        flatten: false, 
                                        makeEmptyDirs: false, 
                                        noDefaultExcludes: false, 
                                        patternSeparator: '[, ]+', 
                                        remoteDirectory: '', 
                                        remoteDirectorySDF: false, 
                                        removePrefix: '', 
                                        sourceFiles: ''
                                        ),
                                    sshTransfer(
                                        cleanRemote: false, 
                                        excludes: '', 
                                        execCommand: "docker stop ${APP_NAME} && docker rm ${APP_NAME} && cd /home/www/${APP_NAME} && docker run --restart=always -d --name=${APP_NAME} \$(pwd)/log:/app/log ${APP_NAME}:latest && docker image prune -f", 
                                        execTimeout: 120000, 
                                        flatten: false, 
                                        makeEmptyDirs: false, 
                                        noDefaultExcludes: false, 
                                        patternSeparator: '[, ]+', 
                                        remoteDirectory: '', 
                                        remoteDirectorySDF: false, 
                                        removePrefix: '', 
                                        sourceFiles: ''
                                        )
                                ],
                                usePromotionTimestamp: false,
                                useWorkspaceInPromotion: false,
                                verbose: true
                            )
                        ]
                    )
                }
            }
            post {
                success {
                    echo "CCenter Dashboard 正式环境服务重启成功:)"
                }
                failure {
                    echo "CCenter Dashboard 正式环境服务重启失败:("
                }
            }
        }
    }

    post {
        success {
            updateGitlabCommitStatus name: "${CURRENT_JOB_NAME}-${Deploy}-${env.BRANCH_NAME}", state: 'success'
        }
        failure {
            updateGitlabCommitStatus name: "${CURRENT_JOB_NAME}-${Deploy}-${env.BRANCH_NAME}", state: 'failed'
        }
        unstable {
            updateGitlabCommitStatus name: "${CURRENT_JOB_NAME}-${Deploy}-${env.BRANCH_NAME}", state: 'failed'
        }
    }
}