如何在Jenkinsfile中获取@Library指定的GitHub分支名而非PR编号
问题原因说明
env.GIT_BRANCH、env.BRANCH_NAME 仅返回当前流水线自身代码仓库对应的分支信息,和你导入的共享库指定的版本/分支没有关联,Jenkins默认不会将共享库的版本信息直接暴露为全局环境变量,所以无法通过这两个变量获取。
可行解决方案
方案1:预定义共享库配置(最推荐)
提前将所有共享库的名称、版本信息存入自定义变量,再动态加载库,后续直接从变量中取值即可,无需额外解析:
// 第一步:预定义所有共享库配置 def sharedLibs = [ "lib1": [name: "my-shared-library1", version: null], "lib2": [name: "my-shared-library2", version: "1.0"], "lib3": [name: "my-shared-library3", version: "my-branch-name"] ] // 第二步:动态加载所有共享库 sharedLibs.each { libId, config -> def fullLibRef = config.version ? "${config.name}@${config.version}" : config.name library(fullLibRef) } // 后续可直接提取对应库的分支/版本 def lib2Version = sharedLibs.lib2.version // 取值为 1.0 def lib3Branch = sharedLibs.lib3.version // 取值为 my-branch-name
方案2:正则解析库引用字符串
如果你坚持使用@Library注解的方式加载库,可以通过Groovy字符串方法直接判断并提取@后的内容:
// 封装提取方法:传入完整的库引用字符串,返回@后的内容,无@则返回null def extractLibVersion(String libRef) { return libRef.contains('@') ? libRef.split('@', 2)[1] : null } // 测试示例 assert extractLibVersion('my-shared-library1') == null assert extractLibVersion('my-shared-library2@1.0') == '1.0' assert extractLibVersion('my-shared-library3@my-branch-name') == 'my-branch-name'
方案3:共享库自暴露版本(适合有权限修改共享库的场景)
在对应共享库的vars目录下新建getLibraryVersion.groovy文件,写入以下内容:
def call() { // 从共享库的类加载路径中提取当前加载的版本号/分支名 return this.class.protectionDomain.codeSource.location.path.split('@')[1].takeBefore('/') }
之后在Jenkinsfile中加载完共享库后,直接调用该方法即可获取版本:
@Library('my-shared-library3@my-branch-name') _ def lib3Branch = getLibraryVersion() // 取值为 my-branch-name
内容的提问来源于stack exchange,提问作者mzarifyan
相关产品推荐
相关产品推荐

