为什么PATH在通过launchctl启动Jenkins slave时有所不同?

我有一个jenkins奴隶运行在macOS上通过ssh slave ,然后screen ,然后启动以下脚本,确保重新连接服务器,如果它下降:

 #!/usr/bin/env bash function startSlave() { java -jar /Users/user/slave.jar -jnlpUrl https://jenkins.company.com/computer/slave-office/slave-agent.jnlp -secret xyz sleep 3 } startSlave while true; do PID=$(pgrep "slave-agent.jnlp" | awk '{print $2}') if [[ -z $PID ]]; then echo "Jenkins slave has died, restarting..." startSlave fi sleep 60 done 

这个效果很好,在Jenkins作业中echo $PATH等同于在通过ssh打开的terminal会话中运行echo $PATH

有时我们需要重新启动机器,所以我希望这个脚本在login时执行。 我testing了启动脚本通过launchctl解决scheme和应用程序在macOS用户启动应用程序列表。

两次都echo $PATH显Jenkins从站的echo $PATH简单地等于: /usr/bin:/bin:/usr/sbin:/sbin因此,PATH没有从当前login的用户正确设置。

  • 该过程正在用户帐户下运行
  • 甚至Jenkins奴隶踢在用户帐户下运行的过程
  • 我们只使用~/.profile来设置环境variables…

怎么了? 为什么当我通过launchctl或应用程序启动上述脚本时,Jenkins从站没有正确设置PATHvariables?

更新:我明白了在Jenkins工作中的configuration文件工作: source /Users/leanplumbuild/.profile有谁知道为什么Jenkins-Slave不会自动执行此操作?

我不知道,但我的第一个猜测是,这是因为jenkins没有启动子shell作为“login壳”。 在交互式环境中login到shell时,shell会加载环境文件的方式与通过“非交互式”环境(如cron)启动环境文件的方式不同。 要改变这种行为,并以更高保真度让您的环境“匹配”,您需要启动子shell作为loginshell。 有很多种方法可以做到这一点,我相信jenkins有一个更强大的方法,但至less可以尝试将第一个sh-bang线改为:

 #!/bin/bash -l 

从作业中删除明确的采购项目。 现在,看看是否一切正常! 🙂

作为参考,请查看bash手册页“INVOCATION”中冗长而复杂的部分。 https://linux.die.net/man/1/bash