theme previews: use external action (#7987)

This PR changes the current theme preview workflow to use an external
function that executes the same process, but has two advantages:

1. It runs using `pull_request_target`, meaning that PRs created from
   forks will get previews too.
2. The action can be shared with other repos with a similar structure to
   get Playground previews as well, such as the [WordPress Community Themes](https://github.com/WordPress/community-themes) repo.
This commit is contained in:
Vicente Canales 2024-08-02 00:43:22 -04:00 committed by GitHub
parent c15bb26803
commit df6ea645eb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -7,105 +7,17 @@ permissions:
pull-requests: write pull-requests: write
jobs: jobs:
check-for-changes-to-themes: preview-theme-changes:
runs-on: ubuntu-latest runs-on: ubuntu-latest
outputs:
HAS_THEME_CHANGES: ${{ steps.check-for-changes.outputs.HAS_THEME_CHANGES }}
CHANGED_THEMES: ${{ steps.check-for-changes.outputs.CHANGED_THEMES }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v2
with: with:
ref: ${{ github.event.pull_request.head.sha }} ref: ${{ github.event.pull_request.head.sha }}
- name: Retrieved Theme Changes - name: Preview Theme Changes
id: check-for-changes uses: vcanales/action-wp-playground-pr-preview@trunk
run: |
# Retrieve list of all changed files
git fetch origin
changed_files=$(git diff --name-only HEAD origin/trunk)
# Loop through changed files and identify parent directories
declare -A unique_dirs
for file in $changed_files; do
dir_name=$(dirname "$file")
while [[ "$dir_name" != "." ]]; do
if [[ -f "$dir_name/style.css" ]]; then
# Get theme name from style.css
theme_name=$(grep -m 1 "Theme Name:" "$dir_name/style.css" | sed 's/Theme Name: //')
parent_theme=$(grep -m 1 "Template:" "$dir_name/style.css" | sed 's/Template: //')
# Append parent theme to the theme name if it exists
[ -n "$parent_theme" ] && theme_name="${theme_name}_childof_${parent_theme}"
# Store theme name and directory in associative array
unique_dirs["$theme_name"]=$dir_name
break
fi
dir_name=$(dirname "$dir_name")
done
done
# Check if themes have changed
if [[ ${#unique_dirs[@]} -eq 0 ]]; then
echo "No theme changes detected"
echo "HAS_THEME_CHANGES=false" >> $GITHUB_OUTPUT
exit 0
fi
# Output list of theme slugs with changes
echo "HAS_THEME_CHANGES=true" >> $GITHUB_OUTPUT
# Serialize associative array of theme dirs to a string
declare -A CHANGED_THEMES
for theme in "${!unique_dirs[@]}"; do
# Append each entry as key:value,
CHANGED_THEMES+="$theme:${unique_dirs[$theme]},"
done
# Remove the last comma for correct JSON formatting
CHANGED_THEMES=${CHANGED_THEMES%,}
echo "CHANGED_THEMES=$CHANGED_THEMES" >> $GITHUB_OUTPUT
echo "Theme directories with changes: $CHANGED_THEMES"
handle-pr-comment:
runs-on: ubuntu-latest
needs: check-for-changes-to-themes
steps:
- name: Checkout create-preview-links script from trunk
uses: actions/checkout@v3
with:
repository: Automattic/themes
sparse-checkout: .github/scripts/create-preview-links
ref: trunk
- name: Add Preview Links comment
id: comment-on-pr
if: ${{ needs.check-for-changes-to-themes.outputs.HAS_THEME_CHANGES == 'true' }}
uses: actions/github-script@v7
env:
CHANGED_THEMES: ${{ needs.check-for-changes-to-themes.outputs.CHANGED_THEMES }}
with: with:
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
script: | ref: ${{ github.event.pull_request.head.sha }}
const createPreviewLinks = require('.github/scripts/create-preview-links'); base-branch: trunk
createPreviewLinks(github, context, process.env.CHANGED_THEMES);
- name: Remove comment if no changes are detected
if: ${{ needs.check-for-changes-to-themes.outputs.HAS_THEME_CHANGES == 'false' }}
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const { data: comments } = await github.rest.issues.listComments({
issue_number: context.payload.pull_request.number,
owner: context.repo.owner,
repo: context.repo.repo
});
const existingComment = comments.find(comment => comment.user.login === 'github-actions[bot]' && comment.body.startsWith('### Preview changes'));
if (existingComment) {
await github.rest.issues.deleteComment({
comment_id: existingComment.id,
owner: context.repo.owner,
repo: context.repo.repo
});
}