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

时间:2019-10-31 15:44:08

标签: jenkins jenkins-pipeline

我正在尝试在詹金斯(Jenkins)中创建管道,在该管道中,第一阶段可能会生成文件,也可能不会生成文件以供以后存储。我想根据是否存在隐藏文件来确定下一阶段的条件。我不确定如何执行此操作,因为隐藏步骤是在“何时”表达式之后进行的。

粗略轮廓:

第1阶段:运行一个脚本,该脚本可能会生成0-3个文件(要存放并用作Ansible的清单文件)

第2阶段:如果file1存在,请以file1作为清单运行剧本

第3阶段:如果file2存在,请使用file2运行剧本

以此类推。

我尝试使用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_EXISTS和env.FILE_EXISTS)

还以类似的方式尝试了舞台内的“何时”表达式。

stage ('Conditional Stage') {
  when {
    allOf {
      expression { fileExists './filename' }
      ...
    }
  }
  steps {
    unstash 'files'
    sh 'ansible ...'
}

由于有条件,两种方法都会跳过该阶段。

如果可能的话,我想避免将文件存档,因为仅在当前版本中才需要它们。

有人能做到这一点,还是我缺少简单的东西?

另外一个注意事项:文件将被存放在Windows从站上,然后被存放在Linux从站上。存放/取消存放不是问题,但值得一提的是,文件将始终存放在与存放位置不同的从站上。

1 个答案:

答案 0 :(得分:1)

您可以定义一个全局变量,即 def FILE_CREATED = 0 并在满足特定条件的情况下在管道中间对其进行修改,在这种情况下,请确保文件存在并更新值FILE_CREATED从0到1(请参见下面的代码)。

稍后,您可以使用whenexpression指令的阶段检查变量的值。

下一个管道已经过测试并且可以很好地用于演示目的,它会运行阶段仅在存在特定文件的情况下运行某些回显操作  “ / 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'
            }
        }

    }
}