Jenkinsfile中使用共享库配置

48次阅读
没有评论

问题描述

团队中有许多项目,它们的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. 我们的方法是否正确?将所有通用配置放在一个文件中,并在库脚本中加载它。
  2. 如果不正确,你会如何解决我们的问题?是否只需在每次调用时传递配置参数?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1 – 使用Global Shared Libraries
你可以考虑使用Jenkins的Global Shared Libraries来重用逻辑,这样你可以跨不同的Jenkinsfile共享代码。

  1. 了解如何使用Global Shared Libraries。不过需要注意,你提到你们的Jenkins由其他团队管理,如果他们不需要使用你们的库,这个方法可能不适合。
  2. 如果选择使用Global Shared Libraries,可以考虑使用单元测试框架,比如JenkinsPipelineUnit来测试这些库的功能。

方案2 – 使用配置文件
如果你仍然想要使用配置文件的方式,可以考虑以下方法:

  1. 在Jenkinsfile中加载配置文件,将参数传递给共享库。但是需要注意,由于Groovy的早期评估问题,当在某些共享库闭包中使用${properties.repo}时,可能会出现值为null的问题。这需要谨慎处理。
  2. 使用pipeline.properties文件来存储变量,然后通过readProperties步骤来读取。但是需要注意Groovy的早期评估问题。

以上是两种解决方案的思路,你可以根据你们团队的实际需求选择适合的方式。如果你选择了第二种方式,请谨慎处理Groovy的早期评估问题,确保你的共享库能够正常工作。

感谢你提前的帮助!如果有其他问题,请继续咨询。

正文完