web-dev-qa-db-fra.com

Comment utiliser le plug-in Jenkins Copy Artifacts à partir des pipelines (jenkinsfile)?

J'essaie de trouver un exemple d'utilisation du plug-in Jenkins Copy Artifacts à partir de pipelines Jenkins (flux de travaux).

Quelqu'un peut-il indiquer un exemple de code Groovy qui l'utilise?

23
sorin

Si les builds ne fonctionnent pas dans le même pipeline, vous pouvez utiliser le plugin direct CopyArtifact. En voici un exemple: https://www.cloudbees.com/blog/copying-artifacts-between-builds-jenkins -workflow et exemple de code:

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
}
25
krynio

Avec un fichier Jenkins déclaratif, vous pouvez utiliser le pipeline suivant:

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'
            }
        }
    }
}

Avant la version 1.39 de CopyArtifact, vous devez remplacer la deuxième étape par la suivante (merci @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'
    }
}

Avec CopyArtifact, j'utilise '$ {JOB_NAME}' comme nom de projet, qui correspond au projet en cours d'exécution.

Le sélecteur par défaut utilisé par CopyArtifact utilise le dernier numéro de build du projet réussi, jamais actuel (car il n’a pas encore abouti, ou pas). Avec SpecificBuildSelector, vous pouvez choisir '$ {BUILD_NUMBER}' qui contient le numéro de build actuel du projet en cours.

Ce pipeline fonctionne avec des étapes parallèles et peut gérer d’énormes fichiers (j’utilise un fichier de 300 Mo, cela ne fonctionne pas avec stash/unstash)

Ce pipeline fonctionne parfaitement avec mon Jenkins 2.74, à condition que vous ayez tous les plugins nécessaires

29
Nelson G.

Si vous utilisez des esclaves dans votre maître et que vous souhaitez copier des artefacts entre eux, vous pouvez utiliser stash/unstash, par exemple:

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' 
}

Vous pouvez voir cet exemple dans ce lien:

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

23
Daniel Hernández
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

essayez d'utiliser un plugin d'artefact de copie

1
Ross Beazley