【问题标题】:Jenkins declarative pipeline expression with boolean environment variable带有布尔环境变量的 Jenkins 声明式管道表达式
【发布时间】:2020-08-31 19:07:26
【问题描述】:

我正在使用 Jenkins 声明式管道,我想根据环境变量进行条件步骤,该环境变量是根据文件的存在设置的。

所以我只想做这样的事情:如果 Dockerfile 存在,则执行下一阶段,否则不执行。

为此我尝试了:

pipeline {
    // ...
    stage {
        stage('Docker') {
            environment {
                IS_DOCKERFILE = fileExists 'Dockerfile'
            }
            when {
                environment name: 'IS_DOCKERFILE', value: true
            }
            stage('Build') {
                // ...
            }
        }
    }
}

或者:

pipeline {
    // ...
    stage {
        stage('Docker') {
            environment {
                IS_DOCKERFILE = fileExists 'Dockerfile'
            }
            when {
                expression {
                    env.IS_DOCKERFILE == true
                }
            }
            stage('Build') {
                // ...
            }
        }
    }
}

在这两种情况下,Dockerfile 都存在并且位于工作区中。我也尝试过使用字符串 ("true"),但每次,管道都会继续而不执行阶段“构建”。

有什么建议吗?

【问题讨论】:

  • 目前尚不清楚您要达到的目标。大多数管道驻留在 Jenkinsfile 中,该文件与存储库中的其他代码一起保存。假设这也是你的情况,存储库要么有 Dockerfile,要么没有。我看不出在运行时发现这一点的意义。
  • 这是因为我试图为两种应用程序类型使用相同的管道:Web 服务(具有 Dockerfile)和库(没有 Dockerfile)。唯一的区别是该库不需要构建为 docker 映像,因此我尝试仅在 Dockerfile 时执行最后一步。我使用 jenkins 共享库,因此管道很常见(可能是不好的做法)
  • 您应该为每个项目使用不同的管道。话虽如此,您可以有一个阶段来查看是否有使用fileExists 的dockerfile,并设置一个全局变量。然后另一个阶段可以使用例如查看全局变量。 when { expression { IS_DOCKERFILE == true }}script { if (IS_DOCKERFILE) { ... } }

标签: jenkins jenkins-pipeline jenkins-groovy


【解决方案1】:

正如@Sergey 已经发布的那样,问题在于您将字符串与布尔值进行比较。见fileExists: Verify if file exists in workspace

除了他的回答,你可以直接比较一个字符串:

environment {
    IS_DOCKERFILE = fileExists 'Dockerfile'
}
stages {
    stage("build docker image") {
        when {
            expression {IS_DOCKERFILE == 'true'}
        }
        steps {
            echo 'fileExists'
        }
    }
    stage("build libraries") {
        when {
            expression {IS_DOCKERFILE == 'false'}
        }
        steps {
            echo 'fileNotExists'
        }
    }
}

【讨论】:

    【解决方案2】:

    这是因为表达式:

    IS_DOCKERFILE = fileExists 'Dockerfile'
    

    使用布尔值作为字符串创建环境变量:

    $ set
    IS_DOCKERFILE='false'
    

    所以解决方案是像这样使用.toBoolean()

    environment {
        IS_DOCKERFILE = fileExists 'Dockerfile'
    }
    stages {
        stage("build docker image") {
            when {
                expression {
                    env.IS_DOCKERFILE.toBoolean()
                }
            }
            steps {
                echo 'fileExists'
            }
        }
        stage("build libraries") {
            when {
                expression {
                    !env.IS_DOCKERFILE.toBoolean()
                }
            }
            steps {
                echo 'fileNotExists'
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多