web-dev-qa-db-fra.com

Le pipeline Jenkins devrait être remplacé

Une étape de mon pipeline télécharge un fichier .tar sur un serveur artificiel. Je reçois une erreur de substitution incorrecte lors de la transmission de env.BUILD_NUMBER, mais les mêmes commandes fonctionnent lorsque le numéro est codé en dur. Le script est écrit en groovy à travers jenkins et s'exécute dans l'espace de travail de jenkins.

sh 'curl -v --user user:password --data-binary ${buildDir}package${env.BUILD_NUMBER}.tar -X PUT "http://artifactory.mydomain.com/artifactory/release-packages/package${env.BUILD_NUMBER}.tar"'

renvoie les erreurs:

[Pipeline] sh
[Package_Deploy_Pipeline] Running Shell script
/var/lib/jenkins/workspace/Package_Deploy_Pipeline@tmp/durable-4c8b7958/script.sh: 2: 
/var/lib/jenkins/workspace/Package_Deploy_Pipeline@tmp/durable-4c8b7958/script.sh: Bad substitution
[Pipeline] } //node
[Pipeline] Allocate node : End
[Pipeline] End of Pipeline
ERROR: script returned exit code 2

Si le code matériel dans un numéro de construction et le remplacement ${env.BUILD_NUMBER} je ne reçois aucune erreur et le code s'exécute correctement.

sh 'curl -v --user user:password --data-binary ${buildDir}package113.tar -X PUT "http://artifactory.mydomain.com/artifactory/release-packages/package113.tar"'

J'utilise $ {env.BUILD_NUMBER} au sein d'autres commandes sh du même script et je n'ai aucun problème ailleurs.

17
Stephen Nichols

Cela s'est avéré être un problème de syntaxe. En enveloppant la commande dans ', ${env.BUILD_NUMBER a été transmis au lieu de sa valeur. J'ai enveloppé la commande entière dans "s et échappé à la imbriquée. Fonctionne bien maintenant.

sh "curl -v --user user:password --data-binary ${buildDir}package${env.BUILD_NUMBER}.tar -X PUT \"http://artifactory.mydomain.com/artifactory/release-packages/package${env.BUILD_NUMBER}.tar\""
44
Stephen Nichols

Généralement, le problème le plus courant pour:

Mauvaise substitution

erreur est d'utiliser sh au lieu de bash.

Surtout lorsque vous utilisez Jenkins, si vous utilisez Execute Shell, assurez-vous que Command commence par Shebang, par exemple. #!/bin/bash -xe ou #!/usr/bin/env bash.

13
kenorb

En fait, vous semblez avoir mal compris la variable env. Dans votre bloc sh, vous devez accéder directement à ${BUILD_NUMBER}.

Raison/Explication: env représente l'environnement dans le script. Cet environnement est utilisé/disponible directement pour tout ce qui est exécuté, par exemple. Scripts shell.

Faites également attention à ne rien écrire dans env.*, mais utilisez plutôt des blocs withEnv{}.

12
patric.schenke

Je peux certainement vous dire que tout est à propos de Shell et Bash Shell. J'ai résolu ce problème en spécifiant #!/bin/bash -xe comme suit:

node {
    stage("Preparing"){
        sh'''#!/bin/bash -xe
            colls=( col1 col2 col3 )
            for eachCol in ${colls[@]}
            do
              echo $eachCol
            done
        '''
    }      
}
8
Gary Gan

J'avais le problème avec l'affichage du {env.MAJOR_VERSION} dans un artificiel du fichier jar. montre que j'approche en gardant l'étape de l'environnement dans Jenkinsfile.

pipeline {
agent any
environment {
MAJOR_VERSION = 1
}

stages {
stage('build') {
  steps {
      sh 'ant -f build.xml -v'
 }
}
}
post {
 always{
   archiveArtifacts artifacts: 'dist/*.jar', fingerprint: true
 }
}
}

Le problème a été résolu et il ne s’agissait pas alors de montrer une mauvaise substitution dans la sortie de la génération Jenkins. donc l’environnement joue un rôle plus important dans Jenkinsfile.

1
Aamir Meman