我必须在星期一写一个构建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天的使用一样,如果我是直率的话,请提前道歉。
答案 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()
}
}
,输出结果如下:
所以你可以在我的例子中做,并使用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' }
}
...
}