【问题标题】:Artifactory collect issues神器收集问题
【发布时间】:2019-10-16 18:22:05
【问题描述】:

我已将 Artifactory 和 Jira 插件安装到我的 Jenkins 构建中。添加了必需的标签,我看到构建将我的工件推送到 Artifactory。

我已经像这样添加了rtCollectIssues 部分:

    stage ('Issues Collection') {
        steps {
            rtCollectIssues (
                serverId: "${ENV_ARTIFACTORY_SERVER_ID}",
                config: """{
                    "version": 1,
                    "issues": {
                        "trackerName": "JIRA",
                        "regexp": "(.+-[0-9]+)\\s-\\s(.+)",
                        "keyGroupIndex": 1,
                        "summaryGroupIndex": 2,
                        "trackerUrl": "https://jira.my-company.com",
                        "aggregate": "true",
                        "aggregationStatus": "RELEASED"
                    }
                }""",

                buildName: "${ENV_JOB_NAME}",
                buildNumber: "${ENV_BUILD_NUMBER}"
            )
        }
    }

但是,我仍然没有在 Artifactory 的 Builds 下看到任何问题:

然而,它成功地从 Jenkins 发送了这些数据(基于下图)

如何添加 GIT cmets 以便收集它们并将其发送到 JFrog Artifactory?

编辑: 詹金斯文件:

pipeline {
    agent any

    environment {
        ENV_BRANCH_NAME = "${env.BRANCH_NAME}"
        ENV_BUILD_NUMBER = "${env.BUILD_NUMBER}"
        ENV_JOB_NAME = "${env.JOB_NAME.toLowerCase()}"
        ENV_ARTIFACTORY_URL = "artifactorydev.mycompany.com:8081"
        ENV_ARTIFACTORY_SERVER_ID = "art-01.net"
        ENV_ARTIFACTORY_VIRTUAL_REPO = "docker"
        ENV_ARTIFACTORY_RELEASE_REPO = "libs-release-local"
        ENV_GIT_URL = "https://myserver/_git/hello-world"
    }

    stages {
        stage ('Clone') {
            steps {
                echo 'Branch Name: ' + "${ENV_BRANCH_NAME}"
                echo 'Build Number: ' + "${ENV_BUILD_NUMBER}"
                echo 'Job Name: ' + "${ENV_JOB_NAME}"
                echo 'Artifactory Url: ' + "http://${ENV_ARTIFACTORY_URL}/artifactory"
                echo 'Artifactory ServerId: ' + "${ENV_ARTIFACTORY_SERVER_ID}"

                git(
                   url: "${ENV_GIT_URL}",
                   credentialsId: '4c81efa2-1d49-4b70-859e-d699c1f618c0',
                   branch: 'master'
                )
            }
        }

        stage ('Artifactory configuration') {
            steps {
                rtServer (
                    id: "${ENV_ARTIFACTORY_SERVER_ID}",
                    url: "http://${ENV_ARTIFACTORY_URL}/artifactory",
                    credentialsId: 'f8f8918e-0368-4b37-88ed-cf25401fa1e1',
                    bypassProxy: true
                )
            }
        }

        stage('Build Docker Image') {
            steps {
                echo 'Starting to build docker image'

                script {
                    def dockerfile = 'Dockerfile'
                    def customImage = docker.build('$ENV_ARTIFACTORY_URL/$ENV_ARTIFACTORY_VIRTUAL_REPO/$ENV_JOB_NAME:$ENV_BUILD_NUMBER', "-f ${dockerfile} .")

                }
            }
        }

        stage ('Push To Artifactory') {
            steps {
                rtDockerPush(
                    serverId: "${ENV_ARTIFACTORY_SERVER_ID}",
                    image: "$ENV_ARTIFACTORY_URL/$ENV_ARTIFACTORY_VIRTUAL_REPO/$ENV_JOB_NAME:$ENV_BUILD_NUMBER",
                    host: 'tcp://localhost:2375',
                    targetRepo: "$ENV_ARTIFACTORY_VIRTUAL_REPO",
                    // Attach custom properties to the published artifacts:
                    properties: 'status=stable'
                )
            }
        }

        stage ('Issues Collection') {
            steps {
                rtCollectIssues (
                    serverId: "${ENV_ARTIFACTORY_SERVER_ID}",
                    config: """{
                        "version": 1,
                        "issues": {
                            "trackerName": "JIRA",
                            "regexp": "(.+-[0-9]+)\\s-\\s(.+)",
                            "keyGroupIndex": 1,
                            "summaryGroupIndex": 2,
                            "trackerUrl": "https://jira.inwk.com",
                            "aggregate": "true",
                            "aggregationStatus": "RELEASED"
                        }
                    }""",

                    // You may alternatively provide a path to a config file, instead of the config itself, by setting:
                    // configPath: '/path/to/config'
                    buildName: "${ENV_JOB_NAME}",
                    buildNumber: "${ENV_BUILD_NUMBER}"
                )
            }
        }

        stage ('Publish Build Info') {
            steps {
                rtBuildInfo (
                    captureEnv: true,
                    includeEnvPatterns: ['*Env*'],
                    maxBuilds: 2,
                    maxDays: 2,
                    doNotDiscardBuilds: ["3"],
                    deleteBuildArtifacts: true,
                    buildName: "${ENV_JOB_NAME}",
                    buildNumber: "${ENV_BUILD_NUMBER}"
                )

                rtPublishBuildInfo (
                    serverId: "${ENV_ARTIFACTORY_SERVER_ID}",
                    buildName: "${ENV_JOB_NAME}",
                    buildNumber: "${ENV_BUILD_NUMBER}"
                )
            }
        }
    }
}

