跨阶段聚合artifactorybuildinfo并上载环境变量

跨阶段聚合artifactorybuildinfo并上载环境变量,artifactory,multibranch-pipeline,Artifactory,Multibranch Pipeline,我有两个不同的问题 我使用的是jenkins多分支声明性管道。 在其中,我定义了多个阶段 问题1 在初始化环境的某个阶段,我从Artifactory下载了一个文件。管道的输出在单独的阶段上载到Artifactory中的不同区域。 我看到,buildInfo可以附加到。以下是上述参考文献中的要点: Publishing Build-Info to Artifactory Both the download and upload methods return a build-info object

我有两个不同的问题

我使用的是jenkins多分支声明性管道。 在其中,我定义了多个阶段

问题1 在初始化环境的某个阶段,我从Artifactory下载了一个文件。管道的输出在单独的阶段上载到Artifactory中的不同区域。 我看到,
buildInfo
可以附加到。以下是上述参考文献中的要点:

Publishing Build-Info to Artifactory

Both the download and upload methods return a build-info object which can be published to Artifactory as shown in the following examples:
def buildInfo1 = server.download downloadSpec
def buildInfo2 = server.upload uploadSpec
buildInfo1.append buildInfo2
server.publishBuildInfo buildInfo1
buildInfo.env.capture = true
server.publishBuildInfo buildInfo
如何保存第一阶段中的buildinfo以用作第二阶段中调用
publishBuilInfo
的一部分

问题2 一旦发布了构建信息和相关工件,当我查看
构建浏览器
,特别是环境选项卡时,我发现没有填充任何环境或系统变量。我还应该提到,我已经按照参考资料中提供的必要步骤收集了环境变量:

Publishing Build-Info to Artifactory

Both the download and upload methods return a build-info object which can be published to Artifactory as shown in the following examples:
def buildInfo1 = server.download downloadSpec
def buildInfo2 = server.upload uploadSpec
buildInfo1.append buildInfo2
server.publishBuildInfo buildInfo1
buildInfo.env.capture = true
server.publishBuildInfo buildInfo
这就引出了一个相关的问题:在第一阶段收集第一个builInfo是否有意义:

buildInfo.env.collect()

第1期

有两种方法可以将多个构建聚合到管道脚本中的一个buildInfo实例中

第一个就是您所做的-保存从server.uoloadserver.downkoad方法返回的buildInfo实例,然后使用buildInfo.append方法附加(聚合)两个buildInfo实例

第二种方法可能是您需要的,即创建一个buildInfo实例,并将其作为参数发送给server.uoloadserver.doenload方法。通过这种方式,您可以将同一个buildInfo实例发送到多个上载或下载方法,并使其聚合所有内容

以下是您的操作方法:

def buildInfo = Artifactory.newBuildInfo()
server.download spec: downloadSpec, buildInfo: buildInfo
server.upload spec: uploadSpec, buildInfo: buildInfo
server.publishBuildInfo buildInfo
这对你有什么帮助

既然您手动创建了buildInfo实例,那么您可以在两个阶段之上的范围内定义它,这样,所有阶段都可以使用buildInfo实例

下面是一个例子:

node {
    // Obtain an Artifactory server instance, defined in Jenkins --> Manage:
    def server = Artifactory.server "SERVER_ID"
    // Create a buildInfo instance, to be used by the stages of this pipeline:
    def buildInfo = Artifactory.newBuildInfo()

    stage ('Upload files to Artifactory') {
        def uploadSpec = """{
            "files": [
                    { "pattern": "/Users/eyalb/.m2/repository/a*a*.jar",
                      "target": "generic-local", 
                      "excludePatterns": ["*SNAPSHOT*"],
                      "flat": "false" 
                    }
                ]
            }"""

        server.upload spec: uploadSpec, buildInfo: buildInfo
    }

    stage ('Collect env vars') {
        buildInfo.env.filter.addExclude("DONT_COLLECT*")

        // By default the filter is configured to exclude "*password*,*secret*,*key*", but since we're overriding this configuration by adding our own exclusion, let's add these excludes:
        buildInfo.env.filter
            .addExclude("*password*")        
            .addExclude("*secret*")        
            .addExclude("*key*")        

        withEnv(['DO_COLLECT_FOO=BAR', 'DONT_COLLECT_FOO=BAR']) {
            buildInfo.env.collect()
        }
    }

    stage ('Access build info env vars') {
        // BAR will printed
        echo buildInfo.env.vars['DO_COLLECT_FOO']

        // null will be printed, because we excluded it.
        echo buildInfo.env.vars['DONT_COLLECT_FOO'] 
    }

    stage ('Set build retention') {
        buildInfo.retention maxBuilds: 1, maxDays: 2, doNotDiscardBuilds: ["3"], deleteBuildArtifacts: true
    }

    stage ('Publish build info') {
        server.publishBuildInfo buildInfo
    }
}
如果您想使用声明性管道,下面介绍如何在多个阶段之间共享同一个buildInfo实例。请注意initBuildInfo()方法-只需调用一次。以下示例仅包括上述脚本化管道示例中的两个阶段:

