web-dev-qa-db-fra.com

Comment réutiliser un espace de travail créé précédemment à travers les étapes

Je suis confronté à un problème dans lequel deux étapes sont définies dans mon pipeline: elles sont toutes deux exécutées sur le même nœud et doivent être exécutées dans le même espace de travail.

La première de ces étapes s’exécute initialement sur mon nœud maître, mais vers la fin des étapes définies, certains fichiers doivent être supprimés sur un nœud différent.

La deuxième étape a ensuite juste besoin de continuer sur mon maître, et repose sur certains modules qui ont été installés à partir de la première étape.

Voici mon pipeline pour mieux expliquer:

#!groovy
pipeline {
  agent { label 'master' }
  stages {
    stage('Build') { // 1. Running on master in /var/lib/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ
      steps {
        sh '''
          npm install
          bower install
          gulp set-staging-node-env
          gulp prepare-staging-files
          gulp webpack
        '''
        stash includes: 'dist/**/*', name: 'builtSources'
        stash includes: 'config/**/*', name: 'appConfig'
        node('Protractor') { // 2. Running on vnccentos7 in /var/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ
          dir('/opt/foo/deploy/') {
            unstash 'builtSources'
            unstash 'appConfig'
          }
        }        
      }
    }
    stage('Unit Tests') {
      agent { label 'master' } // 3. Running on master in /var/lib/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ@2
      steps {
        parallel (
          "Jasmine": {
            sh 'gulp karma-tests-ci'
          },
           "Mocha": {
            sh 'gulp mocha-tests'
          }
        )
      }
    }
  }
}

Comme vous pouvez le constater, j’ai ajouté des commentaires au début de chaque étape,\node servant à afficher la sortie jenkins que je vois pour les espaces de travail affectés.

Le problème auquel je suis confronté est que l'étape des tests unitaires échoue car elle tente d'utiliser certains modules de nœud qu'elle ne peut pas trouver. Celles-ci sont présentes dans le premier espace de travail créé qui correspond à l'endroit où je souhaite continuer à utiliser cette étape. Par conséquent, n'utilisez pas un nouvel espace de travail à suffixe "@ 2".

Existe-t-il un moyen de demander à Jenkins de préserver les espaces de travail créés précédemment dans le pipeline?

MODIFIER

Je suppose que, puisque j'ai spécifié l'agent {label:'master'} à nouveau dans ma prochaine étape, voici quel cas un nouvel espace de travail doit être créé? Devrais-je utiliser l'approche node à la place? Cela permettrait-il d’utiliser le même espace de travail?

En fait, j'ai essayé d'utiliser node('master'){...} autour de chacune des étapes parallèles de mon étape de tests unitaires, mais celles-ci utilisent toujours l'espace de travail avec suffixe @ 2 plutôt que l'original.

J'ai vu d'autres discussions parler de la façon dont vous ne devriez pas réutiliser le même espace de travail car vous pourriez rencontrer des problèmes avec les verrous de fichiers. Ils suggèrent plutôt d'archiver\désarchiver l'espace de travail entre les étapes.

J'ai également vu des approches où vous pouvez stocker le chemin de l'espace de travail dans une variable et l'utiliser plus tard, ce qui semble bien dans mon cas, mais je n'ai trouvé aucun échantillon de syntaxe déclarative, seulement des échantillons groovy.

EDIT 2

J'ai maintenant essayé quelques approches impliquant la sauvegarde de l'espace de travail alloué de la première étape dans une variable et l'utilisation de la directive ws(...) dans les étapes suivantes:

pipeline {
  agent { label 'master' }
  stages {
    stage('Build') {
      steps {
        script {
          def workspace = pwd()
        }
        sh '''
          npm install
          bower install
          gulp set-staging-node-env
          gulp prepare-staging-files
          gulp webpack
        '''
        stash includes: 'dist/**/*', name: 'builtSources'
        stash includes: 'config/**/*', name: 'appConfig'
        node('Protractor') {
          dir('/opt/foo/deploy/') {
            unstash 'builtSources'
            unstash 'appConfig'
          }
        }        
      }
    }
    stage('Unit Tests') {
      steps {
        parallel (
          "Jasmine": {
            node('master') {
              ws("${workspace}"){
                sh 'gulp karma-tests-ci'
              }
            }
          },
          "Mocha": {
            node('master') {
              ws("${workspace}"){
                sh 'gulp mocha-tests'
              }
            }
          }
        )
      }
      post {
        success {
          sh 'gulp combine-coverage-reports'
          sh 'gulp clean-lcov'
          publishHTML(target: [
            allowMissing: false,
            alwaysLinkToLastBuild: false,
            keepAll: false,
            reportDir: 'test/coverage',
            reportFiles: 'index.html',
            reportName: 'Test Coverage Report'
          ])
        }
      }
    }
    }
}

J'ai juste essayé de supprimer la deuxième déclaration d'agent de l'étape des tests unitaires, mais celle-ci est restée sur mon nœud Protractor, ce que je ne voulais pas. Donc, en suivant les réponses\commentaires ici, j’ai ensuite utilisé des blocs de noeuds autour de chacune de mes étapes parallèles et les blocs ws comme vous pouvez le voir,

L'étape échoue et les journaux indiquent que le logiciel n'utilise pas l'espace de travail alloué depuis la première étape (sans le suffixe @):

