diff --git a/.github/workflows/prod.yml b/.github/workflows/prod.yml index f877209b..a49f4a09 100644 --- a/.github/workflows/prod.yml +++ b/.github/workflows/prod.yml @@ -1,74 +1,78 @@ -name: Deploy to Prod +name: Deploy to production on: - workflow_run: - workflows: [CI] - types: - - completed - branches: [prod] + push: + branches: + - prod jobs: - on-success: - runs-on: ubuntu-latest - if: ${{ github.event.workflow_run.conclusion == 'success' }} + deploy: + runs-on: bpProd-runner + defaults: + run: + working-directory: /var/www/aihomework/boilerplate + steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Install sshpass - run: sudo apt-get install sshpass + - name: Checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 0 - - name: Fetch .env file from server - run: | - sshpass -p ${{ secrets.PASSWORD }} scp -o StrictHostKeyChecking=no ${{ secrets.USERNAME }}@${{ secrets.HOST }}:~/prod-deployment/hng_boilerplate_expressjs/.env .env - env: - SSH_HOST: ${{ secrets.HOST }} - SSH_USERNAME: ${{ secrets.USERNAME }} - SSH_PASSWORD: ${{ secrets.PASSWORD }} + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: '20' - - name: Build Docker images + - name: Remove old actions remote URL + continue-on-error: true run: | - docker compose --env-file .env -f docker-compose.production.yml build + git remote rm action - - name: List Docker images - run: docker images + # - name: Stash or remove local changes + # run: | + # if git diff --quiet; then + # echo "No local changes to stash." + # else + # echo "Stashing local changes..." + # git stash --include-untracked || echo "Failed to stash changes. Attempting to reset..." + # git reset --hard || exit 1 + # fi - - name: Save Docker images to tarball + - name: Pull from GitHub + id: pull run: | - docker save hng_boilerplate_expressjs-backend_prod:latest | gzip > prod-images.tar.gz + remote_repo="https://${GITHUB_ACTOR}:${{ secrets.GITHUB_TOKEN }}@github.com/${GITHUB_REPOSITORY}.git" + # git remote add action $remote_repo + git clone $remote_repo prod - - name: Upload artifact - uses: actions/upload-artifact@v2 - with: - name: prod-images - path: prod-images.tar.gz + - name: Install dependencies + run: yarn install --frozen-lockfile - - name: Copy Docker images to server - uses: appleboy/scp-action@master - with: - host: ${{ secrets.HOST }} - username: ${{ secrets.USERNAME }} - password: ${{ secrets.PASSWORD }} - source: "prod-images.tar.gz" - target: "~/images-tar" + - name: Run tests + run: yarn test - - name: Deploy to server - uses: appleboy/ssh-action@master - with: - host: ${{ secrets.HOST }} - username: ${{ secrets.USERNAME }} - password: ${{ secrets.PASSWORD }} - script: | - cd ~/prod-deployment/hng_boilerplate_expressjs - git stash - git checkout main - git pull - docker load -i ~/images-tar/prod-images.tar.gz - docker compose -f docker-compose.production.yml down - docker compose -f docker-compose.production.yml up -d + - name: Build the application + run: yarn build && sudo rm -rf build - on-failure: - runs-on: ubuntu-latest - if: ${{ github.event.workflow_run.conclusion == 'failure' }} - steps: - - run: echo "CI Workflow failed. Prod deployment was not triggered." \ No newline at end of file + # - name: Generate migrations + # run: yarn migration:generate + + # - name: Run migrations + # run: yarn migration:run + + - name: Setup and restart service + run: | + sudo cp server-script/aihomeworkprod.service /etc/systemd/system + sudo systemctl daemon-reload + sudo systemctl restart aihomeworkprod.service + + - name: Verify deployment + run: | + echo "Waiting for service to start..." + sleep 10 + if sudo systemctl is-active --quiet aihomeworkprod.service; then + echo "Deployment successful!" + else + echo "Deployment failed!" + exit 1 + fi