我有一个管道,可以动态创建多个并行阶段,在用户定义数量的代理/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
}
}
}
}
}
这是 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"
}
}
}
}