Как скопировать артефакт из той же конвейерной сборки? - PullRequest
0 голосов
/ 30 мая 2018

Когда я использую плагин Copy Artifact для Jenkins, как я могу получить нужный артефакт из другого задания, которое выполняется (в нисходящем направлении) по тому же конвейеру?Прямо сейчас я использую артефакт из «Последней успешной сборки», но он также может быть неправильным, потому что задание, из которого я получаю артефакт, уже может быть запущено снова и создаст другой артефакт.

Немного подробного объяснения полной настройки:


Для своего проекта я использую Jenkins для сборки и автоматического развертывания на Nexus, HockeyApp и Play Store.Я создал многоотраслевой конвейер, который использует следующий JenkinsFile (упрощенная версия):

#!groovy

node('android') {
    def branchName = env.BRANCH_NAME
    def params = [string(name: 'BRANCH_NAME', value: branchName)]
    echo "Using branch: ${branchName}"

    stage('Build & Unittests') {
        build job: 'Android - Unittests', parameters: params
    }

    if (branchName == 'master') {
        stage('Nexus publish') {
            build job: 'Android - Nexus publish', parameters: params
        }

        stage('HockeyApp') {
            build job: 'Android - HockeyApp', parameters: params
        }

        stage('Google Play Store') {
            build job: 'Android - Play Store', parameters: params
        }
    }
}

Все остальные задания являются проектами с несколькими конфигурациями с 2 осями: FLAVOR и TYPE

The job 'Android - Unittests 'создаст артефакт .apk, который может использоваться всеми последующими заданиями.Для этого я использовал плагин Copy Artifact .

Например, это моя конфигурация сборки для задания «Android - публикация Nexus»:

'Android - Nexus publish' build configuration example

Так как я могуиспользовать правильный артефакт из задания «Android - Unittests»?

пс.это очень важно в моем случае, потому что я работаю с несколькими ветками.Довольно часто случается, что несколько ветвей запускают конвейер, поэтому «последняя успешная сборка» не всегда правильная: задание «Android - Play Store» может быть создано после того, как другая ветвь уже запущена

1 Ответ

0 голосов
/ 31 мая 2018

Вы можете скопировать артефакт на основе идентификатора сборки, сгенерировавшей его.

Для этого вам потребуется:

  • изменить конвейер так, чтобы он захватывалидентификатор 'Android - Unittests' вызывает это
  • change 'Android - Nexus publish'
    • добавляет строковую переменную, которая будет содержать идентификатор сборки задания 'Android - Unittests', например 'BUILD_AND_UNIT_TEST_JOB_ID '
    • изменить конфигурацию шага копирования артефактов, чтобы использовать конкретную сборку на основе добавленного вами параметра.

Итак, ваш Android -Конвейер юниттеста должен выглядеть следующим образом:

#!groovy
node('android') {
    def branchName = env.BRANCH_NAME
    def params = [string(name: 'BRANCH_NAME', value: branchName)]
    echo "Using branch: ${branchName}"

    def buildAnUnitTestJobId
    stage('Build & Unittests') {
        def buildAnUnitTestJob = build job: 'Android - Unittests', parameters: params
        // Note that buildAnUnitTestJob will be null if 'Android - Unitttests' fails
        buildAnUnitTestJobId  = buildAnUnitTestJob.id
    }

    if (branchName == 'master') {
        stage('Nexus publish') {
            build job: 'Android - Nexus publish', parameters: params + [string(name:'BUILD_AND_UNIT_TEST_JOB_ID', value: buildAnUnitTestJob)]
        }

        stage('HockeyApp') {
            build job: 'Android - HockeyApp', parameters: params
        }

        stage('Google Play Store') {
            build job: 'Android - Play Store', parameters: params
        }
    }
}

И в «Android - Nexus publish» должны быть следующие изменения: Add string variable for build id Change your copy artifact step

...