Jenkins技术问询:如何获取指定构建号的构建显示名(跨项目场景)
让我来帮你搞定这两个Jenkins场景下的问题,分情况给你详细说明:
1. 基础场景:已知构建编号,获取该构建的显示名称
这个需求分自由风格项目和流水线项目两种实现方式,你可以根据自己的项目类型选择:
自由风格项目
用Groovy脚本直接读取Jenkins内部对象来获取:
- 在构建步骤里添加「Execute Groovy script」(如果没有这个选项,需要先安装Groovy插件)
- 写入以下脚本(替换成你的项目名称和目标构建编号):
// 获取目标项目的指定构建 def targetBuild = Jenkins.instance.getItemByFullName("你的项目名称").getBuildByNumber(123) // 输出显示名称(如果要存为环境变量供后续步骤使用,就加下面这行) env.TARGET_BUILD_DISPLAY_NAME = targetBuild.getDisplayName()
- 后续步骤里就能用
${TARGET_BUILD_DISPLAY_NAME}调用这个显示名称了。
流水线项目
Pipeline语法更简洁直接,直接在脚本里调用:
pipeline { agent any stages { stage('Get Display Name') { steps { script { // 获取指定项目的指定构建 def targetBuild = Jenkins.instance.getItemByFullName("你的项目名称").getBuildByNumber(123) def displayName = targetBuild.displayName echo "目标构建的显示名称:${displayName}" // 如果要设置当前构建的显示名称,直接用currentBuild.displayName = displayName } } } } }
2. 跨项目场景:同步Project A的构建显示名称到Project B
你现在用Copy Artifact Plugin只能拿到构建编号,要同步显示名称,这里有3种靠谱的方案:
方案一:用Groovy脚本直接读取Project A的构建信息(推荐)
这个方法不需要额外修改Project A,直接在Project B里操作:
- 假设你已经通过Copy Artifact Plugin拿到了Project A的构建编号,存在环境变量
${PROJECT_A_BUILD_NUMBER}里 - 在Project B的构建步骤中添加「Execute Groovy script」,写入:
def projectA = Jenkins.instance.getItemByFullName("Project A") def buildA = projectA.getBuildByNumber(Integer.parseInt(env.PROJECT_A_BUILD_NUMBER)) // 把Project A的显示名称存为环境变量 env.PROJECT_A_DISPLAY_NAME = buildA.getDisplayName()
- 接着用Build Name Setter Plugin设置Project B的构建显示名称为
${PROJECT_A_DISPLAY_NAME}
如果是流水线项目,直接把这段逻辑写到Pipeline脚本里:
pipeline { agent any stages { stage('Copy Artifacts from Project A') { steps { copyArtifacts( projectName: 'Project A', selector: specific(env.PROJECT_A_BUILD_NUMBER), // 替换成你的选择器,比如latestSuccessful target: 'artifacts' ) } } stage('Sync Display Name') { steps { script { def projectA = Jenkins.instance.getItemByFullName("Project A") def buildA = projectA.getBuildByNumber(Integer.parseInt(env.PROJECT_A_BUILD_NUMBER)) currentBuild.displayName = buildA.displayName } } } stage('Repackage') { steps { // 你的重新打包操作 } } } }
注意:第一次运行Groovy脚本可能会触发Jenkins的脚本权限验证,需要去「Manage Jenkins → In-process Script Approval」里批准相关的方法调用。
方案二:让Project A把显示名称作为构件一起打包
这个方法需要修改Project A的配置,把显示名称写入文件并归档:
- 在Project A的构建步骤末尾,添加「Execute shell」(Linux)或「Execute Windows batch command」(Windows):
# Linux/macOS echo "${BUILD_DISPLAY_NAME}" > build_display_name.txt # Windows echo %BUILD_DISPLAY_NAME% > build_display_name.txt
- 在Project A的「Archive the artifacts」步骤中,添加
build_display_name.txt到归档列表 - 在Project B中复制构件后,读取这个文件的内容并存为环境变量:
# Linux/macOS:把内容写入构建环境变量 PROJECT_A_DISPLAY_NAME=$(cat artifacts/build_display_name.txt) echo "PROJECT_A_DISPLAY_NAME=${PROJECT_A_DISPLAY_NAME}" >> $BUILD_ENVIRONMENT # Windows: for /f "delims=" %%i in (artifacts\build_display_name.txt) do set PROJECT_A_DISPLAY_NAME=%%i
- 最后用Build Name Setter Plugin设置显示名称即可。
方案三:通过Jenkins API获取显示名称
如果你的Jenkins允许外部访问API,可以用curl调用(需要注意权限):
# 替换成你的Jenkins地址、用户名、API Token和Project A的构建编号 PROJECT_A_DISPLAY_NAME=$(curl -u 你的用户名:你的API_Token "http://你的Jenkins地址/job/Project%20A/${PROJECT_A_BUILD_NUMBER}/api/json" | jq -r '.displayName') # 把变量写入构建环境 echo "PROJECT_A_DISPLAY_NAME=${PROJECT_A_DISPLAY_NAME}" >> $BUILD_ENVIRONMENT
注意:需要安装jq工具来解析JSON,Windows用户可以用PowerShell的
ConvertFrom-Json来替代。
内容的提问来源于stack exchange,提问作者fei0x
相关产品推荐
相关产品推荐

