From a5ee7489c3d6e09926333289efb0e84efaed6abe Mon Sep 17 00:00:00 2001 From: Patrick Sullivan Date: Fri, 13 Sep 2024 23:37:32 +0100 Subject: [PATCH] fix(monorepo): Added full implementation of CI workflow --- .github/workflows/ci.yml | 375 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 358 insertions(+), 17 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 070308e8..2d006cae 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: "Continuous Integration" +name: CI/CD on: workflow_dispatch: @@ -8,25 +8,366 @@ on: required: false push: branches: - - "main" - - "next" - - "beta" - - "experimental" + - main + +env: + CI: true + # NX_CLOUD_DISTRIBUTED_EXECUTION: true # this enables DTE + # NX_CLOUD_DISTRIBUTED_EXECUTION_AGENT_COUNT: 3 # expected number of agents + # NX_BRANCH: ${{ github.event.number || github.ref_name }} + # NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + STORM_BOT: Stormie-Bot + STORM_REPOSITORY: ${{ github.repositoryUrl }} + STORM_WORKSPACE_ROOT: ${{ github.workspace }} + GITHUB_ACTOR: ${{ github.actor }} + GITHUB_TOKEN: ${{ github.token }} + NPM_TOKEN: ${{ secrets.STORM_BOT_NPM_TOKEN }} + CARGO_REGISTRY_TOKEN: ${{ secrets.STORM_BOT_CARGO_TOKEN }} jobs: - ci: - name: Continuous Integration - if: github.repository == 'storm-software/storm-stack' && (github.ref == - 'refs/heads/main' || github.ref == 'refs/heads/next' || github.ref == - 'refs/heads/beta' || github.ref == 'refs/heads/experimental') + start: + name: Started CI workflow + if: github.repository == 'storm-software/storm-stack' && github.event.pull_request.draft == false + runs-on: ubuntu-latest + steps: + - name: Send Slack notification - Deployment started + uses: slackapi/slack-github-action@v1.26.0 + with: + channel-id: "notifications" + payload: | + { + "text": "Deployment for ${{ github.repository }} has started (In Progress)", + "attachments": [ + { + "pretext": "Deployment for ${{ github.repository }} has started", + "color": "1fb2a6", + "fields": [ + { + "title": "Status", + "short": true, + "value": "In Progress" + } + ] + } + ] + } + env: + SLACK_BOT_TOKEN: ${{ secrets.STORM_BOT_SLACK_TOKEN }} + - name: Send Discord notification - Deployment started + uses: Ilshidur/action-discord@master + with: + args: "Deployment for ${{ github.repository }} has started - #${{ + github.run_number }}" + env: + DISCORD_WEBHOOK: ${{ secrets.STORM_BOT_DISCORD_WEBHOOK }} + DISCORD_USERNAME: ${{ env.STORM_BOT }} + DISCORD_AVATAR: "https://pub-761b436209f44a4d886487c917806c08.r2.dev/icon-stormie.png" + DISCORD_EMBEDS: + '[{"title": "Deployment #${{ github.run_number }} has started", + "description": "Deployment for ${{ github.repository }} is currently + in process - #${{ github.run_number }}", "thumbnail": { "url": + "https://pub-761b436209f44a4d886487c917806c08.r2.dev/icon-fill.png" + }, "image": { "url": + "https://pub-761b436209f44a4d886487c917806c08.r2.dev/logo-fill.png" + }, "author": { "name": "${{ github.actor }}", "url": + "https://github.com/${{ github.actor }}", "icon_url": + "https://avatars.githubusercontent.com/u/${{ github.actor_id }}?v=4" + }, "fields": [ { "name": "Repository", "value": "${{ + github.repository }}" }, { "name": "Repository URL", "value": "${{ + github.repositoryUrl }}" }, { "name": "Pipeline Status", "value": + "In Progress" }], "color": 2077350, "timestamp": "${{ + github.event.repository.updated_at }}", "url": "${{ + github.event.pull_request.html_url || github.event.head_commit.url + }}", "footer": { "text": "Click here to see the full workflow + details: ${{ github.event.pull_request.html_url || + github.event.head_commit.url }}", "icon_url": + "https://pub-761b436209f44a4d886487c917806c08.r2.dev/icon-fill.png" + } }]' + - name: Send Telegram notification - Deployment started + uses: storm-software/action-telegram-notify@main + with: + status: "in-progress" + env: + TELEGRAM_TOKEN: ${{ secrets.STORM_BOT_TELEGRAM_TOKEN }} + TELEGRAM_CHAT: ${{ secrets.STORM_BOT_TELEGRAM_NOTIFICATION_CHAT }} + + setup: + name: Setup workspace + if: always() && !cancelled() && !contains(needs.*.result, 'failure') && github.event.pull_request.draft == false + needs: + - start + runs-on: ubuntu-latest + timeout-minutes: 60 permissions: actions: read contents: write id-token: write - uses: storm-software/storm-ops/.github/workflows/ci-reusable.yml@main - with: - tag: ${{ inputs.tag }} - package-manager: pnpm - package-manager-version: 9.10.0 - storm-bot: Stormie-Bot - secrets: inherit + steps: + - name: Checkout [Pull Request] + uses: actions/checkout@v4 + if: ${{ github.event_name == 'pull_request' }} + with: + # By default, PRs will be checked-out based on the Merge Commit, but we want the actual branch HEAD. + ref: ${{ github.event.pull_request.head.sha }} + # We need to fetch all branches and commits so that Nx affected has a base to compare against. + fetch-depth: 0 + token: ${{ secrets.STORM_BOT_GITHUB_TOKEN }} + + - name: Checkout `main` branch + uses: actions/checkout@v4 + if: ${{ github.event_name != 'pull_request' }} + with: + # We need to fetch all branches and commits so that Nx affected has a base to compare against. + fetch-depth: 0 + token: ${{ secrets.STORM_BOT_GITHUB_TOKEN }} + + - name: Setup workspace + uses: ./.github/actions/setup + with: + working-directory: ./ + + - name: Run Nx Set SHAs + uses: nrwl/nx-set-shas@v4 + with: + main-branch-name: main + + - name: Run build script + run: pnpm build-all + shell: bash + + - name: Release Library Version Updates + run: pnpm release --base=${{ env.NX_BASE }} --head=${{ env.NX_HEAD }} + env: + GITHUB_ACTOR: ${{ github.actor }} + GITHUB_TOKEN: ${{ github.token }} + GH_TOKEN: ${{ github.token }} + NPM_TOKEN: ${{ secrets.STORM_BOT_NPM_TOKEN }} + CARGO_REGISTRY_TOKEN: ${{ secrets.STORM_BOT_CARGO_TOKEN }} + STORM_BOT: Stormie-Bot + STORM_WORKSPACE_ROOT: ${{ github.workspace }} + STORM_REPOSITORY: ${{ github.repositoryUrl }} + TAG: ${{ inputs.tag }} + + success: + needs: + - release + if: ${{ success() }} + name: Send success notification + runs-on: ubuntu-latest + steps: + - name: Send Slack notification - Deployment successful + uses: slackapi/slack-github-action@v1.26.0 + with: + channel-id: "notifications" + update-ts: ${{ steps.release.outputs.ts }} + payload: | + { + "text": "Deployment for ${{ github.repository }} has finished (Completed) \n\nPipeline Status: Success \nClick here to see the full workflow details: ${{ github.event.pull_request.html_url || github.event.head_commit.url }}", + "attachments": [ + { + "pretext": "Deployment for ${{ github.repository }} has finished successfully", + "color": "087f5b", + "fields": [ + { + "title": "Status", + "short": true, + "value": "Completed" + } + ] + } + ] + } + env: + SLACK_BOT_TOKEN: ${{ secrets.STORM_BOT_SLACK_TOKEN }} + + - name: Send Discord notification - Deployment successful + uses: Ilshidur/action-discord@master + with: + args: "Deployment for ${{ github.repository }} finished successfully - + #${{ github.run_number }}" + env: + DISCORD_WEBHOOK: ${{ secrets.STORM_BOT_DISCORD_WEBHOOK }} + DISCORD_USERNAME: ${{ env.STORM_BOT }} + DISCORD_AVATAR: "https://pub-761b436209f44a4d886487c917806c08.r2.dev/icon-stormie.png" + DISCORD_EMBEDS: + '[{"title": "Deployment #${{ github.run_number }} was successful!", + "description": "Deployment for ${{ github.repository }} has finished + successfully - #${{ github.run_number }}", "thumbnail": { "url": + "https://pub-761b436209f44a4d886487c917806c08.r2.dev/icon-fill.png" + }, "image": { "url": + "https://pub-761b436209f44a4d886487c917806c08.r2.dev/logo-fill.png" + }, "author": { "name": "${{ github.actor }}", "url": + "https://github.com/${{ github.actor }}", "icon_url": + "https://avatars.githubusercontent.com/u/${{ github.actor_id }}?v=4" + }, "fields": [ { "name": "Repository", "value": "${{ + github.repository }}" }, { "name": "Repository URL", "value": "${{ + github.repositoryUrl }}" }, { "name": "Pipeline Status", "value": + "Success" }], "color": 556891, "timestamp": "${{ + github.event.repository.updated_at }}", "url": "${{ + github.event.pull_request.html_url || github.event.head_commit.url + }}", "footer": { "text": "Click here to see the full workflow + details: ${{ github.event.pull_request.html_url || + github.event.head_commit.url }}", "icon_url": + "https://pub-761b436209f44a4d886487c917806c08.r2.dev/icon-fill.png" + }}]' + + - name: Send Telegram notification - Deployment successful + uses: storm-software/action-telegram-notify@main + with: + status: "success" + env: + TELEGRAM_TOKEN: ${{ secrets.STORM_BOT_TELEGRAM_TOKEN }} + TELEGRAM_CHAT: ${{ secrets.STORM_BOT_TELEGRAM_NOTIFICATION_CHAT }} + + failure: + needs: + - release + if: ${{ failure() }} + name: Send failure notification + runs-on: ubuntu-latest + steps: + - name: Send Slack notification - Deployment failed + uses: slackapi/slack-github-action@v1.26.0 + with: + channel-id: "notifications" + update-ts: ${{ steps.release.outputs.ts }} + payload: | + { + "text": "Deployment for ${{ github.repository }} has finished (Failure) \n\nPipeline Status: Failure\nError: ${{ job.conclusion }}\nReason: ${{ job.cancelled }}\nConclusion: ${{ job.conclusion }}\nOutput: ${{ job.output }}\nLogs: ${{ job.logs }} \nSteps: ${{ job.steps }} \nActions: ${{ job.actions }} \nServices: ${{ job.services }} \nEnvironment: ${{ job.environment}} \nClick here to see the full workflow details: ${{ github.event.pull_request.html_url || github.event.head_commit.url }}", + "attachments": [ + { + "pretext": "Deployment for ${{ github.repository }} has finished with failures", + "color": "990000", + "fields": [ + { + "title": "Status", + "short": true, + "value": "Failure" + } + ] + } + ] + } + env: + SLACK_BOT_TOKEN: ${{ secrets.STORM_BOT_SLACK_TOKEN }} + + - name: Send Discord notification - Deployment failed + uses: Ilshidur/action-discord@master + with: + args: + "Deployment for ${{ github.repository }} finished with failures - + #${{ github.run_number }}" + env: + DISCORD_WEBHOOK: ${{ secrets.STORM_BOT_DISCORD_WEBHOOK }} + DISCORD_USERNAME: ${{ env.STORM_BOT }} + DISCORD_AVATAR: "https://pub-761b436209f44a4d886487c917806c08.r2.dev/icon-stormie.png" + DISCORD_EMBEDS: + '[{"title": "Deployment #${{ github.run_number }} has failed", + "description": "Deployment for ${{ github.repository }} finished + with failures - #${{ github.run_number }}", "thumbnail": { "url": + "https://pub-761b436209f44a4d886487c917806c08.r2.dev/icon-fill.png" + }, "image": { "url": + "https://pub-761b436209f44a4d886487c917806c08.r2.dev/logo-fill.png" + }, "author": { "name": "${{ github.actor }}", "url": + "https://github.com/${{ github.actor }}", "icon_url": + "https://avatars.githubusercontent.com/u/${{ github.actor_id }}?v=4" + }, "fields": [ { "name": "Repository", "value": "${{ + github.repository }}" }, { "name": "Repository URL", "value": "${{ + github.repositoryUrl }}" }, { "name": "Pipeline Status", "value": + "Failure" }, { "name": "Event", "value": "${{ github.event_name }}" + }, { "name": "Result", "value": "${{ steps.release.result }}" }, { + "name": "Conclusion", "value": "${{ steps.release.conclusion }}" }, + { "name": "Output", "value": "${{ toJSON(steps.release.outputs) }}" + }], "color": 10027008, "timestamp": "${{ + github.event.repository.updated_at }}", "url": "${{ + github.event.pull_request.html_url || github.event.head_commit.url + }}", "footer": { "text": "Click here to see the full workflow + details: ${{ github.event.pull_request.html_url || + github.event.head_commit.url }}", "icon_url": + "https://pub-761b436209f44a4d886487c917806c08.r2.dev/icon-fill.png" + } }]' + + - name: Send Telegram notification - Deployment failed + uses: storm-software/action-telegram-notify@main + with: + status: "failed" + env: + TELEGRAM_TOKEN: ${{ secrets.STORM_BOT_TELEGRAM_TOKEN }} + TELEGRAM_CHAT: ${{ secrets.STORM_BOT_TELEGRAM_NOTIFICATION_CHAT }} + + cancelled: + needs: + - release + if: ${{ cancelled() }} + name: Send cancelled notification + runs-on: ubuntu-latest + steps: + - name: Send Slack notification - Deployment cancelled + uses: slackapi/slack-github-action@v1.26.0 + with: + channel-id: "notifications" + update-ts: ${{ steps.release.outputs.ts }} + payload: | + { + "text": "Deployment for ${{ github.repository }} has finished (Cancelled) \n\nPipeline Status: Cancelled\nError: ${{ job.conclusion }}\nReason: ${{ job.cancelled }}\nConclusion: ${{ job.conclusion }}\nOutput: ${{ job.output }}\nLogs: ${{ job.logs }} \nSteps: ${{ job.steps }} \nActions: ${{ job.actions }} \nServices: ${{ job.services }} \nEnvironment: ${{ job.environment}} \nClick here to see the full workflow details: ${{ github.event.pull_request.html_url || github.event.head_commit.url }}", + "attachments": [ + { + "pretext": "Deployment for ${{ github.repository }} has been cancelled", + "color": "990000", + "fields": [ + { + "title": "Status", + "short": true, + "value": "Cancelled" + } + ] + } + ] + } + env: + SLACK_BOT_TOKEN: ${{ secrets.STORM_BOT_SLACK_TOKEN }} + + - name: Send Discord notification - Deployment cancelled + uses: Ilshidur/action-discord@master + with: + args: + "Deployment for ${{ github.repository }} has been cancelled - #${{ + github.run_number }}" + env: + DISCORD_WEBHOOK: ${{ secrets.STORM_BOT_DISCORD_WEBHOOK }} + DISCORD_USERNAME: ${{ env.STORM_BOT }} + DISCORD_AVATAR: "https://pub-761b436209f44a4d886487c917806c08.r2.dev/icon-stormie.png" + DISCORD_EMBEDS: + '[{"title": "Deployment #${{ github.run_number }} was cancelled", + "description": "Deployment for ${{ github.repository }} was + cancelled before it could complete normal execution - #${{ + github.run_number }}", "thumbnail": { "url": + "https://pub-761b436209f44a4d886487c917806c08.r2.dev/icon-fill.png" + }, "image": { "url": + "https://pub-761b436209f44a4d886487c917806c08.r2.dev/logo-fill.png" + }, "author": { "name": "${{ github.actor }}", "url": + "https://github.com/${{ github.actor }}", "icon_url": + "https://avatars.githubusercontent.com/u/${{ github.actor_id }}?v=4" + }, "fields": [ { "name": "Repository", "value": "${{ + github.repository }}" }, { "name": "Repository URL", "value": "${{ + github.repositoryUrl }}" }, { "name": "Pipeline Status", "value": + "Cancelled" }, { "name": "Event", "value": "${{ github.event_name + }}" }, { "name": "Result", "value": "${{ steps.release.result }}" }, + { "name": "Conclusion", "value": "${{ steps.release.conclusion }}" + }, { "name": "Output", "value": "${{ toJSON(steps.release.outputs) + }}" }], "color": 16565273, "timestamp": "${{ + github.event.repository.updated_at }}", "url": "${{ + github.event.pull_request.html_url || github.event.head_commit.url + }}", "footer": { "text": "Click here to see the full workflow + details: ${{ github.event.pull_request.html_url || + github.event.head_commit.url }}", "icon_url": + "https://pub-761b436209f44a4d886487c917806c08.r2.dev/icon-fill.png" + } }]' + + - name: Send Telegram notification - Deployment cancelled + uses: storm-software/action-telegram-notify@main + with: + status: "cancelled" + env: + TELEGRAM_TOKEN: ${{ secrets.STORM_BOT_TELEGRAM_TOKEN }} + TELEGRAM_CHAT: ${{ secrets.STORM_BOT_TELEGRAM_NOTIFICATION_CHAT }}