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):
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
Vous devez vous connecter pour publier un commentaire.
Cela ne ressemble pas à un problème de variable d'environnement. Il ressemble à un problème d'autorisations. L'utilisateur qui exécute le script est:
Afin de tester, devenir un utilisateur sur l'ordinateur et d'exécuter le nœud de commande sur le chemin d'accès complet:
ou, si vous le souhaitez, modifiez le script pour éviter à l'aide de recherches de CHEMIN d'accès (Im ce qui suggère cela pour le diagnostic seulement, pas comme une solution):
Si vous êtes toujours à une perte, essayez cette ligne:
J'ai pensé que ce pourrait être le cas. C'est probablement un bon argument contre l'utilisation du chemin d'accès complet à la version. Si votre brew install est mis à niveau, vous aurez besoin de modifier votre script pour correspondre à la nouvelle version. Je suis sûr que le nœud est un lien symbolique dans mon infusion d'installation à quelque chose comme /usr/local/bin/node mais je ne sais pas votre installation ou exigences, de sorte qu'une suggestion
nous ne courir infusion de mise à niveau, mais l'idée était de le construire fixe à un nœud version. il est codé en dur dans le but de nœud 7.7.8
OriginalL'auteur spacepickle