You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins技术问询:如何获取指定构建号的构建显示名(跨项目场景)

让我来帮你搞定这两个Jenkins场景下的问题,分情况给你详细说明:

1. 基础场景:已知构建编号,获取该构建的显示名称

这个需求分自由风格项目和流水线项目两种实现方式,你可以根据自己的项目类型选择:

自由风格项目

用Groovy脚本直接读取Jenkins内部对象来获取:

  1. 在构建步骤里添加「Execute Groovy script」(如果没有这个选项,需要先安装Groovy插件)
  2. 写入以下脚本(替换成你的项目名称和目标构建编号):
// 获取目标项目的指定构建
def targetBuild = Jenkins.instance.getItemByFullName("你的项目名称").getBuildByNumber(123)
// 输出显示名称(如果要存为环境变量供后续步骤使用,就加下面这行)
env.TARGET_BUILD_DISPLAY_NAME = targetBuild.getDisplayName()
  1. 后续步骤里就能用${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里操作:

  1. 假设你已经通过Copy Artifact Plugin拿到了Project A的构建编号,存在环境变量${PROJECT_A_BUILD_NUMBER}里
  2. 在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()
  1. 接着用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的配置,把显示名称写入文件并归档:

  1. 在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
  1. 在Project A的「Archive the artifacts」步骤中,添加build_display_name.txt到归档列表
  2. 在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
  1. 最后用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:13:01