2017-04-24 22 views
4

我正在创建一个样本詹金斯管道,这里是代码。詹金斯管道如果还没有工作

pipeline { 
    agent any 

    stages {  
     stage('test') { 
      steps { 
       sh 'echo hello' 
      }    
     } 
     stage('test1') { 
      steps { 
       sh 'echo $TEST' 
      }    
     } 
     stage('test3') { 
      if (env.BRANCH_NAME == 'master') { 
       echo 'I only execute on the master branch' 
      } else { 
       echo 'I execute elsewhere' 
      }       
     }   
    } 
} 

这条管道失败,下面的错误日志

Started by user admin 
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: 
WorkflowScript: 15: Not a valid stage section definition: "if (env.BRANCH_NAME == 'master') { 
       echo 'I only execute on the master branch' 
      } else { 
       echo 'I execute elsewhere' 
      }". Some extra configuration is required. @ line 15, column 9. 
      stage('test3') { 
     ^

WorkflowScript: 15: Nothing to execute within stage "test3" @ line 15, column 9. 
      stage('test3') { 
     ^

但是,当我执行下面的例子from this url,它成功地执行并打印else部分。

node { 
    stage('Example') { 
     if (env.BRANCH_NAME == 'master') { 
      echo 'I only execute on the master branch' 
     } else { 
      echo 'I execute elsewhere' 
     } 
    } 
} 

唯一的区别我可以看到的是,在工作示例没有stages但对我来说是这样。

这里有什么错,任何人都可以请建议?

回答

16

你的第一次尝试使用声明的管道,而第二工作一个是使用脚本管道。你需要附上一个步骤声明步骤,你不能,如果在声明顶级步骤中使用,所以你需要用它在脚本中的一步。这里有一个工作版本声明:

pipeline { 
      agent any 

      stages { 
        stage('test') { 
          steps { 
            sh 'echo hello' 
          } 
        } 
        stage('test1') { 
          steps { 
            sh 'echo $TEST' 
          } 
        } 
        stage('test3') { 
          steps { 
            script { 
              if (env.BRANCH_NAME == 'master') { 
                echo 'I only execute on the master branch' 
              } else { 
                echo 'I execute elsewhere' 
              } 
            } 
          } 
        } 
      } 
    } 

您可以通过使用“时,”简化这个和潜在的避免if语句(只要你不需要别人)。请参阅https://jenkins.io/doc/book/pipeline/syntax/上的“何时指令”。你也可以使用jenkins rest api来验证jenkinsfiles。它超级甜美。在詹金斯的声明式管道中玩得开心!

+0

谢谢你这么多,一为答案,+1声明管线和脚本管道,一为REST API的建议。实际上,我需要如果和其他这就是为什么我使用它。 – Shahzeb

0

它需要一个比特重新排列的,但when做得很好,以取代上述条件句。以上是使用声明性语法编写的示例。请注意0​​阶段现在是两个不同的阶段。一个在主分支上运行,另一个在其他任何地方运行。

stage ('Test 3: Master') { 
    when { branch 'master' } 
    steps { 
     echo 'I only execute on the master branch.' 
    } 
} 

stage ('Test 3: Dev') { 
    when { not { branch 'master' } } 
    steps { 
     echo 'I execute on non-master branches.' 
    } 
}