Injecter des variables d'Environnement dans un Jenkins processus de construction avec un script shell

La situation de départ

J'ai un Jenkins Projet de construction d'où je fais presque tout en appelant mon script de compilation (./jenkins.sh). Je suis en train de construire un Projet Cordova, qui dépend de certaines versions de Nœud et de Xcode. Je suis en cours d'exécution dans les versions sur Mac avec la dernière MacOS Sierra.

Jusqu'à présent, je suis à la configuration des variables d'environnement dans le Jenkins à Construire avec les EnvInject Plugin(https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin):

Injecter des variables d'Environnement dans un Jenkins processus de construction avec un script shell

L'Objectif

Je veux avoir les variables d'environnement également définies par le script de construction au lieu de dans le Jenkins Construire. De cette façon, les variables d'environnement sont également dans le contrôle de version et je n'ai pas à toucher le Jenkins se Construire lui-même.

Essentiellement, j'ai besoin de reconstruire la logique de la EnvInject Plugin avec bash.

Ce que j'ai essayé #1

Dans mon jenkins.sh script de compilation, j'ai défini les variables d'environnement avec export

jenkins.sh:

#!/bin/bash -ve

nodeVersion=7.7.8
xcodeVersion=8.3.1
androidSDKVersion=21.1.2

export DEVELOPER_DIR=/Applications/Xcode_${xcodeVersion}.app/Contents/Developer
export ANDROID_HOME=/Applications/adt/sdk
export PATH=/usr/local/Cellar/node/${nodeVersion}/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/local/bin:/usr/local/bin:/Applications/adt/sdk/tools:/usr/local/bin/:/Applications/adt/sdk/build-tools/${androidSDKVersion}:$PATH

# print info
echo ""
echo "Building with environment Variables"
echo ""
echo "  DEVELOPER_DIR:  $DEVELOPER_DIR"
echo "  ANDROID_HOME:   $ANDROID_HOME"
echo "  PATH:           $PATH"
echo "  node:           $(node -v)"
echo ""

Cela donne:

Building with environment Variables

  DEVELOPER_DIR:  /Applications/Xcode_8.3.1.app/Contents/Developer
  ANDROID_HOME:   /Applications/adt/sdk
  PATH:           /usr/local/Cellar/node/7.7.8/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/local/bin:/usr/local/bin:/Applications/adt/sdk/tools:/usr/local/bin/:/Applications/adt/sdk/build-tools/21.1.2:/Users/mles/.fastlane/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin
node -v
  node:           v0.10.48

PATH, DEVELOPER_DIR, ANDROID_HOME semble être réglé correctement, cependant, il est toujours à l'aide de la version du système de nœud v0.10.48 au lieu de v7.7.8 tel que défini dans PATH.

Ce que j'ai essayé #2

J'ai pris les variables:

jenkins.sh:

#!/bin/bash -ve

source config.sh

# print info
echo ""
echo "Building with environment Variables"
echo ""
echo "  DEVELOPER_DIR:  $DEVELOPER_DIR"
echo "  ANDROID_HOME:   $ANDROID_HOME"
echo "  PATH:           $PATH"
echo "  node:           $(node -v)"
echo ""

config.sh

#!/bin/bash -ve
# environment variables
nodeVersion=7.7.8
xcodeVersion=8.3.1
androidSDKVersion=21.1.2

export DEVELOPER_DIR=/Applications/Xcode_${xcodeVersion}.app/Contents/Developer
export ANDROID_HOME=/Applications/adt/sdk
export PATH=/usr/local/Cellar/node/${nodeVersion}/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/local/bin:/usr/local/bin:/Applications/adt/sdk/tools:/usr/local/bin/:/Applications/adt/sdk/build-tools/${androidSDKVersion}:$PATH

Le résultat est le même que dans What I've tried #1: Toujours à l'aide du système de nœud v0.10.48 au lieu de nœud v7.7.8

La question

Comment puis-je régler le PATH, DEVELOPER_DIR, ANDROID_HOME variables d'environnement correctement pour être utilisé seulement dans le script de build?

