当前位置: 首页 > 知识库问答 >
问题:

跨阶段聚合Artifactory构建信息并上传环境变量

鲜于星波
2023-03-14

我有两个不同的问题。

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

在初始化环境的一个阶段,我从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,以便在第二阶段调用<code>publishBuilInfo<code>时使用?

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

buildInfo.env.capture = true
server.publishBuildInfo buildInfo

这让我想到一个相关的问题:在第一阶段对第一个builInfo进行收集有意义吗:

buildInfo.env.collect()

共有1个答案

邴奇逸
2023-03-14

问题 1

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

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

第二种方法是创建一个buildInfo实例并将其作为参数发送到服务器,这可能是您所需要的。uLoad或服务器。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()
    }
}

问题 2

当你跑步时:

buildInfo.env.collect()

您要求Jenkins现在(在Collection()方法执行时)收集环境变量并将它们存储在这个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()

很方便。

 类似资料:
  • 问题内容: 我正在尝试使用单个,几个文件和几个文件为多个环境创建配置。我需要它为每个环境使用具有python依赖关系的其他文件。 假设我们在两个环境中创建服务:和。为此,我创建了以下文件结构: 目的是在容器的过程中实例化文件的专有名称。根据文档,我尝试了这种天真的方法,这种方法似乎不起作用: 将名称定义为环境变量: envs / dev.env: envs / prod.env: 在 Docker

  • 我有点搞不清楚该怎么做。 我有一个Jfrog Maven回购。在我的Jenkins pipeline中,我只是使用< code>mvn deploy进行部署。 但我也想获取构建信息。 有一个Jenkins插件,您可以像这样在管道中访问: 但是还有一个特定于Maven的东西: 看起来好像如果你使用< code>newMavenBuild()它会为你运行mvn?我不想那样。我想运行我自己的mvn命令,

  • 问题说明 假如我们有个『CDN 域名』的变量,在 Laravel 中有以下几种方法: 硬代码,直接写死。- ❌ 可维护性低 写死在 config/app.php 文件中。 - ❌ 无法区分环境进行配置 存储于 .env 文件中,使用 env() 方法直接读取。 - ❌ 虽然解决了环境变量问题但是不推荐 存储在 .env 和 config/app.php 文件中,然后使用 config() 函数来读

  • 这个码头商。yml: 使用这个。env文件(它位于根文件夹中,如docker-compose.yml和Dockerfile): 和节点服务器启动中的以下代码: 我真的更喜欢使用第一种或第二种方法 docker版本:18.06.1-CE docker-compose版本:1.19.0

  • 我已经查看了我们可以在通过dockerfile构建docker映像的同时通过cmd行传递ENV变量吗?这向我展示了如何使用传递环境变量。在看到没有定义环境变量后,我查看了传递环境变量不适用于Docker,但这涉及通过传递环境变量。 这是我的: 和< code>docker build命令: 结果输出: 然而的输出是: 我错过了什么?

  • 我正在尝试将服务器URL传递给在Docker容器中运行的React应用程序。它在应用程序中发送HTTP请求时使用,访问方式如下:server_url。这在主机上存储为en环境变量。 我尝试过直接在我的does文件中设置变量:< code > ENV server _ URL = $ { server _ URL } ,我认为这不起作用,因为< code>${server_url}是针对does文件