我在读取或识别 Jenkins 构建中的所有环境变量时遇到问题。
所有这些必要的变量都已通过终端设置,并正确写入 .bashrc 和 .zshrc 中。
我的 build.sh 需要设置这些环境变量,当我手动构建(通过终端运行 build.sh)时 - 一切都非常顺利。
我遇到的问题是,当我尝试使用 Jenkins 进行构建时,它无法“读取/识别”那些已设置的环境变量。当我使用以下 Jenkinsfile 开始构建时,我没有得到任何预期的东西(就像我在终端中得到的那样)。
Jenkins文件:
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/zsh
whoami => ec2-user
$PATH => /usr/bin:/bin:/usr/sbin:/sbin
其他所有内容均返回空回显,并且对于 nvm ls - 它失败,因为未找到 nvm:命令。
这是我的.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 -> 配置 -> 节点属性/环境变量。
目前这有效,但是一旦我开始至少一个构建,.bashrc 和 .zshrc 就会从 macOS 代理中删除/消失。
非常感谢关于如何使 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>
答案1
我猜测问题可能是因为 macOS Agents 不作为 shell 脚本运行,所以 .bashrc 和 .zshrc 没有运行。
也许你需要EnvironmentVariables
在 .plist 中添加一个属性?我在 中找到了这个man launchd.plist
;
EnvironmentVariables <dictionary of strings>
This optional key is used to specify additional environmental variables to
be set before running the job. Each key in the dictionary is the name of an
environment variable, with the corresponding value being a string
representing the desired value. NOTE: Values other than strings will be
ignored.
答案2
我找到的解决方案是添加环境变量,/etc/profile
然后获取该文件。
sh '''
source /etc/profile
chmod +x ./build.sh
./build.sh
'''
无法弄清楚为什么获取 .bashrc 和 .zshrc 不起作用。