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.
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\""
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
.
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{}
.
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
'''
}
}
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.