pipeline {
    agent {
      label "my-agents"
    }
    stages {
      stage('Upload files to Artifactory') {
        steps {
            initBuildInfo()
            def uploadSpec = """{
                "files": [
                        { "pattern": "/Users/eyalb/.m2/repository/a*a*.jar",
                          "target": "generic-local", 
                          "excludePatterns": ["*SNAPSHOT*"],
                          "flat": "false" 
                        }
                    ]
                }"""

            server.upload spec: uploadSpec, buildInfo: buildInfo
        }
      }
      stage('Collect env vars') {
        steps {
            buildInfo.env.filter.addExclude("DONT_COLLECT*")

            // By default the filter is configured to exclude "*password*,*secret*,*key*", but since we're overriding this configuration by adding our own exclusion, let's add these excludes:
            buildInfo.env.filter
                .addExclude("*password*")        
                .addExclude("*secret*")        
                .addExclude("*key*")        

            withEnv(['DO_COLLECT_FOO=BAR', 'DONT_COLLECT_FOO=BAR']) {
                buildInfo.env.collect()
            }
        }
      }
    }
  }

def rtServer, buildInfo
void initBuildInfo() {
    script {
        rtServer = Artifactory.server "JX_ARTIFACTORY_SERVER"
        buildInfo = Artifactory.newBuildInfo()
    }
}
第二期

当你跑步时:

buildInfo.env.collect()
您现在要求Jenkins收集环境变量(在执行collect()方法时),并将它们存储在此buildInfo实例上

设置时:

buildInfo.env.capture = true
您要求Jenkins收集使用此buildInfo的每个上载和下载方法的环境变量。您可以按如下方式使用它:

def buildInfo = Artifactory.newBuildInfo()
buildInfo.env.capture = true
server.download spec: downloadSpec, buildInfo: buildInfo
server.upload spec: uploadSpec, buildInfo: buildInfo
server.publishBuildInfo buildInfo
请注意,您应该设置

buildInfo.env.capture = true
在执行上载或下载之前

因此,使用的优点是:

buildInfo.env.capture = true
您可以在buildInfo实例上设置一次,然后从那时起为您收集环境变量。 另一方面,在某些情况下,您希望在管道中的特定点收集环境变量。那是什么时候

buildInfo.env.collect()

很方便。

您能否提供一个示例,说明如何在声明性管道中提供此“全局”构建信息?我用
管道
范围中定义的
环境
声明尝试了它,但它似乎不起作用,因为我认为它只适用于字符串键对。谢谢,我会尝试你关于
env.capture
的建议,顺便说一句,你关于env.capture的建议奏效了。谢谢你!如果您可以提供一个关于在管道中的两个阶段之间链接buildInfo的示例,我将其标记为answered@GregoryKuhn,我在答案中加了一个例子。你可以在这里找到另一个例子:希望这有帮助。嗨@Eyal Ben Moshe,谢谢你花时间提供这个例子。事实上,我猜应该是这样做的,但我使用的是声明性管道,而不是脚本化管道,而且我猜它没有提供任何机制来实现这一点。无论如何,我都会将此标记为已接受的答案。当然,您也可以对声明性管道采用相同的方法。让我试着找一个例子。