如何 运行 jenkins pipeline on all or some servers based

How to run jenkins pipeline on all or some servers based

我有一个将文件复制到服务器的 jenkins 管道。在工作中,我用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/"
    }
}

改用复选框怎么样?
您可以使用 Extended Choice Parameter 创建一个基于服务器值的复选框列表,当用户构建他 select 相关服务器的作业时,这个 selected 服务器列表将传播到具有 selected 值的作业,然后您可以将其用于您的逻辑。
类似于:

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 中它看起来像:

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

如果您希望用户看到与代码中使用的值不同的值,这也是可能的,因为您可以在使用输入值之前使用 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/"
    }
}