【问题标题】:Jenkins Pipeline Job with Condition有条件的 Jenkins 流水线作业
【发布时间】:2017-04-19 14:30:38
【问题描述】:

我正在创建一个 Jenkins 管道。该管道正在构建三个作业(JobOne、JobTwo、JobThree)。我可以使用以下代码运行该作业。

node {
   stage 'Stage 1'
   echo 'Hello World 1'
   build 'Pipeline-Test/JobOne'

   stage 'Stage 2'
   echo 'Hello World 2'
   build 'Pipeline-Test/JobTwo'

   stage 'Stage 3'
   echo 'Hello World 3'
   build 'Pipeline-Test/JobThree'
}

现在我想在其中设置一些条件。例如,当 JobOne 失败时,作业必须再次重新启动。当 JobTwo 通过时,要再次运行作业。 JobThree 应该在 JobTwo 完成后 10 分钟后运行。我不确定如何在这种情况下制作管道。我是 Jenkins 管道的新手。

我检查了几个 Jenkins WiKi 页面,但找不到在上述条件下实现 if 条件的正确方法。我尝试了下面的代码只是为了检查如何实现“if”条件。但它失败了。

node {
   stage 'Stage 1'
   echo 'Hello World 1'
   build 'Pipeline-Test/JobOne'
   post {
       always{
           build 'Pipeline-Test/JobOne'
       }
   }

错误:

java.lang.NoSuchMethodError: No such DSL method 'post' found among [archive, bat, build, catchError, checkout, checkpoint, deleteDir, dir, dockerFingerprintFrom, dockerFingerprintRun, echo, error, fileExists, git, input, isUnix, load, mail, node, parallel, properties, publishHTML, pwd, readFile, retry, sh, sleep, sshagent, stage, stash, step, teamconcert, timeout, tool, triggerRemoteJob, unarchive, unstash, waitUntil, withCredentials, withDockerContainer, withDockerRegistry, withDockerServer, withEnv, wrap, writeFile, ws]
    at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:107)

有人可以指导我完成这个吗?

提前致谢!

【问题讨论】:

    标签: if-statement jenkins groovy jenkins-pipeline


    【解决方案1】:

    Jenkins Pipelines 肯定有一个学习曲线,所以不要气馁 :)

    我建议任何开始使用 Jenkins Pipelines 的人查看 Jenkins' official documentationPipeline Steps Reference page

    仅供参考,stages without a block argument is deprecated;你应该如下定义stages:

    stage('Name of Stage') {
       // code
    }
    

    管道有一个 retry step,如果它失败,您可以使用它重试 JobOne 构建。

    要在第 2 阶段和第 3 阶段之间等待 10 分钟,您可以使用sleep step

    if 语句的编写方式与 Java 相同,因为 Groovy is actually compiled on a JVM

    if (animal == 'dog' || boolean == true) {
    

    结合这些,我认为这是你可以使用的:

    node {
         stage ('Stage 1') {
              echo 'Hello World 1'
              retry(1) {
                   build 'Pipeline-Test/JobOne'
              }
         }
         stage ('Stage 2') {
              echo 'Hello World 2'
              build 'Pipeline-Test/JobTwo'
         }
    
         sleep time:10, unit:"MINUTES"
    
         stage ('Stage 3') {
              echo 'Hello World 3'
              build 'Pipeline-Test/JobThree'
         }
    }
    

    【讨论】:

    • 非常感谢克里斯托弗! :) 我一定会深入研究它。我对此完全陌生,并没有找到出路。再次感谢。我会尝试你上面提到的步骤。
    • 嗨克里斯托弗。 JobOne 重复正常。它按预期工作,但繁琐的工作必须在 10 分钟后运行,它失败并出现以下错误:groovy.lang.MissingPropertyException: No such property: MINUTES for class: WorkflowScript。我正在网上查这个。如果您有任何想法,请告诉我。
    • 如果我只给睡眠(30)它就可以工作。我的意思是如果我只通过时间而不是单位。当我通过单位(MINUTES,MILLISECONDS)时,它会抛出上述错误。
    • 抱歉,@Raji,我编写了示例管道,没有仔细检查它是否有效。我编辑了答案以显示适当的 sleep 用法;我不应该在之前的电话中使用括号。此外,单位应该是一个字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多