进样环境变量为詹金斯与shell脚本
的出发情况进样环境变量为詹金斯与shell脚本
建设过程中,我有一个詹金斯建设项目中,我通过调用我的构建脚本(./jenkins.sh
)做几乎所有的东西。我正在构建一个Cordova项目,它依赖于某些版本的Node和Xcode。我正在使用最新的MacOS Sierra运行Mac上的内部版本。
到目前为止我设置环境变量在詹金斯与EnvInject插件版本(https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin):
目标
我想有环境变量也由构建脚本而不是在Jenkins构建中设置。这样环境变量也在版本控制中,我不必碰触Jenkins Build本身。
基本上我需要用bash重建EnvInject插件的逻辑。
我已经试过#1
在我的jenkins.sh
构建脚本我设置环境变量与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 ""
这产生:
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
似乎设置正确,但它仍然使用系统版本的节点v0.10.48而不是v7.7.8在PATH
中设置。
我已经试过#2
我采购的变量:
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
结果是一样What I've tried #1
:还是用系统节点v0.10.48而不是节点v7.7.8
问题
我怎样才能正确设置PATH
,DEVELOPER_DIR
,ANDROID_HOME
环境变量只能在构建脚本中使用?
@tripleee 上面我通过调用node: $(node -v)
来确定节点。在构建脚本中,我正在运行触发Ionic/Apache Cordova的gulp。围绕node -v
的括号是否会启动一个包含它自己的环境变量的子shell?
@Jacob 我们之前使用过nvm,但我们希望拥有更少的依赖关系。使用nvm需要在所有构建机器上安装nvm。我们有一个用brew来安装节点的标准。这就是为什么我使用/usr/local/Cellar/node/${nodeVersion}
作为节点的路径。
@Christopher斯托比
ENV:
[email protected]:~$ 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
别名:
[email protected]:~$ alias
alias l='ls -lAh'
alias rvm-restart='rvm_reload_flag=1 source '\''/Users/jenkins/.rvm/scripts/rvm'\'''
这并不看起来像一个环境变量的问题。它看起来像一个权限问题。执行脚本的用户可以是:
- 无法读取/usr/local/Cellar/node/7.7.8/bin目录,或
- 无法从该目录中读取节点执行,或
- 不能够从该目录
为了测试,成为机器上的用户和对全路径执行节点命令来执行节点可执行:
/usr/local/Cellar/node/7.7.8/bin/node -v
,或者,如果你需要,更改脚本避免使用路径查找(我只是在暗示本作诊断,而不是作为一个解决方案):
echo " node: $(/usr/local/Cellar/node/7.7.8/bin/node -v)"
如果仍处于亏损状态,尝试这条线:
echo " node: $(sh -c 'echo $PATH'; which node)"
原因是脚本无法读取/usr/local/Cellar/node/7.7.8/bin目录。我的机器上安装了节点7.7.8,但它在jenkins构建机器上是7.8.0节点。接得好! – mles
@ mles我认为可能是这样。这可能是反对使用版本的完整路径的一个很好的论点。如果您的brew安装已升级,您需要更改脚本以匹配新版本。我确信节点在我的brew设置中被链接了,如/ usr/local/bin/node,但我不知道您的设置或要求,所以只有建议 – spacepickle
我们运行brew升级,但想法是该版本固定到节点版本。它有意地硬编码到节点7.7.8 – mles
'buildApp()'不是用于调用函数的有效shell语法。没有什么比这更平凡。 – chepner
您是否正在执行脚本(而不是源代码)并希望在脚本退出后将值保留在当前shell中?因为,不,那不行。你*不能*影响子进程中进程的环境;您必须改为编写脚本。 – chepner
我更正了buildApp调用。这只是为了表明在导出后实际的构建过程开始。 如果可能,我想避免有我需要的单独文件来源。将它全部放在我的shell脚本('jenkins.sh')中将会很棒。 – mles