Ошибка развертывания Gitlab CI: «bash: pm2: команда не найдена» во время выполнения gitlab-ci.yml - PullRequest
0 голосов
/ 19 октября 2018

Я развертываю приложение Next.JS из GitLab непосредственно на моем удаленном сервере.Я настроил переменную, которая содержит мой закрытый SSH-ключ для подключения к удаленному серверу, и я использую rsync для копирования с докера на мой удаленный сервер.Все работает до последней строки, когда я использую PM2 через SSH для перезапуска службы.

image: node:latest

stages:
  - build
  - test
  - deploy

cache:
  paths:
    - node_modules/
    - .next/

install_dependencies:
  stage: build
  script:
    - npm install
    - npm run build
  artifacts:
    paths:
      - node_modules/
      - .next/

test-build:
  stage: test
  script:
    - npm run test

deploy_production:
  stage: deploy
  only:
    - master
  before_script:
    - "which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )"
    - mkdir -p ~/.ssh
    - eval $(ssh-agent -s)
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    - ssh-add <(echo "$SSH_PRIVATE_KEY")
    - apt-get update -y
    - apt-get -y install rsync
  script:
    - ssh -p22 dev@example.com "mkdir -p /var/www/example.com/index_tmp"
    - rsync -rav -e ssh --exclude='.git/' --exclude='.gitlab-ci.yml' --delete-excluded ./ dev@example.com:/var/www/example.com/index_tmp
    - ssh -p22 dev@example.com "mv /var/www/example.com/index /var/www/example.com/index_old && mv /var/www/example.com/index_tmp /var/www/example.com/index"
    - ssh -p22 dev@example.com "rm -rf /var/www/example.com/index_old"
    - ssh -p22 dev@example.com "pm2 restart landing-page"

И вот последние 8 строк или около того из журнала запуска задач:

[... rsync output ...]
sent 193,022,347 bytes  received 550,996 bytes  9,003,411.30 bytes/sec
total size is 191,108,661  speedup is 0.99
$ ssh -p22 dev@example.com "mv /var/www/example.com/index /var/www/example.com/index_old && mv /var/www/example.com/index_tmp /var/www/example.com/index"
$ ssh -p22 dev@example.com "rm -rf /var/www/example.com/index_old"
$ ssh -p22 dev@example.com "pm2 restart landing-page"
bash: pm2: command not found
ERROR: Job failed: exit code 1

Странная часть в том, что, если бы я подключился напрямую к удаленному серверу и запустил pm2 restart landing-page, это было бы результатом:

dev@example.com:~$ pm2 restart landing-page
Use --update-env to update environment variables
[PM2] Applying action restartProcessId on app [landing-page](ids: 0)
[PM2] [landing-page](0) ✓
┌──────────────┬────┬─────────┬──────┬───────┬────────┬─────────┬────────┬─────┬──────────┬──────┬──────────┐
│ App name     │ id │ version │ mode │ pid   │ status │ restart │ uptime │ cpu │ mem      │ user │ watching │
├──────────────┼────┼─────────┼──────┼───────┼────────┼─────────┼────────┼─────┼──────────┼──────┼──────────┤
│ landing-page │ 0  │ 0.33.11 │ fork │ 18174 │ online │ 2       │ 0s     │ 0%  │ 7.6 MB   │ dev  │ disabled │
└──────────────┴────┴─────────┴──────┴───────┴────────┴─────────┴────────┴─────┴──────────┴──────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app

Итак, в конце концов, яполностью потерялся в том, почему последняя команда не работает, если все из rsync работает отлично, потому что я проверил, и файлы были изменены на удаленном сервере.

Ребята, у вас есть идеи?на как это решить?Я был бы очень признателен!

Спасибо за чтение и спасибо за ваше время.

1 Ответ

0 голосов
/ 19 октября 2018

Это потому, что ваш SSH-вызов напрямую встроен.Нет файла .bash_aliases или .bash_rc.

Чтобы ваш pm2 работал, вы должны вызывать его с полным путем.Для этого проверьте ваше местоположение pm2, используя эту команду непосредственно на удаленном сервере:

whereis pm2
# Output something like /usr/bin/pm2

Затем используйте полный путь, указанный ранее, чтобы сделать ваш SSH-вызов:

 script:
    - ...
    - ssh -p22 dev@example.com "/usr/bin/pm2 restart landing-page"
...