Screenshot compare comment #1441
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Screenshot compare comment | |
on: | |
workflow_run: | |
workflows: | |
- CompareScreenshot | |
types: | |
- completed | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.head_ref }}-${{ github.event.workflow_run.id }} | |
cancel-in-progress: true | |
permissions: { } | |
jobs: | |
Comment-CompareScreenshot: | |
if: > | |
github.event.workflow_run.event == 'pull_request' && | |
github.event.workflow_run.conclusion == 'success' | |
timeout-minutes: 2 | |
permissions: | |
actions: read # for downloading artifacts | |
contents: write # for pushing screenshot-diff to companion branch | |
pull-requests: write # for creating a comment on pull requests | |
runs-on: ubuntu-latest | |
steps: | |
- uses: dawidd6/action-download-artifact@268677152d06ba59fcec7a7f0b5d961b6ccd7e1e # v2.28.0 | |
with: | |
name: pr | |
run_id: ${{ github.event.workflow_run.id }} | |
- id: get-pull-request-number | |
name: Get pull request number | |
shell: bash | |
run: | | |
echo "pull_request_number=$(cat NR)" >> "$GITHUB_OUTPUT" | |
- name: main checkout | |
id: checkout-main | |
uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 | |
with: | |
ref: main | |
- id: switch-companion-branch | |
env: | |
BRANCH_NAME: companion_${{ github.event.workflow_run.head_branch }} | |
run: | | |
# orphan means it will create no history branch | |
git branch -D "$BRANCH_NAME" || true | |
git checkout --orphan "$BRANCH_NAME" | |
git rm -rf . | |
- uses: dawidd6/action-download-artifact@268677152d06ba59fcec7a7f0b5d961b6ccd7e1e # v2.28.0 | |
with: | |
run_id: ${{ github.event.workflow_run.id }} | |
name: screenshot-diff | |
path: screenshot-diff | |
- id: check-if-there-are-valid-files | |
name: Check if there are valid files | |
shell: bash | |
run: | | |
# Find all the files ending with _compare.png | |
mapfile -t files_to_add < <(find . -type f -name "*_compare.*") | |
# Check for invalid file names and add only valid ones | |
exist_valid_files="false" | |
for file in "${files_to_add[@]}"; do | |
if [[ $file =~ ^[a-zA-Z0-9_./-]+$ ]]; then | |
exist_valid_files="true" | |
break | |
fi | |
done | |
echo "exist_valid_files=$exist_valid_files" >> "$GITHUB_OUTPUT" | |
- id: push-screenshot-diff | |
shell: bash | |
if: steps.check-if-there-are-valid-files.outputs.exist_valid_files == 'true' | |
env: | |
BRANCH_NAME: companion_${{ github.event.workflow_run.head_branch }} | |
run: | | |
# Find all the files ending with _compare.png | |
files_to_add=$(find . -type f -name "*_compare.*") | |
# Check for invalid file names and add only valid ones | |
for file in $files_to_add; do | |
if [[ "$file" =~ ^[a-zA-Z0-9_./-]+$ ]]; then | |
git add "$file" | |
fi | |
done | |
git config --global user.name ScreenshotBot | |
git config --global user.email 41898282+github-actions[bot]@users.noreply.github.com | |
git commit -m "Add screenshot diff" | |
git push origin HEAD:"$BRANCH_NAME" -f | |
- id: generate-diff-reports | |
name: Generate diff reports | |
if: steps.check-if-there-are-valid-files.outputs.exist_valid_files == 'true' | |
env: | |
BRANCH_NAME: companion_${{ github.event.workflow_run.head_branch }} | |
shell: bash | |
run: | | |
# Find all the files ending with _compare.png in roborazzi folder | |
files=$(find . -type f -name "*_compare.*" | grep "roborazzi/" | grep -E "^[a-zA-Z0-9_./-]+$") | |
delimiter="$(openssl rand -hex 8)" | |
{ | |
echo "reports<<${delimiter}" | |
# Create markdown table header | |
echo "Snapshot diff report" | |
echo "| File name | Image |" | |
echo "|-------|-------|" | |
} >> "$GITHUB_OUTPUT" | |
# Iterate over the files and create table rows | |
for file in $files; do | |
# Get the file name and insert newlines every 20 characters | |
fileName=$(basename "$file" | sed -r 's/(.{20})/\1<br>/g') | |
urlPart="${BRANCH_NAME//#/%23}/${file//#/%23}" | |
echo "| [$fileName](https://github.com/${{ github.repository }}/blob/$urlPart) | ![](https://github.com/${{ github.repository }}/blob/$urlPart?raw=true) |" >> "$GITHUB_OUTPUT" | |
done | |
echo "${delimiter}" >> "$GITHUB_OUTPUT" | |
- name: Find Comment | |
uses: peter-evans/find-comment@a54c31d7fa095754bfef525c0c8e5e5674c4b4b1 # v2 | |
id: fc | |
if: steps.generate-diff-reports.outputs.reports != '' | |
with: | |
issue-number: ${{ steps.get-pull-request-number.outputs.pull_request_number }} | |
comment-author: 'github-actions[bot]' | |
body-includes: Snapshot diff report | |
- name: Add or update comment on PR | |
uses: peter-evans/create-or-update-comment@23ff15729ef2fc348714a3bb66d2f655ca9066f2 # v3 | |
if: steps.generate-diff-reports.outputs.reports != '' | |
with: | |
comment-id: ${{ steps.fc.outputs.comment-id }} | |
issue-number: ${{ steps.get-pull-request-number.outputs.pull_request_number }} | |
body: ${{ steps.generate-diff-reports.outputs.reports }} | |
edit-mode: replace | |
- name: Cleanup outdated companion branches | |
run: | | |
# Find outdated companion branches with last commit date | |
git branch -r --format="%(refname:lstrip=3)" | grep companion_ | while read -r branch; do | |
last_commit_date_timestamp=$(git log -1 --format=%ct "origin/$branch") | |
now_timestamp=$(date +%s) | |
# Delete branch if it's older than 1 month | |
# if [ $((now_timestamp - last_commit_date_timestamp)) -gt 2592000 ]; then | |
# For testing purpose, delete branch if it's older than 1 second | |
echo "branch: $branch now_timestamp: $now_timestamp last_commit_date_timestamp: $last_commit_date_timestamp" | |
if [ $((now_timestamp - last_commit_date_timestamp)) -gt 1 ]; then | |
# Comment out for demonstration purpose | |
echo "Deleting $branch" | |
# git push origin --delete "$branch" | |
fi | |
done |