首页 > 解决方案 > 如何在所有或部分服务器上运行詹金斯管道

问题描述

我有一个将文件复制到服务器的詹金斯管道。在工作中,我用 IP 定义了 3 台服务器。

我需要实现的是,用户可以通过在depoly_on_server_x下键入 yes 或 no 来选择在哪个服务器上部署副本。

在我的原始管道中,我使用的是 IP 列表 - 但请求正如我上面提到的我如何定义请求?

谢谢

server_1_IP - '1.1.1.1'
server_2_IP - '1.1.1.2'
server_3_IP - '1.1.1.3'

deploy_on_server_1 = 'yes'
deploy_on_server_2 = 'yes'
deploy_on_server_3 = 'no'



pipeline {
    agent { label 'client-1' }

    stages {
        stage('Connect to git') {
            steps {
                    git branch: 'xxxx', credentialsId: 'yyy', url: 'https://zzzz'
            }
        }
        stage ('Copy file') {
            when { deploy == yes }
            steps {
                dir('folder_a') {
                    file_copy(server_list)
                }
            }
        }
    }
}

def file_copy(list) {
    list.each { item ->
        sh "echo Copy file"
        sh "scp 11.txt user@${item}:/data/"
    }
}

标签: jenkinsjenkins-pipelinejenkins-groovy

解决方案


改用复选框怎么样?
您可以使用扩展选择参数根据服务器值创建一个复选框列表,当用户构建他选择相关服务器的作业时,此选定服务器列表将传播到具有选定值的作业,然后您可以使用为你的逻辑。
就像是:

pipeline {
    agent { label 'client-1' }
    parameters {
        extendedChoice(name: 'Servers', description: 'Select servers for deployment', multiSelectDelimiter: ',',
                type: 'PT_CHECKBOX', value: '1.1.1.1,1.1.1.2 ,1.1.1.3', visibleItemCount: 5)
    }
    stages {
        stage('Connect to git') {
            steps {
                git branch: 'xxxx', credentialsId: 'yyy', url: 'https://zzzz'
            }
        }
        stage ('Copy files') {
            steps {
                dir('folder_a') {
                    script{
                        params.Servers.split(',').each { server ->
                            sh "echo Copy file to ${server}"
                            sh "scp 11.txt user@${server}:/data/"
                        }
                    }
                }
            }
        }
    }
}

在 UI 中,它看起来像:

在此处输入图像描述

您还可以使用多选选择列表而不是复选框,或者如果您只想允许单个值,您可以使用单选按钮或单选选择列表。

如果您希望用户看到不同的值,那么那些将在代码中使用的值也是可能的,因为您可以在使用之前使用 groovy 操作输入值。
例如,如果您希望用户选项是,<Hostname>-<IP>您可以将参数值更新为类似value: 'server1-1.1.1.1,server2-2.2.2.2',然后在您的代码中从给定值中提取相关 ip:

script {
    params.Servers.split(',').each { item ->
        server = item.split('-').last()
        sh "echo Copy file to ${server}"
        sh "scp 11.txt user@${server}:/data/"
    }
}

推荐阅读