Jenkins:可以将评论添加到 Jenkinsfile 中吗?

Posted

技术标签:

【中文标题】Jenkins:可以将评论添加到 Jenkinsfile 中吗?【英文标题】:Jenkins: Can comments be added to a Jenkinsfile? 【发布时间】:2017-07-07 16:33:09 【问题描述】:

在 Jenkinsfile 中可以使用 cmets 吗?如果有,语法是什么?

我正在使用声明性管道语法。

我想在我的 SMTP 服务器正常工作之前注释掉下面的“帖子”部分。

pipeline 

  agent  label 'docker-build-slave' 

  environment 
    IMAGE = 'registry.gitlab.com/XXXXX/bible-server'
    DOCKER_REGISTRY_CREDENTIALS = credentials('DOCKER_REGISTRY_CREDENTIALS')
  

  options 
    timeout(10)
  

  stages 

    stage('Test') 
      steps 
        sh 'yarn'
        sh 'npm test'
      
    

    stage('Build') 
      when 
        branch '*/master'
      
      steps 
        sh 'docker login -u $DOCKER_REGISTRY_CREDENTIALS_USR -p $DOCKER_REGISTRY_CREDENTIALS_PSW registry.gitlab.com'
        sh 'docker build -t $IMAGE:$BRANCH_NAME .'
        sh 'docker push $IMAGE:$BRANCH_NAME'
      
    

    stage('Deploy') 
      when 
        branch '*/master'
      
      steps 
        echo 'Deploying ..'
      
    
  

  post 
    success 
      mail to: "XXXXX@gmail.com", subject:"SUCCESS: $currentBuild.fullDisplayName", body: "Yay, we passed."
    
    failure 
      mail to: "XXXXX@gmail.com", subject:"FAILURE: $currentBuild.fullDisplayName", body: "Boo, we failed."
    
  

【问题讨论】:

每当您对 Jenkinsfiles 有这样的语言问题时,请记住它们大多是 GROOVY 脚本。因此,如果您添加关键字“groovy”而不是“Jenkinsfile”,您可能会发现更多结果。 【参考方案1】:

official Jenkins documentation 仅提及如下单行命令:

// Declarative //

和 (see)

pipeline 
    /* insert Declarative Pipeline here */

Jenkinsfile 的语法基于Groovy,因此也可以使用groovy syntax for comments。引用:

/* a standalone multiline comment
   spanning two lines */
println "hello" /* a multiline comment starting
                   at the end of a statement */
println 1 /* one */ + 2 /* two */

/**
 * such a nice comment
 */

【讨论】:

【参考方案2】:

您可以对每一行使用块 (/***/) 或单行注释 (//)。您应该在 sh 命令中使用“#”。

屏蔽评论

/*  
post 
    success 
      mail to: "XXXXX@gmail.com", 
      subject:"SUCCESS: $currentBuild.fullDisplayName", 
      body: "Yay, we passed."
    
    failure 
      mail to: "XXXXX@gmail.com", 
      subject:"FAILURE: $currentBuild.fullDisplayName", 
      body: "Boo, we failed."
    
  
*/

单行

// post 
//     success 
//       mail to: "XXXXX@gmail.com", 
//       subject:"SUCCESS: $currentBuild.fullDisplayName", 
//       body: "Yay, we passed."
//     
//     failure 
//       mail to: "XXXXX@gmail.com", 
//       subject:"FAILURE: $currentBuild.fullDisplayName", 
//       body: "Boo, we failed."
//     
// 

“sh”命令中的注释

        stage('Unit Test') 
            steps 
                ansiColor('xterm')
                  sh '''
                  npm test
                  # this is a comment in sh
                  '''
                
            
        

【讨论】:

【参考方案3】:

评论在任何常见的 Java/Groovy 形式中都可以正常工作,但您不能目前使用 groovydoc 来处理您的 Jenkinsfile (s)。

首先,groovydoc 在没有扩展名的文件上出现了奇妙的错误

java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:109)
    at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:131)
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(String.java:1967)
    at org.codehaus.groovy.tools.groovydoc.SimpleGroovyClassDocAssembler.<init>(SimpleGroovyClassDocAssembler.java:67)
    at org.codehaus.groovy.tools.groovydoc.GroovyRootDocBuilder.parseGroovy(GroovyRootDocBuilder.java:131)
    at org.codehaus.groovy.tools.groovydoc.GroovyRootDocBuilder.getClassDocsFromSingleSource(GroovyRootDocBuilder.java:83)
    at org.codehaus.groovy.tools.groovydoc.GroovyRootDocBuilder.processFile(GroovyRootDocBuilder.java:213)
    at org.codehaus.groovy.tools.groovydoc.GroovyRootDocBuilder.buildTree(GroovyRootDocBuilder.java:168)
    at org.codehaus.groovy.tools.groovydoc.GroovyDocTool.add(GroovyDocTool.java:82)
    at org.codehaus.groovy.tools.groovydoc.GroovyDocTool$add.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
    at org.codehaus.groovy.tools.groovydoc.Main.execute(Main.groovy:214)
    at org.codehaus.groovy.tools.groovydoc.Main.main(Main.groovy:180)
    ... 6 more

...其次,据我所知,groovy 脚本开头的 Javadoc 样式的注释被忽略。因此,即使您将 Jenkinsfile 复制/重命名为 Jenkinsfile.groovy,您也不会获得太多有用的输出。

我希望能够使用一个

/**
 * Document my Jenkinsfile's overall purpose here
 */

在我的 Jenkinsfile 开头发表评论。 (还)没有这样的运气。

groovydoc 处理在Jenkinsfile 中定义的类和方法,如果你将-private 传递给命令。

【讨论】:

【参考方案4】:

Jenkinsfile 是用 groovy 编写的,它使用 Java(和 C)形式的 cmets:

/* this
   is a
   multi-line comment */

// this is a single line comment

【讨论】:

我在 sh 部分内的 jenkinsfile 上使用声明性管道,但它失败了,也许它在块级别上工作。 pipeline ... stage('Set Tagging') steps sh ''' echo "env.m_time='$m_time'" &gt; $params_file echo "env.m_comp_tag='$BRANCH_NAME_$m_time_$BUILD_NUMBER'" &gt;&gt; $params_file /* echo "env.docker_ws='/usr/local/lib/node_modules/$repo'" &gt;&gt; $params_file */ ''' &lt; 导致错误 /bash 权限错误 sh 部分内,您需要使用shell 注释字符:#

以上是关于Jenkins:可以将评论添加到 Jenkinsfile 中吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Jenkins 作业中获取 MR 的所有 GitLab 评论

Jenkins - 如果构建失败,将下载链接添加到文件

如何将自定义复选框组件添加到 JIRA 评论?

如何将标头(用于 jenkins crumb)添加到 github webhook?

msbuild怎么添加 到环境变量

如何将外部文件添加到 Jenkins 作业?