问题描述
在使用Jenkins的Pipeline时,希望能够从Pipeline内部访问作业配置页面上设置的值。这些值既不作为参数提供,也不作为环境变量注入。
安装及设置
- Jenkins版本:v2.263.1
- GitLab Branch Source插件版本:v1.5.3(链接)
- 多分支Pipeline作业,指向Gitlab存储库
- Remote Jenkinsfile Provider插件版本:v1.13(链接)
问题
通常情况下,Jenkinsfile会位于存储库的根目录,因此源码管理(scm)与我们要检出和构建的存储库相关联。然而,在这种情况下,我想要构建的代码位于与Jenkinsfile不同的存储库中(因此需要Remote Jenkinsfile Provider插件)。
这意味着我需要显式在Pipeline中检出我希望构建的代码,而为了做到这一点,我需要知道存储库的信息。然而,这个存储库已经在作业配置中定义。
Branch Source插件可以将诸如分支名称、合并请求编号/分支/目标等内容导出为适当的环境变量,但并未导出实际存储库。
由于这是一个多分支Pipeline,我也不能像使用envInject那样使用(多分支作业与其他作业不提供“为运行准备环境”的选项)。
目标
我希望能够访问作业配置页面上设置的server
、owner
和project
字段。最终,我可以只访问项目的ssh/http地址。
如何从Pipeline中访问作业配置
你可以采取一些方式来从Pipeline中访问作业配置的信息。以下是一种可能的方法:
方案
请注意,下面的示例代码基于Groovy语言,用于Jenkins的Pipeline脚本。
- 在Pipeline脚本中,使用
Jenkins.instance.getItemByFullName
来获取作业实例。 - 使用
getProperty
方法来获取作业属性(参数)的值。你需要传递GitLab项目参数的类名作为参数。你可以在插件的API文档中找到这个类名。
下面是一个示例代码片段,展示了如何从作业配置中获取GitLab项目参数的值:
def job = Jenkins.instance.getItemByFullName('YourJobFullName')
def gitLabProjectProperty = job.getProperty(io.jenkins.plugins.gitlabbranchsource.GitLabProjectProperty)
if (gitLabProjectProperty) {
def server = gitLabProjectProperty.getServer()
def owner = gitLabProjectProperty.getOwner()
def project = gitLabProjectProperty.getProject()
// 在这里可以使用 server、owner 和 project 的值进行后续操作
} else {
echo 'GitLabProjectProperty not found'
}
在上面的示例中,我们首先获取作业实例,然后使用getProperty
方法获取GitLab项目参数的属性。如果找到了属性,我们可以通过调用相应的方法获取server
、owner
和project
的值,然后在后续操作中使用这些值。
注意
- 代码中的
'YourJobFullName'
需要替换为你的作业的全名。 io.jenkins.plugins.gitlabbranchsource.GitLabProjectProperty
是根据插件的类名指定的,具体类名可能需要根据插件的版本进行调整。
其他方案
如果你的需求类似于在多个存储库之间共享一个Jenkinsfile或构建Pipeline,你可以考虑使用Jenkins的Shared Libraries。Shared Libraries允许你将所有的构建Pipeline代码放入一个单独的共享库中,然后从各个存储库的Jenkinsfile中调用共享库中的代码。
总结
通过使用Jenkins Pipeline脚本,你可以访问作业配置页面上设置的值。通过获取作业实例并获取相应的属性,你可以获得所需的信息,以便在Pipeline中进行后续操作。同时,也可以考虑使用Shared Libraries来更好地组织和管理Pipeline的代码。