Jenkins 基于是否存在隐藏文件的条件阶段
我正试图在Jenkins中创建一个管道,第一个阶段可能会生成文件,也可能不会生成文件以备以后使用。我想根据是否存在隐藏的文件来确定下一阶段的条件。我不知道该怎么做,因为unstash步骤在'when'表达式之后 大致轮廓: 阶段1:运行一个脚本,该脚本可以生成0-3个文件(要隐藏并用作Ansible的库存文件) 第2阶段:如果存在文件1,则使用文件1作为资源清册运行playbook 阶段3:如果存在文件2,则使用文件2运行playbook 等等 我曾尝试在环境块中使用fileExists选项设置一个变量,但这将在任何阶段运行之前进行评估Jenkins 基于是否存在隐藏文件的条件阶段,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,我正试图在Jenkins中创建一个管道,第一个阶段可能会生成文件,也可能不会生成文件以备以后使用。我想根据是否存在隐藏的文件来确定下一阶段的条件。我不知道该怎么做,因为unstash步骤在'when'表达式之后 大致轮廓: 阶段1:运行一个脚本,该脚本可以生成0-3个文件(要隐藏并用作Ansible的库存文件) 第2阶段:如果存在文件1,则使用文件1作为资源清册运行playbook 阶段3:如果存在文件2,则使用文件2运行playbook 等等 我曾尝试在环境块中使用fileExists选项设置
environment {
FILE_EXISTS = fileExists './filename'
}
stages {
stage ('Conditional Stage') {
when {
allOf {
expression { params.FILE_EXISTS == true }
expression { env.BRANCH_NAME != 'master' }
}
}
steps {
unstash 'files'
sh 'ansible ... '
}
}
}
(已尝试同时存在params.FILE_和env.FILE_)
还以类似的方式尝试了舞台上的“when”表达
stage ('Conditional Stage') {
when {
allOf {
expression { fileExists './filename' }
...
}
}
steps {
unstash 'files'
sh 'ansible ...'
}
这两种方法都会由于条件限制而跳过该阶段
如果可能的话,我希望避免归档这些文件,因为只有当前版本才需要它们
有没有人能做到这一点,或者我错过了一些简单的事情
另一个注意事项是:文件将存储在Windows从机上,然后在Linux从机上取消存储。这不是Stas/unStAy的问题,但它值得一提的是,文件总是在不同的奴隶上保存,而不是存放在哪里。 < p>您可以定义一个全局变量,即<强> DEF文件创建= 0 < /强>,并且在满足特定条件后,在管道的中间修改它。在这种情况下,请确保文件存在,并将创建的文件_的值从0更新为1(请参阅下面的代码) 您可以稍后在阶段中使用
指令检查该变量的值,方法是使用表达式
下一个管道已经过测试,可以很好地用于演示目的,它运行stage仅当特定文件存在时运行一些echo操作
“/tmp/demotime1”存在
#!/usr/bin/env groovy
def FILE_CREATED = 0
pipeline {
agent {
label 'linux'
}
stages{
stage('Show if file exists'){
steps {
echo "At first, var FILE_EXISTS value is: $FILE_CREATED"
echo 'Now check if /tmp/demotime1 exists'
echo '/tmp/demotime1 It should not exists on the very first execution'
script {
def demofile = new File('/tmp/demotime1')
if (!demofile.exists()) {
println('That is expected, /tmp/demotime1 file has NOT been created yet')
}
}
}
}
stage('Force file creation and change env var'){
steps {
echo 'creating a file'
sh """ echo 'Demo time file content here' > /tmp/demotime1 """
echo 'At this time /tmp/demotime1 exists see:'
sh """ cat /tmp/demotime1 """
echo "Now let's change env var to true"
script {
if (new File('/tmp/demotime1').exists()){
println('File exists and FILE_CREATED should be 1 now')
}
FILE_CREATED = 1
}
echo "Now FILE_EXISTS value is: $FILE_CREATED"
}
}
stage('Run some echo actions ONLY if a specific file exists'){
when {
expression {
FILE_CREATED == 1
}
}
steps {
echo 'The file exists so I will do something original...'
echo 'Hello World, the $FILE_CREATED has been created'
}
}
}
}
我感谢您的详细回复!不幸的是,这导致了我这边的另一个问题。这是一个多分支管道,因此脚本将始终在沙箱中运行。我收到一个错误,声明“脚本不允许使用新的java.io.File java.lang.String”-并且我看到的解决方法的任何更改都将是一个令人头痛的问题,安全审批方面的问题。现在我生活在没有库存文件的“成功”阶段。我认为它们会失败,所以至少情况并非如此。也许你可以考虑使用共享库来为你的阶段编写你自己的自定义步骤,你不会有共享库的安全问题,它们是可信的(詹金斯管理员配置它们),不需要沙箱,这里有更多的信息,这是一个很好的建议——我会在以后的某一天再来讨论,因为现在我只是在处理成功完成的阶段。我会把你的回答标记为答案,因为它似乎在大多数情况下都有效。再次感谢!