diff --git a/.github/parse-tests.js b/.github/parse-tests.js deleted file mode 100644 index 2ae1f55819..0000000000 --- a/.github/parse-tests.js +++ /dev/null @@ -1,24 +0,0 @@ -const readline = require('readline'); - -// Create readline interface -const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout, - terminal: false -}); - -let content = ''; - -// Read stdin content -rl.on('line', (line) => { - content += line + '\n'; -}); - -rl.on('close', () => { - // Escape special characters - const escapedContent = content.replace(/"/g, ' '); - // Convert the JSON object to a string - const jsonStr = JSON.stringify(escapedContent); - const jsonStr2 = jsonStr.slice(1, -1); - console.log(jsonStr2); -}); \ No newline at end of file diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 1e228bd2b6..83fd332c55 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -1,5 +1,6 @@ on: pull_request name: pull_request + jobs: staticcheck: runs-on: ubuntu-latest @@ -36,11 +37,10 @@ jobs: args: -v --timeout=5m test: + needs: staticcheck runs-on: ubuntu-latest-128 permissions: pull-requests: write - outputs: - failures: ${{ steps.generate-job-summary.outputs.failures }} steps: - name: checkout code uses: actions/checkout@v4 @@ -75,62 +75,18 @@ jobs: go test -json -v -p 4 -tags=prover_checks ./examples/... 2>&1 | gotestfmt -hide=all | tee -a /tmp/gotest.log go test -json -v -run=NONE -fuzz=FuzzIntcomp -fuzztime=30s ./internal/backend/ioutils 2>&1 | gotestfmt -hide=all | tee -a /tmp/gotest.log - - name: Generate job summary - id: generate-job-summary - if: ${{ always() }} - run: | - if [ -s /tmp/gotest.log ]; then - cat /tmp/gotest.log > $GITHUB_STEP_SUMMARY - echo "failures=$(cat /tmp/gotest.log | node .github/parse-tests.js)" > $GITHUB_OUTPUT - else - echo "## Success ✅" > $GITHUB_STEP_SUMMARY - echo "failures=" > $GITHUB_OUTPUT - fi - slack-workflow-status-failed: - if: failure() - name: post workflow status to slack + slack-notifications: + if: always() + uses: ./.github/workflows/slack-notifications.yml needs: - - staticcheck - test - runs-on: ubuntu-latest - steps: - - name: Notify slack -- workflow failed - id: slack - uses: slackapi/slack-github-action@v1.26.0 - with: - payload: | - { - "actor": "${{ github.actor }}", - "repo": "${{ github.repository }}", - "status": "FAIL", - "title": "${{ github.event.pull_request.title }}", - "pr": "${{ github.event.pull_request.head.ref }}", - "failed_step_url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}/", - "message": "${{ needs.test.outputs.failures }}" - } - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} - - slack-workflow-status-success: - if: success() - name: post workflow status to slack - needs: - staticcheck - - test - runs-on: ubuntu-latest - steps: - - name: Notify slack -- workflow succeeded - id: slack - uses: slackapi/slack-github-action@v1.26.0 - with: - payload: | - { - "actor": "${{ github.actor }}", - "repo": "${{ github.repository }}", - "status": "SUCCESS", - "title": "${{ github.event.pull_request.title }}", - "pr": "${{ github.event.pull_request.head.ref }}" - } - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_SUCCESS }} \ No newline at end of file + secrets: + SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} + with: + status: ${{ needs.staticcheck.result }}${{ needs.test.result }} + actor: ${{ github.actor }} + repository: ${{ github.repository }} + branch: ${{ github.event.pull_request.head.ref }} + run_id: ${{ github.run_id }} \ No newline at end of file diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index d9428762e7..1e21a62c65 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -3,6 +3,7 @@ on: branches: - 'master' name: push_master + jobs: staticcheck: runs-on: ubuntu-latest @@ -81,51 +82,18 @@ jobs: go test -v -p 4 -timeout=50m -tags=release_checks -short -race ./test/... go test -v -run=NONE -fuzz=FuzzIntcomp -fuzztime=30s ./internal/backend/ioutils - - slack-workflow-status-failed: - if: failure() - name: post workflow status to slack - needs: - - staticcheck - - test - runs-on: ubuntu-latest - steps: - - name: Notify slack -- workflow failed - id: slack - uses: slackapi/slack-github-action@v1.26.0 - with: - payload: | - { - "actor": "${{ github.actor }}", - "repo": "${{ github.repository }}", - "status": "FAIL", - "title": "push to master ⚠", - "pr": "", - "failed_step_url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}/", - "message": "" - } - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} - slack-workflow-status-success: - if: success() - name: post workflow status to slack + slack-notifications: + if: always() + uses: ./.github/workflows/slack-notifications.yml needs: - - staticcheck - test - runs-on: ubuntu-latest - steps: - - name: Notify slack -- workflow succeeded - id: slack - uses: slackapi/slack-github-action@v1.26.0 - with: - payload: | - { - "actor": "${{ github.actor }}", - "repo": "${{ github.repository }}", - "status": "SUCCESS", - "title": "push to master ✅", - "pr": "" - } - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_SUCCESS }} \ No newline at end of file + - staticcheck + secrets: + SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} + with: + status: ${{ needs.staticcheck.result }}${{ needs.test.result }} + actor: ${{ github.actor }} + repository: ${{ github.repository }} + branch: "master" + run_id: ${{ github.run_id }} \ No newline at end of file diff --git a/.github/workflows/slack-notifications.yml b/.github/workflows/slack-notifications.yml new file mode 100755 index 0000000000..e563fbf5f7 --- /dev/null +++ b/.github/workflows/slack-notifications.yml @@ -0,0 +1,85 @@ +# .github/workflows/slack-notifications.yml +name: Slack Notifications + +on: + workflow_call: + secrets: + SLACK_BOT_TOKEN: + required: true + inputs: + status: + description: 'The status of the workflow (successsuccess or failure)' + required: true + type: string + actor: + description: 'The GitHub actor' + required: true + type: string + repository: + description: 'The GitHub repository' + required: true + type: string + branch: + description: 'The branch name' + required: true + type: string + run_id: + description: 'The workflow run ID' + required: true + type: string + +jobs: + notify_slack: + runs-on: ubuntu-latest + steps: + - name: Post to Slack + run: | + if [ "${{ inputs.status }}" == "successsuccess" ]; then + payload=$(jq -n --arg repository "${{ inputs.repository }}" --arg branch "${{ inputs.branch }}" --arg actor "${{ inputs.actor }}" --arg run_id "${{ inputs.run_id }}" '{ + "channel": "team-gnark-build", + "text": "GitHub Action build result: success", + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": ":large_green_circle: *All checks have passed:* *\($branch)* :white_check_mark:" + }, + }, + { + "type": "context", + "elements": [ + { + "type": "mrkdwn", + "text": "\($repository) -- \($actor) -- " + } + ] + } + ] + }') + else + payload=$(jq -n --arg repository "${{ inputs.repository }}" --arg branch "${{ inputs.branch }}" --arg actor "${{ inputs.actor }}" --arg run_id "${{ inputs.run_id }}" '{ + "channel": "team-gnark-build", + "text": "GitHub Action build result: failure", + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": ":red_circle: *Failed run:* *\($branch)*" + }, + }, + { + "type": "context", + "elements": [ + { + "type": "mrkdwn", + "text": "\($repository) -- \($actor) -- " + } + ] + } + ] + }') + fi + response=$(curl -s -X POST -H 'Content-type: application/json; charset=utf-8' --data "$payload" https://slack.com/api/chat.postMessage -H "Authorization: Bearer ${{ secrets.SLACK_BOT_TOKEN }}" ) + shell: bash \ No newline at end of file diff --git a/.gotestfmt/downloads.gotpl b/.gotestfmt/downloads.gotpl index ca1cf92f55..adc8fb5dfc 100644 --- a/.gotestfmt/downloads.gotpl +++ b/.gotestfmt/downloads.gotpl @@ -5,24 +5,26 @@ This template contains the format for a package download. {{- $settings := .Settings -}} {{- if or .Packages .Reason -}} {{- if or (not .Settings.HideSuccessfulDownloads) .Failed -}} + ::group:: {{- if .Failed -}} - ❌ + {{ "\033" }}[0;31m❌ {{- else -}} - 📥 + {{ "\033" }}[0;34m📥 {{- end -}} - {{ " " }} Dependency downloads - {{ "\n" -}} + {{ " " }}Dependency downloads + {{- "\033" }}[0m{{ "\n" -}} {{- range .Packages -}} {{- if or (not $settings.HideSuccessfulDownloads) .Failed -}} {{- " " -}} {{- if .Failed -}} - ❌ + {{ "\033" }}[0;31m❌ {{- else -}} 📦 {{- end -}} {{- " " -}} {{- .Package }} {{ .Version -}} + {{- "\033" }}[0m {{- "\n" -}} {{ with .Reason -}} {{- " " -}}{{ . -}}{{ "\n" -}} @@ -30,7 +32,8 @@ This template contains the format for a package download. {{- end -}} {{- end -}} {{- with .Reason -}} - {{- " " -}}🛑 {{ . }}{{ "\n" -}} + {{- " " -}}{{- "\033" }}[0;31m🛑 {{ . }}{{- "\033" }}[0m{{ "\n" -}} {{- end -}} + ::endgroup:: {{- end -}} -{{- end -}} +{{- end -}} \ No newline at end of file diff --git a/.gotestfmt/package.gotpl b/.gotestfmt/package.gotpl index 504949a86b..0dec673dfa 100644 --- a/.gotestfmt/package.gotpl +++ b/.gotestfmt/package.gotpl @@ -1,42 +1,55 @@ {{- /*gotype: github.com/gotesttools/gotestfmt/v2/parser.Package*/ -}} - +{{- /* +This template contains the format for an individual package. GitHub actions does not currently support nested groups so +we are creating a stylized header for each package. +*/ -}} {{- $settings := .Settings -}} {{- if and (or (not $settings.HideSuccessfulPackages) (ne .Result "PASS")) (or (not $settings.HideEmptyPackages) (ne .Result "SKIP") (ne (len .TestCases) 0)) -}} - 📦 `{{ .Name }}` + {{- if eq .Result "PASS" -}} + {{ "\033" }}[0;32m + {{- else if eq .Result "SKIP" -}} + {{ "\033" }}[0;33m + {{- else -}} + {{ "\033" }}[0;31m + {{- end -}} + 📦 {{ .Name }}{{- "\033" }}[0m {{- with .Coverage -}} - ({{ . }}% coverage) + {{- "\033" -}}[0;37m ({{ . }}% coverage){{- "\033" -}}[0m {{- end -}} {{- "\n" -}} {{- with .Reason -}} {{- " " -}}🛑 {{ . -}}{{- "\n" -}} {{- end -}} {{- with .Output -}} - ```{{- "\n" -}} {{- . -}}{{- "\n" -}} - ```{{- "\n" -}} {{- end -}} {{- with .TestCases -}} {{- range . -}} {{- if or (not $settings.HideSuccessfulTests) (ne .Result "PASS") -}} + ::group:: {{- if eq .Result "PASS" -}} - ✅ + {{ "\033" }}[0;32m✅ {{- else if eq .Result "SKIP" -}} - 🚧 + {{ "\033" }}[0;33m🚧 {{- else -}} - ❌ + {{ "\033" }}[0;31m❌ {{- end -}} - {{ " " }}`{{- .Name -}}` {{ .Duration -}} + {{ " " }}{{- .Name -}} + {{- "\033" -}}[0;37m ({{if $settings.ShowTestStatus}}{{.Result}}; {{end}}{{ .Duration -}} + {{- with .Coverage -}} + , coverage: {{ . }}% + {{- end -}}) + {{- "\033" -}}[0m {{- "\n" -}} {{- with .Output -}} - ```{{- "\n" -}} - {{- formatTestOutput . $settings -}}{{- "\n" -}} - ```{{- "\n" -}} + {{- formatTestOutput . $settings -}} + {{- "\n" -}} {{- end -}} - {{- "\n" -}} + ::endgroup::{{- "\n" -}} {{- end -}} {{- end -}} {{- end -}} {{- "\n" -}} -{{- end -}} +{{- end -}} \ No newline at end of file