From d70b760a9a0c0fb2ea3c7a94b81ffec0328ced68 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 31 May 2025 19:51:14 -0700 Subject: [PATCH] Add infrastructure for checking Poetry configuration files The project's Python package dependencies are managed using the "Poetry" tool. Tasks and a GitHub Actions workflow are added to maintain and check for problems in the Poetry configuration files. The tasks provide the following operations: * Check for problems with the data structure of the `pyproject.toml` Python project file * Update the `poetry.lock` file as may be required following manual modifications to `pyproject.toml`, or update of the "Poetry" application These tasks are executed by the GitHub Actions workflow on any push or pull request that modifies relevant files, and periodically to check for breakage caused by external changes. --- .github/workflows/check-poetry-task.yml | 109 ++++++++++++++++++++++++ README.md | 1 + Taskfile.yml | 18 ++++ 3 files changed, 128 insertions(+) create mode 100644 .github/workflows/check-poetry-task.yml diff --git a/.github/workflows/check-poetry-task.yml b/.github/workflows/check-poetry-task.yml new file mode 100644 index 0000000..f963d61 --- /dev/null +++ b/.github/workflows/check-poetry-task.yml @@ -0,0 +1,109 @@ +name: Check Poetry + +on: + create: + push: + paths: + - ".github/workflows/check-poetry-task.ya?ml" + - "poetry.lock" + - "pyproject.toml" + - "Taskfile.ya?ml" + pull_request: + paths: + - ".github/workflows/check-poetry-task.ya?ml" + - "poetry.lock" + - "pyproject.toml" + - "Taskfile.ya?ml" + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 11 * * THU" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="^refs/heads/((v[0-9]+)|([0-9]+\.[0-9]+\.x))$" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + validate: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Python + uses: actions/setup-python@v5 + with: + python-version-file: pyproject.toml + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Validate pyproject.toml + run: | + task \ + --silent \ + poetry:validate + + check-sync: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Python + uses: actions/setup-python@v5 + with: + python-version-file: pyproject.toml + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Sync lockfile + run: | + task \ + --silent \ + poetry:sync + + - name: Check if lockfile was out of sync + run: | + git diff \ + --color \ + --exit-code \ + poetry.lock diff --git a/README.md b/README.md index 06bd938..733a26e 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ [![Check Prettier Formatting status](https://github.com/arduino/arduinoOTA/actions/workflows/check-prettier-formatting-task.yml/badge.svg)](https://github.com/arduino/arduinoOTA/actions/workflows/check-prettier-formatting-task.yml) [![Spell Check status](https://github.com/arduino/arduinoOTA/actions/workflows/spell-check-task.yml/badge.svg)](https://github.com/arduino/arduinoOTA/actions/workflows/spell-check-task.yml) [![Check Markdown status](https://github.com/arduino/arduinoOTA/actions/workflows/check-markdown-task.yml/badge.svg)](https://github.com/arduino/arduinoOTA/actions/workflows/check-markdown-task.yml) +[![Check Poetry status](https://github.com/arduino/arduinoOTA/actions/workflows/check-poetry-task.yml/badge.svg)](https://github.com/arduino/arduinoOTA/actions/workflows/check-poetry-task.yml) [![Check Taskfiles status](https://github.com/arduino/arduinoOTA/actions/workflows/check-taskfiles.yml/badge.svg)](https://github.com/arduino/arduinoOTA/actions/workflows/check-taskfiles.yml) [![Check Workflows status](https://github.com/arduino/arduinoOTA/actions/workflows/check-workflows-task.yml/badge.svg)](https://github.com/arduino/arduinoOTA/actions/workflows/check-workflows-task.yml) [![Check YAML status](https://github.com/arduino/arduinoOTA/actions/workflows/check-yaml-task.yml/badge.svg)](https://github.com/arduino/arduinoOTA/actions/workflows/check-yaml-task.yml) diff --git a/Taskfile.yml b/Taskfile.yml index a214eee..882c68b 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -385,6 +385,24 @@ tasks: poetry install \ {{if .POETRY_GROUPS}} --only {{.POETRY_GROUPS}} {{end}} + poetry:sync: + desc: Sync poetry.lock + deps: + - task: poetry:install + cmds: + - | + poetry lock \ + --no-cache + + poetry:validate: + desc: Validate pyproject.toml + deps: + - task: poetry:install + cmds: + - | + poetry check \ + --lock + # Make a temporary file named according to the passed TEMPLATE variable and print the path passed to stdout # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/windows-task/Taskfile.yml utility:mktemp-file: