gitlab-runner
我正在使用 在 MacOS 上安装服务brew install gitlab-runner
,之后我可以使用 启动该服务brew services start gitlab-runner
。如果我使用 启动该服务sudo
(或者从 root 帐户启动),则在重新启动机器后,该服务将启动。
在没有 - 的情况下启动服务时sudo
,服务在重启后不会启动。brew services help
输出中有一些关于“登录时”的语言,但它在通过 SSH 登录时不起作用,而且 - 我希望服务在启动时启动,即使用户尚未登录。
有什么方法可以让自制的“用户服务”在 MacOS 启动时启动?
使用的问题sudo brew start
在于 Gitlab 运行器服务将以启动它的用户的身份运行提交给它的作业 - 并且我需要 Gitlab 作业不以 root 身份运行。
答案1
我在这里做了一个假设,但听起来你希望在gitlab-runner
不登录 Mac 上的用户帐户的情况下运行进程。GitLab
目前不支持这一点 -https://docs.gitlab.com/runner/install/osx.html
您需要登录 Mac 上的用户帐户才能以这种方式运行 gitlab-runner。
目前,在 macOS 中唯一可行方法是在用户模式下运行该服务。
GitLab 本身承认它比其他方法“不太安全”,即他们承认你必须关闭 FileVault 并启用自动登录,或者准备在 Mac 关闭或重新启动时手动登录。
答案2
它似乎brew
不支持运行“启动守护进程”——它只能管理“启动代理”(苹果的文档深入探讨了“代理”和“守护进程”之间的区别但是,与大多数 Apple 官方文档一样,它没有达到实际规格),这意味着要么在启动时以 root 身份运行,要么在用户登录时以用户身份运行。
但是有一种方法可以让服务在启动时以用户身份运行。我通过以下方法解决了我的问题:
- 运行
brew services start gitlab-runner
(不带sudo
)以使 brew 生成~/Library/LaunchAgents/homebrew.mxcl.gitlab-runner.plist
定义服务的文件。 - 停止服务(
brew services stop gitlab-runner
) - 将文件移动到
/Library/LaunchDaemons/homebrew.mxcl.gitlab-runner.plist
- 编辑 plist 文件以添加
UserName
密钥:
<key>UserName</key>
<string>myuser</string>
- 将文件的所有权更改为
root
(否则 Launchd 将不会启动它):chown root /Library/LaunchDaemons/homebrew.mxcl.gitlab-runner.plist
- 重启
该服务现在将在启动时启动并在守护进程 plist 文件中指定的用户帐户下运行。
示例用例
在我的用例中,我使用 AWS mac1.metal
“VM”来运行 Gitlab 运行器,并且通过将 EC2“用户数据”字段设置为可以设置 Gitlab 运行器并自动启动它的 bash 脚本来设置初始化脚本,它看起来像这样:
#!/bin/bash
GITLAB_TOKEN=GET_THE_CI_TOKEN_FROM_SOMEWHERE
# this script runs as root, so to use brew we need to run
# a script as ec2-user:
cat > /usr/local/bin/setup-ci.sh <<<'#!/bin/bash -x
source .bash_profile
brew upgrade
brew update --auto-update
brew install rbenv gitlab-runner
rbenv init - bash >> .bash_profile
source .bash_profile
rbenv install 2.7.4
rbenv global 2.7.4
brew services start gitlab-runner
sleep 10 # let the service settle before registering
gitlab-runner register --non-interactive --url https://gitlab.com --registration-token "'"${GITLAB_TOKEN}"'" --executor shell --name mac-gitlab-runner --tag-list macos,ios --shell bash
sleep 3
cat /Users/ec2-user/.gitlab-runner/config.toml # for debugging
# update the plist file
perl -lpe "m,RunAtLoad, and print \"\t<key>UserName</key><string>ec2-user</string>\"" ~/Library/LaunchAgents/homebrew.mxcl.gitlab-runner.plist > homebrew.mxcl.gitlab-runner.plist
sudo mv homebrew.mxcl.gitlab-runner.plist /Library/LaunchDaemons/homebrew.mxcl.gitlab-runner.plist
sudo /usr/sbin/chown root /Library/LaunchDaemons/homebrew.mxcl.gitlab-runner.plist
# Try to stop service - it sometimes "fails", but we dont care about that
brew services stop gitlab-runner || true
'
chmod 755 /usr/local/bin/setup-ci.sh
su - ec2-user -c /usr/local/bin/setup-ci.sh
启动完成后,我重新启动 EC2 实例,Gitlab runner 自动启动,并以 的身份运行ec2-user
。