Jenkins Pipeline 根据选择的主机进行发布测试的流程脚本

pipeline 脚本内容

以下只是 pipeline 的发布测试的流程脚本示例,实际生产具体的更新、测试、邮件通知都是通过结合 ansible roles 来设置的,并且 roles 配置以及 pipeline 脚本都是存在 gitlab 中进行版本控制。

pipeline {
    agent any
	parameters {
	    choice(name: 'Actions', choices: ['deploy', 'test'], description:"操作说明: \n (1)deploy 表示对选择的指定服务进行更新 \n (2)test 表示对选择的指定服务进行功能测试")
        string(name: 'Tag', defaultValue: '', description: "配置更新使用的 Docker tag,请再三确认!")
        extendedChoice(
            name: 'Sockets',
            description: '每行中的信息分别表示为:主机名,http_port, socket_port, index',
            multiSelectDelimiter: ',',
            visibleItemCount: 20,
            quoteValue: false,
            type: 'PT_CHECKBOX',
            value: "node1 8080 8091 11,node2 8080 8092 12,node3 8080 8093 13", 
        )
    }
    stages {
        stage('Confirm') {
            steps {
				timeout(time: 60, unit: 'SECONDS'){
                    script {
                        socketInfo = "${params.Sockets}".trim().split(',')
                        def USER_INPUT = input(
                                        message: "Action: ${params.Actions} \n Deploy info: \n ${socketInfo} \n Please confirm and select Yes or No?",
                                        parameters: [
                                            [$class: 'ChoiceParameterDefinition',
                                             choices: ['no','yes'].join('\n'),
                                             name: 'Select list:',
                                             description: 'If select Yes, then will deploy, please confirm!']
                                        ])
                        echo "The answer is: ${USER_INPUT}"
                        echo "Deploy info: \n ${socketInfo}"
                        env.userInput = "${USER_INPUT}"

                    }
				}
            }
        }
		stage("Update") {
            when { 
				allOf { 
                    expression { env.userInput == 'yes' }
					expression { "${params.Actions}" == 'deploy' }
				}
			}
			steps {
				script {
				    if ("${params.Sockets}") {
    				    for (i in "${params.Sockets}".trim().split(',')) {
							host = "${i}".trim().split(' ')[0]
                            http_port = "${i}".trim().split(' ')[1]
                            socket_port = "${i}".trim().split(' ')[2]
                            index = "${i}".trim().split(' ')[3]
                            sh """ansible-playbook -e "actions=${params.Actions} http_port=${http_port} socket_port=${socket_port} node_index=${index} socket_image_tag=${params.Tag} socket_host=${host}" update.yml"""
						}
    				} else {
    				    echo 'No socket information selected, please confirm!'
    				} 
				}
			}
		}
        stage('Test') {
            steps {
				script {
				    if ("${params.Sockets}") {
    				    for (i in "${params.Sockets}".trim().split(',')) {
							host = "${i}".trim().split(' ')[0]
                            http_port = "${i}".trim().split(' ')[1]
                            socket_port = "${i}".trim().split(' ')[2]
                            index = "${i}".trim().split(' ')[3]
                            sh """ansible-playbook  -e "http_port=${http_port} socket_port=${socket_port} node_index=${index} socket_image_tag=${params.Tag} socket_host=${host} actions=test" test.yml""" 
						}
    				} else {
    				    echo 'No socket information selected, please confirm!'
    				} 
				}
			}
		}
    }
}

开始构建前

《Jenkins Pipeline 根据选择的主机进行发布测试的流程脚本》

等待输入确认

《Jenkins Pipeline 根据选择的主机进行发布测试的流程脚本》

执行后的视图显示

《Jenkins Pipeline 根据选择的主机进行发布测试的流程脚本》

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注