update indexer #193
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: Build, Test and Deploy to Prod | |
| on: | |
| push: | |
| branches: | |
| - main | |
| env: | |
| SQLX_OFFLINE: true | |
| jobs: | |
| build: | |
| runs-on: ubuntu-latest | |
| outputs: | |
| image_tag: ${{ steps.tag.outputs.tag }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v2 | |
| # Create unique tag from git commit + build number | |
| - name: Generate unique tag | |
| id: tag | |
| run: | | |
| SHORT_SHA=$(git rev-parse --short HEAD) | |
| TAG="build-${{ github.run_number }}-${SHORT_SHA}" | |
| echo "tag=$TAG" >> $GITHUB_OUTPUT | |
| echo "Generated tag: $TAG" | |
| - name: Cache dependencies | |
| uses: actions/cache@v3 | |
| with: | |
| path: | | |
| ~/.cargo | |
| server/target/ | |
| key: ${{ runner.os }}-cargo-${{ hashFiles('server/Cargo.lock') }} | |
| restore-keys: ${{ runner.os }}-cargo- | |
| - name: Install Rust | |
| uses: actions-rs/toolchain@v1 | |
| with: | |
| profile: minimal | |
| toolchain: stable | |
| - name: Build and test code | |
| working-directory: ./server | |
| run: | | |
| cargo build --verbose | |
| cargo test --verbose | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v2 | |
| - name: Log in to Docker Hub | |
| uses: docker/login-action@v2 | |
| with: | |
| username: ${{ secrets.DOCKER_USERNAME }} | |
| password: ${{ secrets.DOCKER_PASSWORD }} | |
| - name: Build and push Docker images with unique tag | |
| uses: docker/bake-action@v2.3.0 | |
| env: | |
| IMAGE_TAG: ${{ steps.tag.outputs.tag }} | |
| with: | |
| files: ./server/docker-bake.hcl | |
| push: true | |
| set: | | |
| *.cache-from=type=gha | |
| *.cache-to=type=gha,mode=max | |
| - name: Build and push indexer with unique tag | |
| uses: docker/build-push-action@v4 | |
| with: | |
| context: ./the_last_indexer | |
| push: true | |
| tags: | | |
| paymesh/the-last-indexer:${{ steps.tag.outputs.tag }} | |
| paymesh/the-last-indexer:latest | |
| deploy: | |
| needs: build | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v2 | |
| - name: Log in to Docker Hub | |
| uses: docker/login-action@v1 | |
| with: | |
| username: ${{ secrets.DOCKER_USERNAME }} | |
| password: ${{ secrets.DOCKER_PASSWORD }} | |
| - name: Install sshpass | |
| run: sudo apt-get install sshpass | |
| - name: Copy docker-compose.yml to droplet | |
| run: sshpass -v -p ${{ secrets.DROPLET_PASSWORD }} scp -o StrictHostKeyChecking=no server/docker-compose.yml root@${{ vars.DROPLET_IP }}:~ | |
| - name: Deploy with environment variables | |
| uses: appleboy/ssh-action@master | |
| env: | |
| IMAGE_TAG: ${{ needs.build.outputs.image_tag }} | |
| with: | |
| host: ${{ vars.DROPLET_IP }} | |
| username: root | |
| password: ${{ secrets.DROPLET_PASSWORD }} | |
| envs: IMAGE_TAG | |
| script: | | |
| cd ~ | |
| # Create environment file | |
| cat > .env <<EOL | |
| RPC_URL=${{ secrets.RPC_URL }} | |
| PRIVATE_KEY=${{ secrets.PRIVATE_KEY }} | |
| PUBLIC_KEY=${{ secrets.PUBLIC_KEY }} | |
| CONTRACT_ADDRESS=${{ secrets.CONTRACT_ADDRESS }} | |
| DATABASE_URL=${{ secrets.DATABASE_URL }} | |
| DATABASE_URL_USER=${{ secrets.DATABASE_URL_USER }} | |
| DATABASE_URL_PASSWORD=${{ secrets.DATABASE_URL_PASSWORD }} | |
| DATABASE_URL_DB=${{ secrets.DATABASE_URL_DB }} | |
| DNA_TOKEN=${{ secrets.DNA_TOKEN }} | |
| API_URL=${{ secrets.API_URL }} | |
| CROWD_FUNDING_CONTRACT_ADDRESS=${{ secrets.CROWD_FUNDING_CONTRACT_ADDRESS }} | |
| GENESIS_ADMIN_EMAIL=${{ secrets.GENESIS_ADMIN_EMAIL }} | |
| GENESIS_ADMIN_PASSWORD=${{ secrets.GENESIS_ADMIN_PASSWORD }} | |
| JWT_SECRET=${{ secrets.JWT_SECRET }} | |
| JWT_EXPIRED_IN=${{ secrets.JWT_EXPIRED_IN }} | |
| JWT_MAXAGE=${{ secrets.JWT_MAXAGE }} | |
| PAYMESH_API_KEY=${{ secrets.PAYMESH_API_KEY }} | |
| IMAGE_TAG=${IMAGE_TAG} | |
| EOL | |
| echo "Deploying with image tag: ${IMAGE_TAG}" | |
| # Stop, pull new images, and restart | |
| docker compose --env-file .env stop | |
| docker compose --env-file .env pull | |
| docker compose --env-file .env up -d | |
| # Cleanup old images - keep last 5 versions | |
| echo "Cleaning up old images..." | |
| docker images "paymesh/server" --format "{{.Repository}}:{{.Tag}}" | \ | |
| grep -v latest | \ | |
| sort -r | \ | |
| tail -n +6 | \ | |
| xargs -r docker rmi || true | |
| # Remove dangling images | |
| docker image prune -f | |
| echo "Deployment complete!" | |
| echo "Running containers:" | |
| docker ps | |
| # - name: Copy docker-compose.yml to paymesh indexer droplet | |
| # run: sshpass -v -p ${{ secrets.PAYMESH_DROPLET_PASSWORD }} scp -o StrictHostKeyChecking=no the_last_indexer/docker-compose.yml root@${{ vars.PAYMESH_DROPLET_IP }}:~ | |
| # - name: Deploy with environment variables | |
| # uses: appleboy/ssh-action@master | |
| # with: | |
| # host: ${{ vars.PAYMESH_DROPLET_IP }} | |
| # username: root | |
| # password: ${{ secrets.PAYMESH_DROPLET_PASSWORD }} | |
| # script: | | |
| # cd ~ | |
| # cat > .env <<EOL | |
| # DNA_TOKEN=${{ secrets.DNA_TOKEN }} | |
| # API_URL=${{ secrets.API_URL }} | |
| # PAYMESH_API_KEY=${{ secrets.PAYMESH_API_KEY }} | |
| # EOL | |
| # docker compose --env-file .env stop | |
| # docker compose --env-file .env pull | |
| # docker compose --env-file .env up -d |