Skip to content

Commit

Permalink
Update infrastructure for running Python unit tests
Browse files Browse the repository at this point in the history
Arduino tooling projects use a standardized infrastructure. A centralized collection of reusable infrastructure assets
is maintained in a dedicated repository:

https://github.com/arduino/tooling-project-assets

Since the time this project's infrastructure was installed, some advancements have been made in the upstream "template"
assets. The project's infrastructure is hereby brought up to date with the state of the art upstream assets.

The significant changes:

- Migration to the use of the Task task runner to allow contributors to easily run the same operations locally as is
  done by the CI system on GitHub.
  • Loading branch information
per1234 committed Dec 20, 2023
1 parent 6e5e2cc commit 2b2d372
Show file tree
Hide file tree
Showing 6 changed files with 162 additions and 81 deletions.
78 changes: 0 additions & 78 deletions .github/workflows/libraries_report-size-deltas.yml

This file was deleted.

130 changes: 130 additions & 0 deletions .github/workflows/test-python-poetry-task.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/test-python-poetry-task.md
name: Test Python

env:
# See: https://github.com/actions/setup-python/tree/main#available-versions-of-python
PYTHON_VERSION: "3.11.6"

# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows
on:
create:
push:
paths:
- ".github/workflows/test-python-poetry-task.ya?ml"
- ".github/.?codecov.ya?ml"
- "dev/.?codecov.ya?ml"
- ".?codecov.ya?ml"
- "Taskfile.ya?ml"
- ".python-version"
- "poetry.lock"
- "pyproject.toml"
- "reportsizedeltas/tests/**"
- "**.py"
pull_request:
paths:
- ".github/workflows/test-python-poetry-task.ya?ml"
- ".github/.?codecov.ya?ml"
- "dev/.?codecov.ya?ml"
- ".?codecov.ya?ml"
- "Taskfile.ya?ml"
- ".python-version"
- "poetry.lock"
- "pyproject.toml"
- "reportsizedeltas/tests/**"
- "**.py"
schedule:
# Run periodically to catch breakage caused by external changes.
- cron: "0 12 * * WED"
workflow_dispatch:
repository_dispatch:

jobs:
run-determination:
runs-on: ubuntu-latest
outputs:
result: ${{ steps.determination.outputs.result }}
permissions: {}
steps:
- name: Determine if the rest of the workflow should run
id: determination
run: |
RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$"
# 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
test:
needs: run-determination
if: needs.run-determination.outputs.result == 'true'
runs-on: ubuntu-latest
permissions:
contents: read

env:
COVERAGE_DATA_FILENAME: coverage.xml

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Install Python
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}

- name: Install Poetry
run: pip install poetry

- name: Install Task
uses: arduino/setup-task@v1
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
version: 3.x

- name: Run tests
uses: liskin/gh-problem-matcher-wrap@v3
with:
linters: pytest
run: task python:test

- name: Display code coverage report
run: task python:coverage-report

