groovy - 在 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"
.....
}
}
解决方案
当您使用 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
。现在让我们看一下使用notificationConfig
DSL 设置一些配置值的非常简单的脚本化管道:
詹金斯文件
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/
推荐阅读
- python - 使用pygame按下按钮时播放文件夹中的随机音频文件
- python - Python Requests 库填写选项列表
- c# - 如何在不使用数据库的情况下将数据对象保存在数据网格中
- python - 在 Eager 模式下实例化 InceptionResNetV2 时出错
- python-3.x - 如何使用星和点在 python 3 中创建字符模式?
- python-3.x - Python-Tkinter - Ttk ComboBox - 获取函数返回空字符串(长度= 0)
- batch-file - 如何逐行读取文本文件并使用批处理文件修改每一行?
- angularjs - 如何使用 AngularJS 发送数据视图
- javascript - 编辑动态生成的列表项的文本,其中不包含图标
- web-scraping - 使用 python 请求抓取数据表