From 7a547d79c3cbd345999f128215d856e96a45ac85 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/install-briefcase/action.yml | 51 +++++++++--------- .github/actions/pr-body-parse/action.yml | 37 ++++++++++++++ 3 files changed, 83 insertions(+), 59 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 7ba5a2c7..74098929 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 + printf -- "repo=--template '%q'\n" "${REPO}" | tee -a ${GITHUB_OUTPUT} fi - if [ -z "${TEMPLATE_REF}" ]; then - TEMPLATE_REF="${{ inputs.briefcase-template-branch }}" + if [ -n "${REF}" ]; then + printf -- "ref=--template-branch '%q'\n" "${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/install-briefcase/action.yml b/.github/actions/install-briefcase/action.yml index 8de59741..84ae4d28 100644 --- a/.github/actions/install-briefcase/action.yml +++ b/.github/actions/install-briefcase/action.yml @@ -32,38 +32,33 @@ outputs: runs: using: composite steps: - - name: Use Specified Briefcase Version - id: briefcase-override - env: - GITHUB_TOKEN: ${{ github.token }} + - name: Check for Briefcase Repo Override + id: briefcase-repo-override + uses: ./beeware-.github/.github/actions/pr-body-parse + with: + key-regex: 'BRIEFCASE[-_]*REPO' + testing-pr-body: ${{ inputs.testing-pr-body }} + + - name: Check for Briefcase Ref Override + id: briefcase-ref-override + uses: ./beeware-.github/.github/actions/pr-body-parse + with: + key-regex: 'BRIEFCASE[-_]*REF' + testing-pr-body: ${{ inputs.testing-pr-body }} + + - name: Declare Briefcase Source + id: briefcase shell: bash run: | - # Check Body of PR for Briefcase version 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}" - - BRIEFCASE_REPO=$(printf "%s" "${PR_BODY}" | perl -wlne '/BRIEFCASE[-_]*REPO:\s*\K\S+/i and print $&') - BRIEFCASE_REF=$(printf "%s" "${PR_BODY}" | perl -wlne '/BRIEFCASE[-_]*REF:\s*\K\S+/i and print $&') - - # If a version is not in the PR, use inputs specified in CI workflow - if [ -z "${BRIEFCASE_REPO}" ]; then - BRIEFCASE_REPO="${{ inputs.briefcase-url }}" - fi - if [ -z "${BRIEFCASE_REF}" ]; then - BRIEFCASE_REF="${{ inputs.briefcase-override-version }}" - fi + REPO="${{ steps.briefcase-repo-override.outputs.extracted-value || inputs.briefcase-url }}" + REF="${{ steps.briefcase-ref-override.outputs.extracted-value || inputs.briefcase-override-version }}" - # Expose repo and version via outputs - echo "repo=${BRIEFCASE_REPO}" | tee -a ${GITHUB_OUTPUT} - echo "ref=${BRIEFCASE_REF}" | tee -a ${GITHUB_OUTPUT} + printf -- "repo=%s\n" "${REPO}" | tee -a ${GITHUB_OUTPUT} + printf -- "ref=%s\n" "${REF}" | tee -a ${GITHUB_OUTPUT} - name: Derive Target Briefcase Version id: briefcase-derived - if: steps.briefcase-override.outputs.ref == '' + if: steps.briefcase.outputs.ref == '' shell: bash run: | # Branch or tag that triggered the workflow. @@ -136,8 +131,8 @@ runs: id: install shell: bash run: | - REPO="${{ steps.briefcase-override.outputs.repo || inputs.briefcase-url }}" - REF="${{ steps.briefcase-override.outputs.ref || steps.briefcase-derived.outputs.version }}" + REPO="${{ steps.briefcase.outputs.repo }}" + REF="${{ steps.briefcase.outputs.ref || steps.briefcase-derived.outputs.version }}" echo "Installing ${REPO}@${REF}" python -m pip install \ diff --git a/.github/actions/pr-body-parse/action.yml b/.github/actions/pr-body-parse/action.yml new file mode 100644 index 00000000..1b0788ea --- /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}