将循环变量传递给Jenkinsfile中的sh不会';正确地检查示波器

将循环变量传递给Jenkinsfile中的sh不会';正确地检查示波器,jenkins,groovy,jenkins-pipeline,Jenkins,Groovy,Jenkins Pipeline,我尝试使用以下循环在Jenkins文件中动态创建作业。作业创建正确,任务名称以正确的名称显示在Jenkins中(例如ubuntu:bionic) 但是,在每个任务中,sh命令似乎无法访问图像,因为${images[i]}被评估为null(例如sh ci/script.sh null)。因此,这似乎与字符串插值的其他单引号与双引号问题不同 def images = ["ubuntu:bionic", "ubuntu:xenial"] def tasks = [:] for (int i = 0;

我尝试使用以下循环在Jenkins文件中动态创建作业。作业创建正确,任务名称以正确的名称显示在Jenkins中(例如
ubuntu:bionic

但是,在每个任务中,
sh
命令似乎无法访问
图像
,因为
${images[i]}
被评估为
null
(例如
sh ci/script.sh null
)。因此,这似乎与字符串插值的其他单引号与双引号问题不同

def images = ["ubuntu:bionic", "ubuntu:xenial"]
def tasks = [:]

for (int i = 0; i < images.size(); i++) {
  tasks["${images[i]}"] = {
    node {
      lock("build") {
        stage('checkout') {
          checkout scm
        }
        stage('test') {
          sh "ci/script.sh ${images[i]}"
        }
      }
    }
  }
}

stage("matrix") {
  parallel tasks
}
def images=[“ubuntu:bionic”,“ubuntu:xenial”]
def任务=[:]
对于(int i=0;i

如何正确构建这些动态命令?

您在循环中创建并分配给
任务[“${images[I]}”]
的闭包是惰性计算的,它似乎处理
images.getAt(I)
和当前的
I
值,在这种情况下,这两种情况下都等于
2
。看看下面的例子,再打印一些当前
i
状态(我跳过了
scm签出
int这个简短的例子):

def images=[“ubuntu:bionic”,“ubuntu:xenial”]
def任务=[:]
对于(int i=0;iprintln“Using i=${i}”//这很有帮助,但是链接没有提到这里的作用域。我试图理解为什么each语句可以工作,而for(foo in bar)不能。有指针吗?
[Pipeline] echo
Using i = 0
[Pipeline] echo
Using i = 1
[Pipeline] stage
[Pipeline] { (matrix)
[Pipeline] parallel
[Pipeline] [ubuntu:bionic] { (Branch: ubuntu:bionic)
[Pipeline] [ubuntu:xenial] { (Branch: ubuntu:xenial)
[Pipeline] [ubuntu:bionic] node
[ubuntu:bionic] Running on Jenkins in /var/jenkins_home/workspace/test-pipeline
[Pipeline] [ubuntu:xenial] node
[ubuntu:xenial] Running on Jenkins in /var/jenkins_home/workspace/test-pipeline@2
[Pipeline] [ubuntu:bionic] {
[Pipeline] [ubuntu:xenial] {
[Pipeline] [ubuntu:bionic] lock
[ubuntu:bionic] Trying to acquire lock on [build]
[ubuntu:bionic] Lock acquired on [build]
[Pipeline] [ubuntu:bionic] {
[Pipeline] [ubuntu:xenial] lock
[ubuntu:xenial] Trying to acquire lock on [build]
[ubuntu:xenial] Found 0 available resource(s). Waiting for correct amount: 1.
[ubuntu:xenial] [build] is locked, waiting...
[Pipeline] [ubuntu:bionic] stage
[Pipeline] [ubuntu:bionic] { (checkout)
[Pipeline] [ubuntu:bionic] echo
[ubuntu:bionic] ok
[Pipeline] [ubuntu:bionic] }
[Pipeline] [ubuntu:bionic] // stage
[Pipeline] [ubuntu:bionic] stage
[Pipeline] [ubuntu:bionic] { (test)
[Pipeline] [ubuntu:bionic] echo
[ubuntu:bionic] Print i inside stage = 2
[Pipeline] [ubuntu:bionic] echo
[ubuntu:bionic] Echo i inside stage = 2
[Pipeline] [ubuntu:bionic] sh
[ubuntu:bionic] [test-pipeline] Running shell script
[ubuntu:bionic] + ci/script.sh null
[ubuntu:bionic] /var/jenkins_home/workspace/test-pipeline@tmp/durable-998289d1/script.sh: 2: /var/jenkins_home/workspace/test-pipeline@tmp/durable-998289d1/script.sh: ci/script.sh: not found
[Pipeline] [ubuntu:bionic] }
[Pipeline] [ubuntu:bionic] // stage
[ubuntu:xenial] Lock acquired on [build]
[Pipeline] [ubuntu:bionic] }
[ubuntu:bionic] Lock released on resource [build]
[Pipeline] [ubuntu:xenial] {
[Pipeline] [ubuntu:bionic] // lock
[Pipeline] [ubuntu:bionic] }
[Pipeline] [ubuntu:xenial] stage
[Pipeline] [ubuntu:xenial] { (checkout)
[Pipeline] [ubuntu:bionic] // node
[Pipeline] [ubuntu:bionic] }
[ubuntu:bionic] Failed in branch ubuntu:bionic
[Pipeline] [ubuntu:xenial] echo
[ubuntu:xenial] ok
[Pipeline] [ubuntu:xenial] }
[Pipeline] [ubuntu:xenial] // stage
[Pipeline] [ubuntu:xenial] stage
[Pipeline] [ubuntu:xenial] { (test)
[Pipeline] [ubuntu:xenial] echo
[ubuntu:xenial] Print i inside stage = 2
[Pipeline] [ubuntu:xenial] echo
[ubuntu:xenial] Echo i inside stage = 2
[Pipeline] [ubuntu:xenial] sh
[ubuntu:xenial] [test-pipeline@2] Running shell script
[ubuntu:xenial] + ci/script.sh null
[ubuntu:xenial] /var/jenkins_home/workspace/test-pipeline@2@tmp/durable-b1807fa2/script.sh: 2: /var/jenkins_home/workspace/test-pipeline@2@tmp/durable-b1807fa2/script.sh: ci/script.sh: not found
[Pipeline] [ubuntu:xenial] }
[Pipeline] [ubuntu:xenial] // stage
[Pipeline] [ubuntu:xenial] }
[ubuntu:xenial] Lock released on resource [build]
[Pipeline] [ubuntu:xenial] // lock
[Pipeline] [ubuntu:xenial] }
[Pipeline] [ubuntu:xenial] // node
[Pipeline] [ubuntu:xenial] }
[ubuntu:xenial] Failed in branch ubuntu:xenial
[Pipeline] // parallel
[Pipeline] }
[Pipeline] // stage
[Pipeline] End of Pipeline
ERROR: script returned exit code 127
Finished: FAILURE
[ubuntu:bionic] [test-pipeline] Running shell script
[ubuntu:bionic] + ci/script.sh ubuntu:bionic
[ubuntu:xenial] [test-pipeline@2] Running shell script
[ubuntu:xenial] + ci/script.sh ubuntu:xenial