diff --git a/.github/actions/send_slack_notification/action.yml b/.github/actions/send_slack_notification/action.yml new file mode 100644 index 000000000..929f3afbc --- /dev/null +++ b/.github/actions/send_slack_notification/action.yml @@ -0,0 +1,22 @@ +name: Send Slack notification + +inputs: + slack_webhook: + required: true + + slack_title: + required: true + + slack_message: + required: true + +runs: + using: composite + steps: + - uses: rtCamp/action-slack-notify@v2 + env: + SLACK_WEBHOOK: ${{ inputs.slack_webhook }} + SLACK_USERNAME: "ENSNode Bot" + SLACK_TITLE: ${{ inputs.slack_title }} + SLACK_MESSAGE: ${{ inputs.slack_message }} + SLACK_COLOR: good diff --git a/.github/workflows/deploy_ensnode.yml b/.github/workflows/deploy_ensnode.yml index 57bb438c6..04f497408 100644 --- a/.github/workflows/deploy_ensnode.yml +++ b/.github/workflows/deploy_ensnode.yml @@ -4,14 +4,14 @@ on: workflow_dispatch: inputs: target: - description: 'Target environment (green or blue)' + description: "Target environment (green or blue)" required: true type: choice options: - green - blue tag: - description: 'Docker Image Tag (also used for schema name generation)' + description: "Docker Image Tag (also used for schema name generation)" required: true type: string @@ -29,58 +29,65 @@ jobs: RAILWAY_TEAM_TOKEN: ${{ secrets.RAILWAY_TEAM_TOKEN }} steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check if Docker images exists run: | - docker manifest inspect ${{ env.ENSINDEXER_DOCKER_IMAGE }} || { echo "Given docker image does not exist: ${{ env.ENSINDEXER_DOCKER_IMAGE }}"; exit 1; } - docker manifest inspect ${{ env.ENSRAINBOW_DOCKER_IMAGE }} || { echo "Given docker image does not exist: ${{ env.ENSRAINBOW_DOCKER_IMAGE }}"; exit 1; } + docker manifest inspect ${{ env.ENSINDEXER_DOCKER_IMAGE }} || { echo "Given docker image does not exist: ${{ env.ENSINDEXER_DOCKER_IMAGE }}"; exit 1; } + docker manifest inspect ${{ env.ENSRAINBOW_DOCKER_IMAGE }} || { echo "Given docker image does not exist: ${{ env.ENSRAINBOW_DOCKER_IMAGE }}"; exit 1; } - name: Print switch target run: | - echo "Deploying on: $TARGET_ENVIRONMENT" + echo "Deploying on: $TARGET_ENVIRONMENT" - name: Calculate env variables run: | - case "$TARGET_ENVIRONMENT" in - "green") - #ENVIRONMENT - echo "RAILWAY_ENVIRONMENT_ID=${{ secrets.GREEN_RAILWAY_ENVIRONMENT_ID }}" >> $GITHUB_ENV - #ALPHA - echo "ALPHA_API_SVC_ID="${{ secrets.GREEN_ALPHA_API_SVC_ID }} >> "$GITHUB_ENV" - echo "ALPHA_INDEXER_SVC_ID="${{ secrets.GREEN_ALPHA_INDEXER_SVC_ID }} >> "$GITHUB_ENV" - #MAINNET - echo "MAINNET_API_SVC_ID="${{ secrets.GREEN_MAINNET_API_SVC_ID }} >> "$GITHUB_ENV" - echo "MAINNET_INDEXER_SVC_ID="${{ secrets.GREEN_MAINNET_INDEXER_SVC_ID }} >> "$GITHUB_ENV" - #SEPOLIA - echo "SEPOLIA_API_SVC_ID="${{ secrets.GREEN_SEPOLIA_API_SVC_ID }} >> "$GITHUB_ENV" - echo "SEPOLIA_INDEXER_SVC_ID="${{ secrets.GREEN_SEPOLIA_INDEXER_SVC_ID }} >> "$GITHUB_ENV" - #HOLESKY - echo "HOLESKY_API_SVC_ID="${{ secrets.GREEN_HOLESKY_API_SVC_ID }} >> "$GITHUB_ENV" - echo "HOLESKY_INDEXER_SVC_ID="${{ secrets.GREEN_HOLESKY_INDEXER_SVC_ID }} >> "$GITHUB_ENV" - #ENSRAINBOW - echo "ENSRAINBOW_SVC_ID="${{ secrets.GREEN_ENSRAINBOW_SVC_ID }} >> "$GITHUB_ENV" - ;; - "blue") - #ENVIRONMENT - echo "RAILWAY_ENVIRONMENT_ID=${{ secrets.BLUE_RAILWAY_ENVIRONMENT_ID }}" >> $GITHUB_ENV - #ALPHA - echo "ALPHA_API_SVC_ID="${{ secrets.BLUE_ALPHA_API_SVC_ID }} >> "$GITHUB_ENV" - echo "ALPHA_INDEXER_SVC_ID="${{ secrets.BLUE_ALPHA_INDEXER_SVC_ID }} >> "$GITHUB_ENV" - #MAINNET - echo "MAINNET_API_SVC_ID="${{ secrets.BLUE_MAINNET_API_SVC_ID }} >> "$GITHUB_ENV" - echo "MAINNET_INDEXER_SVC_ID="${{ secrets.BLUE_MAINNET_INDEXER_SVC_ID }} >> "$GITHUB_ENV" - #SEPOLIA - echo "SEPOLIA_API_SVC_ID="${{ secrets.BLUE_SEPOLIA_API_SVC_ID }} >> "$GITHUB_ENV" - echo "SEPOLIA_INDEXER_SVC_ID="${{ secrets.BLUE_SEPOLIA_INDEXER_SVC_ID }} >> "$GITHUB_ENV" - #HOLESKY - echo "HOLESKY_API_SVC_ID="${{ secrets.BLUE_HOLESKY_API_SVC_ID }} >> "$GITHUB_ENV" - echo "HOLESKY_INDEXER_SVC_ID="${{ secrets.BLUE_HOLESKY_INDEXER_SVC_ID }} >> "$GITHUB_ENV" - #ENSRAINBOW - echo "ENSRAINBOW_SVC_ID="${{ secrets.BLUE_ENSRAINBOW_SVC_ID }} >> "$GITHUB_ENV" - ;; - *) - echo "Environment not recognized, skipping workflow" - exit 1 - esac + case "$TARGET_ENVIRONMENT" in + "green") + #ENVIRONMENT + echo "RAILWAY_ENVIRONMENT_ID=${{ secrets.GREEN_RAILWAY_ENVIRONMENT_ID }}" >> $GITHUB_ENV + #ALPHA + echo "ALPHA_API_SVC_ID="${{ secrets.GREEN_ALPHA_API_SVC_ID }} >> "$GITHUB_ENV" + echo "ALPHA_INDEXER_SVC_ID="${{ secrets.GREEN_ALPHA_INDEXER_SVC_ID }} >> "$GITHUB_ENV" + #MAINNET + echo "MAINNET_API_SVC_ID="${{ secrets.GREEN_MAINNET_API_SVC_ID }} >> "$GITHUB_ENV" + echo "MAINNET_INDEXER_SVC_ID="${{ secrets.GREEN_MAINNET_INDEXER_SVC_ID }} >> "$GITHUB_ENV" + #SEPOLIA + echo "SEPOLIA_API_SVC_ID="${{ secrets.GREEN_SEPOLIA_API_SVC_ID }} >> "$GITHUB_ENV" + echo "SEPOLIA_INDEXER_SVC_ID="${{ secrets.GREEN_SEPOLIA_INDEXER_SVC_ID }} >> "$GITHUB_ENV" + #HOLESKY + echo "HOLESKY_API_SVC_ID="${{ secrets.GREEN_HOLESKY_API_SVC_ID }} >> "$GITHUB_ENV" + echo "HOLESKY_INDEXER_SVC_ID="${{ secrets.GREEN_HOLESKY_INDEXER_SVC_ID }} >> "$GITHUB_ENV" + #ENSRAINBOW + echo "ENSRAINBOW_SVC_ID="${{ secrets.GREEN_ENSRAINBOW_SVC_ID }} >> "$GITHUB_ENV" + echo "SLACK_TITLE=':large_green_circle: GREEN environment is now having new ENSNode version - '"${{ env.TAG }} >> "$GITHUB_ENV" + ;; + "blue") + #ENVIRONMENT + echo "RAILWAY_ENVIRONMENT_ID=${{ secrets.BLUE_RAILWAY_ENVIRONMENT_ID }}" >> $GITHUB_ENV + #ALPHA + echo "ALPHA_API_SVC_ID="${{ secrets.BLUE_ALPHA_API_SVC_ID }} >> "$GITHUB_ENV" + echo "ALPHA_INDEXER_SVC_ID="${{ secrets.BLUE_ALPHA_INDEXER_SVC_ID }} >> "$GITHUB_ENV" + #MAINNET + echo "MAINNET_API_SVC_ID="${{ secrets.BLUE_MAINNET_API_SVC_ID }} >> "$GITHUB_ENV" + echo "MAINNET_INDEXER_SVC_ID="${{ secrets.BLUE_MAINNET_INDEXER_SVC_ID }} >> "$GITHUB_ENV" + #SEPOLIA + echo "SEPOLIA_API_SVC_ID="${{ secrets.BLUE_SEPOLIA_API_SVC_ID }} >> "$GITHUB_ENV" + echo "SEPOLIA_INDEXER_SVC_ID="${{ secrets.BLUE_SEPOLIA_INDEXER_SVC_ID }} >> "$GITHUB_ENV" + #HOLESKY + echo "HOLESKY_API_SVC_ID="${{ secrets.BLUE_HOLESKY_API_SVC_ID }} >> "$GITHUB_ENV" + echo "HOLESKY_INDEXER_SVC_ID="${{ secrets.BLUE_HOLESKY_INDEXER_SVC_ID }} >> "$GITHUB_ENV" + #ENSRAINBOW + echo "ENSRAINBOW_SVC_ID="${{ secrets.BLUE_ENSRAINBOW_SVC_ID }} >> "$GITHUB_ENV" + echo "SLACK_TITLE=':large_blue_circle: BLUE environment is now having new ENSNode version - '"${{ env.TAG }} >> "$GITHUB_ENV" + ;; + *) + echo "Environment not recognized, skipping workflow" + exit 1 + esac # Update indexer source docker image - name: Update shared environment variable @@ -147,30 +154,36 @@ jobs: - name: Redeploy ENSNode instances run: | - redeploy_service() { - local environment_id=$1 - local service_id=$2 - echo "Redeploying $service_id" - curl --request POST \ - --silent \ - --url https://backboard.railway.app/graphql/v2 \ - --header 'Authorization: Bearer '${{ env.RAILWAY_TOKEN }} \ - --header 'Content-Type: application/json' \ - --data "{\"query\":\"mutation serviceInstanceDeploy(\$serviceId: String!, \$environmentId: String!) { serviceInstanceDeploy(serviceId: \$serviceId, environmentId: \$environmentId) }\",\"variables\":{\"environmentId\":\"${environment_id}\",\"serviceId\":\"${service_id}\"}}" - echo "Finished redeploying $service_id" - } + redeploy_service() { + local environment_id=$1 + local service_id=$2 + echo "Redeploying $service_id" + curl --request POST \ + --silent \ + --url https://backboard.railway.app/graphql/v2 \ + --header 'Authorization: Bearer '${{ env.RAILWAY_TOKEN }} \ + --header 'Content-Type: application/json' \ + --data "{\"query\":\"mutation serviceInstanceDeploy(\$serviceId: String!, \$environmentId: String!) { serviceInstanceDeploy(serviceId: \$serviceId, environmentId: \$environmentId) }\",\"variables\":{\"environmentId\":\"${environment_id}\",\"serviceId\":\"${service_id}\"}}" + echo "Finished redeploying $service_id" + } + + #ALPHA + redeploy_service ${RAILWAY_ENVIRONMENT_ID} ${ALPHA_API_SVC_ID} + redeploy_service ${RAILWAY_ENVIRONMENT_ID} ${ALPHA_INDEXER_SVC_ID} + #MAINNET + redeploy_service ${RAILWAY_ENVIRONMENT_ID} ${MAINNET_API_SVC_ID} + redeploy_service ${RAILWAY_ENVIRONMENT_ID} ${MAINNET_INDEXER_SVC_ID} + #SEPOLIA + redeploy_service ${RAILWAY_ENVIRONMENT_ID} ${SEPOLIA_API_SVC_ID} + redeploy_service ${RAILWAY_ENVIRONMENT_ID} ${SEPOLIA_INDEXER_SVC_ID} + #HOLESKY + redeploy_service ${RAILWAY_ENVIRONMENT_ID} ${HOLESKY_API_SVC_ID} + redeploy_service ${RAILWAY_ENVIRONMENT_ID} ${HOLESKY_INDEXER_SVC_ID} + #ENSRAINBOW + redeploy_service ${RAILWAY_ENVIRONMENT_ID} ${ENSRAINBOW_SVC_ID} - #ALPHA - redeploy_service ${RAILWAY_ENVIRONMENT_ID} ${ALPHA_API_SVC_ID} - redeploy_service ${RAILWAY_ENVIRONMENT_ID} ${ALPHA_INDEXER_SVC_ID} - #MAINNET - redeploy_service ${RAILWAY_ENVIRONMENT_ID} ${MAINNET_API_SVC_ID} - redeploy_service ${RAILWAY_ENVIRONMENT_ID} ${MAINNET_INDEXER_SVC_ID} - #SEPOLIA - redeploy_service ${RAILWAY_ENVIRONMENT_ID} ${SEPOLIA_API_SVC_ID} - redeploy_service ${RAILWAY_ENVIRONMENT_ID} ${SEPOLIA_INDEXER_SVC_ID} - #HOLESKY - redeploy_service ${RAILWAY_ENVIRONMENT_ID} ${HOLESKY_API_SVC_ID} - redeploy_service ${RAILWAY_ENVIRONMENT_ID} ${HOLESKY_INDEXER_SVC_ID} - #ENSRAINBOW - redeploy_service ${RAILWAY_ENVIRONMENT_ID} ${ENSRAINBOW_SVC_ID} + - uses: ./.github/actions/send_slack_notification + with: + slack_webhook: ${{ secrets.SLACK_WEBHOOK_URL }} + slack_title: ${{ env.SLACK_TITLE }} + slack_message: "✅ Deploy ENSNode completed" diff --git a/.github/workflows/deploy_switch_ensnode_environment.yml b/.github/workflows/deploy_switch_ensnode_environment.yml index 20a795f98..0303c8556 100644 --- a/.github/workflows/deploy_switch_ensnode_environment.yml +++ b/.github/workflows/deploy_switch_ensnode_environment.yml @@ -4,7 +4,7 @@ on: workflow_dispatch: inputs: target: - description: 'New main environment (green or blue)' + description: "New main environment (green or blue)" required: true type: choice options: @@ -19,31 +19,55 @@ jobs: REDIS_URL: ${{ secrets.TRAEFIK_REDIS_URL }} steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Print switch target run: | - echo "Switching to: $TARGET_ENVIRONMENT" + echo "Switching to: $TARGET_ENVIRONMENT" - name: Install redis-cli run: | - sudo apt install redis-tools + sudo apt install redis-tools - name: Switch Traefik routers run: | - # SEPOLIA - redis-cli -u $REDIS_URL SET traefik/http/routers/sepolia-api-router/service "${TARGET_ENVIRONMENT}-sepolia-api" - redis-cli -u $REDIS_URL SET traefik/http/routers/sepolia-indexer-router/service "${TARGET_ENVIRONMENT}-sepolia-indexer" + # SEPOLIA + redis-cli -u $REDIS_URL SET traefik/http/routers/sepolia-api-router/service "${TARGET_ENVIRONMENT}-sepolia-api" + redis-cli -u $REDIS_URL SET traefik/http/routers/sepolia-indexer-router/service "${TARGET_ENVIRONMENT}-sepolia-indexer" + + # ALPHA + redis-cli -u $REDIS_URL SET traefik/http/routers/alpha-api-router/service "${TARGET_ENVIRONMENT}-alpha-api" + redis-cli -u $REDIS_URL SET traefik/http/routers/alpha-indexer-router/service "${TARGET_ENVIRONMENT}-alpha-indexer" - # ALPHA - redis-cli -u $REDIS_URL SET traefik/http/routers/alpha-api-router/service "${TARGET_ENVIRONMENT}-alpha-api" - redis-cli -u $REDIS_URL SET traefik/http/routers/alpha-indexer-router/service "${TARGET_ENVIRONMENT}-alpha-indexer" + # MAINNET + redis-cli -u $REDIS_URL SET traefik/http/routers/mainnet-api-router/service "${TARGET_ENVIRONMENT}-mainnet-api" + redis-cli -u $REDIS_URL SET traefik/http/routers/mainnet-indexer-router/service "${TARGET_ENVIRONMENT}-mainnet-indexer" - # MAINNET - redis-cli -u $REDIS_URL SET traefik/http/routers/mainnet-api-router/service "${TARGET_ENVIRONMENT}-mainnet-api" - redis-cli -u $REDIS_URL SET traefik/http/routers/mainnet-indexer-router/service "${TARGET_ENVIRONMENT}-mainnet-indexer" + # HOLESKY + redis-cli -u $REDIS_URL SET traefik/http/routers/holesky-api-router/service "${TARGET_ENVIRONMENT}-holesky-api" + redis-cli -u $REDIS_URL SET traefik/http/routers/holesky-indexer-router/service "${TARGET_ENVIRONMENT}-holesky-indexer" - # HOLESKY - redis-cli -u $REDIS_URL SET traefik/http/routers/holesky-api-router/service "${TARGET_ENVIRONMENT}-holesky-api" - redis-cli -u $REDIS_URL SET traefik/http/routers/holesky-indexer-router/service "${TARGET_ENVIRONMENT}-holesky-indexer" + # ENSRAINBOW + redis-cli -u $REDIS_URL SET traefik/http/routers/ensrainbow-api-router/service "${TARGET_ENVIRONMENT}-ensrainbow-api" + + - name: Calculate env variables + run: | + case "$TARGET_ENVIRONMENT" in + "green") + echo "SLACK_TITLE=':large_green_circle: GREEN environment activated" >> "$GITHUB_ENV" + ;; + "blue") + echo "SLACK_TITLE=':large_blue_circle: BLUE environment activated" >> "$GITHUB_ENV" + ;; + *) + echo "SLACK_TITLE=':large_red_circle: Unrecognized environment activated" >> "$GITHUB_ENV" + esac - # ENSRAINBOW - redis-cli -u $REDIS_URL SET traefik/http/routers/ensrainbow-api-router/service "${TARGET_ENVIRONMENT}-ensrainbow-api" + - uses: ./.github/actions/send_slack_notification + with: + slack_webhook: ${{ secrets.SLACK_WEBHOOK_URL }} + slack_title: ${{ env.SLACK_TITLE }} + slack_message: "✅ Switch ENSNode environment completed" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index df3a7f69d..facbd7a7a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -191,3 +191,9 @@ jobs: prerelease: false env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - uses: ./.github/actions/send_slack_notification + with: + slack_webhook: ${{ secrets.SLACK_WEBHOOK_URL }} + slack_title: "ENSNode new version released: v${{ steps.get-pr.outputs.version }}" + slack_message: "✅ Release ENSNode completed"