web-dev-qa-db-fra.com

Jenkins: Comment utiliser une variable d'un shell pré-construit dans Maven "Objectifs et options"

J'ai un travail Maven à Jenkins. Avant l'étape de construction proprement dite, j'ai une étape de pré-génération "Exécuter Shell". Dans ce shell, j'ai défini une variable:

REVISION=$(cat .build_revision)

J'aimerais utiliser cette variable dans le travail de création Maven dans "Objectifs et options":

clean install -Drevision=${REVISION}

Mais ça ne marche pas! La "vision" est définie sur "$ {REVISION}" et non sur la valeur réelle de $ {REVISION}. Sortie:

Executing Maven:  -B -f /home/gerrit/.jenkins/jobs/<job_name>/workspace/pom.xml clean install -Drevision=${REVISION}

Cela fonctionne avec les variables d'environnement Jenkins:

clean install -Dbuild=${BUILD_NUMBER}

Il définit "Dbuild" sur le numéro de construction actuel. Sortie:

Executing Maven:  -B -f /home/gerrit/.jenkins/jobs/<job_name>/workspace/pom.xml clean install -Dbuild=54

Ma question: Comment utiliser une variable Shell dans Maven "Objectifs et options" ??

MODIFIER:

J'ai essayé d'utiliser Jenkins EnvInject Plugin pour "Injecter les variables d'environnement" après le shell préconstruit, et ma variable est maintenant accessible, par exemple. post-build, mais il n’est toujours pas disponible dans Maven "Objectifs et options".

Ensuite, il est possible de définir "Injecter les variables d’environnement dans le processus de construction" à l’aide du plugin EnvInject, qui les rend disponibles dans Maven "Objectifs et options", mais celles-ci sont définies juste après la vérification SCM, c'est-à-dire avant les étapes préalables à la génération et ne supporte pas les évaluations d'expression.

29
Jonas Bang

Vous êtes sur la bonne voie ici, mais vous avez manqué une troisième fonctionnalité du plug-in EnvInject: l'étape de génération "Inject d'environnement" qui permet d'injecter des variables dans les étapes de construction suivantes en fonction du résultat d'un script ou de propriétés. 

Nous utilisons le plugin EnvInject comme ça; Un script configure une ressource et communique ses paramètres à l'aide de propriétés qui sont ensuite propagées par le plug-in en tant que variables d'environnement.

c'est-à-dire la mise en place d'une base de données temporaire pour la construction: Create a database for the build

32
jjungnickel

J'ai eu un problème très similaire, en essayant de calculer une version de construction et de l'injecter dans la construction. Après avoir rencontré tous les mêmes problèmes (pas d'expansion, etc.), j'ai utilisé l'option "Générer des variables d'environnement à partir d'un script", qui interprète la sortie sous forme de paires tag = valeur dans des variables Jenkins. Le scénario :

  #generate a version code that is high enough to surpass previously published clients
  val=`expr 150000 + $BUILD_NUMBER`
  echo VERSION_CODE=$val

Après cela, j'ai pu injecter $ VERSION_CODE dans maven comme suit:

  -Dbuild.vercode=${VERSION_CODE}

J'espère que cela fonctionne pour vous.

7
user2797386

Ce problème est dû à un bogue dans le plugin Jenkins Maven Project tel que détaillé dans ce rapport de bogue ouvert le 2012-06-22. Le plugin n'a pas encore été corrigé depuis la version 2.1.

Un correctif a été proposé pour le plug-in Maven Project, mais n'a pas encore été intégré. Voici le lien vers la demande d'extraction: https://github.com/jenkinsci/maven-plugin/pull/14

Si vous créez le plug-in vous-même avec le correctif de requête d'extraction appliqué, les variables sont injectées et mises à la disposition du champ "objectifs et options" comme prévu.

3
Brian Creasy

Je pense que votre meilleur coup est d'essayer le plugin EnvInject pour cela avec votre étape initiale de pré-scm.

  1. Vous exécutez le pré-scm comme vous le faites déjà.
  2. Vous utilisez env inject pour charger le fichier pour les étapes de construction du travail principal.

Envisagez de charger le contenu de votre fichier (format de propriétés) ou exécutez un script qui chargera le fichier à votre guise et rendra une variable disponible pour le reste du travail avec l'option "Préparer un environnement pour l'exécution".

J'espère que ça aide.

0
Eldad AK

Je vois qu'il y a une réponse acceptée, mais pour un débutant à Jenkins, j'ai eu du mal à tout comprendre. C'est pourquoi j'ajouterais un peu plus de détails dans cette réponse et montrerais comment je l'ai fait.

Comme @jjungnickel a suggéré que vous deviez installer EnvInject Plugin pour Jenkins. Ensuite, dans la section Build> Ajouter l'étape de construction, vous aurez l'option "Inject variables d'environnement".

Fondamentalement, l'idée est:

  1. Ajoutez les variables auxquelles vous souhaitez accéder ultérieurement à un fichier (il peut être ajouté par un script Shell ou être un fichier du système de fichiers).
  2. Injectez le fichier avec les variables.
  3. Utilisez les variables.

Voici un exemple de configuration:

 enter image description here

Puisque je veux les utiliser dans maven goal, je dois cocher la case Inject Build Variables.

Ensuite, à la fin de la construction, je supprime le fichier simplement parce que je veux conserver l'environnement tel qu'il était avant la construction.

0
nyxz