在 Jenkins 管道中的每个并行阶段使用不同的用户

问题描述 投票:0回答:1

我有一个管道,可以动态创建多个并行阶段,在用户定义数量的代理/Windows 客户端(在执行时设置)上有效执行相同的步骤。 我想让每个代理/客户使用不同的用户。

运行步骤的并行代理数量由参数 AGENT_COUNT 定义。

在下面的简化管道中,有一个简单的一步命令,使用“net use”来映射驱动器。 在现场,我对 Windows 用户和密码进行了硬编码,但我想让每个代理/客户端使用不同的用户。 我使用 WINUSER 变量来定义用户名,将 for 循环中的计数器值作为 WINUSER 字符串的后缀。 我在后面插入的回显(作为调试)是为了验证此时 WINUSER 的值。 在使用 AGENT_COUNT = 3 执行时,我看到随着 for 循环的执行,WINUSER 的值从“test1”更改为“test2”、“test3”,这正是我想要的。 然而,在 net use 命令和生成阶段的 echo 中,所有 3 个代理都以用户“test3”的身份运行,即 for 循环中的最后一个值。

如何传播不同的用户名? 预先感谢您的帮助。

(如果格式混乱请见谅)

def parallelStagesSoak = [:]
def stagesToBuild = []

pipeline {

    agent none 

    parameters {
        string(name: "AGENT_COUNT", defaultValue: "1", trim: true, description: "How many Windows agents to run the test")
        string(name: "HNAS_PATH_WIN", defaultValue: "\\\\server1\\dir", trim: true, description: "path to share")
        string(name: "MAP_DRIVE_WIN", defaultValue: "P", trim: true, description: "drive letter to use in Windows")
    }

    stages {      
        stage("soak_test") { 
            steps {
                script {
                    def WINUSER
                
                    // defines the number of agents/clients that will connect to server
                    for (int i=1; i<="$params.AGENT_COUNT".toInteger();i++) {
                        WINUSER="test"+i.toString()
                        stagesToBuild.add("win_agent_"+i.toString())
                        echo "WINUSER="+WINUSER
                    }
                
                    // generates the defined number of agents/clients to run in parallel
                    stagesToBuild.each { s ->
                        parallelStagesSoak[s] = {
                            echo "WINUSER in test="+WINUSER
                            node(label: "soak-client && windows") {
                                stage(s) {
                                    bat "net use $params.MAP_DRIVE_WIN: $params.PATH_WIN  /user:domain1\\$WINUSER test"
                                }
                            }
                        } 
                    }
                    parallel parallelStagesSoak
                }
            }
        }
    }
}
jenkins-pipeline
1个回答
0
投票

这是 Java 闭包的一个不起眼的特性(你在地图中收集到的一个闭包),但它可以很容易地被破解:

                    stagesToBuild.each { s ->
                        parallelStagesSoak[s] = {
                            def this_user = WINUSER
                            echo "WINUSER in test=" + this_user
                            node(label: "soak-client && windows") {
                                stage(s) {
                                    bat "net use $params.MAP_DRIVE_WIN: $params.PATH_WIN  /user:domain1\\${this_user} test"
                                }
                            }
                        } 
                    }
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.