问题描述
团队中有许多项目,它们的Jenkinsfile非常相似。为了避免重复,他们正在开发一个带有一些工具的共享库。这个库在每个Jenkinsfile中动态加载,并且一些参数在调用之间重复出现。例如,一个工具有一个自定义的Slack消息发布函数,其中“channel”、“bot token”和一些“fixed text”始终相同。
他们想要的是在每次调用这个Slack函数时,不必提供这些参数,而是考虑制作一个配置文件,并在全局范围内加载所有这些“常量”参数。
他们尝试了放置一个config.json
文件,并使用了以下readJSON
步骤:
def load(path) {
env.CONFIGURATION = readJSON(file: path)
}
这样,CONFIGURATION
是一个环境变量,所以它是全局的。问题在于环境变量似乎只能是字符串,所以JSON是破碎的(例如,无法执行env.CONFIGURATION.slack.channel
)。
他们还尝试了以下在Jenkinsfile
中的方式:
def CONFIG = readJSON(file: path)
但是,CONFIG
在库脚本中不可见。
现在,问题如下:
- 我们的方法是否正确?将所有通用配置放在一个文件中,并在库脚本中加载它。
- 如果不正确,你会如何解决我们的问题?是否只需在每次调用时传递配置参数?
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1 – 使用Global Shared Libraries
你可以考虑使用Jenkins的Global Shared Libraries来重用逻辑,这样你可以跨不同的Jenkinsfile共享代码。
- 了解如何使用Global Shared Libraries。不过需要注意,你提到你们的Jenkins由其他团队管理,如果他们不需要使用你们的库,这个方法可能不适合。
- 如果选择使用Global Shared Libraries,可以考虑使用单元测试框架,比如JenkinsPipelineUnit来测试这些库的功能。
方案2 – 使用配置文件
如果你仍然想要使用配置文件的方式,可以考虑以下方法:
- 在Jenkinsfile中加载配置文件,将参数传递给共享库。但是需要注意,由于Groovy的早期评估问题,当在某些共享库闭包中使用
${properties.repo}
时,可能会出现值为null的问题。这需要谨慎处理。 - 使用
pipeline.properties
文件来存储变量,然后通过readProperties
步骤来读取。但是需要注意Groovy的早期评估问题。
以上是两种解决方案的思路,你可以根据你们团队的实际需求选择适合的方式。如果你选择了第二种方式,请谨慎处理Groovy的早期评估问题,确保你的共享库能够正常工作。
感谢你提前的帮助!如果有其他问题,请继续咨询。