Вопрос или проблема
Это мой рабочий процесс GitHub Actions для развертывания кода на экземпляре EC2. Проблема в том, что команда nohup никогда не завершает свою работу, поэтому соединение SSH и сам рабочий процесс не завершаются. Я контролировал сервер EC2 и подтвердил, что файл сборки Go создается и выполняется правильно. Как я могу решить эту проблему? Любая помощь будет оценена!
name: Автоматическое развертывание EC2
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Развертывание
run: |
echo "${{ secrets.PRIVATE_KEY }}" > private_key
chmod 600 private_key
ssh -o StrictHostKeyChecking=no \
${{ secrets.USER_NAME }}@${{ secrets.HOST_NAME }} \
-i private_key \
"cd /home/ec2-user/my-app && \
git switch main && \
git fetch origin && \
git pull origin main && \
/usr/local/go/bin/go build -o main cmd/server/main.go && \
lsof -ti:8080 | xargs --no-run-if-empty kill && \
nohup ./main >> /home/ec2-user/output.txt 2>&1 < /dev/null & \
sleep 5"
echo "Развертывание завершено"
Ответ или решение
Ваша проблема заключается в том, что команда nohup продолжает работать, и SSH-соединение не завершается, что приводит к тому, что ваш GitHub Actions workflow не может успешно завершиться. Чтобы решить эту проблему, вы можете попробовать использовать несколько подходов. Вот один из них:
Решение проблемы с nohup в GitHub Actions
-
Перемещение
nohup
команды в фоновый процесс: Убедитесь, что вы правильно запускаетеnohup
в фоновом режиме, чтобы оно не блокировало SSH-соединение. -
Изменение команды
nohup
: Добавьте в конец команды&
для запуска процесса в фоновом режиме. Это позволит SSH-соединению завершиться независимо от состояния выполняемой команды.
Вот исправленная версия вашего кода:
name: EC2 auto deploy
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Deploy
run: |
echo "${{ secrets.PRIVATE_KEY }}" > private_key
chmod 600 private_key
ssh -o StrictHostKeyChecking=no \
${{ secrets.USER_NAME }}@${{ secrets.HOST_NAME }} \
-i private_key \
"cd /home/ec2-user/my-app && \
git switch main && \
git fetch origin && \
git pull origin main && \
/usr/local/go/bin/go build -o main cmd/server/main.go && \
lsof -ti:8080 | xargs --no-run-if-empty kill && \
nohup ./main >> /home/ec2-user/output.txt 2>&1 < /dev/null & disown"
echo "Deployment completed"
Объяснение изменений:
- Добавление
& disown
в конце командыnohup
позволит процессу продолжать работать даже после закрытия SSH-соединения. - Использование
>>
перенаправляет стандартный вывод и стандартный поток ошибок в файлoutput.txt
, что может помочь в диагностике ошибок.
Дополнительные рекомендации:
- Проверка правил безопасности: Убедитесь, что в правиле безопасности вашего EC2 разрешен входящий трафик на порту 8080, если это необходимо.
- Мониторинг работы: Вы можете добавить команды для проверки статуса сервиса или использованиялога
output.txt
, чтобы иметь возможность отладить возможные проблемы.
Эти изменения и рекомендации должны помочь вашему workflow завершаться без зависаний при использовании команды nohup на EC2.