mirror of
https://github.com/bevyengine/bevy
synced 2024-12-29 22:43:14 +00:00
ec39f6b904
# Objective Running Github Actions on forks helps users to reduce the amount of CI errors they get before submitting a PR. However, due to how workflows are set up on the Bevy repository, this can result in errors occurring for jobs that may not be related to their PR - in this case, uploading screenshots to Pixel Eagle. ## Solution The Pixel Eagle workflow is skipped if we aren't running on the Bevy repository. If we are on the Bevy repository, or the user has set it to run elsewhere, we check if the `PIXELEAGLE_TOKEN` secret is set. If it isn't, we skip uploading screenshots to Pixel Eagle. * Artifacts still continue to generate, in case the user needs them. * In the event that the Pixel Eagle workflow runs, but the `PIXELEAGLE_TOKEN` secret isn't set, we generate a step summary that notifies the user of why it was skipped. https://github.com/LikeLakers2/bevy/actions/runs/12173329006/attempts/1#summary-33953502068 for an example. ## Testing Lots. And lots. Of trying to get Github Actions to work with me.
109 lines
4.3 KiB
YAML
109 lines
4.3 KiB
YAML
name: Send Screenshots to Pixel Eagle
|
|
|
|
on:
|
|
workflow_call:
|
|
inputs:
|
|
artifact:
|
|
required: true
|
|
type: string
|
|
commit:
|
|
required: true
|
|
type: string
|
|
branch:
|
|
required: true
|
|
type: string
|
|
os:
|
|
required: true
|
|
type: string
|
|
|
|
env:
|
|
# Unfortunately, we can't check secrets in `if:` conditionals. However, Github's own documentation
|
|
# suggests a workaround: Putting the secret in an environment variable, and checking that instead.
|
|
PIXELEAGLE_TOKEN_EXISTS: ${{ secrets.PIXELEAGLE_TOKEN != '' }}
|
|
|
|
jobs:
|
|
send-to-pixel-eagle:
|
|
name: Send screenshots to Pixel Eagle
|
|
runs-on: ubuntu-24.04
|
|
# Pixel Eagle is irrelevant for most forks, even of those that allow workflows to run. Thus, we
|
|
# disable this job for any forks. Any forks where Pixel Eagle is relevant can comment out the
|
|
# `if:` conditional below.
|
|
if: ${{ github.repository == 'bevyengine/bevy' }}
|
|
steps:
|
|
- name: Notify user on non-existent token
|
|
if: ${{ ! fromJSON(env.PIXELEAGLE_TOKEN_EXISTS) }}
|
|
run: |
|
|
echo "The PIXELEAGLE_TOKEN secret does not exist, so uploading screenshots to Pixel Eagle was skipped." >> $GITHUB_STEP_SUMMARY
|
|
|
|
- name: Download artifact
|
|
if: ${{ fromJSON(env.PIXELEAGLE_TOKEN_EXISTS) }}
|
|
uses: actions/download-artifact@v4
|
|
with:
|
|
pattern: ${{ inputs.artifact }}
|
|
|
|
- name: Send to Pixel Eagle
|
|
if: ${{ fromJSON(env.PIXELEAGLE_TOKEN_EXISTS) }}
|
|
env:
|
|
project: B04F67C0-C054-4A6F-92EC-F599FEC2FD1D
|
|
run: |
|
|
# Create a new run with its associated metadata
|
|
metadata='{"os":"${{ inputs.os }}", "commit": "${{ inputs.commit }}", "branch": "${{ inputs.branch }}"}'
|
|
run=`curl https://pixel-eagle.vleue.com/$project/runs --json "$metadata" --oauth2-bearer ${{ secrets.PIXELEAGLE_TOKEN }} | jq '.id'`
|
|
|
|
SAVEIFS=$IFS
|
|
|
|
cd ${{ inputs.artifact }}
|
|
|
|
# Read the hashes of the screenshot for fast comparison when they are equal
|
|
IFS=$'\n'
|
|
# Build a json array of screenshots and their hashes
|
|
hashes='[';
|
|
for screenshot in $(find . -type f -name "*.png");
|
|
do
|
|
name=${screenshot:14}
|
|
echo $name
|
|
hash=`shasum -a 256 $screenshot | awk '{print $1}'`
|
|
hashes="$hashes [\"$name\",\"$hash\"],"
|
|
done
|
|
hashes=`echo $hashes | rev | cut -c 2- | rev`
|
|
hashes="$hashes]"
|
|
|
|
IFS=$SAVEIFS
|
|
|
|
# Upload screenshots with unknown hashes
|
|
curl https://pixel-eagle.vleue.com/$project/runs/$run/hashes --json "$hashes" --oauth2-bearer ${{ secrets.PIXELEAGLE_TOKEN }} | jq '.[]|[.name] | @tsv' |
|
|
while IFS=$'\t' read -r name; do
|
|
name=`echo $name | tr -d '"'`
|
|
echo "Uploading $name"
|
|
curl https://pixel-eagle.vleue.com/$project/runs/$run/screenshots -F "data=@./screenshots-$name" -F "screenshot=$name" --oauth2-bearer ${{ secrets.PIXELEAGLE_TOKEN }}
|
|
echo
|
|
done
|
|
|
|
IFS=$SAVEIFS
|
|
|
|
cd ..
|
|
|
|
# Trigger comparison with the main branch on the same os
|
|
curl https://pixel-eagle.vleue.com/$project/runs/$run/compare/auto --json '{"os":"<equal>", "branch": "main"}' --oauth2-bearer ${{ secrets.PIXELEAGLE_TOKEN }} > pixeleagle.json
|
|
|
|
# Log results
|
|
compared_with=`cat pixeleagle.json | jq '.to'`
|
|
|
|
status=0
|
|
missing=`cat pixeleagle.json | jq '.missing | length'`
|
|
if [ ! $missing -eq 0 ]; then
|
|
echo "There are $missing missing screenshots"
|
|
echo "::warning title=$missing missing screenshots on ${{ inputs.os }}::https://pixel-eagle.vleue.com/$project/runs/$run/compare/$compared_with"
|
|
status=1
|
|
fi
|
|
|
|
diff=`cat pixeleagle.json | jq '.diff | length'`
|
|
if [ ! $diff -eq 0 ]; then
|
|
echo "There are $diff screenshots with a difference"
|
|
echo "::warning title=$diff different screenshots on ${{ inputs.os }}::https://pixel-eagle.vleue.com/$project/runs/$run/compare/$compared_with"
|
|
status=1
|
|
fi
|
|
|
|
echo "created run $run: https://pixel-eagle.vleue.com/$project/runs/$run/compare/$compared_with"
|
|
|
|
exit $status
|