агрегирование Artifactory buildInfo по этапам и загрузка переменных среды - PullRequest
0 голосов
/ 27 сентября 2018

У меня две отдельные проблемы.

Я использую многоотраслевой декларативный конвейер 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 первого этапа для использования в качестве части вызова publishBuilInfo на втором этапе?

Выпуск 2

После публикации информации о сборке и связанных с ней артефактов, когда я смотрю на Build Browser и, в частности, на вкладку Среда, я вижу, что никакие переменные среды или системные переменные не заполняются.Я должен также упомянуть, что я выполнил необходимые шаги для сбора переменных среды, как указано в ссылке:

buildInfo.env.capture = true
server.publishBuildInfo buildInfo

Что подводит меня к связанному вопросу: имеет ли смысл проводить сбор данных на первом этапе?buildInfo на первом этапе:

buildInfo.env.collect()

1 Ответ

0 голосов
/ 28 сентября 2018

Выпуск 1

Существует два способа объединить несколько сборок в один экземпляр buildInfo в сценарии конвейера.

Первый - именно то, что вы сделали - сохранитьэкземпляр buildInfo возвращается из методов server.uoload или server.downkoad , а затем используется метод buildInfo.append для добавления (агрегирования) двух экземпляров buildInfo.

Второй способ, который, вероятно, вам нужен, - это создать экземпляр buildInfo и отправить его в качестве аргумента в методы server.uoload или server.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()

Сейчас вы просите Дженкинса собрать переменные среды (во время выполнения метода collect () ) и сохранить их в этом экземпляре buildInfo.

При установке:

buildInfo.env.capture = true

Вы просите Дженкинса собирать переменные среды при каждом методе загрузки и выгрузки, который использует этот 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, а затем собрать env-переменные для вас с этого момента.С другой стороны, есть сценарии, когда вы хотите собирать переменные в определенной точке во время вашего конвейера.Вот тогда

buildInfo.env.collect()

пригодится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...