web-dev-qa-db-fra.com

Pipeline déclaratif Jenkins; Comment déclarer une variable et l'utiliser dans un script ou une notification par courrier?

(mise à jour ci-dessous)

J'ai un travail de pipeline déclaratif qui peut prendre un argument VERSION.

pipeline {
  parameters {
    string(name: VERSION, defaultValue: '')
  }

  // ...
}

Si aucune VERSION n'est donnée, comme lorsque Gitlab envoie un crochet à ce travail, je veux le calculer à partir de git, je fais donc quelque chose comme ça

stages {
  stage('Prepare') {
    steps {
      // ...
      if (! env.VERSION) {
        VERSION = sh(script: "git describe", returnStdout: true).trim()
      }
    }
  }
}       

Maintenant, je veux "injecter" cette variable à

  • mon script de construction. Il doit trouver "VERSION" dans les variables d'environnement
  • au notificator mail Jenkins. Et faites en sorte qu'il récupère $ {VERSION} dans le sujet ou le corps du texte

J'ai essayé de changer le code ci-dessus avec

stages {
  stage('Prepare') {
    steps {
      // ...
      if (! env.VERSION) {
        env.VERSION = sh(script: "git describe", returnStdout: true).trim()
      }
    }
  }
}       

Vous avez cette erreur groovy.lang.MissingPropertyException: No such property: VERSION for class: groovy.lang.Binding

J'ai ensuite essayé d'ajouter une étape "environnement" ci-dessous

environment {
    VERSION = ${VERSION}
}

mais cela n'a pas résolu mon problème.

Je cherche de l'aide pour le résoudre.

METTRE À JOUR

J'ai maintenant un pipeline de travail qui ressemble à

pipeline {
    agent any
    parameters {
        string(name: 'VERSION', defaultValue: '')
    }   
    environment {          
        def VERSION = "${params.VERSION}"
    }
    stages {
        stage('Prepare & Checkout') {
            steps {
                script {
                    if (! env.VERSION) {
                       VERSION = sh(script: "date", returnStdout: true).trim()
                    }
                    echo "** version: ${VERSION} **"
                }
            }
        }  
        stage('Build') {
            steps {
                // sh "./build.sh"
                echo "** version2: ${VERSION} **"
            }
        }
    } // stages
    post {
        always {
            mail to: '[email protected]',
                 subject: "SUCCESS: ${VERSION}",
                 body: """<html><body><p>SUCCESS</p></body></html>""",
                 mimeType: 'text/html',
                 charset: 'UTF-8'
            deleteDir()
        }
    }
} // pipeline

J'avais besoin d'ajouter l'étape "environment" pour pouvoir obtenir $ VERSION à toutes les étapes (et pas seulement à l'étape où elle est manipulée).

Je dois encore trouver un moyen d'injecter cette variable $ VERSION dans les variables d'environnement, afin que mon script de construction puisse le trouver.

3
daks

Si vous souhaitez injecter la variable dans l'environnement afin de pouvoir l'utiliser ultérieurement, vous pouvez définir une autre variable égale à env.VERSION ou à la sortie du script Shell. Puis utilisez cette variable dans votre pipeline, par exemple:

pipeline {
  parameters {
    string(name: VERSION, defaultValue: '')
  }

  def version = env.VERSION
  stages {
  stage('Prepare') {
    steps {
      // ...
      if (!version) {
        version = sh(script: "git describe", returnStdout: true).trim()
      }
    }
  }

  mail subject: "$version build succeeded", ...
}

Si vous souhaitez que d'autres travaux puissent accéder à la valeur de VERSION après l'exécution de la génération, vous pouvez l'écrire dans un fichier et l'archiver. 

Edit: Pour que votre script puisse utiliser la variable de version, vous pouvez lui demander de prendre version comme paramètre ou vous pouvez utiliser l’étape withEnv .

1
Vasiliki Siakka

En supposant que vous utilisez Pipelines paramétrés , vous devez appeler la variable en tant que ${params.parameterName} 

Bien que les paramètres soient disponibles dans env, ils sont actuellement créés avant la première exécution du pipeline. Vous devez donc y accéder via les paramètres:

Dans ton cas:

 ${params.VERSION}
0
user7294900