@tripleee
Ci-dessus, je suis la détermination de nœud en appelant node: $(node -v). Dans le script de build, je suis en cours d'exécution gulp qui déclenche Ionique /Apache Cordova. Faire les crochets autour de node -v démarrer un shell interne est exécuté qui a ses propres variables d'environnement?

@Jacob
Nous avons utilisé nvm avant, mais nous voulons avoir moins de dépendances. À l'aide de nvm pour installer nvm sur tous construire des machines. Nous avons une norme de l'installation de nœud avec de la bière. C'est pourquoi je suis en utilisant /usr/local/Cellar/node/${nodeVersion} comme chemin vers le nœud.

@Christophe Stobie

env:

jenkins@jenkins:~$ env
MANPATH=/Users/jenkins/.nvm/versions/node/v6.4.0/share/man:/usr/local/share/man:/usr/share/man:/Users/jenkins/.rvm/man:/Applications/Xcode_7.2.app/Contents/Developer/usr/share/man:/Applications/Xcode_7.2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/share/man
rvm_bin_path=/Users/jenkins/.rvm/bin
NVM_CD_FLAGS=
TERM=xterm-256color
SHELL=/bin/bash
TMPDIR=/var/folders/t0/h77w7t2s1fx5mdnsp8b5s6y00000gn/T/
SSH_CLIENT=**.**.*.** ***** **
NVM_PATH=/Users/jenkins/.nvm/versions/node/v6.4.0/lib/node
SSH_TTY=/dev/ttys000
LC_ALL=en_US.UTF-8
NVM_DIR=/Users/jenkins/.nvm
rvm_stored_umask=0022
USER=jenkins
_system_type=Darwin
rvm_path=/Users/jenkins/.rvm
rvm_prefix=/Users/jenkins
MAIL=/var/mail/jenkins
PATH=/Users/jenkins/.nvm/versions/node/v6.4.0/bin:/Users/jenkins/.fastlane/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/jenkins/.rvm/bin:/Users/jenkins/tools/oclint/bin:/Applications/adt/sdk/tools:/Applications/adt/sdk/platform-tools:/Applications/adt/sdk/build-tools/android-4.4:/Users/jenkins/.rvm/bin
NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist
rvm_loaded_flag=1
PWD=/Users/jenkins
LANG=en_US.UTF-8
_system_arch=x86_64
_system_version=10.12
rvm_version=1.26.10 (latest)
SHLVL=1
HOME=/Users/jenkins
LS_OPTIONS=--human --color=always
LOGNAME=jenkins
SSH_CONNECTION=**.**.*.** ***** **.**.*.** **
NVM_BIN=/Users/jenkins/.nvm/versions/node/v6.4.0/bin
NVM_IOJS_ORG_MIRROR=https://iojs.org/dist
rvm_user_install_flag=1
_system_name=OSX
_=/usr/bin/env

alias:

jenkins@jenkins:~$ alias
alias l='ls -lAh'
alias rvm-restart='rvm_reload_flag=1 source '\''/Users/jenkins/.rvm/scripts/rvm'\'''
buildApp() n'est pas shell valide la syntaxe pour appeler une fonction. Rien précédents qui sortait de l'ordinaire.
Êtes-vous exécuter le script (plutôt que de sourcing) et d'attendre les valeurs à retenir dans le shell courant après le script se termine? Parce que, non, cela ne marchera pas. Vous pas sur l'environnement d'un processus à partir d'un processus enfant; vous avez à la source du script à la place.
J'ai corrigé le buildApp appel. C'est juste pour montrer qu'après les exportations réelles processus de construction commence. Si possible je veux éviter d'avoir des fichiers distincts que j'ai besoin de source. Il serait génial de l'avoir dans mon script shell (jenkins.sh).
La vraie question est de Comment faites-vous appel à node.js et comment voulez-vous déterminer quelle version il s'agit? Nous montrer cette partie de jenkins.sh trop.
Vous disposez de tous les alias ou les autres variables d'environnement qui pourrait remplacer le chemin d'accès? Pouvons-nous obtenir la sortie de l'env et alias de votre jenkins travail?

OriginalL'auteur mles | 2017-04-12