Merge pull request #2336 from Giveth/hotfix/handle-request-errors-master #772
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: master-pipeline | |
| on: | |
| push: | |
| branches: | |
| - master | |
| jobs: | |
| run-linters: | |
| name: Run linters | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Check out Git repository | |
| uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| - name: Set up Node.js | |
| uses: actions/setup-node@v5 | |
| with: | |
| node-version: 20.11.0 | |
| # ESLint and Prettier must be in `package.json` | |
| - name: Install Node.js dependencies | |
| run: npm ci | |
| - name: Run linters | |
| uses: wearerequired/lint-action@v2 | |
| with: | |
| eslint: true | |
| #prettier: true | |
| continue_on_error: true | |
| publish: | |
| # needs: test | |
| runs-on: ubuntu-latest | |
| if: github.event_name == 'push' | |
| permissions: | |
| contents: read | |
| packages: write | |
| steps: | |
| - name: Check out the repo | |
| uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| - name: Login to GitHub Container Registry | |
| run: echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin | |
| - name: Build image and push to GitHub Packages | |
| uses: docker/build-push-action@v6 | |
| with: | |
| context: . | |
| file: ./Dockerfile | |
| push: true | |
| pull: true | |
| no-cache: true | |
| tags: | | |
| ghcr.io/giveth/impact-graph:master | |
| ghcr.io/giveth/impact-graph:${{ github.sha }} | |
| deploy: | |
| needs: publish | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: SSH and Redeploy | |
| uses: appleboy/ssh-action@v1.0.0 | |
| with: | |
| host: ${{ secrets.PROD_HOST_ALL }} | |
| username: ${{ secrets.PROD_USERNAME_ALL }} | |
| key: ${{ secrets.PROD_PRIVATE_KEY_ALL }} | |
| port: ${{ secrets.SSH_PORT }} | |
| script: | | |
| cd giveth-all | |
| docker compose pull | |
| rollout-deploy-1: | |
| needs: deploy | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: SSH and Redeploy | |
| uses: appleboy/ssh-action@v1.0.0 | |
| with: | |
| host: ${{ secrets.PROD_HOST_ALL }} | |
| username: ${{ secrets.PROD_USERNAME_ALL }} | |
| key: ${{ secrets.PROD_PRIVATE_KEY_ALL }} | |
| port: ${{ secrets.SSH_PORT }} | |
| script: | | |
| cd giveth-all | |
| ## Update each backend service one by one | |
| ## First Deployment (images were pulled earlier) | |
| docker compose up -d --no-deps --force-recreate impact-graph-ql1 | |
| docker compose up -d --no-deps --force-recreate impact-graph-jobs | |
| echo "First deployment phase triggered. Deep health checks deferred to verify-health job." | |
| rollout-deploy-2: | |
| needs: rollout-deploy-1 | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: SSH and Redeploy | |
| uses: appleboy/ssh-action@v1.0.0 | |
| with: | |
| host: ${{ secrets.PROD_HOST_ALL }} | |
| username: ${{ secrets.PROD_USERNAME_ALL }} | |
| key: ${{ secrets.PROD_PRIVATE_KEY_ALL }} | |
| port: ${{ secrets.SSH_PORT }} | |
| script: | | |
| cd giveth-all | |
| ## Update each backend service one by one | |
| ## Second Deployment (images were pulled earlier) | |
| docker compose up -d --no-deps --force-recreate impact-graph-ql2 | |
| echo "Second deployment phase triggered. Health checks deferred to verify-health job." | |
| rollout-deploy-3: | |
| needs: rollout-deploy-2 | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: SSH and Redeploy | |
| uses: appleboy/ssh-action@v1.0.0 | |
| with: | |
| host: ${{ secrets.PROD_HOST_ALL }} | |
| username: ${{ secrets.PROD_USERNAME_ALL }} | |
| key: ${{ secrets.PROD_PRIVATE_KEY_ALL }} | |
| port: ${{ secrets.SSH_PORT }} | |
| script: | | |
| cd giveth-all | |
| ## Update each backend service one by one | |
| ## Third Deployment (images were pulled earlier) | |
| docker compose up -d --no-deps --force-recreate impact-graph-ql3 | |
| echo "Third deployment phase triggered. Health checks deferred to verify-health job." | |
| rollout-deploy-4: | |
| needs: rollout-deploy-3 | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: SSH and Redeploy | |
| uses: appleboy/ssh-action@v1.0.0 | |
| with: | |
| host: ${{ secrets.PROD_HOST_ALL }} | |
| username: ${{ secrets.PROD_USERNAME_ALL }} | |
| key: ${{ secrets.PROD_PRIVATE_KEY_ALL }} | |
| port: ${{ secrets.SSH_PORT }} | |
| script: | | |
| cd giveth-all | |
| ## Update each backend service one by one | |
| ## Fourth Deployment (images were pulled earlier) | |
| docker compose up -d --no-deps --force-recreate impact-graph-ql4 | |
| echo "Fourth deployment phase triggered. Health checks deferred to verify-health job." | |
| verify-health: | |
| needs: | |
| - rollout-deploy-1 | |
| - rollout-deploy-2 | |
| - rollout-deploy-3 | |
| - rollout-deploy-4 | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Wait for services to stabilize | |
| run: sleep 180 | |
| - name: SSH and Verify Health | |
| uses: appleboy/ssh-action@v1.0.0 | |
| with: | |
| host: ${{ secrets.PROD_HOST_ALL }} | |
| username: ${{ secrets.PROD_USERNAME_ALL }} | |
| key: ${{ secrets.PROD_PRIVATE_KEY_ALL }} | |
| port: ${{ secrets.SSH_PORT }} | |
| script: | | |
| set -e | |
| cd giveth-all | |
| services=("impact-graph-ql1" "impact-graph-ql2" "impact-graph-ql3" "impact-graph-ql4") | |
| for svc in "${services[@]}"; do | |
| echo "Checking health for $svc ..." | |
| ok=0 | |
| for i in {1..12}; do | |
| status=$(docker inspect --format='{{json .State.Health.Status}}' "$svc" 2>/dev/null || echo '""') | |
| if [ "$status" = "\"healthy\"" ]; then | |
| echo "$svc is healthy" | |
| ok=1 | |
| break | |
| fi | |
| echo "Current health: $status; waiting..." | |
| sleep 10 | |
| done | |
| if [ $ok -ne 1 ]; then | |
| echo "::error::$svc did not reach healthy status" | |
| exit 1 | |
| fi | |
| done | |
| echo "Checking impact-graph-jobs is running ..." | |
| job_status=$(docker inspect --format='{{json .State.Status}}' impact-graph-jobs 2>/dev/null || echo '""') | |
| if [ "$job_status" != "\"running\"" ]; then | |
| echo "::error::impact-graph-jobs is not running (status: $job_status)" | |
| exit 1 | |
| fi | |
| echo "All services healthy." | |
| docker image prune -f |