macOS下如何让Homebrew安装的GitLab Runner用户服务开机自动启动?
我太懂你的困扰了——用普通用户身份启动GitLab Runner吧,重启机器后服务就自动停了;用sudo启动呢,又会导致所有Job都以root身份运行,完全不符合你的需求。要实现用户级服务开机自动启动(哪怕没人登录系统),得绕开brew services的默认逻辑,直接用macOS原生的launchd来配置,具体步骤如下:
先停掉当前的brew服务,避免冲突
先把已经通过brew启动的GitLab Runner服务停掉:brew services stop gitlab-runner创建自定义的launchd配置文件
我们需要创建一个系统级的launchd守护进程配置,指定以你的普通用户身份运行。在/Library/LaunchDaemons/目录下新建一个名为com.gitlab.gitlab-runner.plist的文件(这个目录是macOS加载系统级开机服务的地方),内容如下:<?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.gitlab.gitlab-runner</string> <key>ProgramArguments</key> <array> <string>/usr/local/bin/gitlab-runner</string> <string>run</string> <string>--working-directory</string> <string>/Users/你的用户名/gitlab-runner</string> <string>--config</string> <string>/Users/你的用户名/.gitlab-runner/config.toml</string> </array> <key>UserName</key> <string>你的用户名</string> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <true/> <key>StandardOutPath</key> <string>/var/log/gitlab-runner.log</string> <key>StandardErrorPath</key> <string>/var/log/gitlab-runner.err</string> </dict> </plist>注意把上面的
你的用户名替换成你实际的Mac用户名,另外可以用which gitlab-runner命令确认gitlab-runner的执行路径是否正确,如果和示例里的/usr/local/bin/gitlab-runner不一样,记得同步修改。设置配置文件的权限
因为放在系统级目录,需要给文件设置正确的权限:sudo chown root:wheel /Library/LaunchDaemons/com.gitlab.gitlab-runner.plist sudo chmod 644 /Library/LaunchDaemons/com.gitlab.gitlab-runner.plist加载并启动服务
用launchctl加载这个配置文件,让系统开机时自动启动:sudo launchctl load /Library/LaunchDaemons/com.gitlab.gitlab-runner.plist验证服务状态
你可以用下面的命令检查服务是否成功启动:launchctl list | grep com.gitlab.gitlab-runner也可以查看日志确认运行情况:
cat /var/log/gitlab-runner.log
为什么这个方法可行?
brew services默认的用户服务(不加sudo启动)是放在~/Library/LaunchAgents/目录下的,这种配置只有当用户登录后才会加载;而我们把配置放在/Library/LaunchDaemons/,属于系统级服务,开机就会自动加载,同时通过UserName字段指定了运行服务的用户,这样GitLab Runner就会以你的普通用户身份运行,提交的Job也不会用root执行,完美解决你的两个痛点。
需要注意的是,以后如果用brew更新GitLab Runner,记得检查一下配置文件里的ProgramArguments路径是否依然正确,避免因为更新导致路径变化而服务无法启动。
备注:内容来源于stack exchange,提问作者Guss

