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

如何在Jenkins Pipeline中获取构建及变更关联的工作项?

在Jenkins Pipeline中获取构建关联的工作项

我来帮你搞定这个问题,结合你现在的代码,主要有两种常用的思路,你可以根据团队的实际情况选择:

一、通用方案:从提交注释里提取工作项ID

大部分团队都会在提交代码时,把关联的工作项ID(比如JIRA-1234、PROJECT-567)写在提交注释里,这种情况我们可以用正则表达式直接从变更的注释中匹配提取。

比如假设你的工作项格式是大写字母+横杠+数字(像Jira的标准格式),可以直接修改你现有的代码,加入提取逻辑:

def changeSets = build.changeSets
if(changeSets != null) {
    def hadChanges = false
    // 这里的正则可以根据你们团队的工作项格式调整,比如改成~/#(\d+)/适配数字型ID
    def workItemPattern = ~/([A-Z]+-\d+)/
    %>
    <table class="section">
        <tr class="tr-title">
            <td class="td-title" colspan="2">Cambios</td>
        </tr>
        <% changeSets.each() { cs_list ->
            cs_list.each() { cs ->
                hadChanges = true
                // 提取当前变更关联的工作项
                def workItems = []
                if (cs.comment) {
                    def matcher = cs.comment =~ workItemPattern
                    while (matcher.find()) {
                        workItems.add(matcher.group(1))
                    }
                }
        %>
        <tr>
            <td class="td-subtitle">Usuario:</td>
            <td class="td-author">
                <%= cs.metaClass.hasProperty('commitId') ? cs.commitId : cs.metaClass.hasProperty('revision') ? cs.revision : cs.metaClass.hasProperty('changeNumber') ? cs.changeNumber : "" %>
                <B><%= cs.author %></B>
            </td>
        </tr>
        <%// 如果有提取到工作项,就添加一行显示 %>
        <% if (!workItems.isEmpty()) { %>
        <tr>
            <td class="td-subtitle">关联工作项:</td>
            <td class="td-content">
                <%= workItems.join(', ') %>
            </td>
        </tr>
        <% } %>
        <%// 可选:显示提交注释 %>
        <% if (cs.comment) { %>
        <tr>
            <td class="td-subtitle">注释:</td>
            <td class="td-content"><%= cs.comment %></td>
        </tr>
        <% } %>
        <% }}} %>
    </table>
    <% if (!hadChanges) { %>
    <p>No hay cambios en esta construcción.</p>
    <% } %>

二、借助专用插件直接获取(适合集成项目管理工具的场景)

如果你的Jenkins已经和Jira、Azure DevOps、GitLab这类工具集成了,用对应插件可以更精准地获取关联工作项,不用自己写正则:

1. Jira集成(需安装Jira Plugin)

如果提交已经关联了Jira issue,插件可以直接拿到关联的工作项:

// 获取当前构建关联的所有Jira issues
def jiraIssues = jiraIssueSelector(issueSelector: "byCurrentBuild()")
if (jiraIssues) {
    echo "关联Jira工作项: ${jiraIssues.join(', ')}"
}

你可以把这段逻辑整合到邮件模板里,直接输出这些issue ID。

2. Azure DevOps/TFS集成(需安装Azure DevOps Plugin)

如果用Azure DevOps管理代码和工作项,插件提供了直接获取的方法:

def workItems = azureDevOpsWorkItems()
workItems.each { item ->
    echo "工作项ID: ${item.id}, 标题: ${item.title}"
}

3. GitLab集成(需安装GitLab Plugin)

GitLab的issue通常用#数字格式关联,除了正则提取,也可以用插件的能力,不过简单的正则也足够:

def workItemPattern = ~/#(\d+)/
changeSets.each { cs_list ->
    cs_list.each { cs ->
        if (cs.comment) {
            def matcher = cs.comment =~ workItemPattern
            matcher.each { match ->
                echo "关联GitLab Issue: #${match[1]}"
            }
        }
    }
}

一些注意点

  • 确保Jenkins的服务账号有访问对应项目管理工具的权限,不然插件可能拿不到数据;
  • 如果你的Pipeline拉取了多个仓库的代码,build.changeSets会包含所有仓库的变更,可能需要针对不同仓库调整提取逻辑;
  • 正则表达式一定要匹配你们团队的提交规范,比如如果工作项是纯数字,就把正则改成~/\b(\d+)\b/之类的。

内容的提问来源于stack exchange,提问作者Hector Scesa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:22:06