Jenkins 基于是否存在隐藏文件的条件阶段

Jenkins 基于是否存在隐藏文件的条件阶段,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,我正试图在Jenkins中创建一个管道,第一个阶段可能会生成文件,也可能不会生成文件以备以后使用。我想根据是否存在隐藏的文件来确定下一阶段的条件。我不知道该怎么做,因为unstash步骤在'when'表达式之后 大致轮廓: 阶段1:运行一个脚本,该脚本可以生成0-3个文件(要隐藏并用作Ansible的库存文件) 第2阶段:如果存在文件1,则使用文件1作为资源清册运行playbook 阶段3:如果存在文件2,则使用文件2运行playbook 等等 我曾尝试在环境块中使用fileExists选项设置

我正试图在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”-并且我看到的解决方法的任何更改都将是一个令人头痛的问题,安全审批方面的问题。现在我生活在没有库存文件的“成功”阶段。我认为它们会失败,所以至少情况并非如此。也许你可以考虑使用共享库来为你的阶段编写你自己的自定义步骤,你不会有共享库的安全问题,它们是可信的(詹金斯管理员配置它们),不需要沙箱,这里有更多的信息,这是一个很好的建议——我会在以后的某一天再来讨论,因为现在我只是在处理成功完成的阶段。我会把你的回答标记为答案,因为它似乎在大多数情况下都有效。再次感谢!