[Jasmine] Running on master in /var/lib/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ@2
[Pipeline] [Jasmine] {
[Pipeline] [Jasmine] ws
[Jasmine] Running in /var/lib/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ@2@2
[Pipeline] [Jasmine] {
[Pipeline] [Jasmine] sh
[Jasmine] [_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ@2@2] Running Shell script
[Jasmine] + gulp karma-tests-ci
[Jasmine] [08:27:01] No gulpfile found

Même son double suffixe avec @ 2, alors je ne suis pas sûr de ce que ça fait maintenant.

11
mindparse

Utilisez dir au lieu de ws.

ws modifie automatiquement le préfixe "@NUMÉRO" lorsque l'espace de travail à utiliser était déjà occupé par un autre travail de construction.

dir déplacez simplement le répertoire de travail actuel exactement là où vous le désignez.

pipeline {
    agent none
    environment {
        WIN_WORKSPACE = ""
        MAC_WORKSPACE = ""
    }
    stages {
        stage("Build") {
            parallel {
                stage("Build on Windows") {
                    agent {
                        label "windows"
                    }
                    steps {
                        script {
                            WIN_WORKSPACE = WORKSPACE
                        }
                        // steps...
                    }
                }
                stage("Build on macOS") {
                    agent {
                        label "macos"
                    }
                    steps {
                        script {
                            MAC_WORKSPACE = WORKSPACE
                        }
                        // steps...
                    }
                }
            }
        }
        stage("Deploy") {
            parallel {
                stage("Deploy on Windows") {
                    agent {
                        label "windows"
                    }
                    steps {
                        dir(WIN_WORKSPACE) {
                            // steps...
                        }
                    }
                }
                stage("Deploy on macOS") {
                    agent {
                        label "macos"
                    }
                    steps {
                        dir(MAC_WORKSPACE) {
                            // steps...
                        }
                    }
                }
            }
        }
    }
}

Fonctionne bien comme tu veux.

6
Jinsoo Heo

Vous ne savez pas si cela correspond à votre cas d'utilisation, mais cet exemple de script montre comment partager le même nœud/espace de travail entre différentes étapes et conteneurs:

De plus, si vous exécutez un agent Docker pour une étape spécifique en spécifiant l'agent {label 'quelconque'} au niveau supérieur, vous pouvez vous assurer que cette étape utilisera le même nœud et le même espace de travail que le reste du pipeline:

pipeline {
  agent {
    label 'whatever'
  }
  stages {
    stage('build') {
      steps {
        sh "./build-artifact.sh"
      }
    }
    stage('test in docker') {
      agent {
        docker {
          image 'ubuntu:16.04'
          reuseNode true
        }
      }
      steps {
        sh "./run-tests-in-docker.sh"
      }
    }
  }
}

https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/Controlling-your-build-environment#reusing-nodeworkspace-with-per-stage-docker-agents

5
kongkoro

Spécifiez un espace de travail personnalisé. À partir de la syntaxe du pipeline: "ws: Allocate workspace"

ws("/usr/local/jenkins/jobs/custom_workspace") {
    stage . . . 
    stage . . . 
}

. . Est-ce que ça marche ?

1
gaoithe

Le plugin External Workspace Manager pourrait résoudre votre problème.

[...] il définit le chemin d'accès local à l'espace de travail et le bascule.

// Basic usage:

def extWorkspace = exwsAllocate diskPoolId: 'diskpool1'
node ('linux') {
    exws (extWorkspace) {
        scm checkout
        sh 'mvn clean install -DskipTests'
    }
}
node ('test') {
    exws (extWorkspace) {
        sh 'mvn test'
    }
}
0
Markus Schulte

Je pense que l'utilisation de la syntaxe du nœud va le résoudre.

afin d'être certain que je voudrais utiliser une portée de dir pour définir l'espace de travail sur votre propre

0
eran meiri

Je suis heureux de pouvoir dire que Jenkins peut maintenant partager un espace de travail.

Vous pouvez spécifier des étapes imbriquées dans d'autres étapes pour partager un espace de travail.

La nouvelle fonctionnalité s'appelle Étapes séquentielles .

Je vais utiliser votre code original pour l'implémenter.

#!groovy
pipeline {
  agent { label 'master' }
  stages {
    stage('Build') { // 1. Running on master in /var/lib/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ
      steps {
        sh '''
          npm install
          bower install
          gulp set-staging-node-env
          gulp prepare-staging-files
          gulp webpack
        '''
        stash includes: 'dist/**/*', name: 'builtSources'
        stash includes: 'config/**/*', name: 'appConfig'
        node('Protractor') { // 2. Running on vnccentos7 in /var/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ
          dir('/opt/foo/deploy/') {
            unstash 'builtSources'
            unstash 'appConfig'
          }
        }        
      }
    }
    stage('Unit Tests') { // 3. Running on master in /var/lib/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ@2
        parallel {
            stage("Unit Tests@") {
                agent {label 'master'}
                stages {
                    stage("Jasmine") {
                        steps {
                            sh 'gulp karma-tests-ci'
                        }
                    }
                    stage(Mocha") {
                        steps {
                            sh 'gulp mocha-tests'
                        }
                    }
                }
            }
        }
    }
  }
}
0
ian