# codecov/codecov-action only makes the conversion if the `coverage` package is installed in the global runner
# environment
- name: Convert code coverage report to format required by Codecov
run: |
poetry run \
coverage xml \
-o "${{ github.workspace }}/${{ env.COVERAGE_DATA_FILENAME }}"
# A token is used to avoid intermittent spurious job failures caused by rate limiting.
- name: Set up Codecov upload token
run: |
if [[ "${{ github.repository }}" == "arduino/compile-sketches" ]]; then
# In order to avoid uploads of data from forks, only use the token for runs in the parent repo.
# Token is intentionally exposed.
# See: https://community.codecov.com/t/upload-issues-unable-to-locate-build-via-github-actions-api/3954
CODECOV_TOKEN="3889efcb-4ed3-4d07-980a-99a3896bd9b8"
else
# codecov/codecov-action does unauthenticated upload if empty string is passed via the `token` input.
CODECOV_TOKEN=""
fi
echo "CODECOV_TOKEN=$CODECOV_TOKEN" >> "$GITHUB_ENV"
- name: Upload coverage report to Codecov
uses: codecov/codecov-action@v3
with:
fail_ci_if_error: true
file: ${{ env.COVERAGE_DATA_FILENAME }}
token: ${{ env.CODECOV_TOKEN }}
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
/node_modules/
__pycache__/
.coverage
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
[![Check Poetry status](https://github.com/arduino/report-size-deltas/actions/workflows/check-poetry-task.yml/badge.svg)](https://github.com/arduino/report-size-deltas/actions/workflows/check-poetry-task.yml)
[![Check Python status](https://github.com/arduino/report-size-deltas/actions/workflows/check-python-task.yml/badge.svg)](https://github.com/arduino/report-size-deltas/actions/workflows/check-python-task.yml)
[![Check Taskfiles status](https://github.com/arduino/report-size-deltas/actions/workflows/check-taskfiles.yml/badge.svg)](https://github.com/arduino/report-size-deltas/actions/workflows/check-taskfiles.yml)
[![Tests](https://github.com/arduino/report-size-deltas/workflows/libraries/report-size-deltas%20workflow/badge.svg)](https://github.com/arduino/report-size-deltas/actions?workflow=libraries/report-size-deltas+workflow)
[![Integration Tests](https://github.com/arduino/report-size-deltas/actions/workflows/test-integration.yml/badge.svg)](https://github.com/arduino/report-size-deltas/actions/workflows/test-integration.yml)
[![Spell Check status](https://github.com/arduino/report-size-deltas/actions/workflows/spell-check-task.yml/badge.svg)](https://github.com/arduino/report-size-deltas/actions/workflows/spell-check-task.yml)
[![Sync Labels status](https://github.com/arduino/report-size-deltas/actions/workflows/sync-labels-npm.yml/badge.svg)](https://github.com/arduino/report-size-deltas/actions/workflows/sync-labels-npm.yml)
[![Test Python status](https://github.com/arduino/report-size-deltas/actions/workflows/test-python-poetry-task.yml/badge.svg)](https://github.com/arduino/report-size-deltas/actions/workflows/test-python-poetry-task.yml)
[![codecov](https://codecov.io/gh/arduino/report-size-deltas/branch/master/graph/badge.svg)](https://codecov.io/gh/arduino/report-size-deltas)

This action comments on the pull request with a report on the resulting change in memory usage of the [Arduino](https://www.arduino.cc/) sketches compiled by the [`arduino/compile-sketches`](https://github.com/arduino/compile-sketches) action. This should be run from a [scheduled workflow](https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#onschedule).
Expand Down
25 changes: 25 additions & 0 deletions Taskfile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
version: "3"

vars:
PYTHON_PROJECT_PATH: reportsizedeltas
# Last version of ajv-cli with support for the JSON schema "Draft 4" specification
SCHEMA_DRAFT_4_AJV_CLI_VERSION: 3.3.0

Expand All @@ -14,6 +15,7 @@ tasks:
- task: npm:validate
- task: poetry:validate
- task: python:lint
- task: python:test

fix:
desc: Make automated corrections to the project's files
Expand Down Expand Up @@ -139,6 +141,15 @@ tasks:
check \
--lock
python:coverage-report:
desc: Show code coverage report
deps:
- task: poetry:install-deps
cmds:
- |
poetry run \
coverage report
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-python-task/Taskfile.yml
python:format:
desc: Format Python files
Expand All @@ -155,6 +166,20 @@ tasks:
cmds:
- poetry run flake8 --show-source

# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/test-python-poetry-task/Taskfile.yml
python:test:
desc: Run Python tests
deps:
- task: poetry:install-deps
cmds:
- |
export PYTHONPATH="${PWD}/{{.PYTHON_PROJECT_PATH}}"
poetry run \
coverage run \
--source="{{.PYTHON_PROJECT_PATH}}" \
--module \
pytest "{{.PYTHON_PROJECT_PATH}}/tests"
# 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:
Expand Down
6 changes: 4 additions & 2 deletions reportsizedeltas/tests/pytest.ini
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/test-python/pytest.ini
[pytest]
filterwarnings =
error
ignore::DeprecationWarning
ignore::ResourceWarning

markers =
slow: marks tests as slow (deselect with '-m "not slow"')
# --capture=no - disable per-test capture
# --tb=long sets the length of the traceback in case of failures
addopts = --capture=no --tb=long --verbose

0 comments on commit 2b2d372

Please sign in to comment.