Skip to content

Use custom status embed to signal workflow status to Discord #43

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

SebastiaanZ
Copy link
Member

I've added a workflow-run triggered workflow to send an enhanced status embed to our Discord webhook whenever the "Test & Lint" workflow finishes. If the Test & Lint workflow was triggered for a pull_request, it will now upload a build artifact to communicate details about the PR to the status embed workflow.

I've added a `workflow-run`-triggered workflow that sends an enhanced
status embed to our #dev-log GitHub Actions webhook. It will run
whenever the main workflow finishes and report its status.
To access information about the PR in the status embed workflow, we need
to upload an artifact whenever the forms-backend.yml workflow runs for a
`pull_request` trigger. This artifact will be downloaded in the workflow
that sends the status embed.
@SebastiaanZ SebastiaanZ added area: CI Continuous Integration and Continuous Deployment type: enhancement Changes or improvements to existing features labels Dec 16, 2020
@SebastiaanZ SebastiaanZ requested a review from jb3 as a code owner December 16, 2020 15:34
@ghost ghost added the needs 1 approval label Dec 16, 2020
@ghost ghost removed the needs 1 approval label Dec 16, 2020
if: github.event.workflow_run.event == 'pull_request'
run: |
curl -s -H "Authorization: token $GITHUB_TOKEN" ${{ github.event.workflow_run.artifacts_url }} > artifacts.json
DOWNLOAD_URL=$(cat artifacts.json | jq -r '.artifacts[] | select(.name == "pull-request-payload") | .archive_download_url')
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The cat is unnecessary. jq accepts a filename argument.

Suggested change
DOWNLOAD_URL=$(cat artifacts.json | jq -r '.artifacts[] | select(.name == "pull-request-payload") | .archive_download_url')
DOWNLOAD_URL=$(jq -r '.artifacts[] | select(.name == "pull-request-payload") | .archive_download_url' artifacts.json)

curl -s -H "Authorization: token $GITHUB_TOKEN" ${{ github.event.workflow_run.artifacts_url }} > artifacts.json
DOWNLOAD_URL=$(cat artifacts.json | jq -r '.artifacts[] | select(.name == "pull-request-payload") | .archive_download_url')
[ -z "$DOWNLOAD_URL" ] && exit 1
wget --quiet --header="Authorization: token $GITHUB_TOKEN" -O pull_request_payload.zip $DOWNLOAD_URL || exit 2
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
wget --quiet --header="Authorization: token $GITHUB_TOKEN" -O pull_request_payload.zip $DOWNLOAD_URL || exit 2
wget --quiet --header="Authorization: token $GITHUB_TOKEN" -O pull_request_payload.zip "$DOWNLOAD_URL" || exit 2

curl -s -H "Authorization: token $GITHUB_TOKEN" ${{ github.event.workflow_run.artifacts_url }} > artifacts.json
DOWNLOAD_URL=$(cat artifacts.json | jq -r '.artifacts[] | select(.name == "pull-request-payload") | .archive_download_url')
[ -z "$DOWNLOAD_URL" ] && exit 1
wget --quiet --header="Authorization: token $GITHUB_TOKEN" -O pull_request_payload.zip $DOWNLOAD_URL || exit 2
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A bit strange to use curl the first time and then switch to wget, but it doesn't really matter.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had some inconsistent results with curl while downloading the zip-file that I couldn't quite explain. I'll see if I can dig them up. wget worked reliable every time.

run: |
curl -s -H "Authorization: token $GITHUB_TOKEN" ${{ github.event.workflow_run.artifacts_url }} > artifacts.json
DOWNLOAD_URL=$(cat artifacts.json | jq -r '.artifacts[] | select(.name == "pull-request-payload") | .archive_download_url')
[ -z "$DOWNLOAD_URL" ] && exit 1
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jq returns the string "null" if a value at a key isn't found, so -z is not an adequate check. You can pass -e to jq to make it set its exit code to 1 when the result is false or null. Since -e is set for the whole script (separate from jq's -e argument), the script will exit when it encounters the exit code of 1. Therefore, this check can be removed unless you still want to check for an empty string (this would mean the API returned an existing key with an empty value).

id: prepare-artifact
if: always() && github.event_name == 'pull_request'
continue-on-error: true
run: cat $GITHUB_EVENT_PATH | jq '.pull_request' > pull_request_payload.json
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is probably an absolute path so it can be quoted. If it relies on globs to expand then it shouldn't be quoted. Setting -e to be safe.

Suggested change
run: cat $GITHUB_EVENT_PATH | jq '.pull_request' > pull_request_payload.json
run: jq -e '.pull_request' "$GITHUB_EVENT_PATH" > pull_request_payload.json


jobs:
status_embed:
if: github.event.workflow_run.conclusion != 'skipped'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is "skipped" what's set if continue on error is triggered? Is this how it tries to prevent itself from running if the artefact upload in the other workflow failed?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, if the artifact was not uploaded, it will send an embed for a non-PR workflow. This is just a safeguard as the action currently only supports success/failure/cancelled as workflow conclusions. It's not really important here, but I added it as a safe guard against a future CI redesign suddenly breaking this action unexpectedly.

# we fail silently using the `continue-on-error` option. It's
# nice if this succeeds, but if it fails for any reason, it
# does not mean that our lint-test checks failed.
- name: Prepare Pull Request Payload artifact
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- name: Prepare Pull Request Payload artifact
- name: Prepare Pull Request Payload Artifact

- name: Get Pull Request Information
id: pr_info
if: github.event.workflow_run.event == 'pull_request'
run: |
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This makes the script safer. e and pipefail I consider essentially for any non-trivial script to get some sane error handling behaviour.

Suggested change
run: |
run: |
set -euo pipefail

Also consider setting x, which will output each command as its executed for debugging purposes.

The || exit ... will no longer be necessary after commands unless you want a custom exit code.

id: pr_info
if: github.event.workflow_run.event == 'pull_request'
run: |
curl -s -H "Authorization: token $GITHUB_TOKEN" ${{ github.event.workflow_run.artifacts_url }} > artifacts.json
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Likely a good idea to add these. -S shows errors even when silent. -L follows HTTP 3xx redirects.

Suggested change
curl -s -H "Authorization: token $GITHUB_TOKEN" ${{ github.event.workflow_run.artifacts_url }} > artifacts.json
curl -sSL -H "Authorization: token $GITHUB_TOKEN" ${{ github.event.workflow_run.artifacts_url }} > artifacts.json

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area: CI Continuous Integration and Continuous Deployment s: waiting for author type: enhancement Changes or improvements to existing features
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants