首页 > 解决方案 > 在 Jenkinsfile 中设置可重用属性的最佳方法

问题描述

我的 Jenkins 管道共享库可以按需发送通知。用户基本上必须为他想要通知的每个阶段发送通知通道详细信息,例如松弛通道名称或电子邮件 ID。

我不希望用户在每个阶段都重复这个属性,而是在 Jenkinsfile 中定义一次,我可以使用它。设置此变量的最佳方法是什么?

样本:

// this properties needs to be accessed by my groovy files
def properties = "channelNm,token"
node('myNode'){

stage('checkout'){
   slackNotify = "yes"
   .....
 }
 stage('compile'){
   slackNotify = "yes"
   .....
 }
}

标签: groovyjenkins-pipeline

解决方案


当您使用 Jenkins 共享库时,您可以创建一个配置类,并且您可以公开一个允许您修改配置对象的 DSL 脚本。看看下面的例子。假设您有一个名为NotificationConfig位于src文件夹中的类:

src/NotificationConfig.groovy

@Singleton
class NotificationConfig {
    String slackChannelName
    String email
    String otherStuff
}

这个类是一个单例,这意味着您可以使用NotificationConfig.instance. 现在,假设您有一个notificationConfig.groovy位于vars文件夹中的 DSL 脚本:

vars/notificationConfig.groovy

#!groovy

def call(Closure body) {
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = NotificationConfig.instance
    body()
}

这是一个非常简单的脚本,它委托闭包主体在对象的上下文中执行NotificationConfig。现在让我们看一下使用notificationConfigDSL 设置一些配置值的非常简单的脚本化管道:

詹金斯文件

notificationConfig {
    email = 'test@test.com'
    slackChannelName = 'test'
}

node {
    stage('Test') {
        echo NotificationConfig.instance.email
    }
}

当我运行这个简单的管道时,我看到:

[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/test-pipeline
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] echo
test@test.com
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

如您所见,您可以使用此类 DSLNotificationConfig对象公开并让管道定义自己的值,然后使用NotificationConfig.instance对象访问共享库中的这些值。

注意:您始终可以在对象中设置一些默认值,NotificationConfig以便库用户可以在其管道中覆盖它们或在需要时依赖默认值。

这是 Jenkins Pipeline 共享库中非常流行的模式。您可以在这篇 Jenkins 博客文章中了解更多信息 - https://jenkins.io/blog/2017/10/02/pipeline-templates-with-shared-libraries/


推荐阅读