Как я могу использовать плагин Jenkins Copy Artifacts из конвейеров (jenkinsfile)?

Я пытаюсь найти пример использования плагина Jenkins Copy Artifacts Plugin из конвейеров Jenkins (рабочих процессов).

Может ли кто-нибудь указать пример кода Groovy, который его использует?


person sorin    schedule 25.04.2016    source источник


Ответы (4)


Если сборки не выполняются в одном конвейере, вы можете использовать прямой CopyArtifact плагин, вот пример: https://www.cloudbees.com/blog/copying-artifacts-between-builds-jenkins-workflow и пример кода:

node {
   // setup env..
   // copy the deployment unit from another Job...
   step ([$class: 'CopyArtifact',
          projectName: 'webapp_build',
          filter: 'target/orders.war']);
   // deploy 'target/orders.war' to an app host
}
person krynio    schedule 26.04.2016

С декларативным Jenkinsfile вы можете использовать следующий конвейер:

pipeline {
    agent any
    stages {
        stage ('push artifact') {
            steps {
                sh 'mkdir archive'
                sh 'echo test > archive/test.txt'
                zip zipFile: 'test.zip', archive: false, dir: 'archive'
                archiveArtifacts artifacts: 'test.zip', fingerprint: true
            }
        }

        stage('pull artifact') {
            steps {
                copyArtifacts filter: 'test.zip', fingerprintArtifacts: true, projectName: '${JOB_NAME}', selector: specific('${BUILD_NUMBER}')
                unzip zipFile: 'test.zip', dir: './archive_new'
                sh 'cat archive_new/test.txt'
            }
        }
    }
}

До версии 1.39 CopyArtifact вы должны заменить второй этап следующим (спасибо @Yeroc):

stage('pull artifact') {
    steps {
        step([  $class: 'CopyArtifact',
                filter: 'test.zip',
                fingerprintArtifacts: true,
                projectName: '${JOB_NAME}',
                selector: [$class: 'SpecificBuildSelector', buildNumber: '${BUILD_NUMBER}']
        ])
        unzip zipFile: 'test.zip', dir: './archive_new'
        sh 'cat archive_new/test.txt'
    }
}

С CopyArtifact я использую «${JOB_NAME}» в качестве имени проекта, который является текущим запущенным проектом.

Селектор по умолчанию, используемый CopyArtifact, использует последний успешный номер сборки проекта, а не текущий (потому что он еще не успешен или нет). С помощью SpecificBuildSelector вы можете выбрать «${BUILD_NUMBER}», который содержит текущий номер сборки текущего проекта.

Этот конвейер работает с параллельными этапами и может управлять огромными файлами (я использую файл размером 300 МБ, он не работает с stash/unstash)

Этот конвейер отлично работает с моим Jenkins 2.74, если у вас есть все необходимые плагины.

person Nelson G.    schedule 04.10.2017
comment
Вы случайно не знаете, где этот шаг([ $class: 'CopyArtifact', синтаксис задокументирован? Кажется, я помню, что он был сгенерирован генератором сниппетов, сейчас не могу его там найти.. Мне особенно интересно, как вы могли используйте параметризованный селектор сборки. - person inger; 18.10.2017
comment
Я видел пример здесь. Насчет SpecificBuildSelector я догадался, проанализировав код плагина - person Nelson G.; 18.10.2017
comment
Начиная с версии 1.39 плагина CopyArtifact вы можете использовать более чистый синтаксис: copyArtifacts filter: 'test.zip', fingerprintArtifacts: true, projectName: '${JOB_NAME}', selector: specific('${BUILD_NUMBER}') - person Yeroc; 17.03.2018
comment
Если у кого-то есть проблемы с Jenkins, утверждающим, что он не может найти проект для копирования артефакта, мне помогло изменение projectName: '${JOB_NAME}', selector: specific('${BUILD_NUMBER}') на projectName: env.JOB_NAME, selector: specific(env.BUILD_NUMBER) (см. также stackoverflow.com/a/55377899/758165). - person Pit; 27.03.2019
comment
copyArtifacts(projectName: ‹job-name›/‹branch›’) работал у меня - person JARC; 07.06.2019

Если вы используете подчиненные устройства в своем мастере и хотите копировать артефакты между собой, вы можете использовать stash/unstash, например:

stage 'build'
node{
   git 'https://github.com/cloudbees/todo-api.git'
   stash includes: 'pom.xml', name: 'pom'
}

stage name: 'test', concurrency: 3
node {
   unstash 'pom'
   sh 'cat pom.xml' 
}

Вы можете увидеть этот пример по этой ссылке:

https://dzone.com/refcardz/continuous-delivery-with-jenkins-workflow

person Daniel Hernández    schedule 25.04.2016

name = "/" + "${env.JOB_NAME}"
def archiveName = 'relNum'
try {
    step($class: 'hudson.plugins.copyartifact.CopyArtifact', projectName: name, filter: archiveName)
} catch (none) {
    echo 'No artifact to copy from ' + name + ' with name relNum'
    writeFile file: archiveName, text: '3'
}

def content = readFile(archiveName).trim()
echo 'value archived: ' + content

попробуйте это с помощью плагина копирования артефакта

person Ross Beazley    schedule 25.04.2016