From cbcdd459023a33f7eeb96dfc9b407e63a7bca102 Mon Sep 17 00:00:00 2001 From: Russell Martin Date: Fri, 9 Aug 2024 15:57:14 -0400 Subject: [PATCH] Refactor PR Body regexing into independent GH Action --- .github/actions/app-create/action.yml | 54 ++++++++++-------------- .github/actions/pr-body-parse/action.yml | 37 ++++++++++++++++ 2 files changed, 60 insertions(+), 31 deletions(-) create mode 100644 .github/actions/pr-body-parse/action.yml diff --git a/.github/actions/app-create/action.yml b/.github/actions/app-create/action.yml index 7ba5a2c..1601483 100644 --- a/.github/actions/app-create/action.yml +++ b/.github/actions/app-create/action.yml @@ -26,46 +26,38 @@ outputs: runs: using: composite steps: - - name: Briefcase Template Override - id: template-override - env: - GITHUB_TOKEN: ${{ github.token }} + - name: Check for Briefcase Template Repo Override + id: template-repo-override + uses: ./beeware-.github/.github/actions/pr-body-parse + with: + key-regex: 'BRIEFCASE[-_]*TEMPLATE[-_]*REPO' + testing-pr-body: ${{ inputs.testing-pr-body }} + + - name: Check for Briefcase Template Ref Override + id: template-ref-override + uses: ./beeware-.github/.github/actions/pr-body-parse + with: + key-regex: 'BRIEFCASE[-_]*TEMPLATE[-_]*REF' + testing-pr-body: ${{ inputs.testing-pr-body }} + + - name: Declare Briefcase Template + id: template shell: bash run: | - # Check Body of PR for template to use - # (only PRs will have a value for github.event.pull_request.number) - PR_BODY="${{ inputs.testing-pr-body }}" - if [[ -z "${PR_BODY}" && -n "${{ github.event.pull_request.number }}" ]]; then - PR_BODY=$(gh api repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }} --jq '.body') - fi - printf "::group::Retrieved PR Body\n%s\n::endgroup::\n" "${PR_BODY}" - - TEMPLATE_REPO=$(printf "%s" "${PR_BODY}" | perl -wlne '/BRIEFCASE[-_]*TEMPLATE[-_]*REPO:\s*\K\S+/i and print $&') - TEMPLATE_REF=$(printf "%s" "${PR_BODY}" | perl -wlne '/BRIEFCASE[-_]*TEMPLATE[-_]*REF:\s*\K\S+/i and print $&') + REPO="${{ steps.template-repo-override.outputs.extracted-value || inputs.briefcase-template-source }}" + REF="${{ steps.template-ref-override.outputs.extracted-value || inputs.briefcase-template-branch }}" - # If a template is not in the PR, use inputs specified in CI workflow - if [ -z "${TEMPLATE_REPO}" ]; then - TEMPLATE_REPO="${{ inputs.briefcase-template-source }}" + if [ -n "${REPO}" ]; then + echo "repo=$(printf -- "--template '%q'" "${REPO}")" | tee -a ${GITHUB_OUTPUT} fi - if [ -z "${TEMPLATE_REF}" ]; then - TEMPLATE_REF="${{ inputs.briefcase-template-branch }}" + if [ -n "${REF}" ]; then + echo "ref=$(printf -- "--template-branch '%q'" "${REF}")" | tee -a ${GITHUB_OUTPUT} fi - # Expose template repo and branch via outputs - echo "repo=${TEMPLATE_REPO}" | tee -a ${GITHUB_OUTPUT} - echo "ref=${TEMPLATE_REF}" | tee -a ${GITHUB_OUTPUT} - - name: Create Briefcase Project id: create shell: bash run: | - if [[ "${{ steps.template-override.outputs.repo }}" != "" ]]; then - TEMPLATE=$(printf -- "--template %q" "${{ steps.template-override.outputs.repo }}") - fi - if [[ "${{ steps.template-override.outputs.ref }}" != "" ]]; then - TEMPLATE_BRANCH=$(printf -- "--template-branch %q" "${{ steps.template-override.outputs.ref }}") - fi - # Map GUI toolkit through case insensitivity case "$(tr '[:upper:]' '[:lower:]' <<< "${{ inputs.framework }}")" in toga ) BOOTSTRAP=Toga ;; @@ -89,7 +81,7 @@ runs: rm -rf "${APP_DIR}" # Roll out the project - briefcase new --no-input ${TEMPLATE} ${TEMPLATE_BRANCH} \ + briefcase new --no-input ${{ steps.template.outputs.repo }} ${{ steps.template.outputs.ref }} \ -Q "formal_name=${APP_NAME}" \ -Q "app_name=${APP_DIR}" \ -Q "bootstrap=${BOOTSTRAP}" diff --git a/.github/actions/pr-body-parse/action.yml b/.github/actions/pr-body-parse/action.yml new file mode 100644 index 0000000..1b0788e --- /dev/null +++ b/.github/actions/pr-body-parse/action.yml @@ -0,0 +1,37 @@ +name: PR Body Parse +description: Parse a value from the body of the relevant PR for a specific key + +inputs: + key-regex: + description: "The regex for the key identifying the value to return, e.g. BRIEFCASE[-_]*REPO" + required: true + testing-pr-body: + description: "Override value for body of PR; only for testing." + required: false + +outputs: + extracted-value: + value: ${{ steps.parse.outputs.extracted-value }} + description: "The value extracted from the PR's body for the specified key." + +runs: + using: composite + steps: + - name: Parse PR Body for ${{ inputs.key-regex }} + id: parse + env: + GITHUB_TOKEN: ${{ github.token }} + shell: bash + run: | + # Retrieve PR Body (only PRs will have a value for github.event.pull_request.number) + PR_BODY="${{ inputs.testing-pr-body }}" + if [[ -z "${PR_BODY}" && -n "${{ github.event.pull_request.number }}" ]]; then + PR_BODY=$(gh api repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }} --jq '.body') + fi + printf "::group::Retrieved PR Body\n%s\n::endgroup::\n" "${PR_BODY}" + + # Parse value with given regex + EXTRACTED_VALUE=$(printf "%s" "${PR_BODY}" | perl -wlne '/${{ inputs.key-regex }}:\s*\K\S+/i and print $&') + + # Expose value as output + echo "extracted-value=${EXTRACTED_VALUE}" | tee -a ${GITHUB_OUTPUT}