Jenkins管道条件打印表达而不是比较

时间:2018-06-13 15:04:22

标签: jenkins jenkins-pipeline

我必须在星期一写一个构建Terraform基础设施的管道并在周五销毁。我试图根据$(date '+%a')的结果确定是构建还是销毁,所以此处的情况如下:

when {
      beforeAgent true
      expression { 
                 // Using 'Wed' because today is Wednesday
                  return  sh(returnStdout: true, script: '$(date +%a)') == 'Wed'
      }
}

唯一的问题是每次运行它时,Jenkins shell都会打印sh(returnStdout: true, script: '$(date +%a)')的结果而不是比较值。

[Pipeline] sh
14:52:03 [teardown] Running shell script
14:52:04 + date +%a
14:52:04 + Wed
14:52:04 /jenkins-slave/workspace/teardown@tmp/durable-524bef20/script.sh: 2: /jenkins-slave/workspace/teardown@tmp/durable-524bef20/script.sh: Wed: not found

我在这里做错了什么?

P.S我对Jenkins很新,就像2天的使用一样,如果我是直率的话,请提前道歉。

1 个答案:

答案 0 :(得分:1)

正如@Matt Schuchard在评论中指出的那样,您的初始问题是$(date +%a),使他执行命令date +%a的结果。

但它完全解决了您的问题,因为sh(returnStdout: true, script: 'date +%a')不会在周三返回"Wed" "Wed\n"

试试这个:

steps {
    script {
        String v = sh(returnStdout: true, script: 'date +%a')
        print v
        print v.trim()
    }
}

,输出结果如下:

enter image description here

所以你可以在我的例子中做,并使用trim()

when {
    beforeAgent true
    expression { sh(returnStdout: true, script: 'date +%a').trim() == 'Wed' }
}

或者,由于Jenkins管道是Groovy脚本,您可以使用Groovy方式执行此操作:

def week = [1:'Sunday', 2:'Monday', 3:'Tuesday', 4:'Wednesday', 5:'Thursday', 6:'Friday', 7:'Saturday']

pipeline{
    agent any
    stages{
        stage('stage'){
            when {
                beforeAgent true
                expression { week[new Date()[Calendar.DAY_OF_WEEK]] == 'Wednesday' }
            }
...
}