Jenkins macOS构建无法读取终端及配置文件中配置的环境变量问题求助
Jenkins macOS构建无法读取终端及配置文件中配置的环境变量问题求助
我最近遇到了一个Jenkins构建的棘手问题,想请大家帮忙出出主意:Jenkins在macOS代理上构建时,无法读取我已经在终端以及.bashrc、.zshrc里配置好的环境变量。
具体情况是这样的:
- 我已经通过终端设置了所有构建需要的环境变量,并且把它们正确写入了
.bashrc和.zshrc配置文件中; - 手动在终端运行
build.sh脚本时,一切都很顺畅,完全没有问题; - 但切换到Jenkins构建后,这些环境变量就像“消失”了一样,完全读不到。
我用下面这个Jenkinsfile做了测试:
pipeline { agent { label 'MacAgent-AppleSilicon_Test' } options { timestamps() timeout(time: 4, unit: 'HOURS') disableConcurrentBuilds() } stages { stage ('Jenkins') { steps { sh ''' $SHELL whoami brew list echo $HOME echo $PATH echo $NVM_DIR echo $JAVA_HOME echo $ANDROID_HOME echo $ANDROID_SDK_ROOT echo $ANDROID_NDK_HOME nvm ls ''' } } } }
执行后只有这几项有输出:
$SHELL=>/bin/zshwhoami=>ec2-user$PATH=>/usr/bin:/bin:/usr/sbin:/sbin
其他所有变量的echo结果都是空的,nvm ls还直接报错nvm: command not found。
我的Jenkins代理是通过plist文件启动的,原来的配置内容如下:
<key>Label</key> <string>com.jenkins.ci</string> <key>UserName</key> <string>ec2-user</string> <key>SessionCreate</key> <key>ProgramArguments</key> <array> <string>java</string> <string>-Djava.awt.headless=true</string> <string>-jar</string> <string>/Users/ec2-user/Jenkins/remoting.jar</string> <string>-jnlpUrl</string> <string>http://ip-of-jenkins-master/computer/mac_vm/slave-agent.jnlp</string> </array> <key>KeepAlive</key> <key>StandardOutPath</key> <string>/Users/ec2-user/Jenkins/stdout.log</string> <key>StandardErrorPath</key> <string>/Users/ec2-user/Jenkins/error.log</string>
目前我找到了一个临时的解决办法:在Jenkins的「节点 -> Slave_Agent -> 配置 -> 节点属性/环境变量」里手动添加这些变量,这样构建就能正常运行了。但新的问题又出现了——只要我运行一次构建,macOS代理上的.bashrc和.zshrc文件就会被自动删除,这实在太奇怪了。
我想请教各位,有没有什么办法能让Jenkins构建直接读取我已经在终端和配置文件里设置好的环境变量,而不用依赖节点属性里的手动配置?
[编辑] 后来我尝试修改了plist文件,添加了EnvironmentVariables属性,现在的配置内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.jenkins.ci</string> <key>ProgramArguments</key> <array> <string>java</string> <string>-Djava.awt.headless=true</string> <string>-jar</string> <string>/Users/ec2-user/Jenkins/remoting.jar</string> <string>-jnlpUrl</string> <string>http://ip-of-jenkins-master/computer/mac_vm/slave-agent.jnlp</string> </array> <key>RunAtLoad</key> <true/> <key>EnvironmentVariables</key> <dict> <key>JAVA_HOME</key> <string>/Library/Java/JavaVirtualMachines/jdk-17.0.1.jdk/Contents/Home</string> </dict> </dict> </plist>
备注:内容来源于stack exchange,提问作者Mishovski
相关产品推荐
相关产品推荐

