Skip to content

Commit

Permalink
Refactor PR Body regexing into independent GH Action
Browse files Browse the repository at this point in the history
  • Loading branch information
rmartin16 committed Aug 9, 2024
1 parent c1486b6 commit 32ae845
Show file tree
Hide file tree
Showing 4 changed files with 159 additions and 59 deletions.
70 changes: 39 additions & 31 deletions .github/actions/app-create/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,50 +22,56 @@ outputs:
project-path:
value: ${{ steps.create.outputs.path }}
description: "The file path to the root of the created project."
briefcase-template-repo:
value: ${{ steps.template.outputs.repo }}
description: "Template repo used to create app."
briefcase-template-ref:
value: ${{ steps.template.outputs.ref }}
description: "Template ref used to create app."


runs:
using: composite
steps:
- name: Briefcase Template Override
id: template-override
env:
GITHUB_TOKEN: ${{ github.token }}
- name: Checkout beeware/.github
uses: actions/[email protected]
with:
path: beeware-app-create-.github

- name: Check for Briefcase Template Repo Override
id: template-repo-override
uses: ./beeware-app-create-.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-app-create-.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}"
REPO="${{ steps.template-repo-override.outputs.extracted-value || inputs.briefcase-template-source }}"
REF="${{ steps.template-ref-override.outputs.extracted-value || inputs.briefcase-template-branch }}"
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 $&')
# 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=%q\n" "${REPO}" | tee -a ${GITHUB_OUTPUT}
printf -- "repo-cmdline=--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=%q\n" "${REF}" | tee -a ${GITHUB_OUTPUT}
printf -- "ref-cmdline=--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 ;;
Expand All @@ -89,7 +95,9 @@ runs:
rm -rf "${APP_DIR}"
# Roll out the project
briefcase new --no-input ${TEMPLATE} ${TEMPLATE_BRANCH} \
briefcase new --no-input \
${{ steps.template.outputs.repo-cmdline }} \
${{ steps.template.outputs.ref-cmdline }} \
-Q "formal_name=${APP_NAME}" \
-Q "app_name=${APP_DIR}" \
-Q "bootstrap=${BOOTSTRAP}"
Expand Down
56 changes: 28 additions & 28 deletions .github/actions/install-briefcase/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,38 +32,38 @@ outputs:
runs:
using: composite
steps:
- name: Use Specified Briefcase Version
id: briefcase-override
env:
GITHUB_TOKEN: ${{ github.token }}
- name: Checkout beeware/.github
uses: actions/[email protected]
with:
path: beeware-install-briefcase-.github

- name: Check for Briefcase Repo Override
id: briefcase-repo-override
uses: ./beeware-install-briefcase-.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-install-briefcase-.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.
Expand Down Expand Up @@ -136,8 +136,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 \
Expand Down
37 changes: 37 additions & 0 deletions .github/actions/pr-body-parse/action.yml
Original file line number Diff line number Diff line change
@@ -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 an output
printf -- "extracted-value=%s\n" "${EXTRACTED_VALUE}" | tee -a ${GITHUB_OUTPUT}
55 changes: 55 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,61 @@ jobs:
exit 1
fi
test-app-create:
name: App Create
needs: pre-commit
runs-on: ubuntu-latest
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
test-case: [ "default", "override", "pr-body" ]
include:
- expected-repo: ""
expected-ref: ""
override-repo: ""
override-ref: ""
pr-body: ""
- test-case: "override"
override-repo: "https://github.com/beeware/briefcase-template"
override-ref: "main"
expected-repo: "https://github.com/beeware/briefcase-template"
expected-ref: "main"
- test-case: "pr-body"
pr-body: "sadf asdf Briefcase-Template-Repo: https://github.com/beeware/briefcase-template foo BRIEFCASE-template-REF: main"
expected-repo: "https://github.com/beeware/briefcase-template"
expected-ref: "main"
steps:
- name: Checkout beeware/.github
uses: actions/[email protected]

- name: Set up Python
uses: actions/[email protected]
with:
python-version: 3.X
cache: pip
cache-dependency-path: |
**/setup.cfg
**/pyproject.toml
.pre-commit-config.yaml
- name: Install Briefcase
uses: ./.github/actions/install-briefcase

- name: Create Briefcase App
id: app
uses: ./.github/actions/app-create
with:
briefcase-template-source: ${{ matrix.override-repo }}
briefcase-template-branch: ${{ matrix.override-ref }}
testing-pr-body: ${{ matrix.pr-body }}

- name: Verify App
shell: python
run: |
assert "${{ steps.app.outputs.briefcase-template-repo }}" == "${{ matrix.expected-repo }}"
assert "${{ steps.app.outputs.briefcase-template-ref }}" == "${{ matrix.expected-ref }}"
test-pre-commit-run:
name: Pre-commit
needs: pre-commit
Expand Down

0 comments on commit 32ae845

Please sign in to comment.