【问题讨论】:

    标签: jenkins jenkins-pipeline artifactory jenkins-groovy


    【解决方案1】:

    编辑(管道添加到问题后):

    rtBuildInfo 步骤配置构建信息实例。如果没有指定名称/编号,它会配置与 jenkins 作业匹配的默认构建信息。

    提供自定义构建详细信息时,如果尚未创建匹配的构建信息实例,则会创建一个新的构建信息实例。因此,在创建新实例时,该步骤应在将使用该实例的其他步骤之前使用。

    因此,您的管道示例如下:

    pipeline { agent any
    
    environment {
        ENV_BRANCH_NAME = "${env.BRANCH_NAME}"
        ENV_BUILD_NUMBER = "${env.BUILD_NUMBER}"
        ENV_JOB_NAME = "${env.JOB_NAME.toLowerCase()}"
        ENV_ARTIFACTORY_URL = "artifactorydev.mycompany.com:8081"
        ENV_ARTIFACTORY_SERVER_ID = "art-01.net"
        ENV_ARTIFACTORY_VIRTUAL_REPO = "docker"
        ENV_ARTIFACTORY_RELEASE_REPO = "libs-release-local"
        ENV_GIT_URL = "https://myserver/_git/hello-world"
    }
    
    stages {
        stage ('Clone') {
            steps {
                echo 'Branch Name: ' + "${ENV_BRANCH_NAME}"
                echo 'Build Number: ' + "${ENV_BUILD_NUMBER}"
                echo 'Job Name: ' + "${ENV_JOB_NAME}"
                echo 'Artifactory Url: ' + "http://${ENV_ARTIFACTORY_URL}/artifactory"
                echo 'Artifactory ServerId: ' + "${ENV_ARTIFACTORY_SERVER_ID}"
    
                git(
                   url: "${ENV_GIT_URL}",
                   credentialsId: '4c81efa2-1d49-4b70-859e-d699c1f618c0',
                   branch: 'master'
                )
            }
        }
    
        stage ('Artifactory configuration') {
            steps {
                rtServer (
                    id: "${ENV_ARTIFACTORY_SERVER_ID}",
                    url: "http://${ENV_ARTIFACTORY_URL}/artifactory",
                    credentialsId: 'f8f8918e-0368-4b37-88ed-cf25401fa1e1',
                    bypassProxy: true
                )
            }
        }
    
        stage ('Configure Build Info') {
            steps {
                rtBuildInfo (
                    captureEnv: true,
                    includeEnvPatterns: ['*Env*'],
                    maxBuilds: 2,
                    maxDays: 2,
                    doNotDiscardBuilds: ["3"],
                    deleteBuildArtifacts: true,
                    buildName: "${ENV_JOB_NAME}",
                    buildNumber: "${ENV_BUILD_NUMBER}"
                )
            }
        }
        stage('Build Docker Image') {
            steps {
                echo 'Starting to build docker image'
    
                script {
                    def dockerfile = 'Dockerfile'
                    def customImage = docker.build('$ENV_ARTIFACTORY_URL/$ENV_ARTIFACTORY_VIRTUAL_REPO/$ENV_JOB_NAME:$ENV_BUILD_NUMBER', "-f ${dockerfile} .")
    
                }
            }
        }
    
    
        stage ('Push To Artifactory') {
            steps {
                rtDockerPush(
                    serverId: "${ENV_ARTIFACTORY_SERVER_ID}",
                    image: "$ENV_ARTIFACTORY_URL/$ENV_ARTIFACTORY_VIRTUAL_REPO/$ENV_JOB_NAME:$ENV_BUILD_NUMBER",
                    host: 'tcp://localhost:2375',
                    targetRepo: "$ENV_ARTIFACTORY_VIRTUAL_REPO",
                    // Attach custom properties to the published artifacts:
                    properties: 'status=stable',
                    buildName: "${ENV_JOB_NAME}",
                    buildNumber: "${ENV_BUILD_NUMBER}"
                )
            }
        }
    
        stage ('Issues Collection') {
            steps {
                rtCollectIssues (
                    serverId: "${ENV_ARTIFACTORY_SERVER_ID}",
                    config: """{
                        "version": 1,
                        "issues": {
                            "trackerName": "JIRA",
                            "regexp": "(.+-[0-9]+)\\s-\\s(.+)",
                            "keyGroupIndex": 1,
                            "summaryGroupIndex": 2,
                            "trackerUrl": "https://jira.inwk.com",
                            "aggregate": "true",
                            "aggregationStatus": "RELEASED"
                        }
                    }""",
    
                    // You may alternatively provide a path to a config file, instead of the config itself, by setting:
                    // configPath: '/path/to/config'
                    buildName: "${ENV_JOB_NAME}",
                    buildNumber: "${ENV_BUILD_NUMBER}"
                )
            }
        }
    
        stage ('Publish Build Info') {
            steps {
                rtPublishBuildInfo (
                    serverId: "${ENV_ARTIFACTORY_SERVER_ID}",
                    buildName: "${ENV_JOB_NAME}",
                    buildNumber: "${ENV_BUILD_NUMBER}"
                )
            }
        }
    }
    }
    

    注意rtBuildInfo 步骤是如何在使用它的任何步骤之前移动到的。我还将buildNamebuildNumber 字段添加到rtDockerPush 步骤,假设您还希望为该步骤收集构建信息。

    现在,当您在日志中看到已添加问题时,您也应该在 Artifactory 中看到它们。

    编辑结束。


    如何添加 GIT cmets 以便收集它们并将其发送到 JFrog Artifactory?

    问题集合配置中的 regexp 字段控制将哪些 git 消息收集为问题。来自documentation

    用于匹配 git 提交消息的正则表达式。该表达式应包括两个捕获组 - 用于问题密钥 (ID) 和问题摘要。

    例如,对于以下正则表达式字段: 'regexp': '(.+-[0-9]+)\\s-\\s(.+)' 正则表达式匹配提交消息,如下例所示:

    HAP-1364 - 用空格替换制表符

    【讨论】:

    • 在构建的“问题”选项卡下仍然没有任何内容。请查看我的完整 Jenkinsfile
    • @ShaneKm 我已经相应地编辑了我的答案。在完成新提交之前,您不会看到添加到当前构建的问题,因为构建已经使用最新的 git 修订版发布。如果它是一个测试版本,您可以将其删除并重新开始以查看它是否正常工作或克隆到较旧的 git 版本。
    猜你喜欢
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2020-11-30
    • 2023-03-21
    • 1970-01-01
    • 2015-11-28
    相关资源
    最近更新 更多