Jenkinsfile管道错误:"预期符号"和"未定义的部分"

时间:2017-03-07 18:19:00

标签: jenkins jenkins-pipeline

任何人都可以解释为什么我会收到以下错误,以及可能为他们提供哪些解决方案?

  

org.codehaus.groovy.control.MultipleCompilationErrorsException:   启动失败:WorkflowScript:20:预期符号@第20行,   第4栏。         环境{

     

WorkflowScript:17:未定义的部分"错误" @第17行,第1栏   管道{

Jenkinsfile中的代码如下:

#!groovy

def application, manifest, git, environment, artifactory, sonar

fileLoader.withGit('git@<reducted>', 'v1', 'ssh-key-credential-id-number') {
   application = fileLoader.load('<reducted>');
   manifest = fileLoader.load('<reducted>');
   git = fileLoader.load('<reducted>');
   environment = fileLoader.load('<reducted>');
}

pipeline {
   agent { label 'cf_slave' }

   environment {
      def projectName = null
      def githubOrg = null
      def gitCommit = null
   }

   options {
      skipDefaultCheckout()
   }

   stages {
      stage ("Checkout SCM") {
         steps {
            checkout scm

            script {
               projectName = git.getGitRepositoryName()
               githubOrg = git.getGitOrgName()
               gitCommit = manifest.getGitCommit()
            }
         }
      }

      stage ("Unit tests") {
         steps {
            sh "./node_modules/.bin/mocha --reporter mocha-junit-reporter --reporter-options mochaFile=./testResults/results.xml"
            junit allowEmptyResults: true, testResults: 'testResults/results.xml'
         }
      }

      //stage ("SonarQube analysis") {
      //...
      //}

      // stage("Simple deploy") {
      //    steps {
      //       // Login
      //       sh "cf api <reducted>"
      //       sh "cf login -u <reducted> -p <....>"
      //       
      //       // Deploy
      //       sh "cf push" 
      //    }
      // }
   }

   post {
      // always {

      //  }
      success {
         sh "echo 'Pipeline reached the finish line!'"

         // Notify in Slack
         slackSend color: 'yellow', message: "Pipeline operation completed successfully. Check <reducted>"
      }
      failure {
         sh "echo 'Pipeline failed'"
         // Notify in Slack
         slackSend color: 'red', message: "Pipeline operation failed!"

         //Clean the execution workspace
         //deleteDir()
      }
      unstable {
         sh "echo 'Pipeline unstable :-('"
      }
      // changed {
      //    sh "echo 'Pipeline was previously failing but is now successful.'"
      // }
   }
}

2 个答案:

答案 0 :(得分:6)

您的管道大部分都很好 - 在声明性pipeline块之前添加脚本管道元素通常不是问题。

但是,从一开始,您就定义了一个名为environment(和git)的变量,这些变量基本上覆盖了各种Pipeline插件声明的元素。

即。当您尝试pipeline { environment { … } }时,environment指的是您的变量声明,这会导致出错。

重命名这两个变量,然后修复第一条错误消息。

要修复第二条错误消息,请删除从environment块声明变量的尝试 - 此块仅供exporting environment variables在构建步骤中使用,例如:

environment {
    FOO = 'bar'
    BAR = 'baz'
}

如果没有这些声明,您拥有的script块将正常工作。或者,您可以将这些变量声明移动到脚本的顶层。

答案 1 :(得分:1)

如果您正在使用声明性管道(例如,外部pipeline步骤),那么您只能在外层声明pipeline,例如你不能拥有变量和函数定义。这是使用声明性管道的缺点。

更多信息here

我认为你可以通过以下方式解决这个问题:

  1. 使用脚本管道
  2. 将开头的代码移动到全局管道库(如果在多个地方使用了某个值,可能很难解决变量作用域,但它应该是可行的。
  3. 将开头的代码移动到管道内的script步骤,并按照here所述存储值。