Не удалось завершить рабочий процесс GitHub Actions из-за команды nohup при развертывании в EC2

Вопрос или проблема

Это мой рабочий процесс 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

  1. Перемещение nohup команды в фоновый процесс: Убедитесь, что вы правильно запускаете nohup в фоновом режиме, чтобы оно не блокировало SSH-соединение.

  2. Изменение команды 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.

Оцените материал
Добавить комментарий

Капча загружается...