也许我的看法是错误的,但我正在尝试设置我的 gitlab ci 以便能够在推送时自动部署代码。这似乎是一个相当简单的过程,我已经成功地完成了大部分工作。我可能完全误解了 systemd 的工作原理,因为我对它还很陌生。
我有一个正在推送到 gitlab 的节点应用程序,它将成功启动部署逻辑,但我要做的最后一步是重新启动该应用程序,以确保我实际上提取了所有代码更改(据我了解,如果不重新启动服务,模块就不会发生更改,因为 npm 缓存会在需要时将模块保存在内存中)。
我的 gitlab ci yaml 文件如下所示:
stages:
- deploy
deploy-prod:
stage: deploy
variables:
BRANCH_REF: master
script:
- git fetch
- git checkout $BRANCH_REF
- git pull origin $BRANCH_REF
- npm install
- rm -rf /opt/my-app/www
- ln -s $CI_PROJECT_DIR /opt/my-app/www
- sh /home/gitlab-runner/restart.sh
tags:
- production
我可能不需要符号链接的间接性,但这对这个问题来说并不重要。我创建该restart.sh
文件是因为我遇到了错误sudo: sorry, you must have a tty to run sudo
,我想我可以将其包装在 shell 文件中。但这并没有改变一切。
那么,如何让我的 gitlab-runner 用户在更新文件时重新启动服务?
我的 systemd 配置如下:
[Unit]
After=mongod.service
[Service]
ExecStart=/usr/bin/node /opt/my-app/www/server
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=my-app
User=my-app
Group=my-app
Environment=NODE_ENV=production
我的 visudo 设置为允许 git-runner 用户systemctl restart my-app.service
无需密码即可运行,并且我已经通过 su 进入 gitlab-runner 并运行命令成功测试了这一点,没有出现错误,但错误再次表明我根本不应该被允许使用关键字sudo
。以下是相关的 sudoers 条目:
gitlab-runner ALL=(ALL) NOPASSWD: /bin/systemctl restart my-app
谢谢
答案1
我做了类似的事情。你不在这种情况下需要 TTY,但是你做需要确保使用 sudo 调用的路径与文件中的内容完全匹配sudoers
。对于您来说,这意味着您需要确保您的重启脚本执行以下任务:
sudo /bin/systemctl restart my-app
并不是
sudo systemctl restart my-app
您可以轻松测试您的sudo
设置是否正常工作,成为 root 并使用su -l gitlab-runner
成为该用户。最后,手动运行您的restart.sh
脚本。您应该不是提示输入密码(这是尝试使用 TTY 的部分)。