Mac 开机自启动程序

上次去吃火锅,被测试 call 说无法打包了,原来是上次有人用电脑,用完之后,忘记连接电源,导致电脑自动关机了,电脑再次开启的时候,Jenkins 反向代理没有开,导致无法打包(我们的 Jenkins 是部署在 阿里云上的,通过反向代理,代理到公司的一个 Mac 电脑上,从而进行打包)。当时也没有带电脑,导致我只好打车回去,去启动反向代理。搞好之后就配置了下开机自动启动,在这里记录一下,以免有人需要。

通过查阅文档可知,Mac 通过launchd 来启动服务

我们只需要在对应的目录,配置好 plist 文件即可,当 Mac 开机或者登录账户的时候,将会按照 plist 文件来加载我们指定的程序。

存放 plist 文件的目录有以下几个

1
2
3
4
5
6
/System/Library/LaunchDaemons/ // 开机后加载
/Library/LaunchDaemons/ // 开机后加载
/System/Library/LaunchAgents/ // 用户登录后
/Library/LaunchAgents/ // 用户登录后
/Library/LaunchDaemons/ // 用户登录后
~/Library/LaunchAgents/ // 用户登录后,自定义的 plist 可以放在这里

详细的 plist 文件的 key 和 value 可以通过 man launchd.plist 来查看,但必须包含以下几项

Label 一个字符串,用来标识要启动的程序,要求唯一
Program 指定一个 sh 脚本,或者一个可执行文件等
ProgramArguments 如果不指定 Program 的话,将依据这个参数来
KeepAlive BOOL 是否一直存活

通过 launchctl load ~/Library/LaunchAgents/com.your.launchjob.plist 来启动程序

通过 launchctl unload ~/Library/LaunchAgents/com.your.launchjob.plist 来终止程序

com.package.jenkinsAgent.plist 内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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>KeepAlive</key>
<true/>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/package/.rvm/gems/ruby-2.5.3/bin:/Users/package/.rvm/gems/ruby-2.5.3@global/bin:/Users/package/.rvm/rubies/ruby-2.5.3/bin:/Users/package/.fastlane/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/package/.rvm/bin</string>
</dict>
<key>Label</key>
<string>com.package.jenkinsAgent</string>
<key>Program</key>
<string>/Users/package/autoRun/jenkinsAgent.sh</string>
<key>RunAtLoad</key>
<true/>
<key>StandardErrorPath</key>
<string>/Users/package/autoRun/jenkinsAgent.stdout.log</string>
<key>StandardOutPath</key>
<string>/Users/package/autoRun/jenkinsAgent.stdout.log</string>
<key>WorkingDirectory</key>
<string>/Users/package/jenkins_workspace</string>
</dict>
</plist>

在上述的 plist 文件中,我们指定了,在用户登录的时候,去执行 /Users/package/autoRun/jenkinsAgent.sh 脚本,并且设置了一些 log 输出到指定文件,设置了工作目录和环境变量。

/Users/package/autoRun/jenkinsAgent.sh 内容如下

1
2
3
4
5
6
7
8
#!/bin/zsh --login
export LC_ALL=en_US.UTF-8
echo $SHELL
echo $PATH
ruby -v
rvm use 2.5.3
cd /Users/package/autoRun
java -jar agent.jar -jnlpUrl http://jenkins-test-int.igetcool.com/computer/ios-package-node/slave-agent.jnlp -secret dce8bc948f8992da8499926eafcd88d80c395a62c24cf15b2a3adaeeaed593c2 -workDir "/Users/package/jenkins_workspace"

如果 sh 脚本不能执行,请添加权限 chmod +x jenkinsAgent.sh

我们这边用的 Jenkins + fastlane 来进行打包
由于使用的 fastlane,当我通过系统直接启动 Jenkins 反向代理,在 Jenkins 上打包的时候,会发现找不到 fastlane,其实电脑上已经装好了。在 Jenkins 打包的时候,我打印了下环境变量发现和直接在终端里打印的是不一样的,后来想可能是系统启动只会加载默认的环境变量,所以我在 com.package.jenkinsAgent.plist 加上了 EnvironmentVariables 相关的配置。后来在打包,就找到了 fastlane,但又发现ruby版本不对,原来系统启动的时候,使用的系统自带的 ruby,导致 和 bundler 不匹配,这里切换下用户手动安装的 ruby 就可以了。

1
2
3
rvm list
ruby -v
rvm use 2.5.3

当配置完成后,重启系统,Jenkins 反向代理将自动启动****