Возможно, я неправильно смотрю на это, но я пытаюсь настроить свой 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
, и я подумал, что могу обернуть его в файл оболочки. Но это ничего не изменило.
Итак, как мне разрешить моему пользователю 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'ing на gitlab-runner и выполнив команду без ошибок, но снова ошибка указывает на то, что мне даже нельзя разрешить использовать ключевое слово sudo
вообще. Вот соответствующая запись sudoers:
gitlab-runner ALL=(ALL) NOPASSWD: /bin/systemctl restart my-app
Спасибо
Итак, покопавшись еще немного, выясняется, что в моем файле sudoers была запись:
Defaults requiretty
Комментирование этого устраняет проблему, а некоторые исследовательская работа похоже, что нет никакой реальной выгоды от его хранения.
Я делаю что-то подобное. Вы не в этом случае нужен TTY, но вы делать необходимо для пути, который вы вызываете с помощью sudo, чтобы точно соответствовать тому, что находится в вашем sudoers
файл. В вашем случае это означает, что вам необходимо убедиться, что ваш сценарий перезапуска:
sudo /bin/systemctl restart my-app
И нет
sudo systemctl restart my-app
Вы можете легко проверить, что ваш sudo
установка работает правильно, становясь root и используя su -l gitlab-runner
стать этим пользователем. Наконец, запустите вручную restart.sh
сценарий. Вам следует не будет запрошен пароль (который пытается использовать TTY).