Updating r6 from main@v6.0.0
15
doc/Action/Actions.rst
Normal file
@@ -0,0 +1,15 @@
|
||||
.. grid:: 2
|
||||
|
||||
.. grid-item::
|
||||
:columns: 2
|
||||
|
||||
.. rubric:: Post-Processing
|
||||
|
||||
* :ref:`ACTION/WithPostStep`
|
||||
|
||||
.. grid-item::
|
||||
:columns: 2
|
||||
|
||||
.. rubric:: Deprecated
|
||||
|
||||
* :ref:`ACTION/Releaser`
|
||||
@@ -1,8 +1,17 @@
|
||||
.. _ACTION/Releaser:
|
||||
.. index::
|
||||
single: GitHub Action; Releaser
|
||||
|
||||
Releaser
|
||||
########
|
||||
|
||||
.. attention::
|
||||
|
||||
The **Releaser** action is deprecated.
|
||||
|
||||
Use the new GitHub Action workflow template :ref:`JOBTMPL/PublishReleaseNotes` as a replacement with lots of
|
||||
additional features.
|
||||
|
||||
**Releaser** is a Docker GitHub Action written in Python.
|
||||
|
||||
**Releaser** allows to keep a GitHub Release of type pre-release and its artifacts up to date with latest builds.
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
.. _ACTION/WithPostStep:
|
||||
.. index::
|
||||
single: GitHub Action; WithPostStep
|
||||
|
||||
with-post-step
|
||||
##############
|
||||
|
||||
@@ -1,7 +1,31 @@
|
||||
.. _ACTION:
|
||||
.. index::
|
||||
single: GitHub Action
|
||||
|
||||
Overview
|
||||
########
|
||||
|
||||
The following 2 actions are provided by **Actions**:
|
||||
|
||||
* :ref:`ACTION/Releaser`
|
||||
* :ref:`ACTION/WithPostStep`
|
||||
.. include:: Actions.rst
|
||||
|
||||
|
||||
.. _ACTION/Instantiation:
|
||||
.. index::
|
||||
single: GitHub Action; Instantiation
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
<JobName>:
|
||||
steps:
|
||||
- ...
|
||||
|
||||
- name: <Name>
|
||||
uses: ./with-post-step
|
||||
with:
|
||||
<Param1>: <Value1>
|
||||
<Param2>: <Value2>
|
||||
|
||||
25
doc/CodeCoverage.rst
Normal file
@@ -0,0 +1,25 @@
|
||||
.. _CODECOV:
|
||||
|
||||
Code Coverage Report
|
||||
####################
|
||||
|
||||
.. grid:: 2
|
||||
|
||||
.. grid-item::
|
||||
:columns: 8
|
||||
|
||||
.. report:code-coverage::
|
||||
:reportid: src
|
||||
|
||||
.. grid-item::
|
||||
:columns: 4
|
||||
|
||||
.. report:code-coverage-legend::
|
||||
:reportid: src
|
||||
:style: vertical-table
|
||||
|
||||
----------
|
||||
|
||||
Code coverage report generated with `pytest <https://github.com/pytest-dev/pytest>`__,
|
||||
`Coverage.py <https://github.com/nedbat/coveragepy/tree/master>`__ and visualized by
|
||||
`sphinx-reports <https://github.com/pyTooling/sphinx-reports>`__.
|
||||
24
doc/DocCoverage.rst
Normal file
@@ -0,0 +1,24 @@
|
||||
.. _DOCCOV:
|
||||
|
||||
Documentation Coverage Report
|
||||
#############################
|
||||
|
||||
.. grid:: 2
|
||||
|
||||
.. grid-item::
|
||||
:columns: 5
|
||||
|
||||
.. report:doc-coverage::
|
||||
:reportid: src
|
||||
|
||||
.. grid-item::
|
||||
:columns: 7
|
||||
|
||||
.. report:doc-coverage-legend::
|
||||
:reportid: src
|
||||
:style: vertical-table
|
||||
|
||||
----------
|
||||
|
||||
Documentation coverage generated with `"""docstr-coverage""" <https://github.com/HunterMcGushion/docstr_coverage>`__ and
|
||||
visualized by `sphinx-reports <https://github.com/pyTooling/sphinx-reports>`__.
|
||||
128
doc/Glossary.rst
Normal file
@@ -0,0 +1,128 @@
|
||||
Glossary
|
||||
########
|
||||
|
||||
.. glossary::
|
||||
|
||||
Bandit
|
||||
Bandit is a tool designed to find common security issues in Python code.
|
||||
|
||||
:Source Code: `github.com/PyCQA/bandit/ <https://github.com/PyCQA/bandit/>`__
|
||||
:Package: `pypi.org/project/bandit/ <https://pypi.org/project/bandit/>`__
|
||||
:Documentation: `bandit.readthedocs.io/ <https://bandit.readthedocs.io/>`__
|
||||
|
||||
build
|
||||
A simple, correct Python build frontend.
|
||||
|
||||
:Source Code: `github.com/pypa/build/ <https://github.com/pypa/build/>`__
|
||||
:Package: `pypi.org/project/build/ <https://pypi.org/project/build/>`__
|
||||
:Documentation: `build.pypa.io/ <https://build.pypa.io/>`__
|
||||
|
||||
Codacy
|
||||
.. todo:: Add description of Codacy.
|
||||
|
||||
:Cloud Service: `Codacy.com <https://www.codacy.com/>`__
|
||||
|
||||
CodeCov
|
||||
.. todo:: Add description of CodeCov.
|
||||
|
||||
:Cloud Service: `Codecov.io <https://about.codecov.io/>`__
|
||||
|
||||
Coverage.py
|
||||
The code coverage tool for Python.
|
||||
|
||||
:Source Code: `github.com/nedbat/coveragepy/ <https://github.com/nedbat/coveragepy/>`__
|
||||
:Package: `pypi.org/project/coverage/ <https://pypi.org/project/coverage/>`__
|
||||
:Documentation: `coverage.readthedocs.io/ <https://coverage.readthedocs.io/>`__
|
||||
|
||||
delete-artifact
|
||||
A GitHub Action to deletes artifacts within the workflow run.
|
||||
|
||||
:Source Code: `github.com/GeekyEggo/delete-artifact/ <https://github.com/GeekyEggo/delete-artifact/>`__
|
||||
:Marketplace: `github.com/marketplace/actions/delete-artifact/ <https://github.com/marketplace/actions/delete-artifact/>`__
|
||||
:README: `github.com/GeekyEggo/delete-artifact ⭢ README.md <https://github.com/GeekyEggo/delete-artifact/blob/main/README.md>`__
|
||||
|
||||
docstr_coverage
|
||||
Docstring coverage analysis and rating for Python.
|
||||
|
||||
:Source Code: `github.com/HunterMcGushion/docstr_coverage/ <https://github.com/HunterMcGushion/docstr_coverage/>`__
|
||||
:Package: `pypi.org/project/docstr_coverage/ <https://pypi.org/project/docstr_coverage/>`__
|
||||
:Documentation: `docstr-coverage.readthedocs.io/ <https://docstr-coverage.readthedocs.io/>`__
|
||||
|
||||
gh
|
||||
GitHub’s official command line tool.
|
||||
|
||||
:Source Code: `github.com/cli/cli/ <https://github.com/cli/cli/>`__
|
||||
:Documentation: `cli.github.com/manual/ <https://cli.github.com/manual/>`__
|
||||
|
||||
GitHub Pages
|
||||
GitHub Pages is a static site hosting service that takes HTML, CSS, and JavaScript files straight from a repository
|
||||
on GitHub, optionally runs the files through a build process, and publishes a website.
|
||||
|
||||
:Documentation: https://docs.github.com/en/pages
|
||||
|
||||
interrogate
|
||||
Explain yourself! Interrogate a codebase for docstring coverage.
|
||||
|
||||
:Source Code: `github.com/econchick/interrogate/ <https://github.com/econchick/interrogate/>`__
|
||||
:Package: `pypi.org/project/interrogate/ <https://pypi.org/project/interrogate/>`__
|
||||
:Documentation: `interrogate.readthedocs.io/ <https://interrogate.readthedocs.io/>`__
|
||||
|
||||
MikTeX
|
||||
MiKTeX is a modern TeX distribution for Windows, Linux and macOS.
|
||||
|
||||
:Source Code: `github.com/MiKTeX/miktex/ <https://github.com/MiKTeX/miktex/>`__
|
||||
:Documentation: `miktex.org/ <https://miktex.org/>`__
|
||||
|
||||
mypy
|
||||
Optional static typing for Python.
|
||||
|
||||
:Source Code: `github.com/python/mypy/ <https://github.com/python/mypy/>`__
|
||||
:Package: `pypi.org/project/mypy/ <https://pypi.org/project/mypy/>`__
|
||||
:Documentation: `www.mypy-lang.org/ <https://www.mypy-lang.org/>`__
|
||||
|
||||
pyEDAA.Reports
|
||||
A collection of various (EDA tool-specific) report data formats.
|
||||
|
||||
:Source Code: `github.com/edaa-org/pyEDAA.Reports/ <https://github.com/edaa-org/pyEDAA.Reports/>`__
|
||||
:Package: `pypi.org/project/pyEDAA.Reports/ <https://pypi.org/project/pyEDAA.Reports/>`__
|
||||
:Documentation: `edaa-org.github.io/pyEDAA.Reports/ <https://edaa-org.github.io/pyEDAA.Reports/>`__
|
||||
|
||||
pip
|
||||
The Python package installer.
|
||||
|
||||
:Source Code: `github.com/pypa/pip/ <https://github.com/pypa/pip/>`__
|
||||
:Package: `pypi.org/project/pip/ <https://pypi.org/project/pip/>`__
|
||||
:Documentation: `pip.pypa.io/ <https://pip.pypa.io/>`__
|
||||
|
||||
PyPI
|
||||
Find, install and publish Python packages with the Python Package Index.
|
||||
|
||||
:Cloud Service: `PyPI.org <https://pypi.org/>`__
|
||||
|
||||
pytest
|
||||
The pytest framework makes it easy to write small tests, yet scales to support complex functional testing.
|
||||
|
||||
:Source Code: `github.com/pytest-dev/pytest/ <https://github.com/pytest-dev/pytest/>`__
|
||||
:Package: `pypi.org/project/pytest/ <https://pypi.org/project/pytest/>`__
|
||||
:Documentation: `pytest.org/ <https://pytest.org/>`__
|
||||
|
||||
Sphinx
|
||||
The Sphinx documentation generator.
|
||||
|
||||
:Source Code: `github.com/sphinx-doc/sphinx/ <https://github.com/sphinx-doc/sphinx/>`__
|
||||
:Package: `pypi.org/project/sphinx/ <https://pypi.org/project/sphinx/>`__
|
||||
:Documentation: `www.sphinx-doc.org/ <https://www.sphinx-doc.org/>`__
|
||||
|
||||
Test Reporter
|
||||
Displays test results from popular testing frameworks directly in GitHub.
|
||||
|
||||
:Source Code: `github.com/dorny/test-reporter/ <https://github.com/dorny/test-reporter/>`__
|
||||
:Marketplace: `github.com/marketplace/actions/test-reporter/ <https://github.com/marketplace/actions/test-reporter/>`__
|
||||
:README: `github.com/dorny/test-reporter ⭢ README.md <https://github.com/dorny/test-reporter/blob/main/README.md>`__
|
||||
|
||||
twine
|
||||
Utilities for interacting with PyPI.
|
||||
|
||||
:Source Code: `github.com/pypa/twine/ <https://github.com/pypa/twine/>`__
|
||||
:Package: `pypi.org/project/twine/ <https://pypi.org/project/twine/>`__
|
||||
:Documentation: `twine.readthedocs.io/ <https://twine.readthedocs.io/>`__
|
||||
@@ -36,10 +36,13 @@ to handover input parameters to the template.
|
||||
on:
|
||||
push:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
# Every Friday at 22:00 - rerun pipeline to check for dependency-based issues
|
||||
- cron: '0 22 * * 5'
|
||||
|
||||
jobs:
|
||||
<InstanceName>:
|
||||
uses: <GitHubOrganization>/<Repository>/.github/workflows/<Template>.yml@v0
|
||||
uses: <GitHubOrganization>/<Repository>/.github/workflows/<Template>.yml@r6
|
||||
with:
|
||||
<Param1>: <Value>
|
||||
|
||||
@@ -57,15 +60,18 @@ Documentation Only (Sphinx)
|
||||
on:
|
||||
push:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
# Every Friday at 22:00 - rerun pipeline to check for dependency-based issues
|
||||
- cron: '0 22 * * 5'
|
||||
|
||||
jobs:
|
||||
BuildTheDocs:
|
||||
uses: pyTooling/Actions/.github/workflows/BuildTheDocs.yml@r4
|
||||
uses: pyTooling/Actions/.github/workflows/BuildTheDocs.yml@r6
|
||||
with:
|
||||
artifact: Documentation
|
||||
|
||||
PublishToGitHubPages:
|
||||
uses: pyTooling/Actions/.github/workflows/PublishToGitHubPages.yml@r4
|
||||
uses: pyTooling/Actions/.github/workflows/PublishToGitHubPages.yml@r6
|
||||
needs:
|
||||
- BuildTheDocs
|
||||
with:
|
||||
|
||||
826
doc/JobTemplate/AllInOne/CompletePipeline.rst
Normal file
@@ -0,0 +1,826 @@
|
||||
.. _JOBTMPL/CompletePipeline:
|
||||
.. index::
|
||||
single: build; CompletePipeline Template
|
||||
single: Bandit; CompletePipeline Template
|
||||
single: CodeCov; CompletePipeline Template
|
||||
single: Codacy; CompletePipeline Template
|
||||
single: Coverage.py; CompletePipeline Template
|
||||
single: docstr_coverage; CompletePipeline Template
|
||||
single: GitHub Pages; CompletePipeline Template
|
||||
single: interrogate; CompletePipeline Template
|
||||
single: MikTeX; CompletePipeline Template
|
||||
single: mypy; CompletePipeline Template
|
||||
single: PyPI; CompletePipeline Template
|
||||
single: pytest; CompletePipeline Template
|
||||
single: pyEDAA.Reports; CompletePipeline Template
|
||||
single: Sphinx; CompletePipeline Template
|
||||
single: Test Reporter; CompletePipeline Template
|
||||
single: twine; CompletePipeline Template
|
||||
single: GitHub Action Reusable Workflow; CompletePipeline Template
|
||||
|
||||
CompletePipeline
|
||||
################
|
||||
|
||||
The ``CompletePipeline`` job template is the combination of almost all job templates offered by pyTooling/Actions in a
|
||||
single workflow template. If fulfills all needs to test, package, document, publish and release Python code from GitHub.
|
||||
It can be used for simple Python packages as well as namespace packages.
|
||||
|
||||
.. topic:: Features
|
||||
|
||||
.. grid:: 3
|
||||
|
||||
.. grid-item::
|
||||
:columns: 4
|
||||
|
||||
.. rubric:: Testing
|
||||
|
||||
* Run unit tests before packaging using :term:`pytest`.
|
||||
* Run platform tests before packaging using :term:`pytest`.
|
||||
* Run application tests using packaged code on target platform.
|
||||
|
||||
.. rubric:: Code Quality
|
||||
|
||||
* Collect code coverage using :term:`Coverage.py`.
|
||||
* Check documentation coverage using :term:`docstr_coverage` and :term:`interrogate`.
|
||||
* Check static typing closure using :term:`mypy`.
|
||||
* Static Application Security Testing (SAST) using :term:`bandit`
|
||||
|
||||
.. rubric:: Report Handling
|
||||
|
||||
* Merge unit test results into one report using :term:`pyEDAA.Reports`.
|
||||
* Merge code coverage results into one report using :term:`Coverage.py`.
|
||||
|
||||
.. grid-item::
|
||||
:columns: 4
|
||||
|
||||
.. rubric:: Documentation
|
||||
|
||||
* Compile documentation using :term:`Sphinx` as HTML and LaTeX.
|
||||
* Translate LaTeX documentation to PDF using :term:`MikTeX`.
|
||||
|
||||
.. rubric:: Publishing Results
|
||||
|
||||
* GitHub Pipeline Summary
|
||||
|
||||
* Publish unittest results using :term:`Test Reporter`.
|
||||
|
||||
* :term:`GitHub Pages`
|
||||
|
||||
* Publish HTML documentation to GitHub Pages.
|
||||
|
||||
* :term:`Codecov`
|
||||
|
||||
* Publish code coverage to CodeCov.
|
||||
* Publish unittest results to CodeCov.
|
||||
|
||||
* :term:`Codacy`
|
||||
|
||||
* Publish code coverage to Codacy.
|
||||
|
||||
.. grid-item::
|
||||
:columns: 4
|
||||
|
||||
.. rubric:: Packaging
|
||||
|
||||
* Package as wheel using :term:`build`.
|
||||
* Install wheel on target platform using pip.
|
||||
* Upload to PyPI using :term:`twine`.
|
||||
|
||||
.. rubric:: Releasing
|
||||
|
||||
* Automatic tagging of merge commits on main branch to trigger a tagged pipeline (release pipeline).
|
||||
* Create a release page with text derived from pull request description.
|
||||
|
||||
.. topic:: Behavior
|
||||
|
||||
.. include:: _Behavior.rst
|
||||
|
||||
|
||||
.. topic:: Pipeline Graph
|
||||
|
||||
.. image:: ../../_static/pyTooling-Actions-SimplePackage.png
|
||||
|
||||
.. topic:: Dependencies
|
||||
|
||||
.. dropdown:: Expand List
|
||||
:animate: fade-in-slide-down
|
||||
:icon: codescan
|
||||
:color: muted
|
||||
|
||||
.. grid:: 2
|
||||
|
||||
.. grid-item::
|
||||
:columns: 6
|
||||
|
||||
* :ref:`pyTooling/Actions/.github/workflows/PrepareJob.yml <JOBTMPL/PrepareJob>`
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`GitHub command line tool 'gh' <cli/cli>`
|
||||
|
||||
* :ref:`pyTooling/Actions/.github/workflows/Parameters.yml <JOBTMPL/Parameters>`
|
||||
* :ref:`pyTooling/Actions/.github/workflows/ExtractConfiguration.yml <JOBTMPL/ExtractConfiguration>`
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`actions/setup-python`
|
||||
|
||||
* :pypi:`wheel`
|
||||
* :pypi:`tomli`
|
||||
|
||||
* :ref:`pyTooling/Actions/.github/workflows/UnitTesting.yml <JOBTMPL/UnitTesting>`
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`msys2/setup-msys2`
|
||||
* :gh:`actions/setup-python`
|
||||
* :gh:`pyTooling/download-artifact`
|
||||
|
||||
* :gh:`actions/download-artifact`
|
||||
|
||||
* :gh:`pyTooling/upload-artifact`
|
||||
|
||||
* :gh:`actions/upload-artifact`
|
||||
|
||||
* apt: Packages specified via :ref:`JOBTMPL/UnitTesting/Input/apt` parameter.
|
||||
* homebrew: Packages specified via :ref:`JOBTMPL/UnitTesting/Input/brew` parameter.
|
||||
* MSYS2: Packages specified via :ref:`JOBTMPL/UnitTesting/Input/pacboy` parameter.
|
||||
* pip
|
||||
|
||||
* :pypi:`wheel`
|
||||
* :pypi:`tomli`
|
||||
* Python packages specified via :ref:`JOBTMPL/UnitTesting/Input/requirements` or
|
||||
:ref:`JOBTMPL/UnitTesting/Input/mingw_requirements` parameter.
|
||||
|
||||
* :ref:`pyTooling/Actions/.github/workflows/ApplicationTesting.yml <JOBTMPL/ApplicationTesting>`
|
||||
* :ref:`pyTooling/Actions/.github/workflows/CheckDocumentation.yml <JOBTMPL/CheckDocumentation>`
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`actions/setup-python`
|
||||
* pip
|
||||
|
||||
* :pypi:`docstr_coverage`
|
||||
* :pypi:`interrogate`
|
||||
|
||||
* :ref:`pyTooling/Actions/.github/workflows/StaticTypeCheck.yml <JOBTMPL/StaticTypeCheck>`
|
||||
* :ref:`pyTooling/Actions/.github/workflows/Package.yml <JOBTMPL/Package>`
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`actions/setup-python`
|
||||
* :gh:`pyTooling/upload-artifact`
|
||||
|
||||
* :gh:`actions/upload-artifact`
|
||||
|
||||
* pip
|
||||
|
||||
* :pypi:`build`
|
||||
* :pypi:`wheel`
|
||||
|
||||
* :ref:`pyTooling/Actions/.github/workflows/PublishTestResults.yml <JOBTMPL/PublishTestResults>`
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`pyTooling/download-artifact`
|
||||
|
||||
* :gh:`actions/download-artifact`
|
||||
|
||||
* pip
|
||||
|
||||
* :pypi:`pyEDAA.Reports`
|
||||
|
||||
* :gh:`dorny/test-reporter`
|
||||
* :gh:`codecov/test-results-action`
|
||||
* :gh:`pyTooling/upload-artifact`
|
||||
|
||||
* :gh:`actions/upload-artifact`
|
||||
|
||||
.. grid-item::
|
||||
:columns: 6
|
||||
|
||||
* :ref:`pyTooling/Actions/.github/workflows/PublishCoverageResults.yml <JOBTMPL/PublishCoverageResults>`
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`pyTooling/download-artifact`
|
||||
|
||||
* :gh:`actions/download-artifact`
|
||||
|
||||
* pip
|
||||
|
||||
* :pypi:`coverage`
|
||||
* :pypi:`tomli`
|
||||
|
||||
* :gh:`pyTooling/upload-artifact`
|
||||
|
||||
* :gh:`actions/upload-artifact`
|
||||
|
||||
* :gh:`codecov/codecov-action`
|
||||
* :gh:`codacy/codacy-coverage-reporter-action`
|
||||
|
||||
* :ref:`pyTooling/Actions/.github/workflows/SphinxDocumentation.yml <JOBTMPL/SphinxDocumentation>`
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`actions/setup-python`
|
||||
* :gh:`pyTooling/download-artifact`
|
||||
|
||||
* :gh:`actions/download-artifact`
|
||||
|
||||
* :gh:`pyTooling/upload-artifact`
|
||||
|
||||
* :gh:`actions/upload-artifact`
|
||||
|
||||
* apt
|
||||
|
||||
* `graphviz <https://graphviz.org/>`__
|
||||
|
||||
* pip
|
||||
|
||||
* :pypi:`wheel`
|
||||
* Python packages specified via :ref:`JOBTMPL/SphinxDocumentation/Input/requirements` parameter.
|
||||
|
||||
* :ref:`pyTooling/Actions/.github/workflows/LaTeXDocumentation.yml <JOBTMPL/LaTeXDocumentation>`
|
||||
|
||||
* :gh:`pyTooling/download-artifact`
|
||||
|
||||
* :gh:`actions/download-artifact`
|
||||
|
||||
* :gh:`pyTooling/upload-artifact`
|
||||
|
||||
* :gh:`actions/upload-artifact`
|
||||
|
||||
* :gh:`addnab/docker-run-action`
|
||||
|
||||
* :dockerhub:`pytooling/miktex <pytooling/miktex:sphinx>`
|
||||
|
||||
* :ref:`pyTooling/Actions/.github/workflows/PublishToGitHubPages.yml <JOBTMPL/PublishToGitHubPages>`
|
||||
* :ref:`pyTooling/Actions/.github/workflows/PublishOnPyPI.yml <JOBTMPL/PublishOnPyPI>`
|
||||
|
||||
* :gh:`pyTooling/download-artifact`
|
||||
|
||||
* :gh:`actions/download-artifact`
|
||||
* :gh:`actions/setup-python`
|
||||
* :gh:`geekyeggo/delete-artifact`
|
||||
|
||||
* pip
|
||||
|
||||
* :pypi:`wheel`
|
||||
* :pypi:`twine`
|
||||
|
||||
* :ref:`pyTooling/Actions/.github/workflows/TagReleaseCommit.yml <JOBTMPL/TagReleaseCommit>`
|
||||
|
||||
* :gh:`actions/github-script`
|
||||
|
||||
* :ref:`pyTooling/Actions/.github/workflows/PublishReleaseNotes.yml <JOBTMPL/PublishReleaseNotes>`
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* ``gh`` (GitHub command line interface)
|
||||
* ``jq`` (JSON processing)
|
||||
* apt
|
||||
|
||||
* zstd
|
||||
|
||||
* :ref:`pyTooling/Actions/.github/workflows/IntermediateCleanUp.yml <JOBTMPL/IntermediateCleanUp>`
|
||||
|
||||
* :gh:`geekyeggo/delete-artifact`
|
||||
|
||||
* :ref:`pyTooling/Actions/.github/workflows/ArtifactCleanUp.yml <JOBTMPL/ArtifactCleanUp>`
|
||||
|
||||
* :gh:`geekyeggo/delete-artifact`
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Instantiation:
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
The following instantiation example creates a ``SimplePackage`` job derived from job template ``CompletePipeline``
|
||||
version ``@r6``. It only requires the `package_name` parameter to run a full pipeline suitable for a Python project.
|
||||
|
||||
.. grid:: 2
|
||||
|
||||
.. grid-item::
|
||||
:columns: 6
|
||||
|
||||
.. tab-set::
|
||||
|
||||
.. tab-item:: Simple Package
|
||||
:sync: Simple
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
name: Pipeline
|
||||
|
||||
jobs:
|
||||
SimplePackage:
|
||||
uses: pyTooling/Actions/.github/workflows/CompletePipeline.yml@r6
|
||||
with:
|
||||
|
||||
package_name: myPackage
|
||||
|
||||
.. tab-item:: Namespace Package
|
||||
:sync: Namespace
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
name: Pipeline
|
||||
|
||||
jobs:
|
||||
NamespacePackage:
|
||||
uses: pyTooling/Actions/.github/workflows/CompletePipeline.yml@r6
|
||||
with:
|
||||
package_namespace: myFramework
|
||||
package_name: Extension
|
||||
|
||||
.. grid-item::
|
||||
:columns: 6
|
||||
|
||||
.. tab-set::
|
||||
|
||||
.. tab-item:: Simple Package
|
||||
:sync: Simple
|
||||
|
||||
.. code-block::
|
||||
|
||||
📂ProjectRoot/
|
||||
📂myFramework/
|
||||
|
||||
📦SubPackage/
|
||||
🐍__init__.py
|
||||
🐍SubModuleA.py
|
||||
🐍__init__.py
|
||||
🐍ModuleB.py
|
||||
|
||||
|
||||
.. tab-item:: Namespace Package
|
||||
:sync: Namespace
|
||||
|
||||
.. code-block::
|
||||
|
||||
📂ProjectRoot/
|
||||
📂myFramework/
|
||||
📂Extension/
|
||||
📦SubPackage/
|
||||
🐍__init__.py
|
||||
🐍SubModuleA.py
|
||||
🐍__init__.py
|
||||
🐍ModuleB.py
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Parameters:
|
||||
|
||||
Parameter Summary
|
||||
*****************
|
||||
|
||||
.. rubric:: Goto :ref:`input parameters <JOBTMPL/CompletePipeline/Inputs>`
|
||||
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=====================================================================+==========+==========+===================================================+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Input/package_namespace` | no | string | ``''`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Input/package_name` | yes | string | — — — — |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Input/unittest_python_version` | no | string | ``'3.13'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Input/unittest_python_version_list` | no | string | ``'3.9 3.10 3.11 3.12 3.13'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Input/unittest_system_list` | no | string | ``'ubuntu windows macos macos-arm ucrt64'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Input/unittest_include_list` | no | string | ``''`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Input/unittest_exclude_list` | no | string | ``'windows-arm:3.9 windows-arm:3.10'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Input/unittest_disable_list` | no | string | ``'windows-arm:pypy-3.10 windows-arm:pypy-3.11'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Input/apptest_python_version` | no | string | ``'3.13'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Input/apptest_python_version_list` | no | string | ``''`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Input/apptest_system_list` | no | string | ``'ubuntu windows macos macos-arm ucrt64'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Input/apptest_include_list` | no | string | ``''`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Input/apptest_exclude_list` | no | string | ``'windows-arm:3.9 windows-arm:3.10'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Input/apptest_disable_list` | no | string | ``'windows-arm:pypy-3.10 windows-arm:pypy-3.11'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Input/codecov` | no | string | ``'false'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Input/codacy` | no | string | ``'false'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Input/dorny` | no | string | ``'false'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Input/cleanup` | no | string | ``'true'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
|
||||
.. rubric:: Goto :ref:`secrets <JOBTMPL/CompletePipeline/Secrets>`
|
||||
|
||||
+-----------------------------------------------------------+----------+----------+--------------+
|
||||
| Token Name | Required | Type | Default |
|
||||
+===========================================================+==========+==========+==============+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Secret/PYPI_TOKEN` | no | string | — — — — |
|
||||
+-----------------------------------------------------------+----------+----------+--------------+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Secret/CODECOV_TOKEN` | no | string | — — — — |
|
||||
+-----------------------------------------------------------+----------+----------+--------------+
|
||||
| :ref:`JOBTMPL/CompletePipeline/Secret/CODACY_TOKEN` | no | string | — — — — |
|
||||
+-----------------------------------------------------------+----------+----------+--------------+
|
||||
|
||||
.. rubric:: Goto :ref:`output parameters <JOBTMPL/CompletePipeline/Outputs>`
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Inputs:
|
||||
|
||||
Input Parameters
|
||||
****************
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Input/package_namespace:
|
||||
|
||||
package_namespace
|
||||
=================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid Python namespace.
|
||||
:Description: In case the package is a Python namespace package, the name of the library's or package's namespace
|
||||
needs to be specified using this parameter. |br|
|
||||
In case of a simple Python package, this parameter must be specified as an empty string (``''``),
|
||||
which is the default.
|
||||
:Example:
|
||||
.. grid:: 2
|
||||
|
||||
.. grid-item::
|
||||
:columns: 5
|
||||
|
||||
.. rubric:: Example Instantiation
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
name: Pipeline
|
||||
|
||||
jobs:
|
||||
NamespacePackage:
|
||||
uses: pyTooling/Actions/.github/workflows/CompletePipeline.yml@r6
|
||||
with:
|
||||
package_namespace: myFramework
|
||||
package_name: Extension
|
||||
|
||||
.. grid-item::
|
||||
:columns: 4
|
||||
|
||||
.. rubric:: Example Directory Structure
|
||||
|
||||
.. code-block::
|
||||
|
||||
📂ProjectRoot/
|
||||
📂myFramework/
|
||||
📂Extension/
|
||||
📦SubPackage/
|
||||
🐍__init__.py
|
||||
🐍SubModuleA.py
|
||||
🐍__init__.py
|
||||
🐍ModuleB.py
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Input/package_name:
|
||||
|
||||
package_name
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: yes
|
||||
:Default Value: — — — —
|
||||
:Possible Values: Any valid Python package name.
|
||||
:Description: In case of a simple Python package, this package's name is specified using this parameter. |br|
|
||||
In case the package is a Python namespace package, the parameter
|
||||
:ref:`JOBTMPL/CompletePipeline/Input/package_namespace` must be specified, too.
|
||||
:Example:
|
||||
.. grid:: 2
|
||||
|
||||
.. grid-item::
|
||||
:columns: 5
|
||||
|
||||
.. rubric:: Example Instantiation
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
name: Pipeline
|
||||
|
||||
jobs:
|
||||
SimplePackage:
|
||||
uses: pyTooling/Actions/.github/workflows/CompletePipeline.yml@r6
|
||||
with:
|
||||
package_name: myPackage
|
||||
|
||||
.. grid-item::
|
||||
:columns: 4
|
||||
|
||||
.. rubric:: Example Directory Structure
|
||||
|
||||
.. code-block::
|
||||
|
||||
📂ProjectRoot/
|
||||
📂myFramework/
|
||||
📦SubPackage/
|
||||
🐍__init__.py
|
||||
🐍SubModuleA.py
|
||||
🐍__init__.py
|
||||
🐍ModuleB.py
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Input/unittest_python_version:
|
||||
|
||||
unittest_python_version
|
||||
=======================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'3.13'``
|
||||
:Possible Values: Any valid Python version conforming to the pattern ``<major>.<minor>`` or ``pypy-<major>.<minor>``. |br|
|
||||
See `actions/python-versions - available Python versions <https://github.com/actions/python-versions>`__
|
||||
and `actions/setup-python - configurable Python versions <https://github.com/actions/setup-python>`__.
|
||||
:Description: The default Python version used for intermediate jobs using Python tools.
|
||||
|
||||
In case :ref:`JOBTMPL/CompletePipeline/Input/unittest_python_version_list` is empty, this default
|
||||
version is used to populate the :ref:`JOBTMPL/CompletePipeline/Input/unittest_python_version_list`
|
||||
parameter.
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Input/unittest_python_version_list:
|
||||
|
||||
unittest_python_version_list
|
||||
============================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'3.9 3.10 3.11 3.12 3.13'``
|
||||
:Possible Values: A space separated list of valid Python versions conforming to the pattern ``<major>.<minor>`` or
|
||||
``pypy-<major>.<minor>``.
|
||||
:Description: The list of space-separated Python versions used for unit testing.
|
||||
|
||||
.. include:: ../PythonVersionList.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Input/unittest_system_list:
|
||||
|
||||
unittest_system_list
|
||||
====================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'ubuntu windows macos macos-arm mingw64 ucrt64'``
|
||||
:Possible Values: A space separated list of system names.
|
||||
:Description: The list of space-separated systems used for unit testing.
|
||||
|
||||
.. include:: ../SystemList.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Input/unittest_include_list:
|
||||
|
||||
unittest_include_list
|
||||
=====================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: A space separated list of ``<system>:<python_version>`` tuples.
|
||||
:Description: List of space-separated ``<system>:<python_version>`` tuples to be included into the list of unittest
|
||||
variants.
|
||||
|
||||
For more details see :ref:`JOBTMPL/Parameters/Input/include_list`.
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Input/unittest_exclude_list:
|
||||
|
||||
unittest_exclude_list
|
||||
=====================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'windows-arm:3.9 windows-arm:3.10'``
|
||||
:Possible Values: A space separated list of ``<system>:<python_version>`` tuples.
|
||||
:Description: List of space-separated ``<system>:<python_version>`` tuples to be excluded from the list of unittest
|
||||
variants.
|
||||
|
||||
For more details see :ref:`JOBTMPL/Parameters/Input/exclude_list`.
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Input/unittest_disable_list:
|
||||
|
||||
unittest_disable_list
|
||||
=====================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'windows-arm:pypy-3.10 windows-arm:pypy-3.11'``
|
||||
:Possible Values: A space separated list of ``<system>:<python_version>`` tuples.
|
||||
:Description: List of space-separated ``<system>:<python_version>`` tuples to be temporarily disabled from the list
|
||||
of unittest variants. |br|
|
||||
Each disabled item creates a warning in the workflow log.
|
||||
|
||||
For more details see :ref:`JOBTMPL/Parameters/Input/disable_list`.
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Input/apptest_python_version:
|
||||
|
||||
apptest_python_version
|
||||
======================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'3.13'``
|
||||
:Possible Values: Any valid Python version conforming to the pattern ``<major>.<minor>`` or ``pypy-<major>.<minor>``. |br|
|
||||
See `actions/python-versions - available Python versions <https://github.com/actions/python-versions>`__
|
||||
and `actions/setup-python - configurable Python versions <https://github.com/actions/setup-python>`__.
|
||||
:Description: The default Python version used for intermediate jobs using Python tools.
|
||||
|
||||
In case :ref:`JOBTMPL/CompletePipeline/Input/apptest_python_version_list` is empty, this default
|
||||
version is used to populate the :ref:`JOBTMPL/CompletePipeline/Input/apptest_python_version_list`
|
||||
parameter.
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Input/apptest_python_version_list:
|
||||
|
||||
apptest_python_version_list
|
||||
===========================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: A space separated list of valid Python versions conforming to the pattern ``<major>.<minor>`` or
|
||||
``pypy-<major>.<minor>```.
|
||||
:Description: The list of space-separated Python versions used for application testing.
|
||||
|
||||
As this list is empty by default, the value is derived from
|
||||
:ref:`JOBTMPL/CompletePipeline/Input/apptest_python_version`.
|
||||
|
||||
.. include:: ../PythonVersionList.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Input/apptest_system_list:
|
||||
|
||||
apptest_system_list
|
||||
===================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'ubuntu windows macos macos-arm mingw64 ucrt64'``
|
||||
:Possible Values: A space separated list of system names.
|
||||
:Description: The list of space-separated systems used for application testing.
|
||||
|
||||
.. include:: ../SystemList.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Input/apptest_include_list:
|
||||
|
||||
apptest_include_list
|
||||
====================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: A space separated list of ``<system>:<python_version>`` tuples.
|
||||
:Description: List of space-separated ``<system>:<python_version>`` tuples to be included into the list of
|
||||
application test variants.
|
||||
|
||||
For more details see :ref:`JOBTMPL/Parameters/Input/include_list`.
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Input/apptest_exclude_list:
|
||||
|
||||
apptest_exclude_list
|
||||
====================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'windows-arm:3.9 windows-arm:3.10'``
|
||||
:Possible Values: A space separated list of ``<system>:<python_version>`` tuples.
|
||||
:Description: List of space-separated ``<system>:<python_version>`` tuples to be excluded from the list of
|
||||
application test variants.
|
||||
|
||||
For more details see :ref:`JOBTMPL/Parameters/Input/exclude_list`.
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Input/apptest_disable_list:
|
||||
|
||||
apptest_disable_list
|
||||
====================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'windows-arm:pypy-3.10 windows-arm:pypy-3.11'``
|
||||
:Possible Values: A space separated list of ``<system>:<python_version>`` tuples.
|
||||
:Description: List of space-separated ``<system>:<python_version>`` tuples to be temporarily disabled from the list
|
||||
of application test variants. |br|
|
||||
Each disabled item creates a warning in the workflow log.
|
||||
|
||||
For more details see :ref:`JOBTMPL/Parameters/Input/disable_list`.
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Input/codecov:
|
||||
|
||||
codecov
|
||||
=======
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'false'``
|
||||
:Possible Values: ``'true'``, ``'false'``
|
||||
:Description: If *true*, publish merged code coverage results and a merged unit test summary to CodeCov. |br|
|
||||
Secret :ref:`JOBTMPL/CompletePipeline/Secret/CODECOV_TOKEN` must be set.
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Input/codacy:
|
||||
|
||||
codacy
|
||||
======
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'false'``
|
||||
:Possible Values: ``'true'``, ``'false'``
|
||||
:Description: If *true*, publish merged code coverage results to Codacy. |br|
|
||||
Secret :ref:`JOBTMPL/CompletePipeline/Secret/CODACY_TOKEN` must be set.
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Input/dorny:
|
||||
|
||||
dorny
|
||||
=====
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'false'``
|
||||
:Possible Values: ``'true'``, ``'false'``
|
||||
:Description: If *true*, publish a merged unit test summary as pipeline result.
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Input/cleanup:
|
||||
|
||||
cleanup
|
||||
=======
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'true'``
|
||||
:Possible Values: ``'true'``, ``'false'``
|
||||
:Description: If *false*, do not remove intermediate artifacts. |br|
|
||||
This might help debugging artifact handovers between jobs.
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Secrets:
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
The workflow template uses the following secrets to publish results to other services.
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Secret/PYPI_TOKEN:
|
||||
|
||||
PYPI_TOKEN
|
||||
==========
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: — — — —
|
||||
:Description: The token to publish and upload packages on :term:`PyPI`.
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Secret/CODECOV_TOKEN:
|
||||
|
||||
CODECOV_TOKEN
|
||||
=============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: — — — —
|
||||
:Description: The token to publish code coverage and unit test results to :term:`CodeCov`.
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Secret/CODACY_TOKEN:
|
||||
|
||||
CODACY_TOKEN
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: — — — —
|
||||
:Description: The token to publish code coverage results to :term:`Codacy`.
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Outputs:
|
||||
|
||||
Outputs
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/CompletePipeline/Optimizations:
|
||||
|
||||
Optimizations
|
||||
*************
|
||||
|
||||
The following optimizations can be used to reduce the template's runtime.
|
||||
|
||||
.. todo::
|
||||
|
||||
CompletePipeline::Optimizations Needs a list of optimizations.
|
||||
16
doc/JobTemplate/AllInOne/_Behavior.rst
Normal file
@@ -0,0 +1,16 @@
|
||||
1. Infer information from ``${{ github.ref }}`` variable.
|
||||
2. Extract Python project settings from :file:`pyproject.toml`.
|
||||
3. Compute job matrix based on system, Python version, environment, ... for job variants.
|
||||
4. Run unit tests using pytest and collect code coverage.
|
||||
5. Run platform tests using pytest and collect code coverage.
|
||||
6. Run application tests using pytest.
|
||||
7. Package code as wheel.
|
||||
8. Check documentation coverage using docstr_coverage and interrogate.
|
||||
9. Verify type annotation using static typing analysis using mypy.
|
||||
10. Merge unit test results and code coverage results.
|
||||
11. Generate HTML and LaTeX documentations using Sphinx.
|
||||
12. Translate LaTeX documentation to PDF using MikTeX.
|
||||
13. Publish unit test and code coverage results to cloud services.
|
||||
14. Publish documentation to GitHub Pages.
|
||||
15. Publish wheel to PyPI.
|
||||
16. Create a GitHub release page and upload release assets.
|
||||
32
doc/JobTemplate/AllInOne/index.rst
Normal file
@@ -0,0 +1,32 @@
|
||||
.. _JOBTMPL/AllInOne:
|
||||
|
||||
All-In-One
|
||||
##########
|
||||
|
||||
The category *all-in-one* provides workflow templates implementing all necessary steps (jobs) for testing and publishing
|
||||
a Python project. It utilizes allmost all of ``pyTooling/Acion``'s workflow templates.
|
||||
|
||||
Such a all-in-one workflow template covers:
|
||||
|
||||
* unit testing
|
||||
* code coverage collections
|
||||
* documentation checking
|
||||
* pulishing of unit test and code coverage results
|
||||
* merging of test reports
|
||||
* packaging as wheel
|
||||
* publishing wheels to PyPI
|
||||
* documentation generation via Sphinx and Miktex
|
||||
* automatic tagging of release commits
|
||||
* releasing
|
||||
|
||||
.. topic:: Provides *all-in-one* workflow templates
|
||||
|
||||
* :ref:`JOBTMPL/CompletePipeline` - Use all of ``pyTooling/Acion``'s workflow templates by instantiation of a single
|
||||
workflow template.
|
||||
|
||||
.. image:: ../../_static/pyTooling-Actions-SimplePackage.png
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
||||
CompletePipeline
|
||||
@@ -1,90 +0,0 @@
|
||||
.. _JOBTMPL/ArtifactCleanup:
|
||||
|
||||
ArtifactCleanUp
|
||||
###############
|
||||
|
||||
This job removes artifacts used to exchange data from job to job.
|
||||
|
||||
**Behavior:**
|
||||
|
||||
1. Delete the package artifact if the current pipeline run was not a tagged run.
|
||||
2. Delete all remaining artifacts if given as a parameter.
|
||||
|
||||
**Dependencies:**
|
||||
|
||||
* :gh:`geekyeggo/delete-artifact`
|
||||
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
Simple Example
|
||||
==============
|
||||
|
||||
The simplest variant just uses the artifact name for the package.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
ArtifactCleanUp:
|
||||
uses: pyTooling/Actions/.github/workflows/ArtifactCleanUp.yml@r4
|
||||
with:
|
||||
package: Package
|
||||
|
||||
|
||||
Complex Example
|
||||
===============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
ArtifactCleanUp:
|
||||
uses: pyTooling/Actions/.github/workflows/ArtifactCleanUp.yml@r4
|
||||
needs:
|
||||
- Params
|
||||
- UnitTesting
|
||||
- BuildTheDocs
|
||||
- PublishToGitHubPages
|
||||
- PublishTestResults
|
||||
with:
|
||||
package: ${{ fromJson(needs.Params.outputs.artifact_names).package_all }}
|
||||
remaining: |
|
||||
${{ fromJson(needs.Params.outputs.artifact_names).unittesting_xml }}-*
|
||||
|
||||
|
||||
Parameters
|
||||
**********
|
||||
|
||||
package
|
||||
=======
|
||||
|
||||
+----------------+----------+----------+----------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==========+
|
||||
| package | yes | string | — — — — |
|
||||
+----------------+----------+----------+----------+
|
||||
|
||||
Artifacts to be removed on not tagged runs.
|
||||
|
||||
|
||||
remaining
|
||||
=========
|
||||
|
||||
+----------------+----------+----------+----------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==========+
|
||||
| remaining | optional | string | ``""`` |
|
||||
+----------------+----------+----------+----------+
|
||||
|
||||
Artifacts to be removed unconditionally.
|
||||
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
Results
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
@@ -1,75 +0,0 @@
|
||||
.. _JOBTMPL/BuildTheDocs:
|
||||
|
||||
BuildTheDocs
|
||||
############
|
||||
|
||||
This jobs compiles the documentation written in ReStructured Text with Sphinx using BuildTheDocs.
|
||||
|
||||
**Behavior:**
|
||||
|
||||
1. Checkout repository.
|
||||
2. Build the documentation.
|
||||
3. Upload the HTML documentation as an artifact.
|
||||
4. Publish the HTML documentation to GitHub Pages.
|
||||
|
||||
**Dependencies:**
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`buildthedocs/btd`
|
||||
* :gh:`actions/upload-artifact`
|
||||
|
||||
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
Simple Example
|
||||
==============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
BuildTheDocs:
|
||||
uses: pyTooling/Actions/.github/workflows/BuildTheDocs.yml@r4
|
||||
|
||||
|
||||
Complex Example
|
||||
===============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
BuildTheDocs:
|
||||
uses: pyTooling/Actions/.github/workflows/BuildTheDocs.yml@r4
|
||||
needs:
|
||||
- Params
|
||||
with:
|
||||
artifact: ${{ fromJson(needs.Params.outputs.artifact_names).documentation_html }}
|
||||
|
||||
|
||||
Parameters
|
||||
**********
|
||||
|
||||
artifact
|
||||
========
|
||||
|
||||
+----------------+----------+----------+--------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==============+
|
||||
| artifact | optional | string | ``""`` |
|
||||
+----------------+----------+----------+--------------+
|
||||
|
||||
Name of the documentation artifact.
|
||||
|
||||
If no artifact name is given, the job directly publishes the documentation's HTML content to GitHub Pages.
|
||||
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
Results
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
157
doc/JobTemplate/Cleanup/ArtifactCleanup.rst
Normal file
@@ -0,0 +1,157 @@
|
||||
.. _JOBTMPL/ArtifactCleanup:
|
||||
.. index::
|
||||
single: delete-artifact; ArtifactCleanUp Template
|
||||
single: GitHub Action Reusable Workflow; ArtifactCleanUp Template
|
||||
|
||||
ArtifactCleanUp
|
||||
###############
|
||||
|
||||
This job removes artifacts which were used to exchange data between jobs.
|
||||
|
||||
.. topic:: Features
|
||||
|
||||
* Delete artifacts from pipeline.
|
||||
|
||||
.. topic:: Behavior
|
||||
|
||||
1. Delete the package artifact if the current pipeline run was not a tagged run.
|
||||
2. Delete all remaining artifacts if given as a parameter.
|
||||
|
||||
.. topic:: Job Execution
|
||||
|
||||
.. image:: ../../_static/pyTooling-Actions-ArtifactCleanup.png
|
||||
:width: 350px
|
||||
|
||||
.. topic:: Dependencies
|
||||
|
||||
* :gh:`geekyeggo/delete-artifact`
|
||||
|
||||
|
||||
.. _JOBTMPL/ArtifactCleanup/Instantiation:
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
Simple Example
|
||||
==============
|
||||
|
||||
The simplest variant just uses the artifact name for the package.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
ArtifactCleanUp:
|
||||
uses: pyTooling/Actions/.github/workflows/ArtifactCleanUp.yml@r6
|
||||
with:
|
||||
package: Package
|
||||
|
||||
|
||||
Complex Example
|
||||
===============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
ArtifactCleanUp:
|
||||
uses: pyTooling/Actions/.github/workflows/ArtifactCleanUp.yml@r6
|
||||
needs:
|
||||
- Params
|
||||
- UnitTesting
|
||||
- BuildTheDocs
|
||||
- PublishToGitHubPages
|
||||
- PublishTestResults
|
||||
with:
|
||||
package: ${{ fromJson(needs.Params.outputs.artifact_names).package_all }}
|
||||
remaining: |
|
||||
${{ fromJson(needs.Params.outputs.artifact_names).unittesting_xml }}-*
|
||||
|
||||
|
||||
.. seealso::
|
||||
|
||||
:ref:`JOBTMPL/IntermediateCleanUp`
|
||||
``IntermediateCleanUp`` is used to remove intermediate artifacts like unit test artifacts for each job variant
|
||||
after test results have been merged into a single file.
|
||||
|
||||
|
||||
.. _JOBTMPL/ArtifactCleanup/Parameters:
|
||||
|
||||
Parameter Summary
|
||||
*****************
|
||||
|
||||
.. rubric:: Goto :ref:`input parameters <JOBTMPL/ArtifactCleanup/Inputs>`
|
||||
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=====================================================================+==========+==========+===================================================+
|
||||
| :ref:`JOBTMPL/ArtifactCleanup/Input/ubuntu_image_version` | no | string | ``'24.04'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/ArtifactCleanup/Input/package` | yes | string | — — — — |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/ArtifactCleanup/Input/remaining` | no | string | ``''`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
|
||||
.. rubric:: Goto :ref:`secrets <JOBTMPL/ArtifactCleanup/Secrets>`
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
.. rubric:: Goto :ref:`output parameters <JOBTMPL/ArtifactCleanup/Outputs>`
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/ArtifactCleanup/Inputs:
|
||||
|
||||
Input Parameters
|
||||
****************
|
||||
|
||||
.. _JOBTMPL/ArtifactCleanup/Input/ubuntu_image_version:
|
||||
|
||||
.. include:: ../_ubuntu_image_version.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/ArtifactCleanup/Input/package:
|
||||
|
||||
package
|
||||
=======
|
||||
|
||||
:Type: string
|
||||
:Required: yes
|
||||
:Default Value: — — — —
|
||||
:Possible Values: Multi-line string accepting any valid artifact name per line.
|
||||
:Description: Artifacts to be removed on not tagged runs.
|
||||
|
||||
|
||||
.. _JOBTMPL/ArtifactCleanup/Input/remaining:
|
||||
|
||||
remaining
|
||||
=========
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Multi-line string accepting any valid artifact name per line.
|
||||
:Description: Versi
|
||||
|
||||
|
||||
.. _JOBTMPL/ArtifactCleanup/Secrets:
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
|
||||
.. _JOBTMPL/ArtifactCleanup/Outputs:
|
||||
|
||||
Outputs
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/ArtifactCleanup/Optimizations:
|
||||
|
||||
Optimizations
|
||||
*************
|
||||
|
||||
This template offers no optimizations (reduced job runtime).
|
||||
141
doc/JobTemplate/Cleanup/IntermediateCleanup.rst
Normal file
@@ -0,0 +1,141 @@
|
||||
.. _JOBTMPL/IntermediateCleanUp:
|
||||
.. index::
|
||||
single: delete-artifact; IntermediateCleanUp Template
|
||||
single: GitHub Action Reusable Workflow; IntermediateCleanUp Template
|
||||
|
||||
IntermediateCleanUp
|
||||
###################
|
||||
|
||||
The ``IntermediateCleanUp`` job template is used to remove intermediate artifacts like unit test artifacts for each job
|
||||
variant after test results have been merged into a single file.
|
||||
|
||||
.. topic:: Features
|
||||
|
||||
* Delete artifacts from pipeline.
|
||||
|
||||
.. topic:: Behavior
|
||||
|
||||
1. Delete all SQLite code coverage artifacts if given as a parameter.
|
||||
2. Delete all JUnit XML report artifacts if given as a parameter.
|
||||
|
||||
.. topic:: Job Execution
|
||||
|
||||
.. image:: ../../_static/pyTooling-Actions-IntermediateCleanUp.png
|
||||
:width: 400px
|
||||
|
||||
.. topic:: Dependencies
|
||||
|
||||
* :gh:`geekyeggo/delete-artifact`
|
||||
|
||||
|
||||
.. _JOBTMPL/IntermediateCleanUp/Instantiation:
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
The following instantiation example creates a ``Params`` job derived from job template ``Parameters`` version ``@r6``. It only
|
||||
requires a `name` parameter to create the artifact names.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
IntermediateCleanUp:
|
||||
uses: pyTooling/Actions/.github/workflows/IntermediateCleanUp.yml@r6
|
||||
needs:
|
||||
- UnitTestingParams
|
||||
- PublishCoverageResults
|
||||
- PublishTestResults
|
||||
if: success() || failure()
|
||||
with:
|
||||
sqlite_coverage_artifacts_prefix: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }}-
|
||||
xml_unittest_artifacts_prefix: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}-
|
||||
|
||||
.. seealso::
|
||||
|
||||
:ref:`JOBTMPL/ArtifactCleanup`
|
||||
``ArtifactCleanup`` is used to remove artifacts like unit test report artifacts after artifact's content has been
|
||||
(post-)processed or published.
|
||||
|
||||
|
||||
.. _JOBTMPL/IntermediateCleanUp/Parameters:
|
||||
|
||||
Parameter Summary
|
||||
*****************
|
||||
|
||||
.. rubric:: Goto :ref:`input parameters <JOBTMPL/IntermediateCleanUp/Inputs>`
|
||||
|
||||
+----------------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+============================================================================+==========+==========+===================================================+
|
||||
| :ref:`JOBTMPL/IntermediateCleanUp/Input/ubuntu_image_version` | no | string | ``'24.04'`` |
|
||||
+----------------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/IntermediateCleanUp/Input/sqlite_coverage_artifacts_prefix` | no | string | ``''`` |
|
||||
+----------------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
| :ref:`JOBTMPL/IntermediateCleanUp/Input/xml_unittest_artifacts_prefix` | no | string | ``''`` |
|
||||
+----------------------------------------------------------------------------+----------+----------+---------------------------------------------------+
|
||||
|
||||
.. rubric:: Goto :ref:`secrets <JOBTMPL/IntermediateCleanUp/Secrets>`
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
.. rubric:: Goto :ref:`output parameters <JOBTMPL/IntermediateCleanUp/Outputs>`
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/IntermediateCleanUp/Inputs:
|
||||
|
||||
Input Parameters
|
||||
****************
|
||||
|
||||
.. _JOBTMPL/IntermediateCleanUp/Input/ubuntu_image_version:
|
||||
|
||||
.. include:: ../_ubuntu_image_version.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/IntermediateCleanUp/Input/sqlite_coverage_artifacts_prefix:
|
||||
|
||||
sqlite_coverage_artifacts_prefix
|
||||
================================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid artifact name including ``*``.
|
||||
:Description: Prefix for SQLite coverage artifacts to be removed.
|
||||
|
||||
|
||||
.. _JOBTMPL/IntermediateCleanUp/Input/xml_unittest_artifacts_prefix:
|
||||
|
||||
xml_unittest_artifacts_prefix
|
||||
=============================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid artifact name including ``*``.
|
||||
:Description: Prefix for XML unittest artifacts to be removed.
|
||||
|
||||
|
||||
.. _JOBTMPL/IntermediateCleanUp/Secrets:
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
|
||||
.. _JOBTMPL/IntermediateCleanUp/Outputs:
|
||||
|
||||
Outputs
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/IntermediateCleanUp/Optimizations:
|
||||
|
||||
Optimizations
|
||||
*************
|
||||
|
||||
This template offers no optimizations (reduced job runtime).
|
||||
28
doc/JobTemplate/Cleanup/index.rst
Normal file
@@ -0,0 +1,28 @@
|
||||
.. _JOBTMPL/Cleanup:
|
||||
|
||||
Cleanup
|
||||
#######
|
||||
|
||||
The category *cleanup* provides workflow templates implementing artifact cleanups (removals) from pipelines.
|
||||
|
||||
Running lots of unit testing, platform testing and application testing variants (operating system |times| Python version
|
||||
|times| environment) creates dozens to hundrets of artifacts (unit test report, code coverage report, ...). This
|
||||
consumes pipeline storage which can be freed up. Moreover, it's unclear which artifacts contain the final unit test and
|
||||
code coverage reports. Thus, it's benefitial, to remove intermediate artifacts after merging reports into one summary
|
||||
report.
|
||||
|
||||
.. topic:: Intermediate cleanups
|
||||
|
||||
* :ref:`JOBTMPL/IntermediateCleanup` - remove intermediate artifacts after merging reports into one summary report.
|
||||
|
||||
|
||||
.. topic:: Final cleanups
|
||||
|
||||
* :ref:`JOBTMPL/ArtifactCleanup` - remove artifacts after publising results and creating release assets.
|
||||
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
||||
IntermediateCleanup
|
||||
ArtifactCleanup
|
||||
@@ -1,168 +0,0 @@
|
||||
.. _JOBTMPL/CodeCoverage:
|
||||
|
||||
CoverageCollection
|
||||
##################
|
||||
|
||||
This jobs runs the specified unit tests with activated code coverage collection (incl. branch coverage).
|
||||
|
||||
It uses pytest, pytest-cov and coverage.py in a single job run, thus it uses one fixed Python version (usually latest).
|
||||
It generates HTML and Cobertura reports (XML), then it uploads the HTML report as an artifact and the jUnit test results
|
||||
(XML) to `Codecov <https://about.codecov.io/>`__ and `Codacy <https://www.codacy.com/>`__.
|
||||
|
||||
Configuration options to ``pytest`` and ``coverage.py`` should be given via sections ``[tool.pytest.ini_options]`` and
|
||||
``[tool.coverage.*]`` in a ``pyproject.toml`` file.
|
||||
|
||||
**Behavior:**
|
||||
|
||||
1. Checkout repository
|
||||
2. Setup Python and install dependencies
|
||||
3. Extract configuration from ``pyproject.toml`` or ``.coveragerc``.
|
||||
4. Run unit tests and collect code coverage
|
||||
5. Convert coverage data to a Cobertura XML file
|
||||
6. Convert coverage data to a HTML report
|
||||
7. Upload HTML report as an artifact
|
||||
8. Publish Cobertura file to CodeCov
|
||||
9. Publish Cobertura file to Codacy
|
||||
|
||||
**Preconditions:**
|
||||
|
||||
* A CodeCov account was created.
|
||||
* A Codacy account was created.
|
||||
|
||||
**Requirements:**
|
||||
|
||||
Setup a secret (e.g. ``codacy_token``) in GitHub to handover the Codacy project token to the job.
|
||||
|
||||
**Dependencies:**
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`actions/setup-python`
|
||||
* :gh:`actions/upload-artifact`
|
||||
* :gh:`codecov/codecov-action`
|
||||
* :gh:`codacy/codacy-coverage-reporter-action`
|
||||
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
Simple Example
|
||||
==============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Coverage:
|
||||
uses: pyTooling/Actions/.github/workflows/CoverageCollection.yml@r4
|
||||
with:
|
||||
artifact: Coverage
|
||||
secrets: inherit
|
||||
|
||||
Complex Example
|
||||
===============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Coverage:
|
||||
uses: pyTooling/Actions/.github/workflows/CoverageCollection.yml@r4
|
||||
needs:
|
||||
- Params
|
||||
with:
|
||||
python_version: ${{ needs.Params.outputs.python_version }}
|
||||
artifact: ${{ fromJson(needs.Params.outputs.artifact_names).codecoverage_html }}
|
||||
secrets: inherit
|
||||
|
||||
Parameters
|
||||
**********
|
||||
|
||||
python_version
|
||||
==============
|
||||
|
||||
+----------------+----------+----------+----------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==========+
|
||||
| python_version | optional | string | 3.11 |
|
||||
+----------------+----------+----------+----------+
|
||||
|
||||
Python version used for running unit tests.
|
||||
|
||||
|
||||
requirements
|
||||
============
|
||||
|
||||
+----------------+----------+----------+-------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+===============================+
|
||||
| requirements | optional | string | ``-r tests/requirements.txt`` |
|
||||
+----------------+----------+----------+-------------------------------+
|
||||
|
||||
Python dependencies to be installed through pip.
|
||||
|
||||
|
||||
tests_directory
|
||||
===============
|
||||
|
||||
+-----------------+----------+----------+-----------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=================+==========+==========+===========+
|
||||
| tests_directory | optional | string | ``tests`` |
|
||||
+-----------------+----------+----------+-----------+
|
||||
|
||||
Path to the directory containing tests (test working directory).
|
||||
|
||||
|
||||
unittest_directory
|
||||
==================
|
||||
|
||||
+--------------------+----------+----------+-----------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+====================+==========+==========+===========+
|
||||
| unittest_directory | optional | string | ``unit`` |
|
||||
+--------------------+----------+----------+-----------+
|
||||
|
||||
Path to the directory containing unit tests (relative to tests_directory).
|
||||
|
||||
|
||||
coverage_config
|
||||
===============
|
||||
|
||||
+-----------------+----------+----------+--------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=================+==========+==========+====================+
|
||||
| coverage_config | optional | string | ``pyproject.toml`` |
|
||||
+-----------------+----------+----------+--------------------+
|
||||
|
||||
Path to the ``.coveragerc`` file. Use ``pyproject.toml`` by default.
|
||||
|
||||
|
||||
artifact
|
||||
========
|
||||
|
||||
+----------------+----------+----------+--------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==============+
|
||||
| artifact | yes | string | — — — — |
|
||||
+----------------+----------+----------+--------------+
|
||||
|
||||
Name of the coverage artifact.
|
||||
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
codacy_token
|
||||
============
|
||||
|
||||
+----------------+----------+----------+--------------+
|
||||
| Secret Name | Required | Type | Default |
|
||||
+================+==========+==========+==============+
|
||||
| codacy_token | yes | string | — — — — |
|
||||
+----------------+----------+----------+--------------+
|
||||
|
||||
Token to push result to codacy.
|
||||
|
||||
|
||||
Results
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
10
doc/JobTemplate/Deprecated/BuildTheDocs.rst
Normal file
@@ -0,0 +1,10 @@
|
||||
.. _JOBTMPL/BuildTheDocs:
|
||||
|
||||
BuildTheDocs
|
||||
############
|
||||
|
||||
.. attention::
|
||||
|
||||
The ``BuildTheDocs`` job template is deprecated.
|
||||
|
||||
See :ref:`JOBTMPL/SphinxDocumentation` and :ref:`JOBTMPL/LaTeXDocumentation`.
|
||||
10
doc/JobTemplate/Deprecated/CoverageCollection.rst
Normal file
@@ -0,0 +1,10 @@
|
||||
.. _JOBTMPL/CoverageCollection:
|
||||
|
||||
CoverageCollection
|
||||
##################
|
||||
|
||||
.. attention::
|
||||
|
||||
The ``CoverageCollection`` job template is deprecated.
|
||||
|
||||
See :ref:`JOBTMPL/UnitTesting` and :ref:`JOBTMPL/PublishCoverageResults`.
|
||||
10
doc/JobTemplate/Deprecated/NightlyRelease.rst
Normal file
@@ -0,0 +1,10 @@
|
||||
.. _JOBTMPL/NightlyRelease:
|
||||
|
||||
NightlyRelease
|
||||
##############
|
||||
|
||||
.. attention::
|
||||
|
||||
The ``NightlyRelease`` job template is deprecated.
|
||||
|
||||
See :ref:`JOBTMPL/PublishReleaseNotes`.
|
||||
20
doc/JobTemplate/Deprecated/index.rst
Normal file
@@ -0,0 +1,20 @@
|
||||
.. _JOBTMPL/Deprecated:
|
||||
|
||||
Deprecated
|
||||
##########
|
||||
|
||||
The category *deprecated* collects outdated job templates:
|
||||
|
||||
:ref:`JOBTMPL/CoverageCollection`
|
||||
replaced by :ref:`JOBTMPL/UnitTesting`
|
||||
:ref:`JOBTMPL/NightlyRelease`
|
||||
replaced by :ref:`JOBTMPL/PublishReleaseNotes`
|
||||
:ref:`JOBTMPL/BuildTheDocs`
|
||||
replaced by :ref:`JOBTMPL/SphinxDocumentation` and :ref:`JOBTMPL/LaTeXDocumentation`
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
||||
CoverageCollection
|
||||
NightlyRelease
|
||||
BuildTheDocs
|
||||
188
doc/JobTemplate/Documentation/LaTeXDocumentation.rst
Normal file
@@ -0,0 +1,188 @@
|
||||
.. _JOBTMPL/LaTeXDocumentation:
|
||||
.. index::
|
||||
single: MikTeX; LaTeXDocumentation Template
|
||||
single: GitHub Action Reusable Workflow; LaTeXDocumentation Template
|
||||
|
||||
LaTeXDocumentation
|
||||
##################
|
||||
|
||||
The ``LaTeXDocumentation`` job template downloads an artifact containing a LaTeX document and translates to a PDF file
|
||||
using MikTeX.
|
||||
|
||||
The translation process uses ``latexmk`` for handling multiple passes. The default LaTeX processor is ``xelatex``, but
|
||||
can be switched by a parameter.
|
||||
|
||||
.. topic:: Features
|
||||
|
||||
* Translate a LaTeX document to PDF.
|
||||
|
||||
.. topic:: Behavior
|
||||
|
||||
1. Download the LaTeX artifact.
|
||||
2. Build the PDF using ``latexmk``.
|
||||
3. Upload the generated PDF as an artifact.
|
||||
|
||||
.. topic:: Dependencies
|
||||
|
||||
* :gh:`pyTooling/download-artifact`
|
||||
|
||||
* :gh:`actions/download-artifact`
|
||||
|
||||
* :gh:`pyTooling/upload-artifact`
|
||||
|
||||
* :gh:`actions/upload-artifact`
|
||||
|
||||
* :gh:`addnab/docker-run-action`
|
||||
|
||||
* :dockerhub:`pytooling/miktex <pytooling/miktex:sphinx>`
|
||||
|
||||
|
||||
.. _JOBTMPL/LaTeXDocumentation/Instantiation:
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
UnitTestingParams:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
|
||||
with:
|
||||
package_name: myPackage
|
||||
|
||||
Documentation:
|
||||
uses: pyTooling/Actions/.github/workflows/SphinxDocumentation.yml@r6
|
||||
needs:
|
||||
- UnitTestingParams
|
||||
with:
|
||||
python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
|
||||
html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_html }}
|
||||
latex_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_latex }}
|
||||
|
||||
PDFDocumentation:
|
||||
uses: pyTooling/Actions/.github/workflows/LaTeXDocumentation.yml@r6
|
||||
needs:
|
||||
- UnitTestingParams
|
||||
- Documentation
|
||||
with:
|
||||
document: pyEDAA.ProjectModel
|
||||
latex_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_latex }}
|
||||
pdf_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_pdf }}
|
||||
|
||||
|
||||
.. _JOBTMPL/LaTeXDocumentation/Parameters:
|
||||
|
||||
Parameter Summary
|
||||
*****************
|
||||
|
||||
.. rubric:: Goto :ref:`input parameters <JOBTMPL/LaTeXDocumentation/Inputs>`
|
||||
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=====================================================================+==========+==========+===================================================================+
|
||||
| :ref:`JOBTMPL/LaTeXDocumentation/Input/ubuntu_image_version` | no | string | ``'24.04'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/LaTeXDocumentation/Input/latex_artifact` | yes | string | — — — — |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/LaTeXDocumentation/Input/document` | yes | string | — — — — |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/LaTeXDocumentation/Input/processor` | no | string | ``'xelatex'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/LaTeXDocumentation/Input/pdf_artifact` | no | string | ``''`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
|
||||
.. rubric:: Goto :ref:`secrets <JOBTMPL/LaTeXDocumentation/Secrets>`
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
.. rubric:: Goto :ref:`output parameters <JOBTMPL/LaTeXDocumentation/Outputs>`
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/LaTeXDocumentation/Inputs:
|
||||
|
||||
Input Parameters
|
||||
****************
|
||||
|
||||
.. _JOBTMPL/LaTeXDocumentation/Input/ubuntu_image_version:
|
||||
|
||||
.. include:: ../_ubuntu_image_version.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/LaTeXDocumentation/Input/latex_artifact:
|
||||
|
||||
latex_artifact
|
||||
==============
|
||||
|
||||
:Type: string
|
||||
:Required: yes
|
||||
:Default Value: — — — —
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the LaTeX document to translate.
|
||||
|
||||
|
||||
.. _JOBTMPL/LaTeXDocumentation/Input/document:
|
||||
|
||||
document
|
||||
========
|
||||
|
||||
:Type: string
|
||||
:Required: yes
|
||||
:Default Value: — — — —
|
||||
:Possible Values: Any valid document name.
|
||||
:Description: Name of the LaTeX document
|
||||
|
||||
|
||||
.. _JOBTMPL/LaTeXDocumentation/Input/processor:
|
||||
|
||||
processor
|
||||
=========
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'xelatex'``
|
||||
:Possible Values: Any supported LaTeX processor supported by MikTeX and ``latexmk``.
|
||||
:Description: Name of the used LaTeX processor.
|
||||
|
||||
|
||||
.. _JOBTMPL/LaTeXDocumentation/Input/pdf_artifact:
|
||||
|
||||
pdf_artifact
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the generated PDF document.
|
||||
:Optimization:
|
||||
.. hint::
|
||||
|
||||
If this parameter is empty, no PDF file will be generated and no artifact will be uploaded.
|
||||
|
||||
.. _JOBTMPL/LaTeXDocumentation/Secrets:
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
|
||||
.. _JOBTMPL/LaTeXDocumentation/Outputs:
|
||||
|
||||
Outputs
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/LaTeXDocumentation/Optimizations:
|
||||
|
||||
Optimizations
|
||||
*************
|
||||
|
||||
The following optimizations can be used to reduce the template's runtime.
|
||||
|
||||
Disable PDF generation and PDF artifact
|
||||
If parameter :ref:`JOBTMPL/LaTeXDocumentation/Input/pdf_artifact` is empty, no PDF will be generated and uploaded.
|
||||
178
doc/JobTemplate/Documentation/PublishToGitHubPages.rst
Normal file
@@ -0,0 +1,178 @@
|
||||
.. _JOBTMPL/PublishToGitHubPages:
|
||||
.. index::
|
||||
single: GitHub Pages; PublishToGitHubPages Template
|
||||
single: GitHub Action Reusable Workflow; PublishToGitHubPages Template
|
||||
|
||||
PublishToGitHubPages
|
||||
####################
|
||||
|
||||
This job template publishes HTML content from artifacts of other jobs to GitHub Pages.
|
||||
|
||||
.. topic:: Features
|
||||
|
||||
tbd
|
||||
|
||||
|
||||
.. topic:: Behavior
|
||||
|
||||
1. Checkout repository.
|
||||
2. Download artifacts.
|
||||
3. Push HTML files to branch ``gh-pages``.
|
||||
|
||||
.. topic:: Job Execution
|
||||
|
||||
.. image:: ../../_static/pyTooling-Actions-PublishToGitHubPages.png
|
||||
:width: 500px
|
||||
|
||||
.. topic:: Dependencies
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`pyTooling/download-artifact`
|
||||
|
||||
* :gh:`actions/download-artifact`
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishToGitHubPages/Instantiation:
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
.. grid:: 2
|
||||
|
||||
.. grid-item::
|
||||
:columns: 5
|
||||
|
||||
.. rubric:: Simple Example
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
BuildTheDocs:
|
||||
# ...
|
||||
|
||||
PublishToGitHubPages:
|
||||
uses: pyTooling/Actions/.github/workflows/PublishToGitHubPages.yml@r6
|
||||
needs:
|
||||
- BuildTheDocs
|
||||
with:
|
||||
doc: Documentation
|
||||
|
||||
.. grid-item::
|
||||
:columns: 5
|
||||
|
||||
.. rubric:: Complex Example
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
PublishToGitHubPages:
|
||||
uses: pyTooling/Actions/.github/workflows/PublishToGitHubPages.yml@r6
|
||||
needs:
|
||||
- Params
|
||||
- BuildTheDocs
|
||||
- Coverage
|
||||
- StaticTypeCheck
|
||||
with:
|
||||
doc: ${{ fromJson(needs.Params.outputs.artifact_names).documentation_html }}
|
||||
coverage: ${{ fromJson(needs.Params.outputs.artifact_names).codecoverage_html }}
|
||||
typing: ${{ fromJson(needs.Params.outputs.artifact_names).statictyping_html }}
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishToGitHubPages/Parameters:
|
||||
|
||||
Parameter Summary
|
||||
*****************
|
||||
|
||||
.. rubric:: Goto :ref:`input parameters <JOBTMPL/PublishToGitHubPages/Inputs>`
|
||||
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=====================================================================+==========+==========+===================================================================+
|
||||
| :ref:`JOBTMPL/PublishToGitHubPages/Input/ubuntu_image_version` | no | string | ``'24.04'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishToGitHubPages/Input/doc` | yes | string | — — — — |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishToGitHubPages/Input/coverage` | no | string | ``''`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishToGitHubPages/Input/typing` | no | string | ``''`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
|
||||
.. rubric:: Goto :ref:`secrets <JOBTMPL/PublishToGitHubPages/Secrets>`
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
.. rubric:: Goto :ref:`output parameters <JOBTMPL/PublishToGitHubPages/Outputs>`
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishToGitHubPages/Inputs:
|
||||
|
||||
Input Parameters
|
||||
****************
|
||||
|
||||
.. _JOBTMPL/PublishToGitHubPages/Input/ubuntu_image_version:
|
||||
|
||||
.. include:: ../_ubuntu_image_version.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishToGitHubPages/Input/doc:
|
||||
|
||||
doc
|
||||
===
|
||||
|
||||
:Type: string
|
||||
:Required: yes
|
||||
:Default Value: — — — —
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the documentation artifact containing the HTML website.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishToGitHubPages/Input/coverage:
|
||||
|
||||
coverage
|
||||
========
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the coverage artifact containing the HTML coverage report, which will be integrated as a
|
||||
subdirectory.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishToGitHubPages/Input/typing:
|
||||
|
||||
typing
|
||||
======
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the type checking artifact containing the HTML type checker report, which will be integrated
|
||||
as a subdirectory.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishToGitHubPages/Secrets:
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishToGitHubPages/Outputs:
|
||||
|
||||
Outputs
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishToGitHubPages/Optimizations:
|
||||
|
||||
Optimizations
|
||||
*************
|
||||
|
||||
This template offers no optimizations (reduced job runtime).
|
||||
327
doc/JobTemplate/Documentation/SphinxDocumentation.rst
Normal file
@@ -0,0 +1,327 @@
|
||||
.. _JOBTMPL/SphinxDocumentation:
|
||||
.. index::
|
||||
single: Sphinx; SphinxDocumentation Template
|
||||
single: GitHub Action Reusable Workflow; SphinxDocumentation Template
|
||||
|
||||
SphinxDocumentation
|
||||
###################
|
||||
|
||||
The ``SphinxDocumentation`` job template compiles the ReStructured Text documentation using :term:`Sphinx` to an HTML
|
||||
website and a LaTeX documentation. This LaTeX document can be translated using e.g. :term:`MikTeX` to a PDF file.
|
||||
|
||||
.. topic:: Features
|
||||
|
||||
* Build documentation using Sphinx as HTML and upload as artifact. |br|
|
||||
(see :ref:`JOBTMPL/SphinxDocumentation/Input/html_artifact`).
|
||||
* Build documentation using Sphinx as LaTeX and upload as artifact. |br|
|
||||
(see :ref:`JOBTMPL/SphinxDocumentation/Input/latex_artifact`).
|
||||
|
||||
* Workaround `sphinx-doc/sphinx#13189 <https://github.com/sphinx-doc/sphinx/issues/13189>`__
|
||||
* Workaround `sphinx-doc/sphinx#13190 <https://github.com/sphinx-doc/sphinx/issues/13190>`__
|
||||
|
||||
* Optionally: download code coverage artifact (JSON format) given by :ref:`JOBTMPL/SphinxDocumentation/Input/coverage_json_artifact`.
|
||||
* Optionally: download unit test report artifact (XML format) given by :ref:`JOBTMPL/SphinxDocumentation/Input/unittest_xml_artifact`.
|
||||
|
||||
.. topic:: Behavior
|
||||
|
||||
1. Checkout repository.
|
||||
2. Install system dependencies.
|
||||
3. Setup Python environment and install Python dependencies.
|
||||
4. Download optional artifacts for integration of further reports into the documentation.
|
||||
5. Build the HTML documentation using Sphinx.
|
||||
6. Build the LaTeX documentation using Sphinx.
|
||||
|
||||
1. Apply LaTeX workaround I.
|
||||
2. Apply LaTeX workaround II.
|
||||
|
||||
7. Upload the HTML and LaTeX artifacts.
|
||||
|
||||
.. topic:: Job Execution
|
||||
|
||||
.. image:: ../../_static/pyTooling-Actions-SphinxDocumentation.png
|
||||
:width: 600px
|
||||
|
||||
.. topic:: Dependencies
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`actions/setup-python`
|
||||
* :gh:`pyTooling/download-artifact`
|
||||
|
||||
* :gh:`actions/download-artifact`
|
||||
|
||||
* :gh:`pyTooling/upload-artifact`
|
||||
|
||||
* :gh:`actions/upload-artifact`
|
||||
|
||||
* apt
|
||||
|
||||
* `graphviz <https://graphviz.org/>`__
|
||||
|
||||
* pip
|
||||
|
||||
* :pypi:`wheel`
|
||||
* Python packages specified via :ref:`JOBTMPL/SphinxDocumentation/Input/requirements` parameter.
|
||||
|
||||
|
||||
.. _JOBTMPL/SphinxDocumentation/Instantiation:
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
UnitTestingParams:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
|
||||
with:
|
||||
package_name: myPackage
|
||||
|
||||
Documentation:
|
||||
uses: pyTooling/Actions/.github/workflows/SphinxDocumentation.yml@r6
|
||||
needs:
|
||||
- UnitTestingParams
|
||||
with:
|
||||
python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
|
||||
html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_html }}
|
||||
latex_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_latex }}
|
||||
|
||||
|
||||
.. _JOBTMPL/SphinxDocumentation/Parameters:
|
||||
|
||||
Parameter Summary
|
||||
*****************
|
||||
|
||||
.. rubric:: Goto :ref:`input parameters <JOBTMPL/SphinxDocumentation/Inputs>`
|
||||
|
||||
+-------------------------------------------------------------------------+----------+----------------+-------------------------------------------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=========================================================================+==========+================+===================================================================+
|
||||
| :ref:`JOBTMPL/SphinxDocumentation/Input/ubuntu_image_version` | no | string | ``'24.04'`` |
|
||||
+-------------------------------------------------------------------------+----------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/SphinxDocumentation/Input/python_version` | no | string | ``'3.13'`` |
|
||||
+-------------------------------------------------------------------------+----------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/SphinxDocumentation/Input/requirements` | no | string | ``'-r doc/requirements.txt'`` |
|
||||
+-------------------------------------------------------------------------+----------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/SphinxDocumentation/Input/doc_directory` | no | string | ``'doc'`` |
|
||||
+-------------------------------------------------------------------------+----------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/SphinxDocumentation/Input/coverage_json_artifact` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/SphinxDocumentation/Input/coverage_report_json` | no | string (JSON) | :jsoncode:`{"directory": "report/coverage"}` |
|
||||
+-------------------------------------------------------------------------+----------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/SphinxDocumentation/Input/unittest_xml_artifact` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/SphinxDocumentation/Input/unittest_xml` | no | string (JSON) | :jsoncode:`{"directory": "report/unit"}` |
|
||||
+-------------------------------------------------------------------------+----------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/SphinxDocumentation/Input/html_artifact` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/SphinxDocumentation/Input/latex_artifact` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------------+-------------------------------------------------------------------+
|
||||
|
||||
.. rubric:: Goto :ref:`secrets <JOBTMPL/SphinxDocumentation/Secrets>`
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
.. rubric:: Goto :ref:`output parameters <JOBTMPL/SphinxDocumentation/Outputs>`
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/SphinxDocumentation/Inputs:
|
||||
|
||||
Input Parameters
|
||||
****************
|
||||
|
||||
.. _JOBTMPL/SphinxDocumentation/Input/ubuntu_image_version:
|
||||
|
||||
.. include:: ../_ubuntu_image_version.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/SphinxDocumentation/Input/python_version:
|
||||
|
||||
.. include:: ../_python_version.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/SphinxDocumentation/Input/requirements:
|
||||
|
||||
requirements
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'-r doc/requirements.txt'``
|
||||
:Possible Values: Any valid list of parameters for ``pip install``. |br|
|
||||
Either a requirements file can be referenced using ``'-r path/to/requirements.txt'``, or a list of
|
||||
packages can be specified using a space separated list like ``'Sphinx sphinx_rtd_theme sphinxcontrib-mermaid'``.
|
||||
:Description: Python dependencies to be installed through *pip*.
|
||||
|
||||
|
||||
.. _JOBTMPL/SphinxDocumentation/Input/doc_directory:
|
||||
|
||||
doc_directory
|
||||
=============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'doc'``
|
||||
:Possible Values: Any valid directory or sub-directory.
|
||||
:Description: Directory where the Sphinx documentation is located.
|
||||
|
||||
.. attention::
|
||||
|
||||
When this parameter gets changed, :ref:`JOBTMPL/SphinxDocumentation/Input/requirements` needs to be
|
||||
adjusted as well.
|
||||
|
||||
|
||||
.. _JOBTMPL/SphinxDocumentation/Input/coverage_json_artifact:
|
||||
|
||||
coverage_json_artifact
|
||||
======================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the code coverage report in JSON format.
|
||||
|
||||
|
||||
.. _JOBTMPL/SphinxDocumentation/Input/coverage_report_json:
|
||||
|
||||
coverage_report_json
|
||||
====================
|
||||
|
||||
:Type: string (JSON)
|
||||
:Required: no
|
||||
:Default Value:
|
||||
.. code-block:: json
|
||||
|
||||
{ "directory": "reports/coverage",
|
||||
}
|
||||
:Possible Values: Any valid JSON string containing a JSON object with fields:
|
||||
|
||||
:directory: Directory or sub-directory where the code coverage JSON report will be extracted from
|
||||
:ref:`artifact <JOBTMPL/SphinxDocumentation/Input/coverage_json_artifact>`.
|
||||
:Description: Directory as JSON object where the code coverage JSON report will be extracted. |br|
|
||||
This path is configured in :file:`pyproject.toml` and can be extracted by
|
||||
:ref:`JOBTMPL/ExtractConfiguration`.
|
||||
:Example:
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
Documentation:
|
||||
uses: pyTooling/Actions/.github/workflows/SphinxDocumentation.yml@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
...
|
||||
coverage_report_json: ${{ needs.ConfigParams.outputs.coverage_report_json }}
|
||||
|
||||
|
||||
.. _JOBTMPL/SphinxDocumentation/Input/unittest_xml_artifact:
|
||||
|
||||
unittest_xml_artifact
|
||||
=====================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the unittest XML report summary in XML format.
|
||||
|
||||
|
||||
.. _JOBTMPL/SphinxDocumentation/Input/unittest_xml:
|
||||
|
||||
unittest_xml
|
||||
============
|
||||
|
||||
:Type: string (JSON)
|
||||
:Required: no
|
||||
:Default Value:
|
||||
.. code-block:: json
|
||||
|
||||
{ "directory": "reports/unit",
|
||||
}
|
||||
:Possible Values: Any valid JSON string containing a JSON object with fields:
|
||||
|
||||
:directory: Directory or sub-directory where the unittest JUnit XML report will be extracted from
|
||||
:ref:`artifact <JOBTMPL/SphinxDocumentation/Input/unittest_xml_artifact>`.
|
||||
:Description: Directory as JSON object where the unittest JUnit XML report will be extracted. |br|
|
||||
This path is configured in :file:`pyproject.toml` and can be extracted by
|
||||
:ref:`JOBTMPL/ExtractConfiguration`.
|
||||
:Example:
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
Documentation:
|
||||
uses: pyTooling/Actions/.github/workflows/SphinxDocumentation.yml@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
...
|
||||
unittest_xml: ${{ needs.ConfigParams.outputs.unittest_xml }}
|
||||
|
||||
|
||||
.. _JOBTMPL/SphinxDocumentation/Input/html_artifact:
|
||||
|
||||
html_artifact
|
||||
=============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the generated HTML website.
|
||||
:Optimization:
|
||||
.. hint::
|
||||
|
||||
If this parameter is empty, no HTML website will be generated and no artifact will be uploaded.
|
||||
|
||||
|
||||
.. _JOBTMPL/SphinxDocumentation/Input/latex_artifact:
|
||||
|
||||
latex_artifact
|
||||
==============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the generated LaTeX document and resource files (e.g., images).
|
||||
:Optimization:
|
||||
.. hint::
|
||||
|
||||
If this parameter is empty, no LaTeX document will be generated and no artifact will be uploaded.
|
||||
|
||||
|
||||
.. _JOBTMPL/SphinxDocumentation/Secrets:
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
|
||||
.. _JOBTMPL/SphinxDocumentation/Outputs:
|
||||
|
||||
Outputs
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/SphinxDocumentation/Optimizations:
|
||||
|
||||
Optimizations
|
||||
*************
|
||||
|
||||
The following optimizations can be used to reduce the template's runtime.
|
||||
|
||||
Disable HTML website generation and HTML artifact
|
||||
If parameter :ref:`JOBTMPL/SphinxDocumentation/Input/html_artifact` is empty, no HTML website will be generated and
|
||||
uploaded.
|
||||
Disable LaTeX document generation and LaTeX artifact
|
||||
If parameter :ref:`JOBTMPL/SphinxDocumentation/Input/latex_artifact` is empty, no LaTeX document will be generated and
|
||||
uploaded.
|
||||
17
doc/JobTemplate/Documentation/index.rst
Normal file
@@ -0,0 +1,17 @@
|
||||
.. _JOBTMPL/Documentation:
|
||||
|
||||
Documentation
|
||||
#############
|
||||
|
||||
The category *documentation* provides workflow templates implementing
|
||||
|
||||
* :ref:`JOBTMPL/SphinxDocumentation` - Translate ReStructured Text to HTML and LaTeX using Sphinx.
|
||||
* :ref:`JOBTMPL/LaTeXDocumentation` - Translate LaTeX to PDF using MikTeX.
|
||||
* :ref:`JOBTMPL/PublishToGitHubPages` - Upload HTML content to GitHub Pages.
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
||||
SphinxDocumentation
|
||||
LaTeXDocumentation
|
||||
PublishToGitHubPages
|
||||
@@ -1,106 +0,0 @@
|
||||
.. _JOBTMPL/Package:
|
||||
|
||||
Package
|
||||
#######
|
||||
|
||||
This job packages the Python source code as a source package (``*.tar.gz``) and wheel package (``*.whl``) and uploads it
|
||||
as an artifact.
|
||||
|
||||
**Behavior:**
|
||||
|
||||
1. Checkout repository
|
||||
2. Setup Python and install dependencies
|
||||
3. Package Python sources:
|
||||
|
||||
* If parameter ``requirements`` is empty, use ``build`` package and run ``python build``.
|
||||
* If parameter ``requirements`` is ``no-isolation``, use ``build`` package in *no-isolation* mode and run
|
||||
``python build``.
|
||||
* If parameter ``requirements`` is non-empty, use ``setuptools`` package and run ``python setup.py``.
|
||||
|
||||
**Dependencies:**
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`actions/setup-python`
|
||||
* :gh:`actions/upload-artifact`
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
Simple Example
|
||||
==============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Package:
|
||||
uses: pyTooling/Actions/.github/workflows/Package.yml@r4
|
||||
with:
|
||||
artifact: Package
|
||||
|
||||
|
||||
Complex Example
|
||||
===============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Package:
|
||||
uses: pyTooling/Actions/.github/workflows/Package.yml@r4
|
||||
needs:
|
||||
- Params
|
||||
- Coverage
|
||||
with:
|
||||
python_version: ${{ needs.Params.outputs.python_version }}
|
||||
requirements: -r build/requirements.txt
|
||||
artifact: ${{ fromJson(needs.Params.outputs.artifact_names).package_all }}
|
||||
|
||||
|
||||
Parameters
|
||||
**********
|
||||
|
||||
python_version
|
||||
==============
|
||||
|
||||
+----------------+----------+----------+----------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==========+
|
||||
| python_version | optional | string | 3.11 |
|
||||
+----------------+----------+----------+----------+
|
||||
|
||||
Python version.
|
||||
|
||||
|
||||
requirements
|
||||
============
|
||||
|
||||
+----------------+----------+----------+----------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==========+
|
||||
| requirements | optional | string | ``""`` |
|
||||
+----------------+----------+----------+----------+
|
||||
|
||||
Python dependencies to be installed through pip; if empty, use pyproject.toml through build.
|
||||
|
||||
|
||||
artifact
|
||||
========
|
||||
|
||||
+----------------+----------+----------+----------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==========+
|
||||
| artifact | yes | string | — — — — |
|
||||
+----------------+----------+----------+----------+
|
||||
|
||||
Name of the package artifact.
|
||||
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
|
||||
Results
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
184
doc/JobTemplate/Package/InstallPackage.rst
Normal file
@@ -0,0 +1,184 @@
|
||||
.. _JOBTMPL/InstallPackage:
|
||||
.. index::
|
||||
single: pip; InstallPackage Template
|
||||
single: GitHub Action Reusable Workflow; InstallPackage Template
|
||||
|
||||
InstallPackage (beta)
|
||||
#####################
|
||||
|
||||
The ``InstallPackage`` job template takes a generated Python package and installs it on the target platform. Afterwards
|
||||
the installation is verified. This aims for packaging and dependency mistakes in the package.
|
||||
|
||||
.. topic:: Features
|
||||
|
||||
* Install generated Python package on the target platform.
|
||||
* Verify the installed package's version.
|
||||
|
||||
.. topic:: Behavior
|
||||
|
||||
* Download Python package as artifact.
|
||||
* Prepare the Python environment.
|
||||
* Install the Python package using :term:`pip`.
|
||||
* Read out and verify the package version.
|
||||
|
||||
.. topic:: Job Execution
|
||||
|
||||
.. image:: ../../_static/pyTooling-Actions-InstallPackage.png
|
||||
:width: 500px
|
||||
|
||||
.. topic:: Dependencies
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`pyTooling/download-artifact`
|
||||
|
||||
* :gh:`actions/download-artifact`
|
||||
|
||||
* :gh:`msys2/setup-msys2`
|
||||
* :gh:`actions/setup-python`
|
||||
* pip
|
||||
|
||||
* :pypi:`pip`
|
||||
* :pypi:`wheel`
|
||||
|
||||
|
||||
.. _JOBTMPL/InstallPackage/Instantiation:
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
The following instantiation example creates a ``Install`` job derived from job template ``InstallPackage`` version
|
||||
`@r6`. It installs the Python package on various platforms using a precomputed job-matrix created by job
|
||||
``InstallParams``. This job uses the same ``Parameters`` job template as job ``UnitTestingParams``, which was used to
|
||||
define parameters for the packaging job ``Package``.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
UnitTestingParams:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
|
||||
with:
|
||||
package_name: myPackage
|
||||
|
||||
InstallParams:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
|
||||
with:
|
||||
package_name: myPackage
|
||||
python_version_list: ''
|
||||
|
||||
Package:
|
||||
uses: pyTooling/Actions/.github/workflows/Package.yml@r6
|
||||
needs:
|
||||
- UnitTestingParams
|
||||
with:
|
||||
artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }}
|
||||
|
||||
Install:
|
||||
uses: pyTooling/Actions/.github/workflows/InstallPackage.yml@r6
|
||||
needs:
|
||||
- UnitTestingParams
|
||||
- InstallParams
|
||||
- Package
|
||||
with:
|
||||
jobs: ${{ needs.InstallParams.outputs.python_jobs }}
|
||||
wheel: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }}
|
||||
package_name: ${{ needs.UnitTestingParams.outputs.package_fullname }}
|
||||
|
||||
|
||||
.. _JOBTMPL/InstallPackage/Parameters:
|
||||
|
||||
Parameter Summary
|
||||
*****************
|
||||
|
||||
.. rubric:: Goto :ref:`input parameters <JOBTMPL/InstallPackage/Inputs>`
|
||||
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=========================================================================+==========+==========+===================================================================================================================================+
|
||||
| :ref:`JOBTMPL/InstallPackage/Input/jobs` | yes | string | — — — — |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/InstallPackage/Input/wheel` | yes | string | — — — — |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/InstallPackage/Input/package_name` | yes | string | — — — — |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
|
||||
.. rubric:: Goto :ref:`secrets <JOBTMPL/InstallPackage/Secrets>`
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
.. rubric:: Goto :ref:`output parameters <JOBTMPL/InstallPackage/Outputs>`
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/InstallPackage/Inputs:
|
||||
|
||||
Input Parameters
|
||||
****************
|
||||
|
||||
.. _JOBTMPL/InstallPackage/Input/jobs:
|
||||
|
||||
jobs
|
||||
====
|
||||
|
||||
:Type: string
|
||||
:Required: yes
|
||||
:Default Value: — — — —
|
||||
:Possible Values: A JSON string with an array of dictionaries with the following key-value pairs:
|
||||
|
||||
:sysicon: icon to display
|
||||
:system: name of the system
|
||||
:runs-on: virtual machine image and base operating system
|
||||
:runtime: name of the runtime environment if not running natively on the VM image
|
||||
:shell: name of the shell
|
||||
:pyicon: icon for CPython or pypy
|
||||
:python: Python version
|
||||
:envname: full name of the selected environment
|
||||
:Description: A JSON encoded job matrix to run multiple Python job variations.
|
||||
|
||||
|
||||
.. _JOBTMPL/InstallPackage/Input/wheel:
|
||||
|
||||
wheel
|
||||
=====
|
||||
|
||||
:Type: string
|
||||
:Required: yes
|
||||
:Default Value: — — — —
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: The artifact containing the packaged Python code as wheel.
|
||||
|
||||
|
||||
.. _JOBTMPL/InstallPackage/Input/package_name:
|
||||
|
||||
package_name
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: yes
|
||||
:Default Value: — — — —
|
||||
:Possible Values: Any valid Python package, subpackage or module name.
|
||||
:Description: The package or module containing the version information as a string in ``__version__``.
|
||||
|
||||
|
||||
.. _JOBTMPL/InstallPackage/Secrets:
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
|
||||
.. _JOBTMPL/InstallPackage/Outputs:
|
||||
|
||||
Outputs
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/InstallPackage/Optimizations:
|
||||
|
||||
Optimizations
|
||||
*************
|
||||
|
||||
This template offers no optimizations (reduced job runtime).
|
||||
175
doc/JobTemplate/Package/Package.rst
Normal file
@@ -0,0 +1,175 @@
|
||||
.. _JOBTMPL/Package:
|
||||
.. index::
|
||||
single: build; Package Template
|
||||
single: GitHub Action Reusable Workflow; Package Template
|
||||
|
||||
Package
|
||||
#######
|
||||
|
||||
This job packages the Python source code as a source package (``*.tar.gz``) and wheel package (``*.whl``) and uploads it
|
||||
as an artifact.
|
||||
|
||||
.. topic:: Features
|
||||
|
||||
* Package source code as wheel and source distribution.
|
||||
* Support packaging using :pypi:`build` (recommended) or :pypi:`setuptools`.
|
||||
|
||||
.. topic:: Behavior
|
||||
|
||||
1. Checkout repository.
|
||||
2. Setup Python and install dependencies.
|
||||
3. Package Python sources:
|
||||
|
||||
* If parameter :ref:`JOBTMPL/Package/Input/requirements` is empty, use :pypi:`build` for packaging and execute
|
||||
``python -m build ...``.
|
||||
* If parameter :ref:`JOBTMPL/Package/Input/requirements` is ``no-isolation``, use :pypi:`build` for packaging in
|
||||
*no-isolation* mode executing ``python -m build --no-isolation ...``.
|
||||
* If parameter :ref:`JOBTMPL/Package/Input/requirements` is non-empty, use :pypi:`setuptools` for package and
|
||||
execute ``python setup.py ...``.
|
||||
|
||||
.. topic:: Job Execution
|
||||
|
||||
.. image:: ../../_static/pyTooling-Actions-Package.png
|
||||
:width: 500px
|
||||
|
||||
.. topic:: Dependencies
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`actions/setup-python`
|
||||
* :gh:`pyTooling/upload-artifact`
|
||||
|
||||
* :gh:`actions/upload-artifact`
|
||||
|
||||
* pip
|
||||
|
||||
* :pypi:`build`
|
||||
* :pypi:`wheel`
|
||||
|
||||
|
||||
.. _JOBTMPL/Package/Instantiation:
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
Simple Example
|
||||
==============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Package:
|
||||
uses: pyTooling/Actions/.github/workflows/Package.yml@r6
|
||||
with:
|
||||
artifact: Package
|
||||
|
||||
|
||||
Complex Example
|
||||
===============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Package:
|
||||
uses: pyTooling/Actions/.github/workflows/Package.yml@r6
|
||||
needs:
|
||||
- Params
|
||||
with:
|
||||
python_version: ${{ needs.Params.outputs.python_version }}
|
||||
requirements: -r build/requirements.txt
|
||||
artifact: ${{ fromJson(needs.Params.outputs.artifact_names).package_all }}
|
||||
|
||||
|
||||
.. _JOBTMPL/Package/Parameters:
|
||||
|
||||
Parameter Summary
|
||||
*****************
|
||||
|
||||
.. rubric:: Goto :ref:`input parameters <JOBTMPL/Package/Inputs>`
|
||||
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=====================================================================+==========+==========+===================================================================+
|
||||
| :ref:`JOBTMPL/Package/Input/ubuntu_image_version` | no | string | ``'24.04'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Package/Input/python_version` | no | string | ``'3.13'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Package/Input/requirements` | no | string | ``''`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Package/Input/artifact` | yes | string | — — — — |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
|
||||
.. rubric:: Goto :ref:`secrets <JOBTMPL/Package/Secrets>`
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
.. rubric:: Goto :ref:`output parameters <JOBTMPL/Package/Outputs>`
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/Package/Inputs:
|
||||
|
||||
Input Parameters
|
||||
****************
|
||||
|
||||
.. _JOBTMPL/Package/Input/ubuntu_image_version:
|
||||
|
||||
.. include:: ../_ubuntu_image_version.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/Package/Input/python_version:
|
||||
|
||||
.. include:: ../_python_version.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/Package/Input/requirements:
|
||||
|
||||
requirements
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid list of parameters for ``pip install``. |br|
|
||||
Either a requirements file can be referenced using ``'-r path/to/requirements.txt'``, or a list of
|
||||
packages can be specified using a space separated list like ``'build wheel'``.
|
||||
:Behavior: If the value is an empty string, :pypi:`build` is used for packaging. |br|
|
||||
if the value is ``no-isolation``, :pypi:`build` is used in *no-isolation* mode for packaging. |br|
|
||||
otherwise, a list of requirements is assumed and :pypi:`setuptools` is used for packaging.
|
||||
:Description: Python dependencies to be installed through *pip*.
|
||||
|
||||
|
||||
.. _JOBTMPL/Package/Input/artifact:
|
||||
|
||||
artifact
|
||||
========
|
||||
|
||||
:Type: string
|
||||
:Required: yes
|
||||
:Default Value: — — — —
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the packaged Python code.
|
||||
|
||||
|
||||
.. _JOBTMPL/Package/Secrets:
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
|
||||
.. _JOBTMPL/Package/Outputs:
|
||||
|
||||
Outputs
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/Package/Optimizations:
|
||||
|
||||
Optimizations
|
||||
*************
|
||||
|
||||
This template offers no optimizations (reduced job runtime).
|
||||
210
doc/JobTemplate/Package/PublishOnPyPI.rst
Normal file
@@ -0,0 +1,210 @@
|
||||
.. _JOBTMPL/PublishOnPyPI:
|
||||
.. index::
|
||||
single: PyPI; PublishOnPyPI Template
|
||||
single: twine; PublishOnPyPI Template
|
||||
single: GitHub Action Reusable Workflow; PublishOnPyPI Template
|
||||
|
||||
PublishOnPyPI
|
||||
#############
|
||||
|
||||
Publish a wheel (``*.whl``) packages and/or source (``*.tar.gz``) package to :term:`PyPI`.
|
||||
|
||||
.. topic:: Features
|
||||
|
||||
* Publish a Python package to :term:`PyPI`.
|
||||
|
||||
.. topic:: Behavior
|
||||
|
||||
1. Download package artifact
|
||||
2. Publish source package(s) (``*.tar.gz``)
|
||||
3. Publish wheel package(s) (``*.whl``)
|
||||
4. Delete the artifact
|
||||
|
||||
.. topic:: Preconditions
|
||||
|
||||
1. A PyPI account was created and the package name is either not occupied or the user has access rights for that
|
||||
package.
|
||||
2. An access token was generated at PyPI, which can be used for uploading packages.
|
||||
3. A secret (e.g. ``PYPI_TOKEN``) was setup in GitHub Actions to handover the PyPI token to the pipeline.
|
||||
|
||||
.. topic:: Job Execution
|
||||
|
||||
.. image:: ../../_static/pyTooling-Actions-PublishOnPyPI.png
|
||||
:width: 500px
|
||||
|
||||
.. topic:: Dependencies
|
||||
|
||||
* :gh:`pyTooling/download-artifact`
|
||||
|
||||
* :gh:`actions/download-artifact`
|
||||
* :gh:`actions/setup-python`
|
||||
* :gh:`geekyeggo/delete-artifact`
|
||||
|
||||
* pip
|
||||
|
||||
* :pypi:`wheel`
|
||||
* :pypi:`twine`
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishOnPyPI/Instantiation:
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
Simple Example
|
||||
==============
|
||||
|
||||
The following example demonstrates how to publish the artifact named ``Package`` to PyPI on every pipeline run triggered
|
||||
by a Git tag. A secret is forwarded from GitHub secrets to a job secret.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
# ...
|
||||
|
||||
PublishOnPyPI:
|
||||
uses: pyTooling/Actions/.github/workflows/PublishOnPyPI.yml@r6
|
||||
if: startsWith(github.ref, 'refs/tags')
|
||||
with:
|
||||
artifact: Package
|
||||
secrets:
|
||||
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
|
||||
|
||||
Complex Example
|
||||
===============
|
||||
|
||||
In this more complex example, the job depends on a parameter creation (``Params``) and packaging job (``Package``). The
|
||||
used Python version is overwritten by a parameter calculated in the ``Params`` jobs. Also the artifact name is managed
|
||||
by that job. Finally, the list of requirements is overwritten to load a list of requirements from ``dist/requirements.txt``.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Params:
|
||||
# ...
|
||||
|
||||
Package:
|
||||
# ...
|
||||
|
||||
PublishOnPyPI:
|
||||
uses: pyTooling/Actions/.github/workflows/PublishOnPyPI.yml@r6
|
||||
if: startsWith(github.ref, 'refs/tags')
|
||||
needs:
|
||||
- Params
|
||||
- Package
|
||||
with:
|
||||
python_version: ${{ needs.Params.outputs.python_version }}
|
||||
requirements: -r dist/requirements.txt
|
||||
artifact: ${{ fromJson(needs.Params.outputs.artifact_names).package_all }}
|
||||
secrets:
|
||||
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
|
||||
|
||||
.. seealso::
|
||||
|
||||
:ref:`JOBTMPL/Package`
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishOnPyPI/Parameters:
|
||||
|
||||
Parameter Summary
|
||||
*****************
|
||||
|
||||
.. rubric:: Goto :ref:`input parameters <JOBTMPL/PublishOnPyPI/Inputs>`
|
||||
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=====================================================================+==========+==========+===================================================================+
|
||||
| :ref:`JOBTMPL/PublishOnPyPI/Input/ubuntu_image_version` | no | string | ``'24.04'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishOnPyPI/Input/python_version` | no | string | ``'3.13'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishOnPyPI/Input/requirements` | no | string | ``'wheel twine'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishOnPyPI/Input/artifact` | yes | string | — — — — |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
|
||||
.. rubric:: Goto :ref:`secrets <JOBTMPL/PublishOnPyPI/Secrets>`
|
||||
|
||||
+-----------------------------------------------------------+----------+----------+--------------+
|
||||
| Token Name | Required | Type | Default |
|
||||
+===========================================================+==========+==========+==============+
|
||||
| :ref:`JOBTMPL/PublishOnPyPI/Secret/PYPI_TOKEN` | no | string | — — — — |
|
||||
+-----------------------------------------------------------+----------+----------+--------------+
|
||||
|
||||
.. rubric:: Goto :ref:`output parameters <JOBTMPL/PublishOnPyPI/Outputs>`
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishOnPyPI/Inputs:
|
||||
|
||||
Input Parameters
|
||||
****************
|
||||
|
||||
.. _JOBTMPL/PublishOnPyPI/Input/ubuntu_image_version:
|
||||
|
||||
.. include:: ../_ubuntu_image_version.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishOnPyPI/Input/python_version:
|
||||
|
||||
.. include:: ../_python_version.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishOnPyPI/Input/requirements:
|
||||
|
||||
requirements
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid list of parameters for ``pip install``. |br|
|
||||
Either a requirements file can be referenced using ``'-r path/to/requirements.txt'``, or a list of
|
||||
packages can be specified using a space separated list like ``'wheel twine'``.
|
||||
:Description: Python dependencies to be installed through *pip*.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishOnPyPI/Input/artifact:
|
||||
|
||||
artifact
|
||||
========
|
||||
|
||||
:Type: string
|
||||
:Required: yes
|
||||
:Default Value: — — — —
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the packaged Python package(s).
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishOnPyPI/Secrets:
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishOnPyPI/Secret/PYPI_TOKEN:
|
||||
|
||||
PYPI_TOKEN
|
||||
==========
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: — — — —
|
||||
:Description: The token to publish and upload packages on :term:`PyPI`.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishOnPyPI/Outputs:
|
||||
|
||||
Outputs
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishOnPyPI/Optimizations:
|
||||
|
||||
Optimizations
|
||||
*************
|
||||
|
||||
This template offers no optimizations (reduced job runtime).
|
||||
17
doc/JobTemplate/Package/index.rst
Normal file
@@ -0,0 +1,17 @@
|
||||
.. _JOBTMPL/Packaging:
|
||||
|
||||
Packaging
|
||||
#########
|
||||
|
||||
The category *packaging* provides workflow templates implementing
|
||||
|
||||
* :ref:`JOBTMPL/Package` - Package Python packages and modules as wheel.
|
||||
* :ref:`JOBTMPL/InstallPackage` - Install Python package (wheel) on target platforms.
|
||||
* :ref:`JOBTMPL/PublishOnPyPI` - Upload Python package (wheel) to PyPI.
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
||||
Package
|
||||
InstallPackage
|
||||
PublishOnPyPI
|
||||
@@ -1,413 +0,0 @@
|
||||
.. _JOBTMPL/Parameters:
|
||||
|
||||
Parameters
|
||||
##########
|
||||
|
||||
The ``Parameters`` job template is a workaround for the limitations of GitHub Actions to handle global variables in
|
||||
GitHub Actions workflows (see `actions/runner#480 <https://github.com/actions/runner/issues/480>`__.
|
||||
|
||||
It generates output parameters with artifact names and a job matrix to be used in later running jobs.
|
||||
|
||||
**Behavior:**
|
||||
|
||||
.. todo:: Parameters:Behavior Needs documentation.
|
||||
|
||||
**Dependencies:**
|
||||
|
||||
*None*
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
Simple Example
|
||||
==============
|
||||
|
||||
The following instantiation example creates a job `Params` derived from job template `Parameters` version `r0`. It only
|
||||
requires a `name` parameter to create the artifact names.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
name: Pipeline
|
||||
|
||||
on:
|
||||
push:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
Params:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r4
|
||||
with:
|
||||
name: pyTooling
|
||||
|
||||
Complex Example
|
||||
===============
|
||||
|
||||
The following instantiation example creates 3 jobs from the same template, but with differing input parameters. The
|
||||
first job `UnitTestingParams` might be used to create a job matrix of unit tests. It creates the cross of default
|
||||
systems (Windows, Ubuntu, macOS, MinGW64, UCRT64) and the given list of Python versions including some mypy versions. In
|
||||
addition a list of excludes (marked as :deletion:`deletions`) and includes (marked as :addition:`additions`) is handed
|
||||
over resulting in the following combinations:
|
||||
|
||||
+------------+-------------+-------------+--------------+--------------+-------------------------+------------+-------------+------------------------------+-------------------------------+
|
||||
| Version | 3.8 🔴 | 3.9 🟠 | 3.10 🟡 | 3.11 🟢 | 3.12 🟢 | 3.13.a1 🟣 | pypy-3.8 🔴 | pypy-3.9 🟠 | pypy-3.10 🟡 |
|
||||
+============+=============+=============+==============+==============+=========================+============+=============+==============================+===============================+
|
||||
| Windows 🧊 | windows:3.8 | windows:3.9 | windows:3.10 | windows:3.11 | | | | :deletion:`windows:pypy-3.9` | :deletion:`windows:pypy-3.10` |
|
||||
+------------+-------------+-------------+--------------+--------------+-------------------------+------------+-------------+------------------------------+-------------------------------+
|
||||
| Ubuntu 🐧 | ubuntu:3.8 | ubuntu:3.9 | ubuntu:3.10 | ubuntu:3.11 | :addition:`ubuntu:3.12` | | | ubuntu:pypy-3.9 | ubuntu:pypy-3.10 |
|
||||
+------------+-------------+-------------+--------------+--------------+-------------------------+------------+-------------+------------------------------+-------------------------------+
|
||||
| macOS 🍎 | macos:3.8 | macos:3.9 | macos:3.10 | macos:3.11 | :addition:`macos:3.12` | | | macos:pypy-3.9 | macos:pypy-3.10 |
|
||||
+------------+-------------+-------------+--------------+--------------+-------------------------+------------+-------------+------------------------------+-------------------------------+
|
||||
| MSYS 🟪 | | | | | | | | | |
|
||||
+------------+-------------+-------------+--------------+--------------+-------------------------+------------+-------------+------------------------------+-------------------------------+
|
||||
| MinGW32 ⬛ | | | | | | | | | |
|
||||
+------------+-------------+-------------+--------------+--------------+-------------------------+------------+-------------+------------------------------+-------------------------------+
|
||||
| MinGW64 🟦 | | | | mingw64:3.11 | | | | | |
|
||||
+------------+-------------+-------------+--------------+--------------+-------------------------+------------+-------------+------------------------------+-------------------------------+
|
||||
| Clang32 🟫 | | | | | | | | | |
|
||||
+------------+-------------+-------------+--------------+--------------+-------------------------+------------+-------------+------------------------------+-------------------------------+
|
||||
| Clang64 🟧 | | | | | | | | | |
|
||||
+------------+-------------+-------------+--------------+--------------+-------------------------+------------+-------------+------------------------------+-------------------------------+
|
||||
| UCRT64 🟨 | | | | | | | | | |
|
||||
+------------+-------------+-------------+--------------+--------------+-------------------------+------------+-------------+------------------------------+-------------------------------+
|
||||
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
name: Pipeline
|
||||
|
||||
on:
|
||||
push:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
UnitTestingParams:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r4
|
||||
with:
|
||||
name: pyTooling
|
||||
python_version_list: "3.8 3.9 3.10 3.11 pypy-3.9 pypy-3.10"
|
||||
include_list: "ubuntu:3.12 macos:3.12"
|
||||
exclude_list: "windows:pypy-3.9 windows:pypy-3.10"
|
||||
|
||||
PerformanceTestingParams:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r4
|
||||
with:
|
||||
name: pyTooling
|
||||
python_version_list: "3.11 3.12"
|
||||
system_list: "ubuntu windows macos"
|
||||
|
||||
PlatformTestingParams:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r4
|
||||
with:
|
||||
name: pyTooling
|
||||
python_version_list: "3.12"
|
||||
system_list: "ubuntu windows macos mingw32 mingw64 clang64 ucrt64"
|
||||
|
||||
Parameters
|
||||
**********
|
||||
|
||||
name
|
||||
====
|
||||
|
||||
+----------------+----------+----------+--------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==============+
|
||||
| name | yes | string | — — — — |
|
||||
+----------------+----------+----------+--------------+
|
||||
|
||||
The name of the library or package.
|
||||
|
||||
It's used to create artifact names.
|
||||
|
||||
|
||||
python_version
|
||||
==============
|
||||
|
||||
+----------------+----------+----------+----------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==========+
|
||||
| python_version | optional | string | ``3.12`` |
|
||||
+----------------+----------+----------+----------+
|
||||
|
||||
Python version to be used for all jobs requiring a single Python version.
|
||||
|
||||
|
||||
python_version_list
|
||||
===================
|
||||
|
||||
+----------------------+----------+----------+----------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+======================+==========+==========+============================+
|
||||
| python_version_list | optional | string | ``3.8 3.9 3.10 3.11 3.12`` |
|
||||
+----------------------+----------+----------+----------------------------+
|
||||
|
||||
Space separated list of CPython versions and/or mypy version to run tests with.
|
||||
|
||||
**Possible values:**
|
||||
|
||||
* ``3.7``, ``3.8``, ``3.9``, ``3.10`` , ``3.11``, ``3.12``, ``3.13``
|
||||
* ``pypy-3.7``, ``pypy-3.8``, ``pypy-3.9``, ``pypy-3.10``
|
||||
|
||||
+------+-----------+------------------+-----------------------------------------+
|
||||
| Icon | Version | Maintained until | Comments |
|
||||
+======+===========+==================+=========================================+
|
||||
| ⚫ | 3.7 | 2023.06.27 | :red:`outdated` |
|
||||
+------+-----------+------------------+-----------------------------------------+
|
||||
| 🔴 | 3.8 | 2024.10 | |
|
||||
+------+-----------+------------------+-----------------------------------------+
|
||||
| 🟠 | 3.9 | 2025.10 | |
|
||||
+------+-----------+------------------+-----------------------------------------+
|
||||
| 🟡 | 3.10 | 2026.10 | |
|
||||
+------+-----------+------------------+-----------------------------------------+
|
||||
| 🟢 | 3.11 | 2027.10 | |
|
||||
+------+-----------+------------------+-----------------------------------------+
|
||||
| 🟢 | 3.12 | 2028.10 | :green:`latest` |
|
||||
+------+-----------+------------------+-----------------------------------------+
|
||||
| 🟣 | 3.13 | 2029.10 | Python 3.13 alpha (or RC) will be used. |
|
||||
+------+-----------+------------------+-----------------------------------------+
|
||||
| ⟲⚫ | pypy-3.7 | ????.?? | |
|
||||
+------+-----------+------------------+-----------------------------------------+
|
||||
| ⟲🔴 | pypy-3.8 | ????.?? | |
|
||||
+------+-----------+------------------+-----------------------------------------+
|
||||
| ⟲🟠 | pypy-3.9 | ????.?? | |
|
||||
+------+-----------+------------------+-----------------------------------------+
|
||||
| ⟲🟡 | pypy-3.10 | ????.?? | |
|
||||
+------+-----------+------------------+-----------------------------------------+
|
||||
|
||||
|
||||
system_list
|
||||
===========
|
||||
|
||||
+----------------+----------+----------+-----------------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+=========================================+
|
||||
| system_list | optional | string | ``ubuntu windows macos mingw64 ucrt64`` |
|
||||
+----------------+----------+----------+-----------------------------------------+
|
||||
|
||||
Space separated list of systems to run tests on.
|
||||
|
||||
**Possible values:**
|
||||
|
||||
* Native systems: ``ubuntu``, ``windows``, ``macos``
|
||||
* MSYS2: ``msys``, ``mingw32``, ``mingw64``, ``clang32``, ``clang64``, ``ucrt64``
|
||||
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
| Icon | System | Used version | Comments |
|
||||
+======+===========+==============================+=================================================================+
|
||||
| 🧊 | Windows | Windows Server 2022 (latest) | |
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
| 🐧 | Ubuntu | Ubuntu 22.04 (LTS) (latest) | |
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
| 🍎 | macOS | macOS Monterey 12 (latest) | While this marked latest, macOS Ventura 13 is already provided. |
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
| 🟪 | MSYS | | |
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
| ⬛ | MinGW32 | | |
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
| 🟦 | MinGW64 | | |
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
| 🟫 | Clang32 | | |
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
| 🟧 | Clang64 | | |
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
| 🟨 | UCRT64 | | |
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
|
||||
Source: `Images provided by GitHub <https://github.com/actions/runner-images>`__
|
||||
|
||||
include_list
|
||||
============
|
||||
|
||||
+----------------+----------+----------+----------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==========+
|
||||
| include_list | optional | string | ``""`` |
|
||||
+----------------+----------+----------+----------+
|
||||
|
||||
Space separated list of ``system:python`` items to be included into the list of test.
|
||||
|
||||
**Example:**
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
include_list: "ubuntu:3.11 macos:3.11"
|
||||
|
||||
|
||||
exclude_list
|
||||
============
|
||||
|
||||
+----------------+----------+----------+----------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==========+
|
||||
| exclude_list | optional | string | ``""`` |
|
||||
+----------------+----------+----------+----------+
|
||||
|
||||
Space separated list of ``system:python`` items to be excluded from the list of test.
|
||||
|
||||
**Example:**
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
exclude_list: "windows:pypy-3.8 windows:pypy-3.9"
|
||||
|
||||
|
||||
disable_list
|
||||
============
|
||||
|
||||
+----------------+----------+----------+----------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==========+
|
||||
| disable_list | optional | string | ``""`` |
|
||||
+----------------+----------+----------+----------+
|
||||
|
||||
Space separated list of ``system:python`` items to be temporarily disabled from the list of test.
|
||||
|
||||
Each disabled item creates a warning in the workflow log:
|
||||
|
||||
.. image:: /_static/GH_Workflow_DisabledJobsWarnings.png
|
||||
:scale: 80 %
|
||||
|
||||
|
||||
**Example:**
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
disable_list: "windows:3.10 windows:3.11"
|
||||
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
Results
|
||||
*******
|
||||
|
||||
python_version
|
||||
==============
|
||||
|
||||
A single string parameter representing the default Python version that should be used across multiple jobs in the same
|
||||
pipeline.
|
||||
|
||||
Such a parameter is needed as a workaround, because GitHub Actions doesn't support proper handling of global pipeline
|
||||
variables. Thus, this job is used to compute an output parameter that can be reused in other jobs.
|
||||
|
||||
**Usage Example:**
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Params:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r4
|
||||
with:
|
||||
name: pyTooling
|
||||
|
||||
CodeCoverage:
|
||||
uses: pyTooling/Actions/.github/workflows/CoverageCollection.yml@r4
|
||||
needs:
|
||||
- Params
|
||||
with:
|
||||
python_version: ${{ needs.Params.outputs.python_version }}
|
||||
|
||||
python_jobs
|
||||
===========
|
||||
|
||||
A list of dictionaries containing a job description.
|
||||
|
||||
A job description contains the following key-value pairs:
|
||||
|
||||
* ``sysicon`` - icon to display
|
||||
* ``system`` - name of the system
|
||||
* ``runs-on`` - virtual machine image and base operating system
|
||||
* ``runtime`` - name of the runtime environment if not running natively on the VM image
|
||||
* ``shell`` - name of the shell
|
||||
* ``pyicon`` - icon for CPython or pypy
|
||||
* ``python`` - Python version
|
||||
* ``envname`` - full name of the selected environment
|
||||
|
||||
**Usage Example:**
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Params:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r4
|
||||
with:
|
||||
name: pyTooling
|
||||
|
||||
UnitTesting:
|
||||
uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r4
|
||||
needs:
|
||||
- Params
|
||||
with:
|
||||
jobs: ${{ needs.Params.outputs.python_jobs }}
|
||||
|
||||
This list can be unpacked with ``fromJson(...)`` in a job ``strategy:matrix:include``:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
UnitTesting:
|
||||
name: ${{ matrix.sysicon }} ${{ matrix.pyicon }} Unit Tests using Python ${{ matrix.python }}
|
||||
runs-on: ${{ matrix.runs-on }}
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
include: ${{ fromJson(inputs.jobs) }}
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: ${{ matrix.shell }}
|
||||
|
||||
steps:
|
||||
- name: 🐍 Setup Python ${{ matrix.python }}
|
||||
if: matrix.system != 'msys2'
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: ${{ matrix.python }}
|
||||
|
||||
|
||||
artifact_names
|
||||
==============
|
||||
|
||||
A dictionary of artifact names sharing a common prefix.
|
||||
|
||||
The supported artifacts are:
|
||||
|
||||
* ``unittesting_xml`` - UnitTesting XML summary report
|
||||
* ``unittesting_html`` - UnitTesting HTML summary report
|
||||
* ``codecoverage_sqlite`` - Code Coverage internal database (SQLite)
|
||||
* ``codecoverage_json`` - Code Coverage JSON report
|
||||
* ``codecoverage_xml`` - Code Coverage XML report
|
||||
* ``codecoverage_html`` - Code Coverage HTML report
|
||||
* ``statictyping_html`` - Static Type Checking HTML report
|
||||
* ``package_all`` - Packaged Python project (multiple formats)
|
||||
* ``documentation_pdf`` - Documentation in PDF format
|
||||
* ``documentation_html`` - Documentation in HTML format
|
||||
|
||||
**Usage Example:**
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Params:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r4
|
||||
with:
|
||||
name: pyTooling
|
||||
|
||||
Coverage:
|
||||
uses: pyTooling/Actions/.github/workflows/CoverageCollection.yml@r4
|
||||
needs:
|
||||
- Params
|
||||
with:
|
||||
artifact: ${{ fromJson(needs.Params.outputs.artifact_names).codecoverage_html }}
|
||||
|
||||
|
||||
Params
|
||||
======
|
||||
|
||||
.. attention:: ``Params`` is deprecated.
|
||||
|
||||
* ``params['unittesting']`` |rarr| ``artifact_names['unittesting_xml']``
|
||||
* ``params['coverage']`` |rarr| ``artifact_names['codecoverage_xml']``
|
||||
* ``params['typing']`` |rarr| ``artifact_names['statictyping_html']``
|
||||
* ``params['package']`` |rarr| ``artifact_names['package_all']``
|
||||
* ``params['doc']`` |rarr| ``artifact_names['documentation_html']``
|
||||
462
doc/JobTemplate/Publish/PublishCoverageResults.rst
Normal file
@@ -0,0 +1,462 @@
|
||||
.. _JOBTMPL/PublishCoverageResults:
|
||||
.. index::
|
||||
single: CodeCov; PublishCoverageResults Template
|
||||
single: Codacy; PublishCoverageResults Template
|
||||
single: Coverage.py; PublishCoverageResults Template
|
||||
single: GitHub Action Reusable Workflow; PublishCoverageResults Template
|
||||
|
||||
PublishCoverageResults
|
||||
######################
|
||||
|
||||
The ``PublishCoverageResults`` job template downloads artifacts provided by :ref:`JOBTMPL/UnitTesting` containing code
|
||||
coverage databases created by :term:`Coverage.py`. These databases are then merged and converted into various output
|
||||
formats like Cobertura XML, JSON or HTML. These outputs are either uploaded as a new artifact or can be published to
|
||||
cloud services like :term:`CodeCov` or :term:`Codacy`.
|
||||
|
||||
.. topic:: Features
|
||||
|
||||
* Merge SQLite code coverage databases generated by Coverage.py into a single
|
||||
SQLite database.
|
||||
* Convert SQLite database to Cobertura XML format.
|
||||
* Convert SQLite database to Coverage.py JSON format.
|
||||
* Convert SQLite database to HTML code coverage report.
|
||||
* Publish code coverage at CodeCov.
|
||||
* Publish code coverage as Codacy.
|
||||
|
||||
.. topic:: Behavior
|
||||
|
||||
1. Checkout repository.
|
||||
2. Download artifact matching the :ref:`JOBTMPL/PublishCoverageResults/Input/coverage_artifacts_pattern`.
|
||||
3. Install Python dependencies especially :pypi:`coverage`.
|
||||
4. Rename SQLite database files within artifact download directory to match the required filename pattern for
|
||||
Coverage.py's merge operation.
|
||||
5. Report code coverage as table into job log.
|
||||
6. Convert code coverage to Cobertura XML format.
|
||||
7. Convert code coverage to JSON format.
|
||||
8. Convert code coverage to HTML report (website).
|
||||
9. Upload merged SQLite database as artifact.
|
||||
10. Upload Cobertura XML file as artifact.
|
||||
11. Upload JSON file as artifact.
|
||||
12. Upload HTML report as artifact.
|
||||
13. Publish Cobertura report to CodeCov.
|
||||
14. Publish Cobertura report to Codacy.
|
||||
|
||||
.. topic:: Job Execution
|
||||
|
||||
.. image:: ../../_static/pyTooling-Actions-PublishCoverageResults.png
|
||||
:width: 600px
|
||||
|
||||
.. topic:: Dependencies
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`pyTooling/download-artifact`
|
||||
|
||||
* :gh:`actions/download-artifact`
|
||||
|
||||
* pip
|
||||
|
||||
* :pypi:`coverage`
|
||||
* :pypi:`tomli`
|
||||
|
||||
* :gh:`pyTooling/upload-artifact`
|
||||
|
||||
* :gh:`actions/upload-artifact`
|
||||
|
||||
* :gh:`codecov/codecov-action`
|
||||
* :gh:`codacy/codacy-coverage-reporter-action`
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishCoverageResults/Instantiation:
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
The following
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
with:
|
||||
package_name: myPackage
|
||||
|
||||
UnitTestingParams:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
|
||||
with:
|
||||
package_name: myPackage
|
||||
|
||||
UnitTesting:
|
||||
uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
- UnitTestingParams
|
||||
with:
|
||||
jobs: ${{ needs.UnitTestingParams.outputs.python_jobs }}
|
||||
coverage_sqlite_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }}
|
||||
|
||||
PublishCoverageResults:
|
||||
uses: pyTooling/Actions/.github/workflows/PublishCoverageResults.yml@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
- UnitTestingParams
|
||||
- UnitTesting
|
||||
with:
|
||||
coverage_report_json: ${{ needs.ConfigParams.outputs.coverage_report_json }}
|
||||
coverage_report_html: ${{ needs.ConfigParams.outputs.coverage_report_html }}
|
||||
coverage_json_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }}
|
||||
coverage_html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }}
|
||||
codecov: 'true'
|
||||
codacy: 'true'
|
||||
secrets:
|
||||
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||
CODACY_TOKEN: ${{ secrets.CODACY_TOKEN }}
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishCoverageResults/Parameters:
|
||||
|
||||
Parameter Summary
|
||||
*****************
|
||||
|
||||
.. rubric:: Goto :ref:`input parameters <JOBTMPL/PublishCoverageResults/Inputs>`
|
||||
|
||||
+-----------------------------------------------------------------------------+----------+----------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=============================================================================+==========+================+==========================================================================================================================+
|
||||
| :ref:`JOBTMPL/PublishCoverageResults/Input/ubuntu_image_version` | no | string | ``'24.04'`` |
|
||||
+-----------------------------------------------------------------------------+----------+----------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishCoverageResults/Input/coverage_artifacts_pattern` | no | string | ``'*-CodeCoverage-SQLite-*'`` |
|
||||
+-----------------------------------------------------------------------------+----------+----------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishCoverageResults/Input/coverage_config` | no | string | ``'pyproject.toml'`` |
|
||||
+-----------------------------------------------------------------------------+----------+----------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishCoverageResults/Input/coverage_report_xml` | no | string (JSON) | :jsoncode:`{"directory": "report/coverage", "filename": "coverage.xml", "fullpath": "report/coverage/coverage.xml"}` |
|
||||
+-----------------------------------------------------------------------------+----------+----------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishCoverageResults/Input/coverage_report_json` | no | string (JSON) | :jsoncode:`{"directory": "report/coverage", "filename": "coverage.json", "fullpath": "report/coverage/coverage.json"}` |
|
||||
+-----------------------------------------------------------------------------+----------+----------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishCoverageResults/Input/coverage_report_html` | no | string (JSON) | :jsoncode:`{"directory": "report/coverage/html"}` |
|
||||
+-----------------------------------------------------------------------------+----------+----------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishCoverageResults/Input/coverage_sqlite_artifact` | no | string | ``''`` |
|
||||
+-----------------------------------------------------------------------------+----------+----------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishCoverageResults/Input/coverage_xml_artifact` | no | string | ``''`` |
|
||||
+-----------------------------------------------------------------------------+----------+----------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishCoverageResults/Input/coverage_json_artifact` | no | string | ``''`` |
|
||||
+-----------------------------------------------------------------------------+----------+----------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishCoverageResults/Input/coverage_html_artifact` | no | string | ``''`` |
|
||||
+-----------------------------------------------------------------------------+----------+----------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishCoverageResults/Input/codecov` | no | string | ``'false'`` |
|
||||
+-----------------------------------------------------------------------------+----------+----------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishCoverageResults/Input/codacy` | no | string | ``'false'`` |
|
||||
+-----------------------------------------------------------------------------+----------+----------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
|
||||
|
||||
.. rubric:: Goto :ref:`secrets <JOBTMPL/PublishCoverageResults/Secrets>`
|
||||
|
||||
+-----------------------------------------------------------+----------+----------+--------------+
|
||||
| Token Name | Required | Type | Default |
|
||||
+===========================================================+==========+==========+==============+
|
||||
| :ref:`JOBTMPL/PublishCoverageResults/Secret/CODECOV_TOKEN`| no | string | — — — — |
|
||||
+-----------------------------------------------------------+----------+----------+--------------+
|
||||
| :ref:`JOBTMPL/PublishCoverageResults/Secret/CODACY_TOKEN` | no | string | — — — — |
|
||||
+-----------------------------------------------------------+----------+----------+--------------+
|
||||
|
||||
.. rubric:: Goto :ref:`output parameters <JOBTMPL/PublishCoverageResults/Outputs>`
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishCoverageResults/Inputs:
|
||||
|
||||
Input Parameters
|
||||
****************
|
||||
|
||||
.. _JOBTMPL/PublishCoverageResults/Input/ubuntu_image_version:
|
||||
|
||||
.. include:: ../_ubuntu_image_version.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishCoverageResults/Input/coverage_artifacts_pattern:
|
||||
|
||||
coverage_artifacts_pattern
|
||||
==========================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'*-CodeCoverage-SQLite-*'``
|
||||
:Possible Values: Any valid artifact matching pattern using fixed text and ``*`` characters.
|
||||
:Description: tbd
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishCoverageResults/Input/coverage_config:
|
||||
|
||||
coverage_config
|
||||
===============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'pyproject.toml'``
|
||||
:Possible Values: Any valid path to a :file:`pyproject.toml` file. |br|
|
||||
Alternatively, path to a :file:`.coveragerc` file (deprecated).
|
||||
:Description: Path to a Python project configuration file for extraction of project settings.
|
||||
:Example:
|
||||
.. grid:: 2
|
||||
|
||||
.. grid-item::
|
||||
:columns: 5
|
||||
|
||||
.. rubric:: Extracted values from :file:`pyproject.toml`
|
||||
|
||||
.. code-block:: toml
|
||||
|
||||
[tool.pytest]
|
||||
junit_xml = "report/unit/UnittestReportSummary.xml"
|
||||
|
||||
[tool.pyedaa-reports]
|
||||
junit_xml = "report/unit/unittest.xml"
|
||||
|
||||
[tool.coverage.xml]
|
||||
output = "report/coverage/coverage.xml"
|
||||
|
||||
[tool.coverage.json]
|
||||
output = "report/coverage/coverage.json"
|
||||
|
||||
[tool.coverage.html]
|
||||
directory = "report/coverage/html"
|
||||
title="Code Coverage of pyDummy"
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishCoverageResults/Input/coverage_report_xml:
|
||||
|
||||
coverage_report_xml
|
||||
===================
|
||||
|
||||
:Type: string (JSON)
|
||||
:Required: no
|
||||
:Default Value:
|
||||
.. code-block:: json
|
||||
|
||||
{ "directory": "reports/coverage",
|
||||
"filename": "coverage.xml",
|
||||
"fullpath": "reports/coverage/coverage.xml"
|
||||
}
|
||||
:Possible Values: Any valid JSON string containing a JSON object with fields:
|
||||
|
||||
:directory: Directory or sub-directory where the code coverage report in Cobertura XML format will be
|
||||
saved.
|
||||
:filename: Filename of the generated Cobertura XML report. |br|
|
||||
Any valid XML filename.
|
||||
:fullpath: The concatenation of both previous fields using the ``/`` separator.
|
||||
:Description: Directory, filename and fullpath as JSON object where the code coverage report in Cobertura XML format
|
||||
will be saved. |br|
|
||||
This path is configured in :file:`pyproject.toml` and can be extracted by
|
||||
:ref:`JOBTMPL/ExtractConfiguration`.
|
||||
:Example:
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
PublishCoverageResults:
|
||||
uses: pyTooling/Actions/.github/workflows/PublishCoverageResults.yml@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
...
|
||||
coverage_report_xml: ${{ needs.ConfigParams.outputs.coverage_report_xml }}
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishCoverageResults/Input/coverage_report_json:
|
||||
|
||||
coverage_report_json
|
||||
====================
|
||||
|
||||
:Type: string (JSON)
|
||||
:Required: no
|
||||
:Default Value:
|
||||
.. code-block:: json
|
||||
|
||||
{ "directory": "reports/coverage",
|
||||
"filename": "coverage.json",
|
||||
"fullpath": "reports/coverage/coverage.json"
|
||||
}
|
||||
:Possible Values: Any valid JSON string containing a JSON object with fields:
|
||||
|
||||
:directory: Directory or sub-directory where the code coverage report in Coverage.py's JSON format
|
||||
will be saved.
|
||||
:filename: Filename of the generated Coverage.py JSON report. |br|
|
||||
Any valid JSON filename.
|
||||
:fullpath: The concatenation of both previous fields using the ``/`` separator.
|
||||
:Description: Directory, filename and fullpath as JSON object where the code coverage report in Coverage.py's JSON
|
||||
format will be saved. |br|
|
||||
This path is configured in :file:`pyproject.toml` and can be extracted by
|
||||
:ref:`JOBTMPL/ExtractConfiguration`.
|
||||
:Example:
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
PublishCoverageResults:
|
||||
uses: pyTooling/Actions/.github/workflows/PublishCoverageResults.yml@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
...
|
||||
coverage_report_json: ${{ needs.ConfigParams.outputs.coverage_report_json }}
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishCoverageResults/Input/coverage_report_html:
|
||||
|
||||
coverage_report_html
|
||||
====================
|
||||
|
||||
:Type: string (JSON)
|
||||
:Required: no
|
||||
:Default Value:
|
||||
.. code-block:: json
|
||||
|
||||
{ "directory": "reports/coverage/html"
|
||||
}
|
||||
:Possible Values: Any valid JSON string containing a JSON object with fields:
|
||||
|
||||
:directory: Directory or sub-directory where the code coverage report in HTML format will be saved.
|
||||
:Description: Directory as JSON object where the code coverage report in HTML format will be saved. |br|
|
||||
This path is configured in :file:`pyproject.toml` and can be extracted by
|
||||
:ref:`JOBTMPL/ExtractConfiguration`.
|
||||
:Example:
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
PublishCoverageResults:
|
||||
uses: pyTooling/Actions/.github/workflows/PublishCoverageResults.yml@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
...
|
||||
coverage_report_html: ${{ needs.ConfigParams.outputs.coverage_report_html }}
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishCoverageResults/Input/coverage_sqlite_artifact:
|
||||
|
||||
coverage_sqlite_artifact
|
||||
========================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the merged SQLite code coverage database.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishCoverageResults/Input/coverage_xml_artifact:
|
||||
|
||||
coverage_xml_artifact
|
||||
=====================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the merged code coverage report as Cobertura XML file.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishCoverageResults/Input/coverage_json_artifact:
|
||||
|
||||
coverage_json_artifact
|
||||
======================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the merged code coverage report as Coverage.py JSON file.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishCoverageResults/Input/coverage_html_artifact:
|
||||
|
||||
coverage_html_artifact
|
||||
======================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'report/coverage/html'``
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the merged code coverage report as HTML report.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishCoverageResults/Input/codecov:
|
||||
|
||||
codecov
|
||||
=======
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'false'``
|
||||
:Possible Values: ``'true'``, ``'false'``
|
||||
:Description: If *true*, publish code coverage results to CodeCov.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishCoverageResults/Input/codacy:
|
||||
|
||||
codacy
|
||||
======
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'false'``
|
||||
:Possible Values: ``'true'``, ``'false'``
|
||||
:Description: If *true*, publish code coverage results to Codacy.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishCoverageResults/Secrets:
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
The workflow template uses the following secrets to publish results to other services.
|
||||
|
||||
.. _JOBTMPL/PublishCoverageResults/Secret/CODECOV_TOKEN:
|
||||
|
||||
CODECOV_TOKEN
|
||||
=============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: — — — —
|
||||
:Description: The token to publish code coverage and unit test results to :term:`CodeCov`.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishCoverageResults/Secret/CODACY_TOKEN:
|
||||
|
||||
CODACY_TOKEN
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: — — — —
|
||||
:Description: The token to publish code coverage results to :term:`Codacy`.
|
||||
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishCoverageResults/Outputs:
|
||||
|
||||
Outputs
|
||||
*******
|
||||
|
||||
The following optimizations can be used to reduce the template's runtime.
|
||||
|
||||
Disable code coverage SQLite database artifact upload
|
||||
If parameter :ref:`JOBTMPL/PublishCoverageResults/Input/coverage_sqlite_artifact` is empty, the collected code coverage database
|
||||
(SQLlite format) wont be uploaded as an artifact.
|
||||
Disable code coverage report conversion to the Cobertura XML format.
|
||||
If parameter :ref:`JOBTMPL/PublishCoverageResults/Input/coverage_xml_artifact` is empty, no Cobertura XML file will be generated
|
||||
from code coverage report. As no Cobertura XML file exists, no code coverage XML artifact will be uploaded.
|
||||
Disable code coverage report conversion to the *Coverage.py* JSON format.
|
||||
If parameter :ref:`JOBTMPL/PublishCoverageResults/Input/coverage_json_artifact` is empty, no *Coverage.py* JSON file will be
|
||||
generated from code coverage report. As no JSON file exists, no code coverage JSON artifact will be uploaded.
|
||||
Disable code coverage report conversion to an HTML website.
|
||||
If parameter :ref:`JOBTMPL/PublishCoverageResults/Input/coverage_html_artifact` is empty, no coverage report HTML report will be
|
||||
generated from code coverage report. As no HTML report exists, no code coverage HTML artifact will be uploaded.
|
||||
|
||||
.. todo:: PublishCoverageResults:: Disable publishing to codecov and codacy. |br| If upload is enabled, XML will be always generated.
|
||||
344
doc/JobTemplate/Publish/PublishTestResults.rst
Normal file
@@ -0,0 +1,344 @@
|
||||
.. _JOBTMPL/PublishTestResults:
|
||||
.. index::
|
||||
single: CodeCov; PublishTestResults Template
|
||||
single: pyEDAA.Reports; PublishTestResults Template
|
||||
single: Test Reporter; PublishTestResults Template
|
||||
single: GitHub Action Reusable Workflow; PublishTestResults Template
|
||||
|
||||
PublishTestResults
|
||||
##################
|
||||
|
||||
This job downloads all matching JUnit report artifacts, merged the reports into one single report and then publishes the
|
||||
JUnit test summary reports to multiple services for visualization and longterm statistical tracking.
|
||||
|
||||
Supported services are:
|
||||
|
||||
* GitHub Actions job results using :term:`Test Reporter`
|
||||
* :term:`Codecov`
|
||||
|
||||
.. topic:: Features
|
||||
|
||||
* Merge multiple JUnit XML reports generated by pytest into a single JUnit XML report.
|
||||
* Publish unit test results to currently running pipeline as job result.
|
||||
* Publish unit test results to CodeCov.
|
||||
|
||||
.. topic:: Behavior
|
||||
|
||||
1. Checkout repository
|
||||
2. Download multiple artifacts containing test report summaries in JUnit XML format conforming to an artifact name
|
||||
pattern (see :ref:`JOBTMPL/PublishTestResults/Input/unittest_artifacts_pattern`) for limiting the number of
|
||||
downloaded artifacts and the hereby generated traffic.
|
||||
3. Rename the found JUnit XML files.
|
||||
4. Merge all found JUnit XML files using :term:`pyEDAA.Reports` into a new JUnit XML file. |br|
|
||||
Optionally, apply certain transformation and cleanup operations to the JUnit report structure.
|
||||
5. Publish test results as a markdown report page to GitHub Actions using :term:`Test Reporter`.
|
||||
6. Publish test results to :term:`Codecov` using :gh:`codecov/test-results-action`.
|
||||
|
||||
.. topic:: Job Execution
|
||||
|
||||
.. grid:: 2
|
||||
|
||||
.. grid-item::
|
||||
:columns: 4
|
||||
|
||||
.. rubric:: Job Steps
|
||||
|
||||
.. image:: ../../_static/pyTooling-Actions-PublishTestResults.png
|
||||
:width: 500px
|
||||
|
||||
.. grid-item::
|
||||
:columns: 4
|
||||
|
||||
.. rubric:: Generated Dorny Report below Pipeline Graph
|
||||
|
||||
.. image:: ../../_static/pyTooling-Actions-PublishTestResults-Dorny.png
|
||||
:width: 500px
|
||||
|
||||
.. topic:: Dependencies
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`pyTooling/download-artifact`
|
||||
|
||||
* :gh:`actions/download-artifact`
|
||||
|
||||
* pip
|
||||
|
||||
* :pypi:`pyEDAA.Reports`
|
||||
|
||||
* :gh:`dorny/test-reporter`
|
||||
* :gh:`codecov/test-results-action`
|
||||
* :gh:`pyTooling/upload-artifact`
|
||||
|
||||
* :gh:`actions/upload-artifact`
|
||||
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishTestResults/Instantiation:
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
Simple Example
|
||||
==============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
PublishTestResults:
|
||||
uses: pyTooling/Actions/.github/workflows/PublishTestResults.yml@r6
|
||||
|
||||
Complex Example
|
||||
===============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
CodeCoverage:
|
||||
# ...
|
||||
|
||||
UnitTesting:
|
||||
# ...
|
||||
|
||||
PublishTestResults:
|
||||
uses: pyTooling/Actions/.github/workflows/PublishTestResults.yml@r6
|
||||
needs:
|
||||
- CodeCoverage
|
||||
- UnitTesting
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishTestResults/Parameters:
|
||||
|
||||
Parameter Summary
|
||||
*****************
|
||||
|
||||
.. rubric:: Goto :ref:`input parameters <JOBTMPL/PublishTestResults/Inputs>`
|
||||
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=====================================================================+==========+==========+=====================================================================+
|
||||
| :ref:`JOBTMPL/PublishTestResults/Input/ubuntu_image_version` | no | string | ``'24.04'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishTestResults/Input/unittest_artifacts_pattern` | no | string | ``'*-UnitTestReportSummary-XML-*'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishTestResults/Input/merged_junit_filename` | no | string | ``'Unittesting.xml'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishTestResults/Input/merged_junit_artifact` | no | string | ``''`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishTestResults/Input/merge-input-dialect` | no | string | ``'pyTest-JUnit'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishTestResults/Input/merge-output-dialect` | no | string | ``'pyTest-JUnit'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishTestResults/Input/additional_merge_args` | no | string | ``'"--pytest=rewrite-dunder-init;reduce-depth:pytest.tests.unit"'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishTestResults/Input/testsuite-summary-name` | no | string | ``''`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishTestResults/Input/publish` | no | string | ``'true'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishTestResults/Input/report_title` | no | string | ``'Unit Test Results'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishTestResults/Input/dorny` | no | string | ``'true'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishTestResults/Input/codecov` | no | string | ``'false'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishTestResults/Input/codecov_flags` | no | string | ``'unittest'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+---------------------------------------------------------------------+
|
||||
|
||||
.. rubric:: Goto :ref:`secrets <JOBTMPL/PublishTestResults/Secrets>`
|
||||
|
||||
+-----------------------------------------------------------+----------+----------+--------------+
|
||||
| Token Name | Required | Type | Default |
|
||||
+===========================================================+==========+==========+==============+
|
||||
| :ref:`JOBTMPL/PublishTestResults/Secret/CODECOV_TOKEN` | no | string | — — — — |
|
||||
+-----------------------------------------------------------+----------+----------+--------------+
|
||||
|
||||
.. rubric:: Goto :ref:`output parameters <JOBTMPL/PublishTestResults/Outputs>`
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishTestResults/Inputs:
|
||||
|
||||
Input Parameters
|
||||
****************
|
||||
|
||||
.. _JOBTMPL/PublishTestResults/Input/ubuntu_image_version:
|
||||
|
||||
.. include:: ../_ubuntu_image_version.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishTestResults/Input/unittest_artifacts_pattern:
|
||||
|
||||
unittest_artifacts_pattern
|
||||
==========================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'*-UnitTestReportSummary-XML-*'``
|
||||
:Possible Values: Any valid artifact matching pattern using fixed text and ``*`` characters.
|
||||
:Description: tbd
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishTestResults/Input/merged_junit_filename:
|
||||
|
||||
merged_junit_filename
|
||||
=====================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'Unittesting.xml'``
|
||||
:Possible Values: Any valid filename suitable for a JUnit XML report.
|
||||
:Description: The filename for the merged JUnit report in XML format. |br|
|
||||
See :ref:`JOBTMPL/PublishTestResults/Input/merge-output-dialect` for the used JUnit dialect in the
|
||||
merged report file.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishTestResults/Input/merged_junit_artifact:
|
||||
|
||||
merged_junit_artifact
|
||||
=====================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description:
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishTestResults/Input/merge-input-dialect:
|
||||
|
||||
merge-input-dialect
|
||||
===================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'pyTest-JUnit'``
|
||||
:Possible Values: tbd
|
||||
:Description: tbd
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishTestResults/Input/merge-output-dialect:
|
||||
|
||||
merge-output-dialect
|
||||
====================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'pyTest-JUnit'``
|
||||
:Possible Values: tbd
|
||||
:Description: tbd
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishTestResults/Input/additional_merge_args:
|
||||
|
||||
additional_merge_args
|
||||
=====================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'"--pytest=rewrite-dunder-init;reduce-depth:pytest.tests.unit"'``
|
||||
:Possible Values: tbd
|
||||
:Description: tbd
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishTestResults/Input/testsuite-summary-name:
|
||||
|
||||
testsuite-summary-name
|
||||
======================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: tbd
|
||||
:Description: tbd
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishTestResults/Input/publish:
|
||||
|
||||
publish
|
||||
=======
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'true'``
|
||||
:Possible Values: tbd
|
||||
:Description: tbd
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishTestResults/Input/report_title:
|
||||
|
||||
report_title
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'Unit Test Results'``
|
||||
:Possible Values: tbd
|
||||
:Description: tbd
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishTestResults/Input/dorny:
|
||||
|
||||
dorny
|
||||
=====
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'true'``
|
||||
:Possible Values: tbd
|
||||
:Description: tbd
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishTestResults/Input/codecov:
|
||||
|
||||
codecov
|
||||
=======
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'false'``
|
||||
:Possible Values: tbd
|
||||
:Description: tbd
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishTestResults/Input/codecov_flags:
|
||||
|
||||
codecov_flags
|
||||
=============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'unittest'``
|
||||
:Possible Values: tbd
|
||||
:Description: tbd
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishTestResults/Secrets:
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
.. _JOBTMPL/PublishTestResults/Secret/CODECOV_TOKEN:
|
||||
|
||||
CODECOV_TOKEN
|
||||
=============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: — — — —
|
||||
:Description: The token to publish unit test results on :term:`CodeCov`.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishTestResults/Outputs:
|
||||
|
||||
Outputs
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishTestResults/Optimizations:
|
||||
|
||||
Optimizations
|
||||
*************
|
||||
|
||||
This template offers no optimizations (reduced job runtime).
|
||||
15
doc/JobTemplate/Publish/index.rst
Normal file
@@ -0,0 +1,15 @@
|
||||
.. _JOBTMPL/Publish:
|
||||
|
||||
Publish
|
||||
#######
|
||||
|
||||
The category *publish* provides workflow templates implementing
|
||||
|
||||
* :ref:`JOBTMPL/PublishTestResults`- Merge and publish unit test results.
|
||||
* :ref:`JOBTMPL/PublishCoverageResults` - Merge and publish code coverage results.
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
||||
PublishTestResults
|
||||
PublishCoverageResults
|
||||
@@ -1,139 +0,0 @@
|
||||
.. _JOBTMPL/PyPI:
|
||||
|
||||
PublishOnPyPI
|
||||
#############
|
||||
|
||||
Publish a source (``*.tar.gz``) package and/or wheel (``*.whl``) packages to `PyPI <https://pypi.org/>`__.
|
||||
|
||||
**Behavior:**
|
||||
|
||||
1. Download package artifact
|
||||
2. Publish source package(s) (``*.tar.gz``)
|
||||
3. Publish wheel package(s) (``*.whl``)
|
||||
4. Delete the artifact
|
||||
|
||||
**Preconditions:**
|
||||
|
||||
A PyPI account was created and the package name is either not occupied or the user has access rights for that package.
|
||||
|
||||
**Requirements:**
|
||||
|
||||
Setup a secret (e.g. ``PYPI_TOKEN``) in GitHub to handover the PyPI token to the job.
|
||||
|
||||
**Dependencies:**
|
||||
|
||||
* :gh:`actions/download-artifact`
|
||||
* :gh:`actions/setup-python`
|
||||
* :gh:`geekyeggo/delete-artifact`
|
||||
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
Simple Example
|
||||
==============
|
||||
|
||||
The following example demonstrates how to publish the artifact named ``Package`` to PyPI on every pipeline run triggered
|
||||
by a Git tag. A secret is forwarded from GitHub secrets to a job secret.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
# ...
|
||||
|
||||
PublishOnPyPI:
|
||||
uses: pyTooling/Actions/.github/workflows/PublishOnPyPI.yml@r4
|
||||
if: startsWith(github.ref, 'refs/tags')
|
||||
with:
|
||||
artifact: Package
|
||||
secrets:
|
||||
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
|
||||
|
||||
Complex Example
|
||||
===============
|
||||
|
||||
In this more complex example, the job depends on a parameter creation (``Params``) and packaging job (``Package``). The
|
||||
used Python version is overwritten by a parameter calculated in the ``Params`` jobs. Also the artifact name is managed
|
||||
by that job. Finally, the list of requirements is overwritten to load a list of requirements from ``dist/requirements.txt``.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Params:
|
||||
# ...
|
||||
|
||||
Package:
|
||||
# ...
|
||||
|
||||
PublishOnPyPI:
|
||||
uses: pyTooling/Actions/.github/workflows/PublishOnPyPI.yml@r4
|
||||
if: startsWith(github.ref, 'refs/tags')
|
||||
needs:
|
||||
- Params
|
||||
- Package
|
||||
with:
|
||||
python_version: ${{ needs.Params.outputs.python_version }}
|
||||
requirements: -r dist/requirements.txt
|
||||
artifact: ${{ fromJson(needs.Params.outputs.artifact_names).package_all }}
|
||||
secrets:
|
||||
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
|
||||
|
||||
|
||||
Parameters
|
||||
**********
|
||||
|
||||
python_version
|
||||
==============
|
||||
|
||||
+----------------+----------+----------+----------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==========+
|
||||
| python_version | optional | string | ``3.11`` |
|
||||
+----------------+----------+----------+----------+
|
||||
|
||||
Python version used for uploading the package contents via `twine` to PyPI.
|
||||
|
||||
|
||||
requirements
|
||||
============
|
||||
|
||||
+----------------+----------+----------+-----------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+=================+
|
||||
| requirements | optional | string | ``wheel twine`` |
|
||||
+----------------+----------+----------+-----------------+
|
||||
|
||||
List of requirements to be installed for uploading the package contents to PyPI.
|
||||
|
||||
|
||||
artifact
|
||||
========
|
||||
|
||||
+----------------+----------+----------+--------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==============+
|
||||
| artifact | yes | string | — — — — |
|
||||
+----------------+----------+----------+--------------+
|
||||
|
||||
Name of the artifact containing the package(s).
|
||||
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
PYPI_TOKEN
|
||||
==========
|
||||
|
||||
+----------------+----------+----------+--------------+
|
||||
| Secret Name | Required | Type | Default |
|
||||
+================+==========+==========+==============+
|
||||
| PYPI_TOKEN | yes | string | — — — — |
|
||||
+----------------+----------+----------+--------------+
|
||||
|
||||
The token to access the package at PyPI for uploading new data.
|
||||
|
||||
|
||||
Results
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
@@ -1,88 +0,0 @@
|
||||
.. _JOBTMPL/PublishTestResults:
|
||||
|
||||
PublishTestResults
|
||||
##################
|
||||
|
||||
This job downloads all artifacts and uploads jUnit XML reports as a Markdown page to GitHub Actions to visualize the
|
||||
results a an item in the job list. For publishing, :gh:`dorny/test-reporter` is used.
|
||||
|
||||
**Behavior:**
|
||||
|
||||
1. Checkout repository
|
||||
2. Download (all) artifacts
|
||||
3. Publish test results as a markdown report page to GitHub Actions.
|
||||
|
||||
.. note::
|
||||
|
||||
The :gh:`actions/download-artifact` does not support wildcards to specify a subset of artifacts for downloading.
|
||||
Thus, all artifacts need to be downloaded.
|
||||
|
||||
**Dependencies:**
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`actions/download-artifact`
|
||||
* :gh:`dorny/test-reporter`
|
||||
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
Simple Example
|
||||
==============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
PublishTestResults:
|
||||
uses: pyTooling/Actions/.github/workflows/PublishTestResults.yml@r4
|
||||
|
||||
Complex Example
|
||||
===============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
CodeCoverage:
|
||||
# ...
|
||||
|
||||
UnitTesting:
|
||||
# ...
|
||||
|
||||
PublishTestResults:
|
||||
uses: pyTooling/Actions/.github/workflows/PublishTestResults.yml@r4
|
||||
needs:
|
||||
- CodeCoverage
|
||||
- UnitTesting
|
||||
|
||||
|
||||
Parameters
|
||||
**********
|
||||
|
||||
report_files
|
||||
============
|
||||
|
||||
+----------------+----------+----------+---------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+=================================+
|
||||
| report_files | optional | string | ``artifacts/**/*.xml`` |
|
||||
+----------------+----------+----------+---------------------------------+
|
||||
|
||||
Pattern of jUnit report files to publish as Markdown.
|
||||
|
||||
The parameter can be a comma separated list. Wildcards are supported.
|
||||
|
||||
.. hint::
|
||||
|
||||
All artifacts are downloaded into directory ``artifacts``, thus the pattern should include this directory as a
|
||||
prefix.
|
||||
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
Results
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
@@ -1,106 +0,0 @@
|
||||
.. _JOBTMPL/PublishToGitHubPages:
|
||||
|
||||
PublishToGitHubPages
|
||||
####################
|
||||
|
||||
This job publishes HTML content from artifacts of other jobs to GitHub Pages.
|
||||
|
||||
**Behavior:**
|
||||
|
||||
1. Checkout repository.
|
||||
2. Download artifacts.
|
||||
3. Push HTML files to branch ``gh-pages``.
|
||||
|
||||
**Dependencies:**
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`actions/download-artifact`
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
Simple Example
|
||||
==============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
BuildTheDocs:
|
||||
# ...
|
||||
|
||||
PublishToGitHubPages:
|
||||
uses: pyTooling/Actions/.github/workflows/PublishToGitHubPages.yml@r4
|
||||
needs:
|
||||
- BuildTheDocs
|
||||
with:
|
||||
doc: Documentation
|
||||
|
||||
|
||||
Complex Example
|
||||
===============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
PublishToGitHubPages:
|
||||
uses: pyTooling/Actions/.github/workflows/PublishToGitHubPages.yml@r4
|
||||
needs:
|
||||
- Params
|
||||
- BuildTheDocs
|
||||
- Coverage
|
||||
- StaticTypeCheck
|
||||
with:
|
||||
doc: ${{ fromJson(needs.Params.outputs.artifact_names).documentation_html }}
|
||||
coverage: ${{ fromJson(needs.Params.outputs.artifact_names).codecoverage_html }}
|
||||
typing: ${{ fromJson(needs.Params.outputs.artifact_names).statictyping_html }}
|
||||
|
||||
|
||||
Parameters
|
||||
**********
|
||||
|
||||
doc
|
||||
===
|
||||
|
||||
+----------------+----------+----------+--------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==============+
|
||||
| doc | yes | string | — — — — |
|
||||
+----------------+----------+----------+--------------+
|
||||
|
||||
Name of the documentation artifact.
|
||||
|
||||
|
||||
coverage
|
||||
========
|
||||
|
||||
+----------------+----------+----------+-----------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+=================+
|
||||
| coverage | optional | string | ``""`` |
|
||||
+----------------+----------+----------+-----------------+
|
||||
|
||||
Name of the coverage artifact.
|
||||
|
||||
|
||||
typing
|
||||
======
|
||||
|
||||
+----------------+----------+----------+-----------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+=================+
|
||||
| typing | optional | string | ``""`` |
|
||||
+----------------+----------+----------+-----------------+
|
||||
|
||||
Name of the typing artifact.
|
||||
|
||||
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
Results
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
32
doc/JobTemplate/PythonVersionList.rst
Normal file
@@ -0,0 +1,32 @@
|
||||
.. rubric:: Possible values
|
||||
|
||||
* ``3.8``, ``3.9``, ``3.10`` , ``3.11``, ``3.12``, ``3.13``, ``3.14``
|
||||
* ``pypy-3.7``, ``pypy-3.8``, ``pypy-3.9``, ``pypy-3.10``, ``pypy-3.11``
|
||||
|
||||
+------+-----------+------------------+-----------------------------------------------+
|
||||
| Icon | Version | Maintained until | Comments |
|
||||
+======+===========+==================+===============================================+
|
||||
| ⚫ | 3.8 | 2024.10 | :red:`outdated` |
|
||||
+------+-----------+------------------+-----------------------------------------------+
|
||||
| 🔴 | 3.9 | 2025.10 | |
|
||||
+------+-----------+------------------+-----------------------------------------------+
|
||||
| 🟠 | 3.10 | 2026.10 | |
|
||||
+------+-----------+------------------+-----------------------------------------------+
|
||||
| 🟡 | 3.11 | 2027.10 | |
|
||||
+------+-----------+------------------+-----------------------------------------------+
|
||||
| 🟢 | 3.12 | 2028.10 | |
|
||||
+------+-----------+------------------+-----------------------------------------------+
|
||||
| 🟢 | 3.13 | 2029.10 | :green:`latest CPython` |
|
||||
+------+-----------+------------------+-----------------------------------------------+
|
||||
| 🟣 | 3.14 | 2030.10 | Python 3.14 alpha, beta (or RC) will be used. |
|
||||
+------+-----------+------------------+-----------------------------------------------+
|
||||
| ⟲⚫ | pypy-3.7 | ????.?? | |
|
||||
+------+-----------+------------------+-----------------------------------------------+
|
||||
| ⟲⚫ | pypy-3.8 | ????.?? | |
|
||||
+------+-----------+------------------+-----------------------------------------------+
|
||||
| ⟲🔴 | pypy-3.9 | ????.?? | |
|
||||
+------+-----------+------------------+-----------------------------------------------+
|
||||
| ⟲🟠 | pypy-3.10 | ????.?? | |
|
||||
+------+-----------+------------------+-----------------------------------------------+
|
||||
| ⟲🟡 | pypy-3.11 | ????.?? | :green:`latest PyPy` |
|
||||
+------+-----------+------------------+-----------------------------------------------+
|
||||
150
doc/JobTemplate/Quality/CheckDocumentation.rst
Normal file
@@ -0,0 +1,150 @@
|
||||
.. _JOBTMPL/CheckDocumentation:
|
||||
.. index::
|
||||
single: docstr_coverage; CheckDocumentation Template
|
||||
single: interrogate; CheckDocumentation Template
|
||||
single: GitHub Action Reusable Workflow; CheckDocumentation Template
|
||||
|
||||
CheckDocumentation
|
||||
##################
|
||||
|
||||
The ``CheckDocumentation`` job checks the level of documentation coverage for Python files.
|
||||
|
||||
.. topic:: Features
|
||||
|
||||
* Check documentation coverage in Python code using :pypi:`docstr_coverage`.
|
||||
* Check documentation coverage in Python code using :pypi:`interrogate`.
|
||||
|
||||
.. topic:: Behavior
|
||||
|
||||
1. Checkout repository.
|
||||
2. Setup Python environment and install dependencies.
|
||||
3. Run ``docstr_coverage``.
|
||||
4. Run ``interrogate``.
|
||||
|
||||
.. topic:: Job Execution
|
||||
|
||||
.. image:: ../../_static/pyTooling-Actions-CheckDocumentation.png
|
||||
:width: 600px
|
||||
|
||||
.. topic:: Dependencies
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`actions/setup-python`
|
||||
* pip
|
||||
|
||||
* :pypi:`docstr_coverage`
|
||||
* :pypi:`interrogate`
|
||||
|
||||
|
||||
.. _JOBTMPL/CheckDocumentation/Instantiation:
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
The following instantiation example creates a ``Params`` job derived from job template ``Parameters`` version ``@r6``. It only
|
||||
requires a `name` parameter to create the artifact names.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
with:
|
||||
package_name: myPackage
|
||||
|
||||
DocCoverage:
|
||||
uses: pyTooling/Actions/.github/workflows/CheckDocumentation.yml@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
directory: ${{ needs.ConfigParams.outputs.package_directory }}
|
||||
|
||||
|
||||
.. seealso::
|
||||
|
||||
:ref:`JOBTMPL/ExtractConfiguration`
|
||||
``ExtractConfiguration`` is usually used to compute the path to the package's source code directory.
|
||||
|
||||
|
||||
.. _JOBTMPL/CheckDocumentation/Parameters:
|
||||
|
||||
Parameter Summary
|
||||
*****************
|
||||
|
||||
.. rubric:: Goto :ref:`input parameters <JOBTMPL/CheckDocumentation/Inputs>`
|
||||
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=========================================================================+==========+==========+===================================================================+
|
||||
| :ref:`JOBTMPL/CheckDocumentation/Input/ubuntu_image_version` | no | string | ``'24.04'`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/CheckDocumentation/Input/python_version` | no | string | ``'3.13'`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/CheckDocumentation/Input/directory` | yes | string | — — — — |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/CheckDocumentation/Input/fail_under` | no | string | ``'80'`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
|
||||
.. rubric:: Goto :ref:`secrets <JOBTMPL/CheckDocumentation/Secrets>`
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
.. rubric:: Goto :ref:`output parameters <JOBTMPL/CheckDocumentation/Outputs>`
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/CheckDocumentation/Inputs:
|
||||
|
||||
Input Parameters
|
||||
****************
|
||||
|
||||
.. _JOBTMPL/CheckDocumentation/Input/ubuntu_image_version:
|
||||
|
||||
.. include:: ../_ubuntu_image_version.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/CheckDocumentation/Input/python_version:
|
||||
|
||||
.. include:: ../_python_version.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/CheckDocumentation/Input/directory:
|
||||
|
||||
directory
|
||||
=========
|
||||
|
||||
:Type: string
|
||||
:Required: yes
|
||||
:Default Value: — — — —
|
||||
:Possible Values: Any valid directory or sub-directory.
|
||||
:Description: Directory where the Python code is located.
|
||||
|
||||
|
||||
.. _JOBTMPL/CheckDocumentation/Input/fail_under:
|
||||
|
||||
fail_under
|
||||
==========
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'80'``
|
||||
:Possible Values: Any valid percentage from 0 to 100 encoded as string.
|
||||
:Description: A minimum percentage level for good documentation. If the documentation coverage is below this level,
|
||||
the coverage is considered a fail.
|
||||
|
||||
|
||||
.. _JOBTMPL/CheckDocumentation/Secrets:
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
|
||||
.. _JOBTMPL/CheckDocumentation/Outputs:
|
||||
|
||||
Outputs
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
365
doc/JobTemplate/Quality/StaticTypeCheck.rst
Normal file
@@ -0,0 +1,365 @@
|
||||
.. _JOBTMPL/StaticTypeCheck:
|
||||
.. index::
|
||||
single: mypy; StaticTypeCheck Template
|
||||
single: GitHub Action Reusable Workflow; StaticTypeCheck Template
|
||||
|
||||
StaticTypeCheck
|
||||
###############
|
||||
|
||||
This job template runs a static type check using :term:`mypy` and collects the results. These results can be converted
|
||||
to a HTML report and uploaded as an artifact.
|
||||
|
||||
.. topic:: Features
|
||||
|
||||
* Run static type check using :term:`mypy`.
|
||||
|
||||
.. topic:: Behavior
|
||||
|
||||
1. Checkout repository
|
||||
2. Setup Python and install dependencies
|
||||
3. Run type checking.
|
||||
4. Upload type checking report as an artifact
|
||||
|
||||
.. topic:: Job Execution
|
||||
|
||||
.. image:: ../../_static/pyTooling-Actions-StaticTypeCheck.png
|
||||
:width: 400px
|
||||
|
||||
.. topic:: Dependencies
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`actions/setup-python`
|
||||
* pip
|
||||
|
||||
* Python packages specified via :ref:`JOBTMPL/StaticTypeCheck/Input/requirements`.
|
||||
|
||||
* :gh:`pyTooling/upload-artifact`
|
||||
|
||||
* :gh:`actions/upload-artifact`
|
||||
|
||||
|
||||
.. _JOBTMPL/StaticTypeCheck/Instantiation:
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
Simple Example
|
||||
==============
|
||||
|
||||
This example runs mypy for the Python package ``myPackage`` according to the configuration stored in
|
||||
:file:`pyproject.toml`. It prints a report into the job's log. In addition is generates a report in HTML format into the
|
||||
directory ``report/typing``.
|
||||
|
||||
.. grid:: 2
|
||||
|
||||
.. grid-item::
|
||||
:columns: 6
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
StaticTypeCheck:
|
||||
uses: pyTooling/Actions/.github/workflows/StaticTypeCheck.yml@r6
|
||||
with:
|
||||
cobertura_artifact: 'TypeChecking-Cobertura'
|
||||
junit_artifact: 'TypeChecking-JUnit'
|
||||
html_artifact: 'TypeChecking-HTML'
|
||||
|
||||
.. grid-item::
|
||||
:columns: 6
|
||||
|
||||
.. code-block:: toml
|
||||
|
||||
[tool.mypy]
|
||||
packages = ["myPackage"]
|
||||
strict = true
|
||||
pretty = true
|
||||
|
||||
html_report = "report/typing/html"
|
||||
junit_xml = "report/typing/StaticTypingSummary.xml"
|
||||
cobertura_xml_report = "report/typing"
|
||||
|
||||
|
||||
Complex Example
|
||||
===============
|
||||
|
||||
To ease the handling of mypy parameters stored in :file:`pyproject.toml`, the :ref:`JOBTMPL/ExtractConfiguration` is
|
||||
used to extract the set configuration parameters for later usage. Similarly, :ref:`JOBTMPL/Parameters` is used to
|
||||
precompute the artifact's name.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
with:
|
||||
package_name: myPackage
|
||||
|
||||
Params:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
|
||||
with:
|
||||
package_name: myPackage
|
||||
|
||||
StaticTypeCheck:
|
||||
uses: pyTooling/Actions/.github/workflows/StaticTypeCheck.yml@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
- Params
|
||||
with:
|
||||
python_version: ${{ needs.Params.outputs.python_version }}
|
||||
junit_report: ${{ needs.ConfigParams.outputs.typing_report_junit }}
|
||||
junit_artifact: ${{ fromJson(needs.Params.outputs.artifact_names).statictyping_junit }}
|
||||
|
||||
|
||||
.. _JOBTMPL/StaticTypeCheck/Parameters:
|
||||
|
||||
Parameter Summary
|
||||
*****************
|
||||
|
||||
.. rubric:: Goto :ref:`input parameters <JOBTMPL/StaticTypeCheck/Inputs>`
|
||||
|
||||
+---------------------------------------------------------------------+----------+----------------+------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=====================================================================+==========+================+==========================================================================================================================================+
|
||||
| :ref:`JOBTMPL/StaticTypeCheck/Input/ubuntu_image_version` | no | string | ``'24.04'`` |
|
||||
+---------------------------------------------------------------------+----------+----------------+------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/StaticTypeCheck/Input/python_version` | no | string | ``'3.13'`` |
|
||||
+---------------------------------------------------------------------+----------+----------------+------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/StaticTypeCheck/Input/requirements` | no | string | ``'-r tests/requirements.txt'`` |
|
||||
+---------------------------------------------------------------------+----------+----------------+------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/StaticTypeCheck/Input/mypy_options` | no | string | ``''`` |
|
||||
+---------------------------------------------------------------------+----------+----------------+------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/StaticTypeCheck/Input/cobertura_report` | no | string (JSON) | :jsoncode:`{"fullpath": "report/typing/cobertura.xml", "directory": "report/typing", "filename": "cobertura.xml"}` |
|
||||
+---------------------------------------------------------------------+----------+----------------+------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/StaticTypeCheck/Input/junit_report` | no | string (JSON) | :jsoncode:`{"fullpath": "report/typing/StaticTypingSummary.xml", "directory": "report/typing", "filename": "StaticTypingSummary.xml"}` |
|
||||
+---------------------------------------------------------------------+----------+----------------+------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/StaticTypeCheck/Input/html_report` | no | string (JSON) | :jsoncode:`{"directory": "report/typing/html"}` |
|
||||
+---------------------------------------------------------------------+----------+----------------+------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/StaticTypeCheck/Input/cobertura_artifact` | no | string | ``''`` |
|
||||
+---------------------------------------------------------------------+----------+----------------+------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/StaticTypeCheck/Input/junit_artifact` | no | string | ``''`` |
|
||||
+---------------------------------------------------------------------+----------+----------------+------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/StaticTypeCheck/Input/html_artifact` | no | string | ``''`` |
|
||||
+---------------------------------------------------------------------+----------+----------------+------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
|
||||
.. rubric:: Goto :ref:`secrets <JOBTMPL/StaticTypeCheck/Secrets>`
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
.. rubric:: Goto :ref:`output parameters <JOBTMPL/StaticTypeCheck/Outputs>`
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/StaticTypeCheck/Inputs:
|
||||
|
||||
Input Parameters
|
||||
****************
|
||||
|
||||
.. _JOBTMPL/StaticTypeCheck/Input/ubuntu_image_version:
|
||||
|
||||
.. include:: ../_ubuntu_image_version.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/StaticTypeCheck/Input/python_version:
|
||||
|
||||
.. include:: ../_python_version.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/StaticTypeCheck/Input/requirements:
|
||||
|
||||
requirements
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'-r tests/requirements.txt'``
|
||||
:Possible Values: Any valid list of parameters for ``pip install``. |br|
|
||||
Either a requirements file can be referenced using ``'-r path/to/requirements.txt'``, or a list of
|
||||
packages can be specified using a space separated list like ``'mypy lxml'``.
|
||||
:Description: Python dependencies to be installed through *pip*.
|
||||
|
||||
|
||||
.. _JOBTMPL/StaticTypeCheck/Input/mypy_options:
|
||||
|
||||
mypy_options
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid command line options for :term:`mypy`.
|
||||
:Description: Additional options handed over to mypy as ``mypy ${mypy_options}``.
|
||||
|
||||
|
||||
.. _JOBTMPL/StaticTypeCheck/Input/cobertura_report:
|
||||
|
||||
cobertura_report
|
||||
================
|
||||
|
||||
:Type: string (JSON)
|
||||
:Required: no
|
||||
:Default Value:
|
||||
.. code-block:: json
|
||||
|
||||
{ "directory": "reports/typing",
|
||||
"filename": "cobertura.xml",
|
||||
"fullpath": "reports/typing/cobertura.xml"
|
||||
}
|
||||
:Possible Values: Any valid JSON string containing a JSON object with fields:
|
||||
|
||||
:directory: Directory or sub-directory where the type checking report in Cobertura XML format will be
|
||||
saved.
|
||||
:filename: Filename of the generated type checking report in Cobertura XML format. |br|
|
||||
Currently, this filename is hardcoded within :term:`mypy` as :file:`cobertura.xml`.
|
||||
:fullpath: The concatenation of both previous fields using the ``/`` separator.
|
||||
:Description: Directory, filename and fullpath as JSON object where the type checking report in Cobertura XML format
|
||||
will be saved. |br|
|
||||
This path is configured in :file:`pyproject.toml` and can be extracted by
|
||||
:ref:`JOBTMPL/ExtractConfiguration`.
|
||||
:Example:
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
UnitTesting:
|
||||
uses: pyTooling/Actions/.github/workflows/StaticTypeCheck.yml@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
...
|
||||
cobertura_report: ${{ needs.ConfigParams.outputs.statictyping_cobertura }}
|
||||
|
||||
|
||||
.. _JOBTMPL/StaticTypeCheck/Input/junit_report:
|
||||
|
||||
junit_report
|
||||
============
|
||||
|
||||
:Type: string (JSON)
|
||||
:Required: no
|
||||
:Default Value:
|
||||
.. code-block:: json
|
||||
|
||||
{ "directory": "reports/typing",
|
||||
"filename": "StaticTypingSummary.xml",
|
||||
"fullpath": "reports/typing/StaticTypingSummary.xml"
|
||||
}
|
||||
:Possible Values: Any valid JSON string containing a JSON object with fields:
|
||||
|
||||
:directory: Directory or sub-directory where the type checking report in JUnit XML format will be
|
||||
saved.
|
||||
:filename: Filename of the generated type checking report in JUnit XML format. |br|
|
||||
Any valid file name for mypy's JUnit XML report.
|
||||
:fullpath: The concatenation of both previous fields using the ``/`` separator.
|
||||
:Description: Directory, filename and fullpath as JSON object where the type checking report in JUnit XML format
|
||||
will be saved. |br|
|
||||
This path is configured in :file:`pyproject.toml` and can be extracted by
|
||||
:ref:`JOBTMPL/ExtractConfiguration`.
|
||||
:Example:
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
UnitTesting:
|
||||
uses: pyTooling/Actions/.github/workflows/StaticTypeCheck.yml@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
...
|
||||
junit_report: ${{ needs.ConfigParams.outputs.statictyping_junit }}
|
||||
|
||||
|
||||
.. _JOBTMPL/StaticTypeCheck/Input/html_report:
|
||||
|
||||
html_report
|
||||
===========
|
||||
|
||||
:Type: string (JSON)
|
||||
:Required: no
|
||||
:Default Value:
|
||||
.. code-block:: json
|
||||
|
||||
{ "directory": "reports/typing/html"
|
||||
}
|
||||
:Possible Values: Any valid JSON string containing a JSON object with fields:
|
||||
|
||||
:directory: Directory or sub-directory where the type checking report in HTML format will be saved.
|
||||
:Description: Directory as JSON object where the type checking report in HTML format will be saved. |br|
|
||||
This path is configured in :file:`pyproject.toml` and can be extracted by
|
||||
:ref:`JOBTMPL/ExtractConfiguration`.
|
||||
:Example:
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
UnitTesting:
|
||||
uses: pyTooling/Actions/.github/workflows/StaticTypeCheck.yml@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
...
|
||||
html_report: ${{ needs.ConfigParams.outputs.statictyping_html }}
|
||||
|
||||
|
||||
.. _JOBTMPL/StaticTypeCheck/Input/cobertura_artifact:
|
||||
|
||||
cobertura_artifact
|
||||
==================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the Cobertura XML report.
|
||||
|
||||
|
||||
.. _JOBTMPL/StaticTypeCheck/Input/junit_artifact:
|
||||
|
||||
junit_artifact
|
||||
==============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the JUnit XML report.
|
||||
|
||||
|
||||
.. _JOBTMPL/StaticTypeCheck/Input/html_artifact:
|
||||
|
||||
html_artifact
|
||||
=============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the HTML report.
|
||||
|
||||
|
||||
.. _JOBTMPL/StaticTypeCheck/Secrets:
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
|
||||
.. _JOBTMPL/StaticTypeCheck/Outputs:
|
||||
|
||||
Outputs
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/StaticTypeCheck/Optimizations:
|
||||
|
||||
Optimizations
|
||||
*************
|
||||
|
||||
This template offers no optimizations (reduced job runtime).
|
||||
6
doc/JobTemplate/Quality/VerifyDocs.rst
Normal file
@@ -0,0 +1,6 @@
|
||||
.. _JOBTMPL/VerifyDocs:
|
||||
|
||||
VerifyDocs (idea)
|
||||
#################
|
||||
|
||||
.. todo:: VerifyDocs:: Needs documentation.
|
||||
17
doc/JobTemplate/Quality/index.rst
Normal file
@@ -0,0 +1,17 @@
|
||||
.. _JOBTMPL/Quality:
|
||||
|
||||
Quality
|
||||
#######
|
||||
|
||||
The category *quality* provides workflow templates implementing
|
||||
|
||||
* :ref:`JOBTMPL/VerifyDocs` - Verify code snippets in documentations for correctness.
|
||||
* :ref:`JOBTMPL/CheckDocumentation` - Check documentation coverage in Python modules.
|
||||
* :ref:`JOBTMPL/StaticTypeCheck` - Check type annotations using mypy.
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
||||
VerifyDocs
|
||||
StaticTypeCheck
|
||||
CheckDocumentation
|
||||
@@ -1,96 +0,0 @@
|
||||
.. _JOBTMPL/GitHubReleasePage:
|
||||
|
||||
Release
|
||||
#######
|
||||
|
||||
This job creates a Release Page on GitHub.
|
||||
|
||||
**Release Template in Markdown**:
|
||||
|
||||
.. parsed-literal::
|
||||
|
||||
**Automated Release created on: ${{ steps.getVariables.outputs.datetime }}**
|
||||
|
||||
# New Features
|
||||
|
||||
* tbd
|
||||
* tbd
|
||||
|
||||
# Changes
|
||||
|
||||
* tbd
|
||||
* tbd
|
||||
|
||||
# Bug Fixes
|
||||
|
||||
* tbd
|
||||
* tbd
|
||||
|
||||
# Documentation
|
||||
|
||||
* tbd
|
||||
* tbd
|
||||
|
||||
# Unit Tests
|
||||
|
||||
* tbd
|
||||
* tbd
|
||||
|
||||
----------
|
||||
# Related Issues and Pull-Requests
|
||||
|
||||
* tbd
|
||||
* tbd
|
||||
|
||||
|
||||
**Behavior:**
|
||||
|
||||
1. Extract information from environment variables provided by GitHub Actions.
|
||||
2. Create a Release Page on GitHub
|
||||
|
||||
**Dependencies:**
|
||||
|
||||
* :gh:`actions/create-release` (unmaintained)
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
Simple Example
|
||||
==============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Release:
|
||||
uses: pyTooling/Actions/.github/workflows/Release.yml@r4
|
||||
|
||||
|
||||
Complex Example
|
||||
===============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Release:
|
||||
uses: pyTooling/Actions/.github/workflows/Release.yml@r4
|
||||
if: startsWith(github.ref, 'refs/tags')
|
||||
needs:
|
||||
- Package
|
||||
|
||||
|
||||
Parameters
|
||||
**********
|
||||
|
||||
This job template needs no input parameters.
|
||||
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
|
||||
Results
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
580
doc/JobTemplate/Release/PublishReleaseNotes.rst
Normal file
@@ -0,0 +1,580 @@
|
||||
.. _JOBTMPL/PublishReleaseNotes:
|
||||
.. index::
|
||||
single: gh; PublishReleaseNotes Template
|
||||
single: GitHub Action Reusable Workflow; PublishReleaseNotes Template
|
||||
|
||||
PublishReleaseNotes
|
||||
###################
|
||||
|
||||
This template creates a GitHub Release Page and uploads assets to that page.
|
||||
|
||||
.. topic:: Features
|
||||
|
||||
* Assembly a release description from various sources:
|
||||
|
||||
* Description file in the repository.
|
||||
* Description via job template parameter.
|
||||
* Description from associated pull-request.
|
||||
|
||||
* Download artifact and upload selected files as assets to the release page.
|
||||
* Add an inventory file in JSON format as asset to each release.
|
||||
* Replace placeholders with variable contents.
|
||||
* Override the release's title.
|
||||
* Create draft releases.
|
||||
* Create pre-release release.
|
||||
* Create nightly/rolling releases.
|
||||
|
||||
.. topic:: Behavior
|
||||
|
||||
1. Checkout repository.
|
||||
2. Install dependencies.
|
||||
3. Check if it's a full release or nightly release (rolling release).
|
||||
4. Delete old release.
|
||||
5. Assemble release notes.
|
||||
6. Create a new or recreate the release page as draft.
|
||||
7. Attach files from artifacts as assets:
|
||||
|
||||
1. Download artifact
|
||||
2. Optionally, create compressed archives of that content.
|
||||
3. Upload assets to release page.
|
||||
|
||||
8. Remove draft state from new release page.
|
||||
|
||||
.. topic:: Job Execution
|
||||
|
||||
.. image:: ../../_static/pyTooling-Actions-PublishReleaseNotes.png
|
||||
:width: 600px
|
||||
|
||||
.. topic:: Dependencies
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* ``gh`` (GitHub command line interface)
|
||||
* ``jq`` (JSON processing)
|
||||
* apt
|
||||
|
||||
* zstd
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Instantiation:
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Prepare:
|
||||
uses: pyTooling/Actions/.github/workflows/PrepareJob.yml@r6
|
||||
|
||||
Release:
|
||||
uses: pyTooling/Actions/.github/workflows/PublishReleaseNotes.yml@r6
|
||||
needs:
|
||||
- Prepare
|
||||
if: needs.Prepare.outputs.is_release_tag == 'true'
|
||||
permissions:
|
||||
contents: write
|
||||
actions: write
|
||||
with:
|
||||
tag: ${{ needs.Prepare.outputs.version }}
|
||||
secrets: inherit
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/ReleaseNotes:
|
||||
|
||||
Release Notes
|
||||
*************
|
||||
|
||||
Providing a release description (a.k.a release page content) can be achieved from various sources. These sources can
|
||||
also be combined to a single description. Moreover, the resulting description can contain placeholders which can be
|
||||
replaced by values provided via parameter :ref:`JOBTMPL/PublishReleaseNotes/Input/replacements`.
|
||||
|
||||
Description text from file in the repository
|
||||
The job template's parameter :ref:`JOBTMPL/PublishReleaseNotes/Input/description_file` provides a way to read a
|
||||
predefined content from a file within the repository. This allows sharing the same text between nightly releases and
|
||||
full releases.
|
||||
|
||||
.. note::
|
||||
|
||||
This file can't be computed/modified at pipeline runtime, because a fixed Git commit is checked out for this job
|
||||
template run.
|
||||
Descriptions text from pipeline parameter
|
||||
The job template's parameter :ref:`JOBTMPL/PublishReleaseNotes/Input/description` provides a way to either hard code
|
||||
a release description in YAML code, or connect a GitHub Action variable ``${{ ... }}`` to that parameter.
|
||||
|
||||
The content is available in replacement variable ``%%DESCRIPTION%%``.
|
||||
Description text from associated PullRequest
|
||||
If an associated pull-request can be identified for a merge-commit, the pull-requests description can be used as a
|
||||
release description.
|
||||
|
||||
The content is available in replacement variable ``%%PULLREQUEST%%``.
|
||||
Additional text from :ref:`JOBTMPL/PublishReleaseNotes/Input/description_footer`
|
||||
Additionally, a footer text is provided.
|
||||
|
||||
The content is available in replacement variable ``%%FOOTER%%``.
|
||||
|
||||
.. topic:: Order of Processing
|
||||
|
||||
1. If :ref:`JOBTMPL/PublishReleaseNotes/Input/description_file` exists and is not empty, it will serve as the main
|
||||
description. If the description contains ``%%...%%`` placeholders, these placeholders will be replaced
|
||||
accordingly. If description contains ``%...%`` placeholders, replacement rules provided by
|
||||
:ref:`JOBTMPL/PublishReleaseNotes/Input/replacements` will be applied.
|
||||
2. If :ref:`JOBTMPL/PublishReleaseNotes/Input/description` is not empty, it will serve as the main description. If
|
||||
the description contains ``%%...%%`` placeholders, these placeholders will be replaced accordingly. If description
|
||||
contains ``%...%`` placeholders, replacement rules provided by :ref:`JOBTMPL/PublishReleaseNotes/Input/replacements`
|
||||
will be applied.
|
||||
3. If the associated pull-request exists and is not empty, it's description will serve as the main description. If
|
||||
the description contains ``%%...%%`` placeholders, these placeholders will be replaced accordingly. If description
|
||||
contains ``%...%`` placeholders, replacement rules provided by :ref:`JOBTMPL/PublishReleaseNotes/Input/replacements`
|
||||
will be applied.
|
||||
4. Otherwise, an error is raised.
|
||||
|
||||
.. topic:: Replacements
|
||||
|
||||
``%%DESCRIPTION%%``
|
||||
Replaces the placeholder with the content from :ref:`JOBTMPL/PublishReleaseNotes/Input/description`.
|
||||
``%%PULLREQUEST%%``, ``%%PULLREQUEST+0%%``, ``%%PULLREQUEST+1%%``, ``%%PULLREQUEST+2%%``, ``%%PULLREQUEST+3%%``
|
||||
Replaces the content by the associated pull-requests description text.
|
||||
|
||||
If an indentation level +N (``+1``, ``+2``, ``+3``) is specified, headlines in the pull-request description will be
|
||||
moved by N levels down.
|
||||
``%%FOOTER%%``
|
||||
Replaces the placeholder with the content from :ref:`JOBTMPL/PublishReleaseNotes/Input/description_footer`.
|
||||
``%%gh_server%%``
|
||||
Replaced by the GitHub server URL. |br|
|
||||
The value is derived from ``${{ github.server_url }}``.
|
||||
``%%gh_workflow_name%%``
|
||||
Replaced by the workflow name. |br|
|
||||
The value is derived from ``${{ github.workflow }}``.
|
||||
``%%gh_owner%%``
|
||||
Replaced by the repository owner, which is either the name of a GitHub organisation or a GitHub user account. |br|
|
||||
The value is derived from ``${{ github.repository_owner }}``.
|
||||
``%%gh_repo%%``
|
||||
Replaced by the repository name. |br|
|
||||
The value is derived from ``${{ github.repository }}`` by splitting namespace and repository name into the
|
||||
``${repo}`` variable.
|
||||
``%%gh_owner_repo%%``
|
||||
Replaced by the repository slug, which is either the name of a GitHub organisation or a GitHub user account
|
||||
followed by the repository name concatenated by the slash character. |br|
|
||||
The value is derived from ``${{ github.repository }}``.
|
||||
``%%gh_pages%%``
|
||||
Replaced by the URL to the associated GitHub Pages webspace. |br|
|
||||
The value is formatted as ``https://${{ github.repository_owner }}.github.io/${repo}``.
|
||||
``%%gh_runid%%``
|
||||
Replaced by the pipelines ID. |br|
|
||||
The value is derived from ``${{ github.run_id }}``
|
||||
``%%gh_actor%%``
|
||||
Replaced by the actor (user or bot), who launched the pipeline. |br|
|
||||
The value is derived from ``${{ github.actor }}``.
|
||||
``%%gh_sha%%``
|
||||
Replaced by the associated commit's SHA. |br|
|
||||
The value is derived from ``${{ github.sha }}``
|
||||
``%%date%%``
|
||||
Replaced by the current date. |br|
|
||||
The value is formatted as ``$(date '+%Y-%m-%d')``.
|
||||
``%%time%%``
|
||||
Replaced by the current date. |br|
|
||||
The value is formatted as ``$(date '+%H:%M:%S %Z')``.
|
||||
``%%datetime%%``
|
||||
Replaced by the current date. |br|
|
||||
The value is formatted as ``$(date '+%Y-%m-%d %H:%M:%S %Z')``.
|
||||
|
||||
|
||||
Examples
|
||||
========
|
||||
|
||||
.. todo::
|
||||
|
||||
* GHDL - uses description_file and description
|
||||
* pyTooling - uses pullrequest
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Assets:
|
||||
|
||||
Assets
|
||||
******
|
||||
|
||||
.. todo::
|
||||
|
||||
PublishReleaseNotes::Assets Describe artifact to asset transformation
|
||||
|
||||
Format: ``artifact:file:title``
|
||||
|
||||
See also: :ref:`JOBTMPL/PublishReleaseNotes/Input/replacements`
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Inventory:
|
||||
|
||||
Inventory
|
||||
*********
|
||||
|
||||
.. todo::
|
||||
|
||||
PublishReleaseNotes::Inventory Describe how inventory files are created.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Parameters:
|
||||
|
||||
Parameter Summary
|
||||
*****************
|
||||
|
||||
.. rubric:: Goto :ref:`input parameters <JOBTMPL/PublishReleaseNotes/Inputs>`
|
||||
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=========================================================================+==========+==========+===================================================================+
|
||||
| :ref:`JOBTMPL/PublishReleaseNotes/Input/ubuntu_image` | no | string | ``'ubuntu-24.04'`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishReleaseNotes/Input/release_branch` | no | string | ``'main'`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishReleaseNotes/Input/mode` | no | string | ``'release'`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishReleaseNotes/Input/tag` | yes | string | — — — — |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishReleaseNotes/Input/title` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishReleaseNotes/Input/description` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishReleaseNotes/Input/description_file` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishReleaseNotes/Input/description_footer` | no | string | see parameter details |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishReleaseNotes/Input/draft` | no | boolean | ``false`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishReleaseNotes/Input/prerelease` | no | boolean | ``false`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishReleaseNotes/Input/latest` | no | boolean | ``false`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishReleaseNotes/Input/replacements` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishReleaseNotes/Input/assets` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishReleaseNotes/Input/inventory-json` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishReleaseNotes/Input/inventory-version` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishReleaseNotes/Input/inventory-categories` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishReleaseNotes/Input/tarball-name` | no | string | ``'__pyTooling_upload_artifact__.tar'`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PublishReleaseNotes/Input/can-fail` | no | boolean | ``false`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
|
||||
.. rubric:: Goto :ref:`secrets <JOBTMPL/PublishReleaseNotes/Secrets>`
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
.. rubric:: Goto :ref:`output parameters <JOBTMPL/PublishReleaseNotes/Outputs>`
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Inputs:
|
||||
|
||||
Input Parameters
|
||||
****************
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Input/ubuntu_image:
|
||||
|
||||
ubuntu_image
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: usually no
|
||||
:Default Value: ``'ubuntu-24.04'``
|
||||
:Possible Values: See `actions/runner-images - Available Images <https://github.com/actions/runner-images?tab=readme-ov-file#available-images>`__
|
||||
for available Ubuntu image versions.
|
||||
:Description: Name of the Ubuntu image used to run a job.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Input/release_branch:
|
||||
|
||||
release_branch
|
||||
==============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'main'``
|
||||
:Possible Values: Any valid Git branch name.
|
||||
:Description: Name of the branch containing releases.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Input/mode:
|
||||
|
||||
mode
|
||||
====
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'release'``
|
||||
:Possible Values: ``'release'``, ``'nightly'``
|
||||
:Description: The release mode, which is either *nightly* (a.k.a *rolling* release) or *release*.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Input/tag:
|
||||
|
||||
tag
|
||||
===
|
||||
|
||||
:Type: string
|
||||
:Required: yes
|
||||
:Default Value: — — — —
|
||||
:Possible Values: Any valid Git tag name.
|
||||
:Description: Name of the release (tag).
|
||||
:Condition: It must match an existing tag name in the repository.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Input/title:
|
||||
|
||||
title
|
||||
=====
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid string suitable for a release title (headline).
|
||||
:Description: If this parameter is not empty, the releases title is set, which overrides the default title inferred
|
||||
from the associated tag name.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Input/description:
|
||||
|
||||
description
|
||||
===========
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid (multi-line) Markdown string.
|
||||
:Description: The description of the release usually used to render the *release notes*. |br|
|
||||
See :ref:`JOBTMPL/PublishReleaseNotes/ReleaseNotes` for more details.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Input/description_file:
|
||||
|
||||
description_file
|
||||
================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid Markdown file. |br|
|
||||
Suggested value: :file:`.github/ReleaseDescription.md`.
|
||||
:Description: Path to a Markdown file used for the release description. |br|
|
||||
See :ref:`JOBTMPL/PublishReleaseNotes/ReleaseNotes` for more details.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Input/description_footer:
|
||||
|
||||
description_footer
|
||||
==================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value:
|
||||
.. code-block::
|
||||
|
||||
|
||||
--------
|
||||
Published from [%%gh_workflow_name%%](%%gh_server%%/%%gh_owner_repo%%/actions/runs/%%gh_runid%%) workflow triggered by %%gh_actor%% on %%datetime%%.
|
||||
|
||||
This automatic release was created by [pyTooling/Actions](http://github.com/pyTooling/Actions)::Release.yml
|
||||
:Possible Values: Any valid (multi-line) Markdown text.
|
||||
:Description: A footer added to the description. |br|
|
||||
See :ref:`JOBTMPL/PublishReleaseNotes/ReleaseNotes` for more details.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Input/draft:
|
||||
|
||||
draft
|
||||
=====
|
||||
|
||||
:Type: :red:`boolean`
|
||||
:Required: no
|
||||
:Default Value: ``false``
|
||||
:Possible Values: ``false``, ``true``
|
||||
:Description: If *true*, the release is kept in *draft* state.
|
||||
|
||||
.. note::
|
||||
|
||||
GitHub doesn't send e-mail notifications to subscribed users for draft releases.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Input/prerelease:
|
||||
|
||||
prerelease
|
||||
==========
|
||||
|
||||
:Type: :red:`boolean`
|
||||
:Required: no
|
||||
:Default Value: ``false``
|
||||
:Possible Values: ``false``, ``true``
|
||||
:Description: If *true*, the release is marked as a *pre-release*.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Input/latest:
|
||||
|
||||
latest
|
||||
======
|
||||
|
||||
:Type: :red:`boolean`
|
||||
:Required: no
|
||||
:Default Value: ``false``
|
||||
:Possible Values: ``false``, ``true``
|
||||
:Description: If *true*, the release is marked as *latest release*.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Input/replacements:
|
||||
|
||||
replacements
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid multi-line string of format ``search=replace`` patterns.
|
||||
:Description: The given replacements are used to replace placeholders in :ref:`JOBTMPL/PublishReleaseNotes/Input/description`,
|
||||
:ref:`JOBTMPL/PublishReleaseNotes/Input/description_file`, :ref:`JOBTMPL/PublishReleaseNotes/Input/description_footer`. |br|
|
||||
See :ref:`JOBTMPL/PublishReleaseNotes/ReleaseNotes` for more details.
|
||||
:Example: The following example replaces the placeholder ``%version%`` with the actual version number (inferred
|
||||
from tag name by :ref:`JOBTMPL/PrepareJob`.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ReleasePage:
|
||||
uses: pyTooling/Actions/.github/workflows/PublishReleaseNotes.yml@r6
|
||||
needs:
|
||||
- Prepare
|
||||
if: needs.Prepare.outputs.is_release_tag == 'true'
|
||||
permissions:
|
||||
contents: write
|
||||
actions: write
|
||||
with:
|
||||
tag: ${{ needs.Prepare.outputs.version }}
|
||||
description: |
|
||||
# myPackage %version%
|
||||
|
||||
This is the latest release of myPackage.
|
||||
replacements: |
|
||||
version=${{ needs.Prepare.outputs.version }}
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Input/assets:
|
||||
|
||||
assets
|
||||
======
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid multi-line string containing artifact to asset transformations. |br|
|
||||
The ``artifact:file:title`` format is explained at :ref:`JOBTMPL/PublishReleaseNotes/Assets`
|
||||
:Description: Each line describes which artifacts to download and extract as well as which extracted file to upload
|
||||
as a release asset. The files title can be changed. |br|
|
||||
Replacement rules from parameter :ref:`JOBTMPL/PublishReleaseNotes/Input/replacements` can be used,
|
||||
too. |br|
|
||||
See :ref:`JOBTMPL/PublishReleaseNotes/Assets` for more details.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Input/inventory-json:
|
||||
|
||||
inventory-json
|
||||
==============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid JSON filename. |br|
|
||||
Suggested value: :file:`inventory.json`.
|
||||
:Description: If this parameter is not empty, an inventory of all assets will be created and attached as a JSON file
|
||||
to the release. |br|
|
||||
See :ref:`JOBTMPL/PublishReleaseNotes/Inventory` for more details.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Input/inventory-version:
|
||||
|
||||
inventory-version
|
||||
=================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid version string.
|
||||
:Description: If this parameter is not empty, the version field in the inventory JSON is set to this value. |br|
|
||||
See :ref:`JOBTMPL/PublishReleaseNotes/Inventory` for more details.
|
||||
|
||||
.. hint::
|
||||
|
||||
Especially for *nightly*/*rolling* releases, the used Git tag is a name rather then a version
|
||||
number. Therefore, a version number must be provided thus a nightly release can be identified as
|
||||
``vX.Y.Z``.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Input/inventory-categories:
|
||||
|
||||
inventory-categories
|
||||
====================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: A colon separated list of identifiers used as category names in an inventory JSON.
|
||||
:Description: For decoding hierarchy levels (categories) in an inventory JSON, the hierarchy of categories can be
|
||||
added to the inventoy JSON. |br|
|
||||
See :ref:`JOBTMPL/PublishReleaseNotes/Inventory` for more details.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Input/tarball-name:
|
||||
|
||||
tarball-name
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'__pyTooling_upload_artifact__.tar'``
|
||||
:Possible Values: Any valid name for a tarball file.
|
||||
:Description:
|
||||
.. todo:: PublishReleaseNotes::tarball-name Needs documentation.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Input/can-fail:
|
||||
|
||||
can-fail
|
||||
========
|
||||
|
||||
:Type: :red:`boolean`
|
||||
:Required: no
|
||||
:Default Value: ``false``
|
||||
:Possible Values: ``false``, ``true``
|
||||
:Description:
|
||||
.. todo:: PublishReleaseNotes::can-fail Needs documentation.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Secrets:
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Outputs:
|
||||
|
||||
Outputs
|
||||
*******
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Output/release-page:
|
||||
|
||||
release-page
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Description: Returns the URL to the release page.
|
||||
:Example: ``tbd``
|
||||
|
||||
|
||||
.. _JOBTMPL/PublishReleaseNotes/Optimizations:
|
||||
|
||||
Optimizations
|
||||
*************
|
||||
|
||||
This template offers no optimizations (reduced job runtime).
|
||||
198
doc/JobTemplate/Release/TagReleaseCommit.rst
Normal file
@@ -0,0 +1,198 @@
|
||||
.. _JOBTMPL/TagReleaseCommit:
|
||||
.. index::
|
||||
single: gh; TagReleaseCommit Template
|
||||
single: GitHub Action Reusable Workflow; TagReleaseCommit Template
|
||||
|
||||
TagReleaseCommit
|
||||
################
|
||||
|
||||
The ``TagReleaseCommit`` job template creates a tag at the commit currently used by the pipeline run and then it
|
||||
triggers a new pipeline run for that tag, a.k.a *tag pipeline* or *release pipeline*.
|
||||
|
||||
.. note::
|
||||
|
||||
When the *tag pipeline* is launched, the pipeline is displayed in GitHub Actions with the name in the YAML file. In
|
||||
contrast, when a tag is manually added and pushed via Git on command line, the tag name is displayed.
|
||||
|
||||
Currently, no command, API or similar is known to add a tag and trigger a matching pipeline run, where the pipeline
|
||||
is named like the used tag. Thus, currently this job template has a slightly different behavior compared to manual
|
||||
tagging and pushing a tag to GitHub.
|
||||
|
||||
In addition, GitHub doesn't support *project access token*, thus there is no solution to create a user independent
|
||||
token to emulate a manual push operation.
|
||||
|
||||
.. topic:: Features
|
||||
|
||||
* Tag the current pipeline's commit.
|
||||
* Trigger a new pipeline run for this new tag.
|
||||
|
||||
.. topic:: Behavior
|
||||
|
||||
1. Tag the current commit with a tag named like :ref:`JOBTMPL/TagReleaseCommit/Input/version`.
|
||||
2. Trigger a pipeline run for the new tag.
|
||||
|
||||
.. topic:: Job Execution
|
||||
|
||||
.. image:: ../../_static/pyTooling-Actions-TagReleaseCommit.png
|
||||
:width: 350px
|
||||
|
||||
.. topic:: Dependencies
|
||||
|
||||
* :gh:`actions/github-script`
|
||||
|
||||
|
||||
.. _JOBTMPL/TagReleaseCommit/Instantiation:
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
The following instantiation example depicts three jobs within a bigger pipeline. The ``prepare`` job derived from job
|
||||
template ``PrepareJob`` version ``@r6`` figures out if a pipeline runs for a release merge-commit, for a tag or any
|
||||
other reason. Its outputs are used to either run a ``TriggerTaggedRelease`` job derived from job template
|
||||
``TagReleaseCommit`` version ``@r6``, or alternatively run the ``ReleasePage`` job derived from job template
|
||||
``PublishReleaseNotes`` version ``@r6``.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Prepare:
|
||||
uses: pyTooling/Actions/.github/workflows/PrepareJob.yml@r6
|
||||
|
||||
# Other pipeline jobs
|
||||
|
||||
TriggerTaggedRelease:
|
||||
uses: pyTooling/Actions/.github/workflows/TagReleaseCommit.yml@r6
|
||||
needs:
|
||||
- Prepare
|
||||
if: needs.Prepare.outputs.is_release_commit == 'true' && github.event_name != 'schedule'
|
||||
permissions:
|
||||
contents: write # required for create tag
|
||||
actions: write # required for trigger workflow
|
||||
with:
|
||||
version: ${{ needs.Prepare.outputs.version }}
|
||||
auto_tag: ${{ needs.Prepare.outputs.is_release_commit }}
|
||||
secrets: inherit
|
||||
|
||||
ReleasePage:
|
||||
uses: pyTooling/Actions/.github/workflows/PublishReleaseNotes.yml@r6
|
||||
needs:
|
||||
- Prepare
|
||||
if: needs.Prepare.outputs.is_release_tag == 'true'
|
||||
permissions:
|
||||
contents: write
|
||||
actions: write
|
||||
with:
|
||||
tag: ${{ needs.Prepare.outputs.version }}
|
||||
secrets: inherit
|
||||
|
||||
|
||||
.. _JOBTMPL/TagReleaseCommit/Parameters:
|
||||
|
||||
Parameter Summary
|
||||
*****************
|
||||
|
||||
.. rubric:: Goto :ref:`input parameters <JOBTMPL/TagReleaseCommit/Inputs>`
|
||||
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=====================================================================+==========+==========+===================================================================+
|
||||
| :ref:`JOBTMPL/TagReleaseCommit/Input/ubuntu_image` | no | string | ``'ubuntu-24.04'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/TagReleaseCommit/Input/version` | yes | string | — — — — |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/TagReleaseCommit/Input/auto_tag` | yes | string | — — — — |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/TagReleaseCommit/Input/workflow` | no | string | ``'Pipeline.yml'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
|
||||
.. rubric:: Goto :ref:`secrets <JOBTMPL/TagReleaseCommit/Secrets>`
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
.. rubric:: Goto :ref:`output parameters <JOBTMPL/TagReleaseCommit/Outputs>`
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/TagReleaseCommit/Inputs:
|
||||
|
||||
Input Parameters
|
||||
****************
|
||||
|
||||
.. _JOBTMPL/TagReleaseCommit/Input/ubuntu_image:
|
||||
|
||||
ubuntu_image
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'ubuntu-24.04'``
|
||||
:Possible Values: See `actions/runner-images - Available Images <https://github.com/actions/runner-images?tab=readme-ov-file#available-images>`__
|
||||
for available Ubuntu image versions.
|
||||
:Description: Name of the Ubuntu image used to run this job.
|
||||
|
||||
|
||||
.. _JOBTMPL/TagReleaseCommit/Input/version:
|
||||
|
||||
version
|
||||
=======
|
||||
|
||||
:Type: string
|
||||
:Required: yes
|
||||
:Default Value: — — — —
|
||||
:Possible Values: Any valid Git tag name.
|
||||
:Description: The version string to be used for tagging.
|
||||
|
||||
|
||||
.. _JOBTMPL/TagReleaseCommit/Input/auto_tag:
|
||||
|
||||
auto_tag
|
||||
========
|
||||
|
||||
:Type: string
|
||||
:Required: yes
|
||||
:Default Value: — — — —
|
||||
:Possible Values: ``'false'``, ``'true'```
|
||||
:Description: If *true*, tag the current commit.
|
||||
|
||||
|
||||
.. _JOBTMPL/TagReleaseCommit/Input/workflow:
|
||||
|
||||
workflow
|
||||
========
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'Pipeline.yml'``
|
||||
:Possible Values: Any valid GitHub Action pipeline filename.
|
||||
:Description: Github Action pipeline (workflow) to trigger after tag creation.
|
||||
|
||||
.. note::
|
||||
|
||||
Compared to manual tagging and pushing a tag, where a pipeline is triggered automatically, here a
|
||||
pipeline must be trigger separately by API. Therefore the pipeline doesn't run with the name of the
|
||||
tag, but with the name specified within the workflow YAML file.
|
||||
|
||||
|
||||
.. _JOBTMPL/TagReleaseCommit/Secrets:
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
|
||||
.. _JOBTMPL/TagReleaseCommit/Outputs:
|
||||
|
||||
Outputs
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/TagReleaseCommit/Optimizations:
|
||||
|
||||
Optimizations
|
||||
*************
|
||||
|
||||
This template offers no optimizations (reduced job runtime).
|
||||
15
doc/JobTemplate/Release/index.rst
Normal file
@@ -0,0 +1,15 @@
|
||||
.. _JOBTMPL/Release:
|
||||
|
||||
Release
|
||||
#######
|
||||
|
||||
The category *release* provides workflow templates implementing
|
||||
|
||||
* :ref:`JOBTMPL/TagReleaseCommit` - Automatically tag current commit in Git using the associate pull-requests title.
|
||||
* :ref:`JOBTMPL/PublishReleaseNotes` - Create GitHub release page and upload release assets.
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
||||
TagReleaseCommit
|
||||
PublishReleaseNotes
|
||||
877
doc/JobTemplate/Setup/ExtractConfiguration.rst
Normal file
@@ -0,0 +1,877 @@
|
||||
.. _JOBTMPL/ExtractConfiguration:
|
||||
.. index::
|
||||
single: GitHub Action Reusable Workflow; ExtractConfiguration Template
|
||||
|
||||
ExtractConfiguration
|
||||
####################
|
||||
|
||||
The ``ExtractConfiguration`` job template extracts Python project settings from :file:`pyproject.toml` and shares the
|
||||
values via output parameters with other jobs. Thus, only a single centralized implementation is needed to avoid code
|
||||
duplications within jobs.
|
||||
|
||||
|
||||
.. topic:: Features
|
||||
|
||||
* Extract the unittest report file in pytest's JUnit XML format as directory name, filename and full path from
|
||||
:file:`pyproject.toml`.
|
||||
* Extract the merged unittest XML report file as directory name, filename and full path from :file:`pyproject.toml`.
|
||||
* Extract code coverage report in HTML format as directory from :file:`pyproject.toml`.
|
||||
* Extract code coverage report file in Cobertura XML format as directory name, filename and full path from
|
||||
:file:`pyproject.toml`.
|
||||
* Extract code coverage report file in Coverage.py's JSON format as directory name, filename and full path from
|
||||
:file:`pyproject.toml`.
|
||||
* Extract static typing report file in Cobertura XML format as directory name, filename and full path from
|
||||
:file:`pyproject.toml`.
|
||||
* Extract static typing report file in JUnit XML format as directory name, filename and full path from
|
||||
:file:`pyproject.toml`.
|
||||
* Extract static typing report in HTML format as directory name from :file:`pyproject.toml`.
|
||||
|
||||
.. topic:: Behavior
|
||||
|
||||
1. Checkout repository.
|
||||
2. Install Python dependencies.
|
||||
3. Compute the full package name and the package source directory.
|
||||
4. Read :file:`pyproject.toml` and extract settings for:
|
||||
|
||||
* :term:`Coverage.py`
|
||||
* :term:`mypy`
|
||||
* :term:`pyEDAA.Reports`
|
||||
* :term:`pytest`
|
||||
|
||||
.. topic:: Job Execution
|
||||
|
||||
.. image:: ../../_static/pyTooling-Actions-ExtractConfiguration.png
|
||||
:width: 600px
|
||||
|
||||
.. topic:: Dependencies
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`actions/setup-python`
|
||||
|
||||
* :pypi:`wheel`
|
||||
* :pypi:`tomli`
|
||||
|
||||
|
||||
.. _JOBTMPL/ExtractConfiguration/Instantiation:
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
The following instantiation example creates a ``ConfigParams`` job derived from job template ``ExtractConfiguration``
|
||||
version ``@r6``. It requires no special parameters to extract unit test (pytest) and code coverage (Coverage.py)
|
||||
settings.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
UnitTesting:
|
||||
uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
unittest_report_xml: ${{ needs.ConfigParams.outputs.unittest_report_xml }}
|
||||
coverage_report_xml: ${{ needs.ConfigParams.outputs.coverage_report_xml }}
|
||||
coverage_report_json: ${{ needs.ConfigParams.outputs.coverage_report_json }}
|
||||
coverage_report_html: ${{ needs.ConfigParams.outputs.coverage_report_html }}
|
||||
|
||||
|
||||
.. seealso::
|
||||
|
||||
:ref:`JOBTMPL/UnitTesting`
|
||||
``UnitTesting`` is usually
|
||||
:ref:`JOBTMPL/StaticTypeCheck`
|
||||
xxx
|
||||
:ref:`JOBTMPL/CheckDocumentation`
|
||||
xxx
|
||||
:ref:`JOBTMPL/InstallPackage`
|
||||
xxx
|
||||
:ref:`JOBTMPL/PublishCoverageResults`
|
||||
xxx
|
||||
:ref:`JOBTMPL/PublishTestResults`
|
||||
xxx
|
||||
:ref:`JOBTMPL/SphinxDocumentation`
|
||||
xxx
|
||||
|
||||
.. _JOBTMPL/ExtractConfiguration/Parameters:
|
||||
|
||||
Parameter Summary
|
||||
*****************
|
||||
|
||||
.. rubric:: Goto :ref:`input parameters <JOBTMPL/ExtractConfiguration/Inputs>`
|
||||
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=====================================================================+==========+==========+===================================================================+
|
||||
| :ref:`JOBTMPL/ExtractConfiguration/Input/ubuntu_image_version` | no | string | ``'24.04'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/ExtractConfiguration/Input/python_version` | no | string | ``'3.13'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/ExtractConfiguration/Input/coverage_config` | no | string | ``'pyproject.toml'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
|
||||
.. rubric:: Goto :ref:`secrets <JOBTMPL/ExtractConfiguration/Secrets>`
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
.. rubric:: Goto :ref:`output parameters <JOBTMPL/ExtractConfiguration/Outputs>`
|
||||
|
||||
+---------------------------------------------------------------------------------+----------------+-------------------------------------------------------------------+
|
||||
| Result Name | Type | Description |
|
||||
+=================================================================================+================+===================================================================+
|
||||
| :ref:`JOBTMPL/ExtractConfiguration/Output/unittest_report_xml` | string (JSON) | |
|
||||
+---------------------------------------------------------------------------------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/ExtractConfiguration/Output/unittest_merged_report_xml` | string (JSON) | |
|
||||
+---------------------------------------------------------------------------------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/ExtractConfiguration/Output/coverage_report_html` | string (JSON) | |
|
||||
+---------------------------------------------------------------------------------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/ExtractConfiguration/Output/coverage_report_xml` | string (JSON) | |
|
||||
+---------------------------------------------------------------------------------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/ExtractConfiguration/Output/coverage_report_json` | string (JSON) | |
|
||||
+---------------------------------------------------------------------------------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/ExtractConfiguration/Output/typing_report_cobertura` | string (JSON) | |
|
||||
+---------------------------------------------------------------------------------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/ExtractConfiguration/Output/typing_report_junit` | string (JSON) | |
|
||||
+---------------------------------------------------------------------------------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/ExtractConfiguration/Output/typing_report_html` | string (JSON) | |
|
||||
+---------------------------------------------------------------------------------+----------------+-------------------------------------------------------------------+
|
||||
|
||||
|
||||
.. _JOBTMPL/ExtractConfiguration/Inputs:
|
||||
|
||||
Input Parameters
|
||||
****************
|
||||
|
||||
.. _JOBTMPL/ExtractConfiguration/Input/ubuntu_image_version:
|
||||
|
||||
.. include:: ../_ubuntu_image_version.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/ExtractConfiguration/Input/python_version:
|
||||
|
||||
.. include:: ../_python_version.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/ExtractConfiguration/Input/coverage_config:
|
||||
|
||||
coverage_config
|
||||
===============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'pyproject.toml'``
|
||||
:Possible Values: Any valid path to a :file:`pyproject.toml` file. |br|
|
||||
Alternatively, path to a :file:`.coveragerc` file (deprecated).
|
||||
:Description: Path to a Python project configuration file for extraction of project settings.
|
||||
:Example:
|
||||
.. grid:: 2
|
||||
|
||||
.. grid-item::
|
||||
:columns: 5
|
||||
|
||||
.. rubric:: Extracted values from :file:`pyproject.toml`
|
||||
|
||||
.. code-block:: toml
|
||||
|
||||
[tool.coverage.xml]
|
||||
output = "report/coverage/coverage.xml"
|
||||
|
||||
[tool.coverage.json]
|
||||
output = "report/coverage/coverage.json"
|
||||
|
||||
[tool.coverage.html]
|
||||
directory = "report/coverage/html"
|
||||
title="Code Coverage of myPackage"
|
||||
|
||||
[tool.mypy]
|
||||
html_report = "report/typing/html"
|
||||
junit_xml = "report/typing/StaticTypingSummary.xml"
|
||||
cobertura_xml_report = "report/typing"
|
||||
|
||||
[tool.pyedaa-reports]
|
||||
junit_xml = "report/unit/unittest.xml"
|
||||
|
||||
[tool.pytest]
|
||||
junit_xml = "report/unit/UnittestReportSummary.xml"
|
||||
|
||||
|
||||
.. _JOBTMPL/ExtractConfiguration/Secrets:
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
|
||||
.. _JOBTMPL/ExtractConfiguration/Outputs:
|
||||
|
||||
Outputs
|
||||
*******
|
||||
|
||||
.. _JOBTMPL/ExtractConfiguration/Output/unittest_report_xml:
|
||||
|
||||
unittest_report_xml
|
||||
===================
|
||||
|
||||
:Type: string (JSON)
|
||||
:Description: Returns a string in JSON format containing the directory, the filename and the fullpath to the unit
|
||||
test's report XML file created by :term:`pytest` in JUnit XML format.
|
||||
|
||||
The JSON object contains these fields:
|
||||
|
||||
:directory: Contains the directory where the unittest XML report file will be created. |br|
|
||||
Example: :file:`reports/unit`
|
||||
:filename: Contains the filename of the unittest XML report file. |br|
|
||||
Example: :file:`UnittestReportSummary.xml`
|
||||
:fullpath: Contains the path where the unittest XML report file will be created. |br|
|
||||
This is the concatenation of both previous JSON fields. |br|
|
||||
Example: :file:`reports/unit/UnittestReportSummary.xml`
|
||||
:pyproject.toml: Matching :file:`pyproject.toml` configuration for tool :term:`pytest`.
|
||||
|
||||
.. code-block:: toml
|
||||
|
||||
[tool.pytest]
|
||||
junit_xml = "report/unit/UnittestReportSummary.xml"
|
||||
:Example:
|
||||
.. code-block:: json
|
||||
|
||||
{ "directory": "reports/unit",
|
||||
"filename": "UnittestReportSummary.xml",
|
||||
"fullpath": "reports/unit/UnittestReportSummary.xml"
|
||||
}
|
||||
:Usage:
|
||||
.. tab-set::
|
||||
|
||||
.. tab-item:: Forwarding complete JSON object
|
||||
:sync: ForwardParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
report: ${{ needs.ConfigParams.outputs.unittest_report_xml }}
|
||||
|
||||
.. tab-item:: Assembling new JSON object
|
||||
:sync: AssembleParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
report: >-
|
||||
{ "dir": "${{ fromJson(needs.ConfigParams.outputs.unittest_report_xml).directory }}",
|
||||
"file": "${{ fromJson(needs.ConfigParams.outputs.unittest_report_xml).filename }}"
|
||||
}
|
||||
|
||||
.. tab-item:: Using single field from JSON object
|
||||
:sync: SingleFieldFromParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
fullpath: ${{ fromJson(needs.ConfigParams.outputs.unittest_report_xml).fullpath }}
|
||||
|
||||
|
||||
.. _JOBTMPL/ExtractConfiguration/Output/unittest_merged_report_xml:
|
||||
|
||||
unittest_merged_report_xml
|
||||
==========================
|
||||
|
||||
:Type: string (JSON)
|
||||
:Description: Returns a string in JSON format containing the directory, the filename and the fullpath to the merged
|
||||
unittest report file in JUnit XML format created by :term:`pyEDAA.Reports`.
|
||||
|
||||
The JSON object contains these fields:
|
||||
|
||||
:directory: Contains the directory where the merged unittest XML report file will be created. |br|
|
||||
Example: :file:`reports/unit`
|
||||
:filename: Contains the filename of the merged unittest XML report file. |br|
|
||||
Example: :file:`unittest.xml`
|
||||
:fullpath: Contains the path where the merged unittest XML report file will be created. |br|
|
||||
This is the concatenation of both previous JSON fields. |br|
|
||||
Example: :file:`reports/unit/unittest.xml`
|
||||
:pyproject.toml: Matching :file:`pyproject.toml` configuration for tool :term:`pyEDAA.Reports`.
|
||||
|
||||
.. code-block:: toml
|
||||
|
||||
[tool.pyedaa-reports]
|
||||
junit_xml = "report/unit/unittest.xml"
|
||||
:Example:
|
||||
.. code-block:: json
|
||||
|
||||
{ "directory": "reports/unit",
|
||||
"filename": "unittest.xml",
|
||||
"fullpath": "reports/unit/unittest.xml"
|
||||
}
|
||||
:Usage:
|
||||
.. tab-set::
|
||||
|
||||
.. tab-item:: Forwarding complete JSON object
|
||||
:sync: ForwardParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
report: ${{ needs.ConfigParams.outputs.unittest_merged_report_xml }}
|
||||
|
||||
.. tab-item:: Assembling new JSON object
|
||||
:sync: AssembleParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
report: >-
|
||||
{ "dir": "${{ fromJson(needs.ConfigParams.outputs.unittest_merged_report_xml).directory }}",
|
||||
"file": "${{ fromJson(needs.ConfigParams.outputs.unittest_merged_report_xml).filename }}"
|
||||
}
|
||||
|
||||
.. tab-item:: Using single field from JSON object
|
||||
:sync: SingleFieldFromParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
fullpath: ${{ fromJson(needs.ConfigParams.outputs.unittest_merged_report_xml).fullpath }}
|
||||
|
||||
|
||||
.. _JOBTMPL/ExtractConfiguration/Output/coverage_report_html:
|
||||
|
||||
coverage_report_html
|
||||
====================
|
||||
|
||||
:Type: string (JSON)
|
||||
:Description: Returns a string in JSON format containing the directory and the full path, where the code coverage
|
||||
HTML report will be generated by :term:`Coverage.py`.
|
||||
|
||||
The JSON object contains these fields:
|
||||
|
||||
:directory: Contains the directory where the code coverage report in HTML format will be created. |br|
|
||||
Example: :file:`report/coverage/html`
|
||||
:fullpath: Contains the path where the code coverage report in HTML format will be created. |br|
|
||||
This is the same as the previous JSON field. |br|
|
||||
Example: :file:`report/coverage/html`
|
||||
:pyproject.toml: Matching :file:`pyproject.toml` configuration for tool :term:`Coverage.py`.
|
||||
|
||||
.. code-block:: toml
|
||||
|
||||
[tool.coverage.html]
|
||||
directory = "report/coverage/html"
|
||||
title="Code Coverage of pyDummy"
|
||||
:Example:
|
||||
.. code-block:: json
|
||||
|
||||
{ "directory": "report/coverage/html",
|
||||
"fullpath": "report/coverage/html"
|
||||
}
|
||||
:Usage:
|
||||
.. tab-set::
|
||||
|
||||
.. tab-item:: Forwarding complete JSON object
|
||||
:sync: ForwardParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
report: ${{ needs.ConfigParams.outputs.coverage_report_html }}
|
||||
|
||||
.. tab-item:: Assembling new JSON object
|
||||
:sync: AssembleParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
report: >-
|
||||
{ "dir": "${{ fromJson(needs.ConfigParams.outputs.coverage_report_html).directory }}",
|
||||
"file": "${{ fromJson(needs.ConfigParams.outputs.coverage_report_html).filename }}"
|
||||
}
|
||||
|
||||
.. tab-item:: Using single field from JSON object
|
||||
:sync: SingleFieldFromParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
fullpath: ${{ fromJson(needs.ConfigParams.outputs.coverage_report_html).fullpath }}
|
||||
|
||||
|
||||
.. _JOBTMPL/ExtractConfiguration/Output/coverage_report_xml:
|
||||
|
||||
coverage_report_xml
|
||||
===================
|
||||
|
||||
:Type: string (JSON)
|
||||
:Description: Returns a string in JSON format containing the directory, the filename and the fullpath to the code
|
||||
coverage XML report file in Cobertura XML format created by :term:`Coverage.py`.
|
||||
|
||||
The JSON object contains these fields:
|
||||
|
||||
:directory: Contains the directory where the code coverage XML report file will be created. |br|
|
||||
Example: :file:`reports/unit`
|
||||
:filename: Contains the filename of the code coverage XML report file. |br|
|
||||
Example: :file:`unittest.xml`
|
||||
:fullpath: Contains the path where the code coverage XML report file will be created. |br|
|
||||
This is the concatenation of both previous JSON fields. |br|
|
||||
Example: :file:`reports/unit/unittest.xml`
|
||||
:pyproject.toml: Matching :file:`pyproject.toml` configuration for tool :term:`Coverage.py`.
|
||||
|
||||
.. code-block:: toml
|
||||
|
||||
[tool.coverage.xml]
|
||||
output = "report/coverage/coverage.xml"
|
||||
:Example:
|
||||
.. code-block:: json
|
||||
|
||||
{ "directory": "reports/coverage",
|
||||
"filename": "coverage.xml",
|
||||
"fullpath": "reports/coverage/coverage.xml"
|
||||
}
|
||||
:Usage:
|
||||
.. tab-set::
|
||||
|
||||
.. tab-item:: Forwarding complete JSON object
|
||||
:sync: ForwardParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
report: ${{ needs.ConfigParams.outputs.coverage_report_xml }}
|
||||
|
||||
.. tab-item:: Assembling new JSON object
|
||||
:sync: AssembleParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
report: >-
|
||||
{ "dir": "${{ fromJson(needs.ConfigParams.outputs.coverage_report_xml).directory }}",
|
||||
"file": "${{ fromJson(needs.ConfigParams.outputs.coverage_report_xml).filename }}"
|
||||
}
|
||||
|
||||
.. tab-item:: Using single field from JSON object
|
||||
:sync: SingleFieldFromParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
fullpath: ${{ fromJson(needs.ConfigParams.outputs.coverage_report_xml).fullpath }}
|
||||
|
||||
|
||||
.. _JOBTMPL/ExtractConfiguration/Output/coverage_report_json:
|
||||
|
||||
coverage_report_json
|
||||
====================
|
||||
|
||||
:Type: string (JSON)
|
||||
:Description: Returns a string in JSON format containing the directory, the filename and the fullpath to the code
|
||||
coverage JSON report file created by :term:`Coverage.py`.
|
||||
|
||||
The JSON object contains these fields:
|
||||
|
||||
:directory: Contains the directory where the code coverage JSON report file will be created. |br|
|
||||
Example: :file:`reports/unit`
|
||||
:filename: Contains the filename of the code coverage JSON report file. |br|
|
||||
Example: :file:`unittest.json`
|
||||
:fullpath: Contains the path where the code coverage JSON report file will be created. |br|
|
||||
This is the concatenation of both previous JSON fields. |br|
|
||||
Example: :file:`reports/unit/unittest.json`
|
||||
:pyproject.toml: Matching :file:`pyproject.toml` configuration for tool :term:`Coverage.py`.
|
||||
|
||||
.. code-block:: toml
|
||||
|
||||
[tool.coverage.json]
|
||||
output = "report/coverage/coverage.json"
|
||||
:Example:
|
||||
.. code-block:: json
|
||||
|
||||
{ "directory": "reports/coverage",
|
||||
"filename": "coverage.json",
|
||||
"fullpath": "reports/coverage/coverage.json"
|
||||
}
|
||||
:Usage:
|
||||
.. tab-set::
|
||||
|
||||
.. tab-item:: Forwarding complete JSON object
|
||||
:sync: ForwardParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
report: ${{ needs.ConfigParams.outputs.coverage_report_json }}
|
||||
|
||||
.. tab-item:: Assembling new JSON object
|
||||
:sync: AssembleParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
report: >-
|
||||
{ "dir": "${{ fromJson(needs.ConfigParams.outputs.coverage_report_json).directory }}",
|
||||
"file": "${{ fromJson(needs.ConfigParams.outputs.coverage_report_json).filename }}"
|
||||
}
|
||||
|
||||
.. tab-item:: Using single field from JSON object
|
||||
:sync: SingleFieldFromParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
fullpath: ${{ fromJson(needs.ConfigParams.outputs.coverage_report_json).fullpath }}
|
||||
|
||||
|
||||
.. _JOBTMPL/ExtractConfiguration/Output/typing_report_cobertura:
|
||||
|
||||
typing_report_cobertura
|
||||
=======================
|
||||
|
||||
:Type: string (JSON)
|
||||
:Description: Returns a string in JSON format containing the directory, the filename and the fullpath to the static
|
||||
type checking report file in Cobertura format created by :term:`mypy`.
|
||||
|
||||
The JSON object contains these fields:
|
||||
|
||||
:directory: Contains the directory where the type checking XML report file will be created. |br|
|
||||
Example: :file:`reports/typing`
|
||||
:filename: Contains the filename of the type checking XML report file. |br|
|
||||
Example: :file:`cobertura.xml`
|
||||
:fullpath: Contains the path where the type checking XML report file will be created. |br|
|
||||
This is the concatenation of both previous JSON fields. |br|
|
||||
Example: :file:`reports/typing/cobertura.xml`
|
||||
:pyproject.toml: Matching :file:`pyproject.toml` configuration for tool :term:`mypy`.
|
||||
|
||||
.. code-block:: toml
|
||||
|
||||
[tool.mypy]
|
||||
cobertura_xml_report = "report/typing"
|
||||
:Example:
|
||||
.. code-block:: json
|
||||
|
||||
{ "directory": "reports/typing",
|
||||
"filename": "cobertura.xml",
|
||||
"fullpath": "reports/typing/cobertura.xml"
|
||||
}
|
||||
:Usage:
|
||||
.. tab-set::
|
||||
|
||||
.. tab-item:: Forwarding complete JSON object
|
||||
:sync: ForwardParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
report: ${{ needs.ConfigParams.outputs.typing_report_cobertura }}
|
||||
|
||||
.. tab-item:: Assembling new JSON object
|
||||
:sync: AssembleParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
report: >-
|
||||
{ "dir": "${{ fromJson(needs.ConfigParams.outputs.typing_report_cobertura).directory }}",
|
||||
"file": "${{ fromJson(needs.ConfigParams.outputs.typing_report_cobertura).filename }}"
|
||||
}
|
||||
|
||||
.. tab-item:: Using single field from JSON object
|
||||
:sync: SingleFieldFromParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
fullpath: ${{ fromJson(needs.ConfigParams.outputs.typing_report_cobertura).fullpath }}
|
||||
|
||||
|
||||
.. _JOBTMPL/ExtractConfiguration/Output/typing_report_junit:
|
||||
|
||||
typing_report_junit
|
||||
===================
|
||||
|
||||
:Type: string (JSON)
|
||||
:Description: Returns a string in JSON format containing the directory, the filename and the fullpath to the static
|
||||
type checking report file in JUnit XML format created by :term:`mypy`.
|
||||
|
||||
The JSON object contains these fields:
|
||||
|
||||
:directory: Contains the directory where the static typing JUnit XML report file will be created. |br|
|
||||
Example: :file:`reports/typing`
|
||||
:filename: Contains the filename of the static typing JUnit XML report file. |br|
|
||||
Example: :file:`StaticTypingSummary.xml`
|
||||
:fullpath: Contains the path where the cstatic typing JUnit XML report file will be created. |br|
|
||||
This is the concatenation of both previous JSON fields. |br|
|
||||
Example: :file:`reports/typing/StaticTypingSummary.xml`
|
||||
:pyproject.toml: Matching :file:`pyproject.toml` configuration for tool :term:`mypy`.
|
||||
|
||||
.. code-block:: toml
|
||||
|
||||
[tool.mypy]
|
||||
junit_xml = "report/typing/StaticTypingSummary.xml"
|
||||
:Example:
|
||||
.. code-block:: json
|
||||
|
||||
{ "directory": "reports/typing",
|
||||
"filename": "StaticTypingSummary.xml",
|
||||
"fullpath": "reports/typing/StaticTypingSummary.xml"
|
||||
}
|
||||
:Usage:
|
||||
.. tab-set::
|
||||
|
||||
.. tab-item:: Forwarding complete JSON object
|
||||
:sync: ForwardParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
report: ${{ needs.ConfigParams.outputs.typing_report_junit }}
|
||||
|
||||
.. tab-item:: Assembling new JSON object
|
||||
:sync: AssembleParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
report: >-
|
||||
{ "dir": "${{ fromJson(needs.ConfigParams.outputs.typing_report_junit).directory }}",
|
||||
"file": "${{ fromJson(needs.ConfigParams.outputs.typing_report_junit).filename }}"
|
||||
}
|
||||
|
||||
.. tab-item:: Using single field from JSON object
|
||||
:sync: SingleFieldFromParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
fullpath: ${{ fromJson(needs.ConfigParams.outputs.typing_report_junit).fullpath }}
|
||||
|
||||
|
||||
.. _JOBTMPL/ExtractConfiguration/Output/typing_report_html:
|
||||
|
||||
typing_report_html
|
||||
==================
|
||||
|
||||
:Type: string (JSON)
|
||||
:Description: Returns a string in JSON format containing the directory, the filename and the fullpath to the static
|
||||
type checking report in HTML format created by :term:`mypy`.
|
||||
|
||||
The JSON object contains these fields:
|
||||
|
||||
:directory: Contains the directory where the static typing HTML report will be created. |br|
|
||||
Example: :file:`reports/typing/html`
|
||||
:fullpath: Contains the path where the static typing HTML report will be created. |br|
|
||||
This is the same as the previous JSON field. |br|
|
||||
Example: :file:`reports/typing/html`
|
||||
:pyproject.toml: Matching :file:`pyproject.toml` configuration for tool :term:`mypy`.
|
||||
|
||||
.. code-block:: toml
|
||||
|
||||
[tool.mypy]
|
||||
html_report = "report/typing/html"
|
||||
:Example:
|
||||
.. code-block:: json
|
||||
|
||||
{ "directory": "reports/typing/html",
|
||||
"fullpath": "reports/typing/html"
|
||||
}
|
||||
:Usage:
|
||||
.. tab-set::
|
||||
|
||||
.. tab-item:: Forwarding complete JSON object
|
||||
:sync: ForwardParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
report: ${{ needs.ConfigParams.outputs.typing_report_html }}
|
||||
|
||||
.. tab-item:: Assembling new JSON object
|
||||
:sync: AssembleParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
report: >-
|
||||
{ "dir": "${{ fromJson(needs.ConfigParams.outputs.typing_report_html).directory }}",
|
||||
"file": "${{ fromJson(needs.ConfigParams.outputs.typing_report_html).filename }}"
|
||||
}
|
||||
|
||||
.. tab-item:: Using single field from JSON object
|
||||
:sync: SingleFieldFromParam
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
OtherJob:
|
||||
uses: some/path/to/a/template@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
fullpath: ${{ fromJson(needs.ConfigParams.outputs.typing_report_html).fullpath }}
|
||||
|
||||
|
||||
.. _JOBTMPL/ExtractConfiguration/Optimizations:
|
||||
|
||||
Optimizations
|
||||
*************
|
||||
|
||||
This template offers no optimizations (reduced job runtime).
|
||||
780
doc/JobTemplate/Setup/Parameters.rst
Normal file
@@ -0,0 +1,780 @@
|
||||
.. _JOBTMPL/Parameters:
|
||||
.. index::
|
||||
single: GitHub Action Reusable Workflow; Parameters Template
|
||||
|
||||
Parameters
|
||||
##########
|
||||
|
||||
The ``Parameters`` job template is a workaround for the limitations of GitHub Actions to handle global variables in
|
||||
GitHub Actions workflows (see `actions/runner#480 <https://github.com/actions/runner/issues/480>`__).
|
||||
|
||||
It generates output parameters containing a list of artifact names and a job matrix to be used in later-running jobs.
|
||||
|
||||
.. topic:: Features
|
||||
|
||||
* Generate artifact names for various artifacts.
|
||||
* Generate a matrix of job combinations as a JSON string made from:
|
||||
|
||||
* systems (Ubuntu, macOS, Windows)
|
||||
* architecture (x64-64, aarch64)
|
||||
* Python versions (3.9, 3.10, ..., 3.13),
|
||||
* Python implementation (CPython, PyPy), and
|
||||
* environments (Native, MinGW64, UCRT64, ...).
|
||||
|
||||
* Provide a (default) Python version for other jobs.
|
||||
|
||||
.. topic:: Behavior
|
||||
|
||||
1. Delay job execution by :ref:`JOBTMPL/Parameters/Input/pipeline-delay` seconds.
|
||||
2. Compute job matrix using an embedded Python script.
|
||||
3. Assemble artifact names using a common prefix derived from Python namespace and package name.
|
||||
|
||||
.. topic:: Job Execution
|
||||
|
||||
.. image:: ../../_static/pyTooling-Actions-Parameters.png
|
||||
:width: 1000px
|
||||
|
||||
.. topic:: Dependencies
|
||||
|
||||
* Python from base-system.
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Instantiation:
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
Simple Example
|
||||
==============
|
||||
|
||||
.. grid:: 2
|
||||
|
||||
.. grid-item::
|
||||
:columns: 5
|
||||
|
||||
The following instantiation example creates a ``Params`` job derived from job template ``Parameters`` version
|
||||
``@r6``. It only requires a :ref:`JOBTMPL/Parameters/Input/package_name` parameter to create the artifact names.
|
||||
|
||||
.. grid-item::
|
||||
:columns: 7
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Params:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
|
||||
with:
|
||||
package_name: myPackage
|
||||
|
||||
UnitTesting:
|
||||
uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r6
|
||||
needs:
|
||||
- Params
|
||||
with:
|
||||
jobs: ${{ needs.Params.outputs.python_jobs }}
|
||||
|
||||
Complex Example
|
||||
===============
|
||||
|
||||
.. grid:: 2
|
||||
|
||||
.. grid-item::
|
||||
:columns: 5
|
||||
|
||||
The following instantiation example creates 3 jobs from the same template, but with differing input parameters.
|
||||
|
||||
The first ``UnitTestingParams`` job might be used to create a job matrix of unit tests. It creates the cross of
|
||||
default systems (Windows, Ubuntu, macOS, macOS-ARM, MinGW64, UCRT64) and the given list of Python versions
|
||||
including some mypy versions. In addition a list of excludes (marked as :deletion:`deletions`) and includes
|
||||
(marked as :addition:`additions`) is handed over resulting in the following combinations.
|
||||
|
||||
The second ``PerformanceTestingParams`` job might be used to create a job matrix for performance tests. Here a
|
||||
pipeline might be limited to the latest two Python versions on a selected list of platforms.
|
||||
|
||||
The third ``PlatformTestingParams`` job might be used to create a job matrix for platform compatibility tests.
|
||||
Here a pipeline might be limited to the latest Python version, but all available platforms.
|
||||
|
||||
.. grid-item::
|
||||
:columns: 7
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
UnitTestingParams:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
|
||||
with:
|
||||
package_namespace: myFramework
|
||||
package_name: Extension
|
||||
python_version_list: '3.9 3.10 3.11 3.12 pypy-3.10 pypy-3.11'
|
||||
system_list: 'ubuntu windows macos macos-arm mingw64 ucrt64'
|
||||
include_list: 'ubuntu:3.13 macos:3.13 macos-arm:3.13'
|
||||
exclude_list: 'windows:pypy-3.10 windows:pypy-3.11'
|
||||
|
||||
PerformanceTestingParams:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
|
||||
with:
|
||||
package_namespace: myFramework
|
||||
package_name: Extension
|
||||
python_version_list: '3.12 3.13'
|
||||
system_list: 'ubuntu windows macos macos-arm'
|
||||
|
||||
PlatformTestingParams:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
|
||||
with:
|
||||
package_namespace: myFramework
|
||||
package_name: Extension
|
||||
python_version_list: '3.13'
|
||||
system_list: 'ubuntu windows macos macos-arm mingw32 mingw64 clang64 ucrt64'
|
||||
|
||||
+--------------------------------+----------------+-----------------+-----------------+-----------------+----------------------------+------------+-------------+-------------------------------+-------------------------------+
|
||||
| Version | 3.9 🔴 | 3.10 🟠 | 3.11 🟡 | 3.12 🟢 | 3.13 🟢 | 3.14.b1 🟣 | pypy-3.9 🔴 | pypy-3.10 🟠 | pypy-3.11 🟡 |
|
||||
+================================+================+=================+=================+=================+============================+============+=============+===============================+===============================+
|
||||
| Ubuntu 🐧 | ubuntu:3.9 | ubuntu:3.10 | ubuntu:3.11 | ubuntu:3.12 | :addition:`ubuntu:3.13` | | | ubuntu:pypy-3.10 | ubuntu:pypy-3.11 |
|
||||
+--------------------------------+----------------+-----------------+-----------------+-----------------+----------------------------+------------+-------------+-------------------------------+-------------------------------+
|
||||
| macOS (x86-64) 🍎 | macos:3.9 | macos:3.10 | macos:3.11 | macos:3.12 | :addition:`macos:3.13` | | | macos:pypy-3.10 | macos:pypy-3.11 |
|
||||
+--------------------------------+----------------+-----------------+-----------------+-----------------+----------------------------+------------+-------------+-------------------------------+-------------------------------+
|
||||
| macOS (aarch64) 🍏 | macos-arm:3.9 | macos-arm:3.10 | macos-arm:3.11 | macos-arm:3.12 | :addition:`macos-arm:3.13` | | | macos:pypy-3.10 | macos:pypy-3.11 |
|
||||
+--------------------------------+----------------+-----------------+-----------------+-----------------+----------------------------+------------+-------------+-------------------------------+-------------------------------+
|
||||
| Windows Server 🪟 | windows:3.9 | windows:3.10 | windows:3.11 | windows:3.12 | | | | :deletion:`windows:pypy-3.10` | :deletion:`windows:pypy-3.11` |
|
||||
+--------------------------------+----------------+-----------------+-----------------+-----------------+----------------------------+------------+-------------+-------------------------------+-------------------------------+
|
||||
| Windows Server 🪟 + MSYS 🟪 | | | | | | | | | |
|
||||
+--------------------------------+----------------+-----------------+-----------------+-----------------+----------------------------+------------+-------------+-------------------------------+-------------------------------+
|
||||
| Windows Server 🪟 + MinGW32 ⬛ | | | | | | | | | |
|
||||
+--------------------------------+----------------+-----------------+-----------------+-----------------+----------------------------+------------+-------------+-------------------------------+-------------------------------+
|
||||
| Windows Server 🪟 + MinGW64 🟦 | | | | mingw64:3.12 | | | | | |
|
||||
+--------------------------------+----------------+-----------------+-----------------+-----------------+----------------------------+------------+-------------+-------------------------------+-------------------------------+
|
||||
| Windows Server 🪟 + Clang32 🟫 | | | | | | | | | |
|
||||
+--------------------------------+----------------+-----------------+-----------------+-----------------+----------------------------+------------+-------------+-------------------------------+-------------------------------+
|
||||
| Windows Server 🪟 + Clang64 🟧 | | | | | | | | | |
|
||||
+--------------------------------+----------------+-----------------+-----------------+-----------------+----------------------------+------------+-------------+-------------------------------+-------------------------------+
|
||||
| Windows Server 🪟 + UCRT64 🟨 | | | | ucrt64:3.12 | | | | | |
|
||||
+--------------------------------+----------------+-----------------+-----------------+-----------------+----------------------------+------------+-------------+-------------------------------+-------------------------------+
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Parameters:
|
||||
|
||||
Parameter Summary
|
||||
*****************
|
||||
|
||||
.. rubric:: Goto :ref:`input parameters <JOBTMPL/Parameters/Inputs>`
|
||||
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=====================================================================+==========+==========+===================================================================+
|
||||
| :ref:`JOBTMPL/Parameters/Input/ubuntu_image_version` | no | string | ``'24.04'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Input/name` | no | string | ``''`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Input/package_namespace` | no | string | ``''`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Input/package_name` | no | string | ``''`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Input/python_version` | no | string | ``'3.13'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Input/python_version_list` | no | string | ``'3.9 3.10 3.11 3.12 3.13'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Input/system_list` | no | string | ``'ubuntu windows macos macos-arm mingw64 ucrt64'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Input/include_list` | no | string | ``''`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Input/exclude_list` | no | string | ``'windows-arm:3.9 windows-arm:3.10'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Input/disable_list` | no | string | ``'windows-arm:pypy-3.10 windows-arm:pypy-3.11'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Input/ubuntu_image` | no | string | ``'ubuntu-24.04'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Input/ubuntu_arm_image` | no | string | ``'ubuntu-24.04-arm'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Input/windows_image` | no | string | ``'windows-2025'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Input/windows_arm_image` | no | string | ``'windows-11-arm'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Input/macos_intel_image` | no | string | ``'macos-13'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Input/macos_arm_image` | no | string | ``'macos-15'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Input/pipeline-delay` | no | number | ``0`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
|
||||
.. rubric:: Goto :ref:`secrets <JOBTMPL/Parameters/Secrets>`
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
.. rubric:: Goto :ref:`output parameters <JOBTMPL/Parameters/Outputs>`
|
||||
|
||||
+---------------------------------------------------------------------+----------------+-------------------------------------------------------------------+
|
||||
| Result Name | Type | Description |
|
||||
+=====================================================================+================+===================================================================+
|
||||
| :ref:`JOBTMPL/Parameters/Output/python_version` | string | |
|
||||
+---------------------------------------------------------------------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Output/package_fullname` | string | |
|
||||
+---------------------------------------------------------------------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Output/package_directory` | string | |
|
||||
+---------------------------------------------------------------------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Output/artifact_basename` | string | |
|
||||
+---------------------------------------------------------------------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Output/artifact_names` | string (JSON) | |
|
||||
+---------------------------------------------------------------------+----------------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/Parameters/Output/python_jobs` | string (JSON) | |
|
||||
+---------------------------------------------------------------------+----------------+-------------------------------------------------------------------+
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Inputs:
|
||||
|
||||
Input Parameters
|
||||
****************
|
||||
|
||||
.. _JOBTMPL/Parameters/Input/ubuntu_image_version:
|
||||
|
||||
.. include:: ../_ubuntu_image_version.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Input/name:
|
||||
|
||||
name
|
||||
====
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Prefix used to generate artifact names. Usually, the name of the Python package. |br|
|
||||
In case this parameter is an empty string, the artifact prefix is derived from :ref:`JOBTMPL/Parameters/Input/package_name`
|
||||
if the package is a simple Python package, **or** from :ref:`JOBTMPL/Parameters/Input/package_namespace`
|
||||
and :ref:`JOBTMPL/Parameters/Input/package_name`, if the package is a Python namespace package.
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Input/package_namespace:
|
||||
|
||||
package_namespace
|
||||
=================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid Python namespace.
|
||||
:Description: In case the package is a Python namespace package, the name of the library's or package's namespace
|
||||
needs to be specified using this parameter. |br|
|
||||
In case of a simple Python package, this parameter must be specified as an empty string (``''``),
|
||||
which is the default. |br|
|
||||
This parameter is used to derive :ref:`JOBTMPL/Parameters/Input/name`, if it's an empty string.
|
||||
:Example:
|
||||
.. grid:: 2
|
||||
|
||||
.. grid-item::
|
||||
:columns: 5
|
||||
|
||||
.. rubric:: Example Instantiation
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
name: Pipeline
|
||||
|
||||
jobs:
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
|
||||
with:
|
||||
package_namespace: myFramework
|
||||
package_name: Extension
|
||||
|
||||
.. grid-item::
|
||||
:columns: 4
|
||||
|
||||
.. rubric:: Example Directory Structure
|
||||
|
||||
.. code-block::
|
||||
|
||||
📂ProjectRoot/
|
||||
📂myFramework/
|
||||
📂Extension/
|
||||
📦SubPackage/
|
||||
🐍__init__.py
|
||||
🐍SubModuleA.py
|
||||
🐍__init__.py
|
||||
🐍ModuleB.py
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Input/package_name:
|
||||
|
||||
package_name
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid Python package name.
|
||||
:Description: In case of a simple Python package, this package's name is specified using this parameter. |br|
|
||||
In case the package is a Python namespace package, the parameter
|
||||
:ref:`JOBTMPL/Parameters/Input/package_namespace` must be specified, too. |br|
|
||||
This parameter is used to derive :ref:`JOBTMPL/Parameters/Input/name`, if it's an empty string.
|
||||
:Example:
|
||||
.. grid:: 2
|
||||
|
||||
.. grid-item::
|
||||
:columns: 5
|
||||
|
||||
.. rubric:: Example Instantiation
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
name: Pipeline
|
||||
|
||||
jobs:
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
|
||||
with:
|
||||
package_name: myPackage
|
||||
|
||||
.. grid-item::
|
||||
:columns: 4
|
||||
|
||||
.. rubric:: Example Directory Structure
|
||||
|
||||
.. code-block::
|
||||
|
||||
📂ProjectRoot/
|
||||
📂myFramework/
|
||||
📦SubPackage/
|
||||
🐍__init__.py
|
||||
🐍SubModuleA.py
|
||||
🐍__init__.py
|
||||
🐍ModuleB.py
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Input/python_version:
|
||||
|
||||
python_version
|
||||
==============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'3.13'``
|
||||
:Possible Values: Any valid Python version conforming to the pattern ``<major>.<minor>`` or ``pypy-<major>.<minor>``. |br|
|
||||
See `actions/python-versions - available Python versions <https://github.com/actions/python-versions>`__
|
||||
and `actions/setup-python - configurable Python versions <https://github.com/actions/setup-python>`__.
|
||||
:Description: Python version used as default for other jobs requiring a single Python version. |br|
|
||||
In case :ref:`JOBTMPL/Parameters/Input/python_version_list` is an empty string, this version is used
|
||||
to populate the version list.
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Input/python_version_list:
|
||||
|
||||
python_version_list
|
||||
===================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'3.9 3.10 3.11 3.12 3.13'``
|
||||
:Possible Values: A space separated list of valid Python versions conforming to the pattern ``<major>.<minor>`` or
|
||||
``pypy-<major>.<minor>``. |br|
|
||||
See `actions/python-versions - available Python versions <https://github.com/actions/python-versions>`__
|
||||
and `actions/setup-python - configurable Python versions <https://github.com/actions/setup-python>`__.
|
||||
:Description: The list of space-separated Python versions used for Python variation testing.
|
||||
|
||||
.. include:: ../PythonVersionList.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Input/system_list:
|
||||
|
||||
system_list
|
||||
===========
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'ubuntu windows macos macos-arm mingw64 ucrt64'``
|
||||
:Possible Values: A space separated list of system names.
|
||||
:Description: The list of space-separated systems used for application testing.
|
||||
|
||||
.. include:: ../SystemList.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Input/include_list:
|
||||
|
||||
include_list
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: A space separated list of ``<system>:<python_version>`` tuples.
|
||||
:Description: List of space-separated ``<system>:<python_version>`` tuples to be included into the list of test
|
||||
variants.
|
||||
:Example:
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
|
||||
with:
|
||||
package_name: myPackage
|
||||
include_list: "ubuntu:3.11 macos:3.11"
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Input/exclude_list:
|
||||
|
||||
exclude_list
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'windows-arm:3.9 windows-arm:3.10'``
|
||||
:Possible Values: A space separated list of ``<system>:<python_version>`` tuples.
|
||||
:Description: List of space-separated ``<system>:<python_version>`` tuples to be excluded from the list of test
|
||||
variants.
|
||||
:Example:
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
|
||||
with:
|
||||
package_name: myPackage
|
||||
exclude_list: "windows:pypy-3.8 windows:pypy-3.9"
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Input/disable_list:
|
||||
|
||||
disable_list
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'windows-arm:pypy-3.10 windows-arm:pypy-3.11'``
|
||||
:Possible Values: A space separated list of ``<system>:<python_version>`` tuples.
|
||||
:Description: List of space-separated ``<system>:<python_version>`` tuples to be temporarily disabled from the list
|
||||
of test variants. |br|
|
||||
Each disabled item creates a warning in the workflow log.
|
||||
:Warning Example:
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
|
||||
with:
|
||||
package_name: myPackage
|
||||
disable_list: "windows:3.10 windows:3.11"
|
||||
|
||||
.. image:: ../../_static/GH_Workflow_DisabledJobsWarnings.png
|
||||
:width: 400px
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Input/ubuntu_image:
|
||||
|
||||
ubuntu_image
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'ubuntu-24.04'``
|
||||
:Possible Values: See `actions/runner-images - Available Images <https://github.com/actions/runner-images?tab=readme-ov-file#available-images>`__
|
||||
for available Ubuntu image versions.
|
||||
:Description: Name of the Ubuntu x86-64 image and version used to run a Ubuntu jobs when selected via :ref:`JOBTMPL/Parameters/Input/system_list`.
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Input/ubuntu_arm_image:
|
||||
|
||||
ubuntu_arm_image
|
||||
================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'ubuntu-24.04-arm'``
|
||||
:Possible Values: See `actions/partner-runner-images - Available Images <https://github.com/actions/partner-runner-images?tab=readme-ov-file#available-images>`__
|
||||
for available Ubuntu ARM image versions.
|
||||
:Description: Name of the Ubuntu aarch64 image and version used to run a Ubuntu ARM jobs when selected via :ref:`JOBTMPL/Parameters/Input/system_list`.
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Input/windows_image:
|
||||
|
||||
windows_image
|
||||
=============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'windows-2025'``
|
||||
:Possible Values: See `actions/runner-images - Available Images <https://github.com/actions/runner-images?tab=readme-ov-file#available-images>`__
|
||||
:Description: Name of the Windows Server x86-64 image and version used to run a Windows jobs when selected via :ref:`JOBTMPL/Parameters/Input/system_list`.
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Input/windows_arm_image:
|
||||
|
||||
windows_arm_image
|
||||
=================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'windows-11-arm'``
|
||||
:Possible Values: See `actions/partner-runner-images - Available Images <https://github.com/actions/partner-runner-images?tab=readme-ov-file#available-images>`__
|
||||
:Description: Name of the Windows aarch64 image and version used to run a Windows ARM jobs when selected via :ref:`JOBTMPL/Parameters/Input/system_list`.
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Input/macos_intel_image:
|
||||
|
||||
macos_intel_image
|
||||
=================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'macos-13'``
|
||||
:Possible Values: See `actions/runner-images - Available Images <https://github.com/actions/runner-images?tab=readme-ov-file#available-images>`__
|
||||
:Description: Name of the macOS x86-64 image and version used to run a macOS Intel jobs when selected via :ref:`JOBTMPL/Parameters/Input/system_list`.
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Input/macos_arm_image:
|
||||
|
||||
macos_arm_image
|
||||
===============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'macos-15'``
|
||||
:Possible Values: See `actions/runner-images - Available Images <https://github.com/actions/runner-images?tab=readme-ov-file#available-images>`__
|
||||
:Description: Name of the macOS aarch64 image and version used to run a macOS ARM jobs when selected via :ref:`JOBTMPL/Parameters/Input/system_list`.
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Input/pipeline-delay:
|
||||
|
||||
pipeline-delay
|
||||
==============
|
||||
|
||||
:Type: number
|
||||
:Required: no
|
||||
:Default Value: ``0``
|
||||
:Possible Values: Any integer number.
|
||||
:Description: Slow down this job, to delay the startup of the GitHub Action pipline.
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Secrets:
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Outputs:
|
||||
|
||||
Outputs
|
||||
*******
|
||||
|
||||
.. _JOBTMPL/Parameters/Output/python_version:
|
||||
|
||||
python_version
|
||||
==============
|
||||
|
||||
:Type: string
|
||||
:Default Value: ``'3.13'``
|
||||
:Possible Values: Any valid Python version conforming to the pattern ``<major>.<minor>`` or ``pypy-<major>.<minor>``.
|
||||
:Description: Returns
|
||||
|
||||
A single string parameter representing the default Python version that should be used across multiple jobs in the same
|
||||
pipeline.
|
||||
|
||||
Such a parameter is needed as a workaround, because GitHub Actions doesn't support proper handling of global pipeline
|
||||
variables. Thus, this job is used to compute an output parameter that can be reused in other jobs.
|
||||
:Example:
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Params:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
|
||||
with:
|
||||
name: pyTooling
|
||||
|
||||
CodeCoverage:
|
||||
uses: pyTooling/Actions/.github/workflows/CoverageCollection.yml@r6
|
||||
needs:
|
||||
- Params
|
||||
with:
|
||||
python_version: ${{ needs.Params.outputs.python_version }}
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Output/package_fullname:
|
||||
|
||||
package_fullname
|
||||
================
|
||||
|
||||
:Type: string
|
||||
:Description: Returns the full package name composed from :ref:`JOBTMPL/Parameters/Input/package_namespace`
|
||||
and :ref:`JOBTMPL/Parameters/Input/package_name`.
|
||||
:Example: ``myFramework.Extension``
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Output/package_directory:
|
||||
|
||||
package_directory
|
||||
=================
|
||||
|
||||
:Type: string
|
||||
:Description: Returns the full package path composed from :ref:`JOBTMPL/Parameters/Input/package_namespace`
|
||||
and :ref:`JOBTMPL/Parameters/Input/package_name`.
|
||||
:Example: ``myFramework/Extension``
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Output/artifact_basename:
|
||||
|
||||
artifact_basename
|
||||
=================
|
||||
|
||||
:Type: string
|
||||
:Description: Returns the basename (prefix) of all :ref:`artifact names <JOBTMPL/Parameters/Output/artifact_names>` |br|.
|
||||
The basename is either :ref:`JOBTMPL/Parameters/Input/name` if set, otherwise its
|
||||
:ref:`JOBTMPL/Parameters/Output/package_fullname`.
|
||||
:Example: ``myFramework.Extension``
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Output/artifact_names:
|
||||
|
||||
artifact_names
|
||||
==============
|
||||
|
||||
:Type: string (JSON)
|
||||
:Description: Returns a JSON dictionary of artifact names sharing a common prefix (see :ref:`JOBTMPL/Parameters/Input/name`). |br|
|
||||
As artifacts are handed from jo to job, a consistent naming scheme is advised to avoid duplications
|
||||
and naming artifacts by hand. This technique solves again the problem of global variables in GitHub
|
||||
Action YAMl files and the need for assigning the same value (here artifact name) to multiple jobs
|
||||
templates.
|
||||
|
||||
The supported artifacts are:
|
||||
|
||||
:unittesting_xml: UnitTesting XML summary report
|
||||
:unittesting_html: UnitTesting HTML summary report
|
||||
:perftesting_xml: PerformanceTesting XML summary report
|
||||
:benchtesting_xml: Benchmarking XML summary report
|
||||
:apptesting_xml: ApplicationTesting XML summary report
|
||||
:codecoverage_sqlite: Code Coverage internal database (SQLite)
|
||||
:codecoverage_xml: Code Coverage Cobertura XML report
|
||||
:codecoverage_json: Code Coverage Coverage.py JSON report
|
||||
:codecoverage_html: Code Coverage HTML report
|
||||
:statictyping_cobertura: Static Type Checking Cobertura XML report
|
||||
:statictyping_junit: Static Type Checking JUnit XML report
|
||||
:statictyping_html: Static Type Checking HTML report
|
||||
:package_all: Packaged Python project (multiple formats)
|
||||
:documentation_html: Documentation in HTML format
|
||||
:documentation_latex: Documentation in LaTeX format
|
||||
:documentation_pdf: Documentation in PDF format
|
||||
:Example:
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Params:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
|
||||
with:
|
||||
name: pyTooling
|
||||
|
||||
Coverage:
|
||||
uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r6
|
||||
needs:
|
||||
- Params
|
||||
with:
|
||||
unittest_xml_artifact: ${{ fromJson(needs.Params.outputs.artifact_names).unittesting_xml }}
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Output/python_jobs:
|
||||
|
||||
python_jobs
|
||||
===========
|
||||
|
||||
:Type: string (JSON)
|
||||
:Description: Returns a JSON array of job descriptions, wherein each job description is a dictionary providing the
|
||||
following key-value pairs:
|
||||
|
||||
:sysicon: icon to display
|
||||
:system: name of the system
|
||||
:runs-on: virtual machine image and base operating system
|
||||
:runtime: name of the runtime environment if not running natively on the VM image
|
||||
:shell: name of the shell
|
||||
:pyicon: icon for CPython or pypy
|
||||
:python: Python version
|
||||
:envname: full name of the selected environment
|
||||
:Example:
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Params:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
|
||||
with:
|
||||
name: pyDummy
|
||||
|
||||
UnitTesting:
|
||||
uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r6
|
||||
needs:
|
||||
- Params
|
||||
with:
|
||||
jobs: ${{ needs.Params.outputs.python_jobs }}
|
||||
:Usage: The generated JSON array can be unpacked using the ``fromJson(...)`` function in a job's matrix
|
||||
``strategy:matrix:include`` like this:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
name: Unit Testing (Matrix)
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
jobs:
|
||||
required: true
|
||||
type: string
|
||||
|
||||
jobs:
|
||||
UnitTesting:
|
||||
name: ${{ matrix.sysicon }} ${{ matrix.pyicon }} Unit Tests using Python ${{ matrix.python }}
|
||||
runs-on: ${{ matrix.runs-on }}
|
||||
strategy:
|
||||
matrix:
|
||||
include: ${{ fromJson(inputs.jobs) }}
|
||||
defaults:
|
||||
run:
|
||||
shell: ${{ matrix.shell }}
|
||||
steps:
|
||||
- name: 🐍 Setup Python ${{ matrix.python }}
|
||||
if: matrix.system != 'msys2'
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: ${{ matrix.python }}
|
||||
:Debugging: The job prints debugging information like system |times| Python version |times| environment
|
||||
combinations as well as the generated JSON array in the job's log.
|
||||
|
||||
.. code-block:: json
|
||||
|
||||
[
|
||||
{"sysicon": "🐧", "system": "ubuntu", "runs-on": "ubuntu-24.04", "runtime": "native", "shell": "bash", "pyicon": "🔴", "python": "3.9", "envname": "Linux (x86-64)" },
|
||||
{"sysicon": "🐧", "system": "ubuntu", "runs-on": "ubuntu-24.04", "runtime": "native", "shell": "bash", "pyicon": "🟠", "python": "3.10", "envname": "Linux (x86-64)" },
|
||||
{"sysicon": "🐧", "system": "ubuntu", "runs-on": "ubuntu-24.04", "runtime": "native", "shell": "bash", "pyicon": "🟡", "python": "3.11", "envname": "Linux (x86-64)" },
|
||||
{"sysicon": "🐧", "system": "ubuntu", "runs-on": "ubuntu-24.04", "runtime": "native", "shell": "bash", "pyicon": "🟢", "python": "3.12", "envname": "Linux (x86-64)" },
|
||||
{"sysicon": "🐧", "system": "ubuntu", "runs-on": "ubuntu-24.04", "runtime": "native", "shell": "bash", "pyicon": "🟢", "python": "3.13", "envname": "Linux (x86-64)" },
|
||||
{"sysicon": "🪟", "system": "windows", "runs-on": "windows-2025", "runtime": "native", "shell": "pwsh", "pyicon": "🔴", "python": "3.9", "envname": "Windows (x86-64)" },
|
||||
{"sysicon": "🪟", "system": "windows", "runs-on": "windows-2025", "runtime": "native", "shell": "pwsh", "pyicon": "🟠", "python": "3.10", "envname": "Windows (x86-64)" },
|
||||
{"sysicon": "🪟", "system": "windows", "runs-on": "windows-2025", "runtime": "native", "shell": "pwsh", "pyicon": "🟡", "python": "3.11", "envname": "Windows (x86-64)" },
|
||||
{"sysicon": "🪟", "system": "windows", "runs-on": "windows-2025", "runtime": "native", "shell": "pwsh", "pyicon": "🟢", "python": "3.12", "envname": "Windows (x86-64)" },
|
||||
{"sysicon": "🪟", "system": "windows", "runs-on": "windows-2025", "runtime": "native", "shell": "pwsh", "pyicon": "🟢", "python": "3.13", "envname": "Windows (x86-64)" },
|
||||
{"sysicon": "🍎", "system": "macos", "runs-on": "macos-13", "runtime": "native", "shell": "bash", "pyicon": "🔴", "python": "3.9", "envname": "macOS (x86-64)" },
|
||||
{"sysicon": "🍎", "system": "macos", "runs-on": "macos-13", "runtime": "native", "shell": "bash", "pyicon": "🟠", "python": "3.10", "envname": "macOS (x86-64)" },
|
||||
{"sysicon": "🍎", "system": "macos", "runs-on": "macos-13", "runtime": "native", "shell": "bash", "pyicon": "🟡", "python": "3.11", "envname": "macOS (x86-64)" },
|
||||
{"sysicon": "🍎", "system": "macos", "runs-on": "macos-13", "runtime": "native", "shell": "bash", "pyicon": "🟢", "python": "3.12", "envname": "macOS (x86-64)" },
|
||||
{"sysicon": "🍎", "system": "macos", "runs-on": "macos-13", "runtime": "native", "shell": "bash", "pyicon": "🟢", "python": "3.13", "envname": "macOS (x86-64)" },
|
||||
{"sysicon": "🍏", "system": "macos-arm", "runs-on": "macos-15", "runtime": "native", "shell": "bash", "pyicon": "🔴", "python": "3.9", "envname": "macOS (aarch64)" },
|
||||
{"sysicon": "🍏", "system": "macos-arm", "runs-on": "macos-15", "runtime": "native", "shell": "bash", "pyicon": "🟠", "python": "3.10", "envname": "macOS (aarch64)" },
|
||||
{"sysicon": "🍏", "system": "macos-arm", "runs-on": "macos-15", "runtime": "native", "shell": "bash", "pyicon": "🟡", "python": "3.11", "envname": "macOS (aarch64)" },
|
||||
{"sysicon": "🍏", "system": "macos-arm", "runs-on": "macos-15", "runtime": "native", "shell": "bash", "pyicon": "🟢", "python": "3.12", "envname": "macOS (aarch64)" },
|
||||
{"sysicon": "🍏", "system": "macos-arm", "runs-on": "macos-15", "runtime": "native", "shell": "bash", "pyicon": "🟢", "python": "3.13", "envname": "macOS (aarch64)" },
|
||||
{"sysicon": "🪟🟦", "system": "msys2", "runs-on": "windows-2025", "runtime": "MINGW64", "shell": "msys2 {0}", "pyicon": "🟢", "python": "3.12", "envname": "Windows+MSYS2 (x86-64) - MinGW64"},
|
||||
{"sysicon": "🪟🟨", "system": "msys2", "runs-on": "windows-2025", "runtime": "UCRT64", "shell": "msys2 {0}", "pyicon": "🟢", "python": "3.12", "envname": "Windows+MSYS2 (x86-64) - UCRT64" }
|
||||
]
|
||||
|
||||
|
||||
.. _JOBTMPL/Parameters/Optimizations:
|
||||
|
||||
Optimizations
|
||||
*************
|
||||
|
||||
This template offers no optimizations (reduced job runtime).
|
||||
|
||||
Nontheless, the generated output :ref:`JOBTMPL/Parameters/Output/python_jobs` is influenced by many input parameters
|
||||
generating :math:`N^2` many Python job combinations, which in turn will influence the overall pipeline runtime and how many
|
||||
jobs (parallel VMs) are needed to execute the matrix.
|
||||
|
||||
.. hint::
|
||||
|
||||
Some VM images (macOS, Windows) have parallelism limitations and run slower then Ubuntu-based jobs. Additionally,
|
||||
environments like MSYS2 require an additional setup time increasing a jobs runtime significantly.
|
||||
464
doc/JobTemplate/Setup/PrepareJob.rst
Normal file
@@ -0,0 +1,464 @@
|
||||
.. _JOBTMPL/PrepareJob:
|
||||
.. index::
|
||||
single: GitHub Action Reusable Workflow; PrepareJob Template
|
||||
|
||||
PrepareJob
|
||||
##########
|
||||
|
||||
The ``PrepareJob`` template is a workaround for the limitations of GitHub Actions to handle global variables in GitHub
|
||||
Actions workflows (see `actions/runner#480 <https://github.com/actions/runner/issues/480>`__) as well as providing basic
|
||||
string operations (see GitHub Action's `limited set of functions <https://docs.github.com/en/actions/reference/workflows-and-actions/expressions#functions>`__).
|
||||
|
||||
The job template generates various output parameters derived from
|
||||
`${{ github }} context <https://docs.github.com/en/actions/reference/workflows-and-actions/contexts#github-context>`__.
|
||||
|
||||
.. topic:: Features
|
||||
|
||||
* Provide branch name or tag name from ``${{ github.ref }}`` variable.
|
||||
* Check if pipeline is a branch, tag or pull-request pipeline.
|
||||
* Check if a commit is a merge commit.
|
||||
* Check if a commit is a release commit.
|
||||
* Check if a tag is a nightly tag (rolling release tag).
|
||||
* Check if a tag is a release tag.
|
||||
* Find associated pull-request (PR) for a merge commit/release commit.
|
||||
* Provide a version from tag name or pull-request name.
|
||||
|
||||
.. note::
|
||||
|
||||
Due to GitHub Action's broken type system and missing implicit type conversions in YAML files, *boolean* values need
|
||||
to be returned as *string* values otherwise type compatibility and comparison are broken. This also requires all
|
||||
inputs to be *string* parameters, otherwise step's, job's or template's output cannot be assigned to a template's
|
||||
input.
|
||||
|
||||
**Problems:**
|
||||
|
||||
1. Scripts (Bash, Python, ...) return results as strings. There is no option or operation provided by GitHub Actions
|
||||
to convert outputs of ``printf`` to a ``boolean`` in the YAML file.
|
||||
2. Unlike job template inputs, outputs have no type information. These are all considered *string* values. Again no
|
||||
implicit or explicit type conversion is provided.
|
||||
3. While inputs might be defined as ``boolean`` and a matching default can be set as a *boolean* value (e.g.,
|
||||
``false``), a connected variable from ``${{ needs }}`` context will either cause a typing error or a later
|
||||
comparison will not work as expected. Either the comparison works with ``inputs.param == false`` for the default
|
||||
value, **or** it works with a value from ``${{ needs }}`` context, which is a string ``inputs.param == 'false'``.
|
||||
|
||||
.. topic:: Behavior
|
||||
|
||||
1. Checkout repository.
|
||||
2. Classify ``${{ github.ref }}`` into branch, tag or pull-request.
|
||||
3. Compute output parameters.
|
||||
4. Find associated pull-request.
|
||||
|
||||
.. topic:: Job Execution
|
||||
|
||||
.. image:: ../../_static/pyTooling-Actions-PrepareJob.png
|
||||
:width: 600px
|
||||
|
||||
.. topic:: Dependencies
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`GitHub command line tool 'gh' <cli/cli>`
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Instantiation:
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
The following instantiation example creates a ``Prepare`` job derived from job template ``PrepareJob`` version ``@r6``.
|
||||
In a default usecase, no input parameters need to be specified for the job template assuming a main-branch and
|
||||
release-branch called ``main``, a development-branch called ``dev``, as well as semantic versioning for tags and
|
||||
pull-request titles.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Prepare:
|
||||
uses: pyTooling/Actions/.github/workflows/PrepareJob.yml@r6
|
||||
|
||||
<ReleaseJob>:
|
||||
needs:
|
||||
- Prepare
|
||||
if: needs.Prepare.outputs.is_release_tag == 'true'
|
||||
...
|
||||
with:
|
||||
version: ${{ needs.Prepare.outputs.version }}
|
||||
|
||||
.. seealso::
|
||||
|
||||
:ref:`JOBTMPL/TagReleaseCommit`
|
||||
``PrepareJob`` is usually used to identify if a pipeline's commit is a merge commit created by a pull-request. If
|
||||
so, this commit can be tagged automatically to trigger a release pipeline (tag pipeline) for the same commit
|
||||
resulting in a full release (PyPI, GitHub Pages, GitHub Release, ...).
|
||||
:ref:`JOBTMPL/PublishReleaseNotes`
|
||||
``PrepareJob`` is usually used to identify if a tag pipeline is a release pipeline.
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Parameters:
|
||||
|
||||
Parameter Summary
|
||||
*****************
|
||||
|
||||
.. rubric:: Goto :ref:`input parameters <JOBTMPL/PrepareJob/Inputs>`
|
||||
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=====================================================================+==========+==========+===================================================================+
|
||||
| :ref:`JOBTMPL/PrepareJob/Input/ubuntu_image` | no | string | ``'ubuntu-24.04'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PrepareJob/Input/main_branch` | no | string | ``'main'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PrepareJob/Input/development_branch` | no | string | ``'dev'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PrepareJob/Input/release_branch` | no | string | ``'main'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PrepareJob/Input/nightly_tag_pattern` | no | string | ``'nightly'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PrepareJob/Input/release_tag_pattern` | no | string | ``'(v|r)?[0-9]+(\.[0-9]+){0,2}(-(dev|alpha|beta|rc)([0-9]*))?'`` |
|
||||
+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+
|
||||
|
||||
.. rubric:: Goto :ref:`secrets <JOBTMPL/PrepareJob/Secrets>`
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
.. rubric:: Goto :ref:`output parameters <JOBTMPL/PrepareJob/Outputs>`
|
||||
|
||||
+---------------------------------------------------------------------+----------+-------------------------------------------------------------------+
|
||||
| Result Name | Type | Description |
|
||||
+=====================================================================+==========+===================================================================+
|
||||
| :ref:`JOBTMPL/PrepareJob/Output/on_main_branch` | string | |
|
||||
+---------------------------------------------------------------------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PrepareJob/Output/on_dev_branch` | string | |
|
||||
+---------------------------------------------------------------------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PrepareJob/Output/on_release_branch` | string | |
|
||||
+---------------------------------------------------------------------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PrepareJob/Output/is_regular_commit` | string | |
|
||||
+---------------------------------------------------------------------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PrepareJob/Output/is_merge_commit` | string | |
|
||||
+---------------------------------------------------------------------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PrepareJob/Output/is_release_commit` | string | |
|
||||
+---------------------------------------------------------------------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PrepareJob/Output/is_nightly_tag` | string | |
|
||||
+---------------------------------------------------------------------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PrepareJob/Output/is_release_tag` | string | |
|
||||
+---------------------------------------------------------------------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PrepareJob/Output/ref_kind` | string | |
|
||||
+---------------------------------------------------------------------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PrepareJob/Output/branch` | string | |
|
||||
+---------------------------------------------------------------------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PrepareJob/Output/tag` | string | |
|
||||
+---------------------------------------------------------------------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PrepareJob/Output/version` | string | |
|
||||
+---------------------------------------------------------------------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PrepareJob/Output/pr_title` | string | |
|
||||
+---------------------------------------------------------------------+----------+-------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/PrepareJob/Output/pr_number` | string | |
|
||||
+---------------------------------------------------------------------+----------+-------------------------------------------------------------------+
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Inputs:
|
||||
|
||||
Input Parameters
|
||||
****************
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Input/ubuntu_image:
|
||||
|
||||
ubuntu_image
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'ubuntu-24.04'``
|
||||
:Possible Values: See `actions/runner-images - Available Images <https://github.com/actions/runner-images?tab=readme-ov-file#available-images>`__
|
||||
for available Ubuntu image versions.
|
||||
:Description: Name of the Ubuntu image used to run this job.
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Input/main_branch:
|
||||
|
||||
main_branch
|
||||
===========
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'main'``
|
||||
:Possible Values: Any valid branch name.
|
||||
:Description: Name of the main branch.
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Input/development_branch:
|
||||
|
||||
development_branch
|
||||
==================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'dev'``
|
||||
:Possible Values: Any valid branch name.
|
||||
:Description: Name of the development branch.
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Input/release_branch:
|
||||
|
||||
release_branch
|
||||
==============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'main'``
|
||||
:Possible Values: Any valid branch name.
|
||||
:Description: Name of the branch containing releases.
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Input/nightly_tag_pattern:
|
||||
|
||||
nightly_tag_pattern
|
||||
===================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'nightly'``
|
||||
:Possible Values: Any valid regular expression. |br|
|
||||
Suggested alternative values: ``latest``, ``rolling``
|
||||
:Description: Name of the tag used for rolling releases, a.k.a nightly builds.
|
||||
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Input/release_tag_pattern:
|
||||
|
||||
release_tag_pattern
|
||||
===================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'(v|r)?[0-9]+(\.[0-9]+){0,2}(-(dev|alpha|beta|rc)([0-9]*))?'``
|
||||
:Possible Values: Any valid regular expression.
|
||||
:Description: A regular expression describing a pattern for identifying a release tag.
|
||||
|
||||
The default pattern matches on a `semantic version number <https://semver.org/>`__ separated by dots.
|
||||
It supports up to 3 digit groups. It accepts an optional ``v`` or ``r`` prefix. Optionally, a postfix
|
||||
of ``dev``, ``alpha``, ``beta`` or ``rc`` separated by a hyphen can be appended. If needed, the
|
||||
postfix can have a digit group.
|
||||
|
||||
**Matching tag names as releases:**
|
||||
|
||||
* ``v1``, ``r1``
|
||||
* ``1``, ``1.1``, ``1.1.1``
|
||||
* ``v1.2.8-dev``
|
||||
* ``v3.13.5-alpha2``
|
||||
* ``v4.7.22-beta3``
|
||||
* ``v10.2-rc1``
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Secrets:
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Outputs:
|
||||
|
||||
Outputs
|
||||
*******
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Output/on_main_branch:
|
||||
|
||||
on_main_branch
|
||||
==============
|
||||
|
||||
:Type: string
|
||||
:Default Value: ``'false'``
|
||||
:Possible Values: ``'true'``, ``'false'``
|
||||
:Description: Returns ``'true'`` if the pipeline's commit is on :ref:`main branch <JOBTMPL/PrepareJob/Input/main_branch>`,
|
||||
otherwise return ``'false'``.
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Output/on_dev_branch:
|
||||
|
||||
on_dev_branch
|
||||
=============
|
||||
|
||||
:Type: string
|
||||
:Default Value: ``'false'``
|
||||
:Possible Values: ``'true'``, ``'false'``
|
||||
:Description: Returns ``'true'`` if the pipeline's commit is on :ref:`development branch <JOBTMPL/PrepareJob/Input/development_branch>`,
|
||||
otherwise return ``'false'``.
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Output/on_release_branch:
|
||||
|
||||
on_release_branch
|
||||
=================
|
||||
|
||||
:Type: string
|
||||
:Default Value: ``'false'``
|
||||
:Possible Values: ``'true'``, ``'false'``
|
||||
:Description: Returns ``'true'`` if the pipeline's commit is on :ref:`release branch <JOBTMPL/PrepareJob/Input/release_branch>`,
|
||||
otherwise return ``'false'``.
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Output/is_regular_commit:
|
||||
|
||||
is_regular_commit
|
||||
=================
|
||||
|
||||
:Type: string
|
||||
:Default Value: ``'false'``
|
||||
:Possible Values: ``'true'``, ``'false'``
|
||||
:Description: Returns ``'true'`` if the pipeline's commit is not a :ref:`merge commit <JOBTMPL/PrepareJob/Output/is_merge_commit>`
|
||||
nor :ref:`release commit <JOBTMPL/PrepareJob/Output/is_release_commit>`, otherwise return ``'false'``.
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Output/is_merge_commit:
|
||||
|
||||
is_merge_commit
|
||||
===============
|
||||
|
||||
:Type: string
|
||||
:Default Value: ``'false'``
|
||||
:Possible Values: ``'true'``, ``'false'``
|
||||
:Description: Returns ``'true'`` if the pipeline's commit is on :ref:`main branch <JOBTMPL/PrepareJob/Input/main_branch>`
|
||||
or :ref:`development branch <JOBTMPL/PrepareJob/Input/development_branch>` and has more than one
|
||||
parent (merge commit), otherwise return ``'false'``.
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Output/is_release_commit:
|
||||
|
||||
is_release_commit
|
||||
=================
|
||||
|
||||
:Type: string
|
||||
:Default Value: ``'false'``
|
||||
:Possible Values: ``'true'``, ``'false'``
|
||||
:Description: Returns ``'true'`` if the pipeline's commit is on :ref:`release branch <JOBTMPL/PrepareJob/Input/release_branch>`
|
||||
and has more than one parent (merge commit), otherwise return ``'false'``.
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Output/is_nightly_tag:
|
||||
|
||||
is_nightly_tag
|
||||
==============
|
||||
|
||||
:Type: string
|
||||
:Default Value: ``'false'``
|
||||
:Possible Values: ``'true'``, ``'false'``
|
||||
:Description: Returns ``'true'`` if the pipeline is a tag pipeline for a commit on :ref:`release branch <JOBTMPL/PrepareJob/Input/release_branch>`
|
||||
and the tag's name matches the :ref:`nightly tag pattern <JOBTMPL/PrepareJob/Input/nightly_tag_pattern>`,
|
||||
otherwise return ``'false'``.
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Output/is_release_tag:
|
||||
|
||||
is_release_tag
|
||||
==============
|
||||
|
||||
:Type: string
|
||||
:Default Value: ``'false'``
|
||||
:Possible Values: ``'true'``, ``'false'``
|
||||
:Description: Returns ``'true'`` if the pipeline is a tag pipeline for a commit on :ref:`release branch <JOBTMPL/PrepareJob/Input/release_branch>`
|
||||
and the tag's name matches the :ref:`release tag pattern <JOBTMPL/PrepareJob/Input/release_tag_pattern>`,
|
||||
otherwise return ``'false'``.
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Output/ref_kind:
|
||||
|
||||
ref_kind
|
||||
========
|
||||
|
||||
:Type: string
|
||||
:Default Value: ``'unknown'``
|
||||
:Possible Values: ``'branch'``, ``'tag'``, ``'pullrequest'``, ``'unknown'``
|
||||
:Description: Returns ``'branch'`` if pipeline's commit is on a branch or returns ``'tag'`` if the pipeline runs for
|
||||
a tagged commit, otherwise returns ``'unknown'`` in case of an internal error.
|
||||
|
||||
If the kind is a branch, the branch name is available in the job's :ref:`JOBTMPL/PrepareJob/Output/branch`
|
||||
result. |br|
|
||||
If the kind is a tag, the tags name is available in the job's :ref:`JOBTMPL/PrepareJob/Output/tag`
|
||||
result. |br|
|
||||
If the kind is a pull-request, the pull request's id is available in the job's :ref:`JOBTMPL/PrepareJob/Output/pr_number`
|
||||
result. |br|
|
||||
Moreover, if the tag matches the :ref:`JOBTMPL/PrepareJob/Input/release_tag_pattern`, the extracted
|
||||
version is available in the job's :ref:`JOBTMPL/PrepareJob/Output/version` result.
|
||||
|
||||
.. note::
|
||||
|
||||
GitHub doesn't provide standalone branch or tag information, but provides the variable
|
||||
``${{ github.ref }}`` specifying the currently active reference (branch, tag, pull, ...). This job
|
||||
template parses the context's variable and derives if a pipeline runs for a commit on a branch or a
|
||||
tagged commit.
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Output/branch:
|
||||
|
||||
branch
|
||||
======
|
||||
|
||||
:Type: string
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid branch name.
|
||||
:Description: Returns the branch's name the pipeline's commit is associated to, if :ref:`JOBTMPL/PrepareJob/Output/ref_kind`
|
||||
is ``'branch'``, otherwise returns an empty string ``''``.
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Output/tag:
|
||||
|
||||
tag
|
||||
===
|
||||
|
||||
:Type: string
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid tag name.
|
||||
:Description: Returns the tag's name the pipeline's commit is associated to, if :ref:`JOBTMPL/PrepareJob/Output/ref_kind`
|
||||
is ``'tag'``, otherwise returns an empty string ``''``.
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Output/version:
|
||||
|
||||
version
|
||||
=======
|
||||
|
||||
:Type: string
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid version matching :ref:`JOBTMPL/PrepareJob/Input/release_tag_pattern`.
|
||||
:Description: In case the pipeline runs for a tag, it returns the tag's name, if the name matches
|
||||
:ref:`JOBTMPL/PrepareJob/Input/release_tag_pattern`, otherwise returns an empty string ``''``. |br|
|
||||
In case the pipeline runs for a branch, then the commit is checked if it's a
|
||||
:ref:`merge commit <JOBTMPL/PrepareJob/Output/is_merge_commit>` and corresponding pull-request (PR) is
|
||||
searched. When a matching PR can be located and it's title matches
|
||||
:ref:`JOBTMPL/PrepareJob/Input/release_tag_pattern`, then this title is returned as a version,
|
||||
otherwise it returns an empty string ``''``.
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Output/pr_title:
|
||||
|
||||
pr_title
|
||||
========
|
||||
|
||||
:Type: string
|
||||
:Default Value: ``''``
|
||||
:Possible Values: ``'true'``, ``'false'``
|
||||
:Description: Returns the associated pull-request's title, if the pipeline's commit is a
|
||||
:ref:`merge commit <JOBTMPL/PrepareJob/Output/is_merge_commit>` and the located pull-request's title
|
||||
for this commit matches :ref:`JOBTMPL/PrepareJob/Input/release_tag_pattern`, otherwise returns an
|
||||
empty string ``''``.
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Output/pr_number:
|
||||
|
||||
pr_number
|
||||
=========
|
||||
|
||||
:Type: string
|
||||
:Default Value: ``''``
|
||||
:Possible Values: ``'true'``, ``'false'``
|
||||
:Description: Returns the associated pull-request's number, if the pipeline's commit is a
|
||||
:ref:`merge commit <JOBTMPL/PrepareJob/Output/is_merge_commit>` and the located pull-request's title
|
||||
for this commit matches :ref:`JOBTMPL/PrepareJob/Input/release_tag_pattern`, otherwise returns an
|
||||
empty string ``''``.
|
||||
|
||||
|
||||
.. _JOBTMPL/PrepareJob/Optimizations:
|
||||
|
||||
Optimizations
|
||||
*************
|
||||
|
||||
This template offers no optimizations (reduced job runtime).
|
||||
21
doc/JobTemplate/Setup/index.rst
Normal file
@@ -0,0 +1,21 @@
|
||||
.. _JOBTMPL/Setup:
|
||||
|
||||
Pipeline Setup
|
||||
##############
|
||||
|
||||
The category *pipeline setup* provides workflow templates implementing preparation steps suitable for every pipeline.
|
||||
|
||||
* :ref:`JOBTMPL/Parameters` - Compute a matrix of (operating system |times| Python version |times| environment)
|
||||
combinations for unit testing, platform testing or application testing and provide the result as a JSON string via
|
||||
pipeline outputs.
|
||||
* :ref:`JOBTMPL/PrepareJob` - Check GitHub Action environment variables and commits to provide precomputed variables as
|
||||
pipeline outputs.
|
||||
* :ref:`JOBTMPL/ExtractConfiguration` - Extract configuration settings from :file:`pyproject.toml` and provide settings
|
||||
as pipeline outputs.
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
||||
PrepareJob
|
||||
Parameters
|
||||
ExtractConfiguration
|
||||
@@ -1,182 +0,0 @@
|
||||
.. _JOBTMPL/StaticTypeChecking:
|
||||
|
||||
StaticTypeCheck
|
||||
###############
|
||||
|
||||
This job runs a static type check using mypy and collects the results. These results can be converted to a HTML report
|
||||
and then uploaded as an artifact.
|
||||
|
||||
**Behavior:**
|
||||
|
||||
1. Checkout repository
|
||||
2. Setup Python and install dependencies
|
||||
3. Run type checking command(s).
|
||||
4. Upload type checking report as an artifact
|
||||
|
||||
**Dependencies:**
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`actions/setup-python`
|
||||
* :gh:`actions/upload-artifact`
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
Simple Example
|
||||
==============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
StaticTypeCheck:
|
||||
uses: pyTooling/Actions/.github/workflows/StaticTypeCheck.yml@r4
|
||||
with:
|
||||
commands: |
|
||||
touch pyTooling/__init__.py
|
||||
mypy --html-report htmlmypy -p pyTooling
|
||||
report: 'htmlmypy'
|
||||
artifact: TypeChecking
|
||||
|
||||
Complex Example
|
||||
===============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
StaticTypeCheck:
|
||||
uses: pyTooling/Actions/.github/workflows/StaticTypeCheck.yml@r4
|
||||
needs:
|
||||
- Params
|
||||
with:
|
||||
python_version: ${{ needs.Params.outputs.python_version }}
|
||||
commands: |
|
||||
touch pyTooling/__init__.py
|
||||
mypy --html-report htmlmypy -p pyTooling
|
||||
report: 'htmlmypy'
|
||||
artifact: ${{ fromJson(needs.Params.outputs.artifact_names).statictyping_html }}
|
||||
|
||||
Commands
|
||||
========
|
||||
|
||||
Example ``commands``:
|
||||
|
||||
1. Regular package
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
commands: mypy --html-report htmlmypy -p ToolName
|
||||
|
||||
|
||||
2. Parent namespace package
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
commands: |
|
||||
touch Parent/__init__.py
|
||||
mypy --html-report htmlmypy -p ToolName
|
||||
|
||||
3. Child namespace package
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
commands: |
|
||||
cd Parent
|
||||
mypy --html-report ../htmlmypy -p ToolName
|
||||
|
||||
Parameters
|
||||
**********
|
||||
|
||||
python_version
|
||||
==============
|
||||
|
||||
+----------------+----------+----------+-----------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+=================+
|
||||
| python_version | optional | string | ``3.11`` |
|
||||
+----------------+----------+----------+-----------------+
|
||||
|
||||
Python version.
|
||||
|
||||
|
||||
requirements
|
||||
============
|
||||
|
||||
+----------------+----------+----------+-------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+===============================+
|
||||
| requirements | optional | string | ``-r tests/requirements.txt`` |
|
||||
+----------------+----------+----------+-------------------------------+
|
||||
|
||||
Python dependencies to be installed through pip.
|
||||
|
||||
|
||||
commands
|
||||
========
|
||||
|
||||
+----------------+----------+----------+--------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==============+
|
||||
| commands | yes | string | — — — — |
|
||||
+----------------+----------+----------+--------------+
|
||||
|
||||
Commands to run the static type checks.
|
||||
|
||||
|
||||
html_report
|
||||
===========
|
||||
|
||||
+----------------+----------+----------+-----------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+=================+
|
||||
| report | optional | string | ``htmlmypy`` |
|
||||
+----------------+----------+----------+-----------------+
|
||||
|
||||
HTML output directory to upload as an artifact.
|
||||
|
||||
|
||||
junit_report
|
||||
============
|
||||
|
||||
+----------------+----------+----------+-----------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+=============================+
|
||||
| report | optional | string | ``StaticTypingSummary.xml`` |
|
||||
+----------------+----------+----------+-----------------------------+
|
||||
|
||||
junit file to upload as an artifact.
|
||||
|
||||
|
||||
html_artifact
|
||||
=============
|
||||
|
||||
+----------------+----------+----------+--------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==============+
|
||||
| html_artifact | yes | string | — — — — |
|
||||
+----------------+----------+----------+--------------+
|
||||
|
||||
Name of the typing artifact (HTML report).
|
||||
|
||||
|
||||
junit_artifact
|
||||
==============
|
||||
|
||||
+----------------+----------+----------+--------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==============+
|
||||
| junit_artifact | optional | string | ``""`` |
|
||||
+----------------+----------+----------+--------------+
|
||||
|
||||
Name of the typing junit artifact (junit XML).
|
||||
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
|
||||
Results
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
30
doc/JobTemplate/SystemList.rst
Normal file
@@ -0,0 +1,30 @@
|
||||
.. rubric:: Possible values
|
||||
|
||||
* Native systems: ``ubuntu``, ``windows``, ``macos``
|
||||
* MSYS2: ``msys``, ``mingw32``, ``mingw64``, ``clang32``, ``clang64``, ``ucrt64``
|
||||
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
| Icon | System | Used version | Comments |
|
||||
+======+===========+==============================+=================================================================+
|
||||
| 🪟 | Windows | Windows Server 2025 (latest) | |
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
| 🐧 | Ubuntu | Ubuntu 24.04 (LTS) (latest) | |
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
| 🍎 | macOS | macOS Ventura 13 (latest) | While this marked latest, macOS Ventura 13 is already provided. |
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
| 🍏 | macOS-arm | macOS Sonoma 14 (latest) | While this marked latest, macOS Ventura 13 is already provided. |
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
| 🟪 | MSYS | | |
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
| ⬛ | MinGW32 | | |
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
| 🟦 | MinGW64 | | |
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
| 🟫 | Clang32 | | |
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
| 🟧 | Clang64 | | |
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
| 🟨 | UCRT64 | | |
|
||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||
|
||||
Source: `Images provided by GitHub <https://github.com/actions/runner-images>`__
|
||||
77
doc/JobTemplate/Templates.rst
Normal file
@@ -0,0 +1,77 @@
|
||||
.. grid:: 5
|
||||
|
||||
.. grid-item::
|
||||
:columns: 2
|
||||
|
||||
.. rubric:: All-In-One
|
||||
|
||||
* :ref:`JOBTMPL/CompletePipeline` |br| |br| |br| |br|
|
||||
|
||||
.. rubric:: Pipeline Setup
|
||||
|
||||
* :ref:`JOBTMPL/Parameters`
|
||||
* :ref:`JOBTMPL/PrepareJob`
|
||||
* :ref:`JOBTMPL/ExtractConfiguration`
|
||||
|
||||
.. grid-item::
|
||||
:columns: 2
|
||||
|
||||
.. rubric:: Documentation
|
||||
|
||||
* :ref:`JOBTMPL/CheckDocumentation`
|
||||
* :ref:`JOBTMPL/SphinxDocumentation`
|
||||
* :ref:`JOBTMPL/LaTeXDocumentation`
|
||||
|
||||
.. #* :ref:`JOBTMPL/VerifyDocs`
|
||||
|
||||
.. rubric:: Unit Tests, Code Coverage
|
||||
|
||||
* :ref:`JOBTMPL/ApplicationTesting`
|
||||
* :ref:`JOBTMPL/UnitTesting`
|
||||
|
||||
.. grid-item::
|
||||
:columns: 2
|
||||
|
||||
.. rubric:: Code Quality
|
||||
|
||||
* :ref:`JOBTMPL/StaticTypeCheck`
|
||||
* *code formatting (planned)*
|
||||
* *coding style (planned)*
|
||||
* *code linting (planned)*
|
||||
|
||||
.. rubric:: Build and Packaging
|
||||
|
||||
* :ref:`JOBTMPL/Package`
|
||||
* :ref:`JOBTMPL/InstallPackage`
|
||||
|
||||
.. grid-item::
|
||||
:columns: 2
|
||||
|
||||
.. rubric:: Publishing
|
||||
|
||||
* :ref:`JOBTMPL/PublishOnPyPI`
|
||||
* :ref:`JOBTMPL/PublishTestResults`
|
||||
* :ref:`JOBTMPL/PublishCoverageResults`
|
||||
* :ref:`JOBTMPL/PublishToGitHubPages`
|
||||
|
||||
.. rubric:: Releasing
|
||||
|
||||
* :ref:`JOBTMPL/PublishReleaseNotes`
|
||||
* :ref:`JOBTMPL/TagReleaseCommit`
|
||||
|
||||
.. grid-item::
|
||||
:columns: 2
|
||||
|
||||
.. rubric:: Cleanup
|
||||
|
||||
* :ref:`JOBTMPL/IntermediateCleanup`
|
||||
* :ref:`JOBTMPL/ArtifactCleanup`
|
||||
|
||||
.. grid-item::
|
||||
:columns: 2
|
||||
|
||||
.. rubric:: :ref:`JOBTMPL/Deprecated`
|
||||
|
||||
* :ref:`JOBTMPL/CoverageCollection`
|
||||
* :ref:`JOBTMPL/NightlyRelease`
|
||||
* :ref:`JOBTMPL/BuildTheDocs`
|
||||
6
doc/JobTemplate/Testing/ApplicationTesting.rst
Normal file
@@ -0,0 +1,6 @@
|
||||
.. _JOBTMPL/ApplicationTesting:
|
||||
|
||||
ApplicationTesting (idea)
|
||||
#########################
|
||||
|
||||
.. todo:: ApplicationTesting:: Needs documentation.
|
||||
756
doc/JobTemplate/Testing/UnitTesting.rst
Normal file
@@ -0,0 +1,756 @@
|
||||
.. _JOBTMPL/UnitTesting:
|
||||
.. index::
|
||||
single: pytest; UnitTesting Template
|
||||
single: Coverage.py; UnitTesting Template
|
||||
single: GitHub Action Reusable Workflow; UnitTesting Template
|
||||
|
||||
UnitTesting
|
||||
###########
|
||||
|
||||
This template runs multiple jobs from a matrix as a cross of Python versions and systems. The summary report in junit
|
||||
XML format is optionally uploaded as an artifact.
|
||||
|
||||
Configuration options to :term:`pytest` should be given via section ``[tool.pytest.ini_options]`` in a
|
||||
``pyproject.toml`` file.
|
||||
|
||||
.. topic:: Features
|
||||
|
||||
* Execute unit tests using :term:`pytest`.
|
||||
|
||||
* Provide unit test results as JUnit XML file (pyTest XML dialect).
|
||||
|
||||
* Collect code coverage using :term:`Coverage.py`.
|
||||
|
||||
* Provide code coverage results as pytest SQLite database.
|
||||
* Provide code coverage results as Cobertura XML file.
|
||||
* Provide code coverage results as pytest JSON file.
|
||||
* Provide code coverage results as HTML report.
|
||||
|
||||
.. topic:: Behavior
|
||||
|
||||
1. Checkout repository.
|
||||
2. Setup environment and install dependencies (``apt``, ``homebrew``, ``pacman``, ...).
|
||||
3. Setup Python and install dependencies (:term:`pip`).
|
||||
4. Run instructions from ``*_before_script`` parameter.
|
||||
5. Run unit tests using *pytest* and if enabled in combination with *Coverage.py*.
|
||||
6. Convert gathered results to other formats.
|
||||
7. Upload results (test reports, code coverage reports, ...) as an artifacts.
|
||||
|
||||
.. topic:: Job Execution
|
||||
|
||||
.. image:: ../../_static/pyTooling-Actions-UnitTesting.png
|
||||
:width: 600px
|
||||
|
||||
.. topic:: Dependencies
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`msys2/setup-msys2`
|
||||
* :gh:`actions/setup-python`
|
||||
* :gh:`pyTooling/download-artifact`
|
||||
|
||||
* :gh:`actions/download-artifact`
|
||||
|
||||
* :gh:`pyTooling/upload-artifact`
|
||||
|
||||
* :gh:`actions/upload-artifact`
|
||||
|
||||
* apt: Packages specified via :ref:`JOBTMPL/UnitTesting/Input/apt` parameter.
|
||||
* homebrew: Packages specified via :ref:`JOBTMPL/UnitTesting/Input/brew` parameter.
|
||||
* MSYS2: Packages specified via :ref:`JOBTMPL/UnitTesting/Input/pacboy` parameter.
|
||||
* pip
|
||||
|
||||
* :pypi:`wheel`
|
||||
* :pypi:`tomli`
|
||||
* Python packages specified via :ref:`JOBTMPL/UnitTesting/Input/requirements` or
|
||||
:ref:`JOBTMPL/UnitTesting/Input/mingw_requirements` parameter.
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Instantiation:
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
The following instantiation example creates a ``UnitTesting`` job derived from job template ``UnitTesting`` version
|
||||
`@r6`. For providing the job matrix as a JSON string, the :ref:`JOBTMPL/Parameters` job template is used. Additionally,
|
||||
the job needs configuration settings, which are stored in :file:`pyproject.toml`. Instead of duplicating these settings,
|
||||
the :ref:`JOBTMPL/ExtractConfiguration` job template is used to extract these settings.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
UnitTestingParams:
|
||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
|
||||
with:
|
||||
package_name: myPackage
|
||||
|
||||
UnitTesting:
|
||||
uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
- UnitTestingParams
|
||||
with:
|
||||
jobs: ${{ needs.UnitTestingParams.outputs.python_jobs }}
|
||||
requirements: '-r tests/unit/requirements.txt'
|
||||
unittest_report_xml: ${{ needs.ConfigParams.outputs.unittest_report_xml }}
|
||||
unittest_xml_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}
|
||||
coverage_sqlite_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }}
|
||||
|
||||
|
||||
.. seealso::
|
||||
|
||||
:ref:`JOBTMPL/Parameters`
|
||||
``Parameters`` is usually used to pre-compute the job matrix as a JSON string with all system |times| environment
|
||||
|times| Python version combinations.
|
||||
:ref:`JOBTMPL/PublishTestResults`
|
||||
``PublishTestResults`` can be used to merge all JUnit test reports into one file.
|
||||
:ref:`JOBTMPL/PublishCoverageResults`
|
||||
``PublishCoverageResults`` can be used to merge all code coverage reports into one file.
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Parameters:
|
||||
|
||||
Parameter Summary
|
||||
*****************
|
||||
|
||||
.. # |unittest_report_xml| code-block:: json
|
||||
|
||||
{ "directory": "report/unit",
|
||||
"filename": "TestReportSummary.xml",
|
||||
"fullpath": "report/unit/TestReportSummary.xml"
|
||||
}
|
||||
|
||||
|
||||
.. rubric:: Goto :ref:`input parameters <JOBTMPL/UnitTesting/Inputs>`
|
||||
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=========================================================================+==========+==========+===================================================================================================================================+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/jobs` | yes | string | — — — — |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/apt` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/brew` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/pacboy` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/requirements` | no | string | ``'-r tests/requirements.txt'`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/mingw_requirements` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/macos_before_script` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/macos_arm_before_script` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/ubuntu_before_script` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/mingw64_before_script` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/ucrt64_before_script` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/root_directory` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/tests_directory` | no | string | ``'tests'`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/unittest_directory` | no | string | ``'unit'`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/unittest_report_xml` | no | string | :jsoncode:`{"directory": "report/unit", "filename": "TestReportSummary.xml", "fullpath": "report/unit/TestReportSummary.xml"}` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/coverage_config` | no | string | ``'pyproject.toml'`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/coverage_report_xml` | no | string | :jsoncode:`{"directory": "report/coverage", "filename": "coverage.xml", "fullpath": "report/coverage/coverage.xml"}` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/coverage_report_json` | no | string | :jsoncode:`{"directory": "report/coverage", "filename": "coverage.json", "fullpath": "report/coverage/coverage.json"}` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/coverage_report_html` | no | string | :jsoncode:`{"directory": "report/coverage"}` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/unittest_xml_artifact` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/unittest_html_artifact` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/coverage_sqlite_artifact` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/coverage_xml_artifact` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/coverage_json_artifact` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :ref:`JOBTMPL/UnitTesting/Input/coverage_html_artifact` | no | string | ``''`` |
|
||||
+-------------------------------------------------------------------------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
|
||||
|
||||
.. rubric:: Goto :ref:`secrets <JOBTMPL/UnitTesting/Secrets>`
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
.. rubric:: Goto :ref:`output parameters <JOBTMPL/UnitTesting/Outputs>`
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Inputs:
|
||||
|
||||
Input Parameters
|
||||
****************
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/jobs:
|
||||
|
||||
jobs
|
||||
====
|
||||
|
||||
:Type: string
|
||||
:Required: yes
|
||||
:Default Value: — — — —
|
||||
:Possible Values: A JSON string with an array of dictionaries with the following key-value pairs:
|
||||
|
||||
:sysicon: icon to display
|
||||
:system: name of the system
|
||||
:runs-on: virtual machine image and base operating system
|
||||
:runtime: name of the runtime environment if not running natively on the VM image
|
||||
:shell: name of the shell
|
||||
:pyicon: icon for CPython or pypy
|
||||
:python: Python version
|
||||
:envname: full name of the selected environment
|
||||
:Description: A JSON encoded job matrix to run multiple Python job variations.
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/apt:
|
||||
|
||||
apt
|
||||
===
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid list of parameters for ``apt install``. |br|
|
||||
Packages are specified as a space separated list like ``'graphviz curl gzip'``.
|
||||
:Description: Additional Ubuntu system dependencies to be installed through *apt*.
|
||||
:Example:
|
||||
.. code-block:: yaml
|
||||
|
||||
UnitTests:
|
||||
...
|
||||
with:
|
||||
apt: >-
|
||||
graphviz
|
||||
curl
|
||||
gzip
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/brew:
|
||||
|
||||
brew
|
||||
====
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid list of parameters for ``brew install``. |br|
|
||||
Packages are specified as a space separated list.
|
||||
:Description: Additional macOS system dependencies to be installed through *brew*.
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/pacboy:
|
||||
|
||||
pacboy
|
||||
======
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid list of parameters for ``pacboy``. |br|
|
||||
Packages are specified as a space separated list like ``'python-lxml:p python-numpy:p'``.
|
||||
:Description: Additional MSYS2 system dependencies to be installed through *pacboy* (*pacman*). |br|
|
||||
Usually, Python packages start with ``python-``. The suffix ``:p`` ensures pacboy figures out the
|
||||
correct package repository prefix for MinGW64, UCRT64, ...
|
||||
|
||||
.. note::
|
||||
|
||||
Internally, a dedicated workflow step reads the :ref:`JOBTMPL/UnitTesting/Input/requirements` file
|
||||
for Python and compares requested packages with a list of packages that should be installed through
|
||||
*pacman*/*pacboy* compared to installation via *pip*. These are mainly core packages or packages
|
||||
with embedded C code. |br|
|
||||
The list of identified packages is handed over to *pacboy* for preinstallation. Otherwise *pip*
|
||||
will later raise an error. |br|
|
||||
The packages listed by this parameter will be installed in addition to the identified packages.
|
||||
|
||||
.. attention::
|
||||
|
||||
Ensure your Python requirements match the available version from MSYS2 packages list, otherwise
|
||||
if your :file:`requirements.txt` requests a newer version then provided by MSYS2, such a dependency
|
||||
will fail.
|
||||
:Example:
|
||||
.. code-block:: yaml
|
||||
|
||||
UnitTests:
|
||||
...
|
||||
with:
|
||||
pacboy: >-
|
||||
python-lxml:p
|
||||
:Packages: The following list of Python packages is identified to be installed via *pacboy*:
|
||||
|
||||
* :ucrt64:`python-coverage` |rarr| :pypi:`coverage`
|
||||
* :ucrt64:`igraph` |rarr| :pypi:`igraph`
|
||||
* :ucrt64:`python-lxml` |rarr| :pypi:`lxml`
|
||||
* :ucrt64:`python-markupsafe` |rarr| :pypi:`markupsafe`
|
||||
* :ucrt64:`python-numpy` |rarr| :pypi:`numpy`
|
||||
* :ucrt64:`python-pip` |rarr| :pypi:`pip`
|
||||
* :ucrt64:`python-pyaml` |rarr| :pypi:`pyaml`
|
||||
* :ucrt64:`python-ruamel-yaml` |rarr| :pypi:`ruamel-yaml`
|
||||
* :ucrt64:`python-wheel` |rarr| :pypi:`wheel`
|
||||
* :ucrt64:`python-tomli` |rarr| :pypi:`tomli`
|
||||
* :ucrt64:`python-types-pyyaml` |rarr| :pypi:`types.pyyaml`
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/requirements:
|
||||
|
||||
requirements
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'-r tests/requirements.txt'``
|
||||
:Possible Values: Any valid list of parameters for ``pip install``. |br|
|
||||
Either a requirements file can be referenced using ``'-r path/to/requirements.txt'``, or a list of
|
||||
packages can be specified using a space separated list like ``'coverage pytest'``.
|
||||
:Description: Python dependencies to be installed through *pip*.
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/mingw_requirements:
|
||||
|
||||
mingw_requirements
|
||||
==================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid list of parameters for ``pip install``. |br|
|
||||
Either a requirements file can be referenced using ``'-r path/to/requirements.txt'``, or a list of
|
||||
packages can be specified using a space separated list like ``'coverage pytest'``.
|
||||
:Description: Override Python dependencies to be installed through *pip* in MSYS2 (MinGW64/UCRT64) only.
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/macos_before_script:
|
||||
|
||||
macos_before_script
|
||||
===================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid *Bash* instructions as single-line or multi-line string suitable for macOS (Intel platform).
|
||||
:Description: These optional *Bash* instructions for macOS are executed after setting up the environment and
|
||||
installing the platform specific dependencies and before running the unit test.
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/macos_arm_before_script:
|
||||
|
||||
macos_arm_before_script
|
||||
=======================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid *Bash* instructions as single-line or multi-line string suitable for macOS (ARM platform).
|
||||
:Description: These optional *Bash* instructions for macOS are executed after setting up the environment and
|
||||
installing the platform specific dependencies and before running the unit test.
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/ubuntu_before_script:
|
||||
|
||||
ubuntu_before_script
|
||||
====================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid *Bash* instructions as single-line or multi-line string suitable for Ubuntu.
|
||||
:Description: These optional *Bash* instructions for Ubuntu are executed after setting up the environment and
|
||||
installing the platform specific dependencies and before running the unit test.
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/mingw64_before_script:
|
||||
|
||||
mingw64_before_script
|
||||
=====================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid *Bash* instructions as single-line or multi-line string suitable for MinGW64 on Windows.
|
||||
:Description: These optional *Bash* instructions for MinGW64 on Windows are executed after setting up the
|
||||
environment and installing the platform specific dependencies and before running the unit test.
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/ucrt64_before_script:
|
||||
|
||||
ucrt64_before_script
|
||||
====================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid *Bash* instructions as single-line or multi-line string suitable for UCRT64 on Windows.
|
||||
:Description: These optional *Bash* instructions for UCRT64 on Windows are executed after setting up the
|
||||
environment and installing the platform specific dependencies and before running the unit test.
|
||||
|
||||
.. hint::
|
||||
|
||||
The next parameters allow running different test kinds (unit tests, performance tests, platform tests, ...) with the
|
||||
same job template, but isolated in sub-directories, thus pytest only discovers a subset of tests. The following code
|
||||
blocks showcase how the job template uses these parameters and how it relates to a proposed directory structure.
|
||||
|
||||
.. grid:: 3
|
||||
|
||||
.. grid-item::
|
||||
:columns: 5
|
||||
|
||||
.. card:: Relation between :ref:`JOBTMPL/UnitTesting/Input/root_directory`, :ref:`JOBTMPL/UnitTesting/Input/tests_directory` and :ref:`JOBTMPL/UnitTesting/Input/unittest_directory`
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
cd <RepositoryRoot>
|
||||
cd ${root_directory}
|
||||
|
||||
python -m \
|
||||
pytest -raP \
|
||||
--color=yes ..... \
|
||||
"${tests_directory}/${unittest_directory}"
|
||||
|
||||
.. grid-item::
|
||||
:columns: 3
|
||||
|
||||
.. card:: Directory Structure
|
||||
|
||||
.. code-block::
|
||||
|
||||
<RepositoryRoot>/
|
||||
doc/
|
||||
myPackage/
|
||||
__init__.py
|
||||
tests/
|
||||
unit/
|
||||
myTests.py
|
||||
|
||||
.. grid-item::
|
||||
:columns: 3
|
||||
|
||||
.. card:: Example for Default Values
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
cd <RepositoryRoot>
|
||||
cd .
|
||||
|
||||
python -m \
|
||||
pytest -raP \
|
||||
--color=yes ..... \
|
||||
"tests/unit"
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/root_directory:
|
||||
|
||||
root_directory
|
||||
==============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``''``
|
||||
:Possible Values: Any valid directory or sub-directory.
|
||||
:Description: Working directory for running tests. |br|
|
||||
Usually, this is the repository's root directory. Tests are called relatively from here. See
|
||||
:ref:`JOBTMPL/UnitTesting/Input/tests_directory` and :ref:`JOBTMPL/UnitTesting/Input/unittest_directory`.
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/tests_directory:
|
||||
|
||||
tests_directory
|
||||
===============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'tests'``
|
||||
:Possible Values: Any valid directory or sub-directory.
|
||||
:Description: Path to the directory containing tests (relative from :ref:`JOBTMPL/UnitTesting/Input/root_directory`).
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/unittest_directory:
|
||||
|
||||
unittest_directory
|
||||
==================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'unit'``
|
||||
:Possible Values: Any valid directory or sub-directory.
|
||||
:Description: Path to the directory containing unit tests (relative from :ref:`JOBTMPL/UnitTesting/Input/tests_directory`).
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/unittest_report_xml:
|
||||
|
||||
unittest_report_xml
|
||||
===================
|
||||
|
||||
:Type: string (JSON)
|
||||
:Required: no
|
||||
:Default Value:
|
||||
.. code-block:: json
|
||||
|
||||
{ "directory": "reports/unit",
|
||||
"filename": "UnittestReportSummary.xml",
|
||||
"fullpath": "reports/unit/UnittestReportSummary.xml"
|
||||
}
|
||||
:Possible Values: Any valid JSON string containing a JSON object with fields:
|
||||
|
||||
:directory: Directory or sub-directory where the unittest summary report in XML format will be saved.
|
||||
:filename: Filename of the generated JUnit XML report. |br|
|
||||
Any valid filename accepted by ``pytest ... --junitxml=${unittest_report_xml}``.
|
||||
:fullpath: The concatenation of both previous fields using the ``/`` separator.
|
||||
:Description: Directory, filename and fullpath as JSON object where the unittest summary report in XML format will
|
||||
be saved. |br|
|
||||
This path is configured in :file:`pyproject.toml` and can be extracted by
|
||||
:ref:`JOBTMPL/ExtractConfiguration`.
|
||||
:Example:
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
UnitTesting:
|
||||
uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
...
|
||||
unittest_report_xml: ${{ needs.ConfigParams.outputs.unittest_report_xml }}
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/coverage_config:
|
||||
|
||||
coverage_config
|
||||
===============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'pyproject.toml'``
|
||||
:Possible Values: TBD
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/coverage_report_xml:
|
||||
|
||||
coverage_report_xml
|
||||
===================
|
||||
|
||||
:Type: string (JSON)
|
||||
:Required: no
|
||||
:Default Value:
|
||||
.. code-block:: json
|
||||
|
||||
{ "directory": "reports/coverage",
|
||||
"filename": "coverage.xml",
|
||||
"fullpath": "reports/coverage/coverage.xml"
|
||||
}
|
||||
:Possible Values: Any valid JSON string containing a JSON object with fields:
|
||||
|
||||
:directory: Directory or sub-directory where the code coverage report in Cobertura XML format will be
|
||||
saved.
|
||||
:filename: Filename of the generated Cobertura XML report. |br|
|
||||
Any valid XML filename.
|
||||
:fullpath: The concatenation of both previous fields using the ``/`` separator.
|
||||
:Description: Directory, filename and fullpath as JSON object where the code coverage report in Cobertura XML format
|
||||
will be saved. |br|
|
||||
This path is configured in :file:`pyproject.toml` and can be extracted by
|
||||
:ref:`JOBTMPL/ExtractConfiguration`.
|
||||
:Example:
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
UnitTesting:
|
||||
uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
...
|
||||
coverage_report_xml: ${{ needs.ConfigParams.outputs.coverage_report_xml }}
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/coverage_report_json:
|
||||
|
||||
coverage_report_json
|
||||
====================
|
||||
|
||||
:Type: string (JSON)
|
||||
:Required: no
|
||||
:Default Value:
|
||||
.. code-block:: json
|
||||
|
||||
{ "directory": "reports/coverage",
|
||||
"filename": "coverage.json",
|
||||
"fullpath": "reports/coverage/coverage.json"
|
||||
}
|
||||
:Possible Values: Any valid JSON string containing a JSON object with fields:
|
||||
|
||||
:directory: Directory or sub-directory where the code coverage report in Coverage.py's JSON format
|
||||
will be saved.
|
||||
:filename: Filename of the generated Coverage.py JSON report. |br|
|
||||
Any valid JSON filename.
|
||||
:fullpath: The concatenation of both previous fields using the ``/`` separator.
|
||||
:Description: Directory, filename and fullpath as JSON object where the code coverage report in Coverage.py's JSON
|
||||
format will be saved. |br|
|
||||
This path is configured in :file:`pyproject.toml` and can be extracted by
|
||||
:ref:`JOBTMPL/ExtractConfiguration`.
|
||||
:Example:
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
UnitTesting:
|
||||
uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
...
|
||||
coverage_report_json: ${{ needs.ConfigParams.outputs.coverage_report_json }}
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/coverage_report_html:
|
||||
|
||||
coverage_report_html
|
||||
====================
|
||||
|
||||
:Type: string (JSON)
|
||||
:Required: no
|
||||
:Default Value:
|
||||
.. code-block:: json
|
||||
|
||||
{ "directory": "reports/coverage/html"
|
||||
}
|
||||
:Possible Values: Any valid JSON string containing a JSON object with fields:
|
||||
|
||||
:directory: Directory or sub-directory where the code coverage report in HTML format will be saved.
|
||||
:Description: Directory as JSON object where the code coverage report in HTML format will be saved. |br|
|
||||
This path is configured in :file:`pyproject.toml` and can be extracted by
|
||||
:ref:`JOBTMPL/ExtractConfiguration`.
|
||||
:Example:
|
||||
.. code-block:: yaml
|
||||
|
||||
ConfigParams:
|
||||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6
|
||||
|
||||
UnitTesting:
|
||||
uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r6
|
||||
needs:
|
||||
- ConfigParams
|
||||
with:
|
||||
...
|
||||
coverage_report_html: ${{ needs.ConfigParams.outputs.coverage_report_html }}
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/unittest_xml_artifact:
|
||||
|
||||
unittest_xml_artifact
|
||||
=====================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the unittest report summary in XML format.
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/unittest_html_artifact:
|
||||
|
||||
unittest_html_artifact
|
||||
======================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the unittest report in HTML format.
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/coverage_sqlite_artifact:
|
||||
|
||||
coverage_sqlite_artifact
|
||||
========================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the code coverage report as SQLite database.
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/coverage_xml_artifact:
|
||||
|
||||
coverage_xml_artifact
|
||||
=====================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the code coverage report in XML format.
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/coverage_json_artifact:
|
||||
|
||||
coverage_json_artifact
|
||||
======================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the code coverage report in JSON format.
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Input/coverage_html_artifact:
|
||||
|
||||
coverage_html_artifact
|
||||
======================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Possible Values: Any valid artifact name.
|
||||
:Description: Name of the artifact containing the code coverage report in HTML format.
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Secrets:
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Outputs:
|
||||
|
||||
Outputs
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
|
||||
|
||||
.. _JOBTMPL/UnitTesting/Optimizations:
|
||||
|
||||
Optimizations
|
||||
*************
|
||||
|
||||
The following optimizations can be used to reduce the template's runtime.
|
||||
|
||||
Disable unit test XML generation
|
||||
If parameter :ref:`JOBTMPL/UnitTesting/Input/unittest_xml_artifact` is empty, no unit test summary report will be
|
||||
generated and no JUnit XML artifact will be uploaded.
|
||||
Disabled code coverage collection
|
||||
If parameter :ref:`JOBTMPL/UnitTesting/Input/coverage_config` is empty, no code coverage will be collected.
|
||||
Disable code coverage SQLite database artifact upload
|
||||
If parameter :ref:`JOBTMPL/UnitTesting/Input/coverage_sqlite_artifact` is empty, the collected code coverage database
|
||||
(SQLlite format) wont be uploaded as an artifact.
|
||||
Disable code coverage report conversion to the Cobertura XML format.
|
||||
If parameter :ref:`JOBTMPL/UnitTesting/Input/coverage_xml_artifact` is empty, no Cobertura XML file will be generated
|
||||
from code coverage report. As no Cobertura XML file exists, no code coverage XML artifact will be uploaded.
|
||||
Disable code coverage report conversion to the *Coverage.py* JSON format.
|
||||
If parameter :ref:`JOBTMPL/UnitTesting/Input/coverage_json_artifact` is empty, no *Coverage.py* JSON file will be
|
||||
generated from code coverage report. As no JSON file exists, no code coverage JSON artifact will be uploaded.
|
||||
Disable code coverage report conversion to an HTML website.
|
||||
If parameter :ref:`JOBTMPL/UnitTesting/Input/coverage_html_artifact` is empty, no coverage report HTML report will be
|
||||
generated from code coverage report. As no HTML report exists, no code coverage HTML artifact will be uploaded.
|
||||
15
doc/JobTemplate/Testing/index.rst
Normal file
@@ -0,0 +1,15 @@
|
||||
.. _JOBTMPL/Testing:
|
||||
|
||||
Testing
|
||||
#######
|
||||
|
||||
The category *testing* provides workflow templates implementing
|
||||
|
||||
* :ref:`JOBTMPL/UnitTesting` - Run unit tests and collect code coverage.
|
||||
* :ref:`JOBTMPL/ApplicationTesting` - Run application tests.
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
||||
UnitTesting
|
||||
ApplicationTesting
|
||||
@@ -1,159 +0,0 @@
|
||||
.. _JOBTMPL/UnitTesting:
|
||||
|
||||
UnitTesting
|
||||
###########
|
||||
|
||||
This template runs multiple jobs from a matrix as a cross of Python versions and systems. The summary report in junit
|
||||
XML format is optionally uploaded as an artifact.
|
||||
|
||||
Configuration options to ``pytest`` should be given via section ``[tool.pytest.ini_options]`` in a ``pyproject.toml``
|
||||
file.
|
||||
|
||||
**Behavior:**
|
||||
|
||||
1. Checkout repository
|
||||
2. Setup Python and install dependencies
|
||||
3. Run unit tests using ``pytest``.
|
||||
4. Upload junit test summary as an artifact
|
||||
|
||||
**Dependencies:**
|
||||
|
||||
* :gh:`actions/checkout`
|
||||
* :gh:`msys2/setup-msys2`
|
||||
* :gh:`actions/setup-python`
|
||||
* :gh:`actions/upload-artifact`
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
Simple Example
|
||||
==============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
jobs:
|
||||
Params:
|
||||
# ...
|
||||
|
||||
UnitTesting:
|
||||
uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r4
|
||||
needs:
|
||||
- Params
|
||||
with:
|
||||
jobs: ${{ needs.Params.outputs.python_jobs }}
|
||||
artifact: ${{ fromJson(needs.Params.outputs.artifact_names).unittesting }}
|
||||
|
||||
|
||||
Complex Example
|
||||
===============
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
TBD
|
||||
|
||||
Parameters
|
||||
**********
|
||||
|
||||
jobs
|
||||
====
|
||||
|
||||
+----------------+----------+----------+--------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==============+
|
||||
| jobs | yes | string | — — — — |
|
||||
+----------------+----------+----------+--------------+
|
||||
|
||||
JSON list with environment fields, telling the system and Python versions to run tests with.
|
||||
|
||||
|
||||
requirements
|
||||
============
|
||||
|
||||
+----------------+----------+----------+---------------------------------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+=================================+
|
||||
| requirements | optional | string | ``-r tests/requirements.txt`` |
|
||||
+----------------+----------+----------+---------------------------------+
|
||||
|
||||
Python dependencies to be installed through pip.
|
||||
|
||||
|
||||
pacboy
|
||||
======
|
||||
|
||||
+----------------+----------+----------+-----------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+===========+
|
||||
| pacboy | optional | string | ``""`` |
|
||||
+----------------+----------+----------+-----------+
|
||||
|
||||
Additional MSYS2 dependencies to be installed through pacboy (pacman).
|
||||
|
||||
Internally, a workflow step reads the requirements file for Python and compares requested packages with a list of
|
||||
packages that should be installed through pacman/pacboy compared to installation via pip. These are mainly core packages
|
||||
or packages with embedded C code.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
pacboy: >-
|
||||
python-lxml:p
|
||||
|
||||
|
||||
mingw_requirements
|
||||
==================
|
||||
|
||||
+--------------------+----------+----------+----------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+====================+==========+==========+==========+
|
||||
| mingw_requirements | optional | string | ``""`` |
|
||||
+--------------------+----------+----------+----------+
|
||||
|
||||
Override Python dependencies to be installed through pip on MSYS2 (MINGW64) only.
|
||||
|
||||
|
||||
tests_directory
|
||||
===============
|
||||
|
||||
+-----------------+----------+----------+-----------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+=================+==========+==========+===========+
|
||||
| tests_directory | optional | string | ``tests`` |
|
||||
+-----------------+----------+----------+-----------+
|
||||
|
||||
Path to the directory containing tests (test working directory).
|
||||
|
||||
|
||||
unittest_directory
|
||||
==================
|
||||
|
||||
+--------------------+----------+----------+----------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+====================+==========+==========+==========+
|
||||
| unittest_directory | optional | string | ``unit`` |
|
||||
+--------------------+----------+----------+----------+
|
||||
|
||||
Path to the directory containing unit tests (relative to tests_directory).
|
||||
|
||||
|
||||
artifact
|
||||
========
|
||||
|
||||
+----------------+----------+----------+----------+
|
||||
| Parameter Name | Required | Type | Default |
|
||||
+================+==========+==========+==========+
|
||||
| artifact | optional | string | ``""`` |
|
||||
+----------------+----------+----------+----------+
|
||||
|
||||
Generate unit test report with junitxml and upload results as an artifact.
|
||||
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
|
||||
Results
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
@@ -1,42 +0,0 @@
|
||||
.. _JOBTMPL/VerifyDocumentation:
|
||||
|
||||
VerifyDocs
|
||||
##########
|
||||
|
||||
This job extracts code examples from the README and tests these code snippets.
|
||||
|
||||
**Behavior:**
|
||||
|
||||
TBD
|
||||
|
||||
**Dependencies:**
|
||||
|
||||
TBD
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
Simple Example
|
||||
==============
|
||||
|
||||
.. todo:: VerifyDocs:SimpleExample Needs documentation.
|
||||
|
||||
Complex Example
|
||||
===============
|
||||
|
||||
.. todo:: VerifyDocs:ComplexExample Needs documentation.
|
||||
|
||||
Parameters
|
||||
**********
|
||||
|
||||
.. todo:: VerifyDocs:Parameters Needs documentation.
|
||||
|
||||
Secrets
|
||||
*******
|
||||
|
||||
This job template needs no secrets.
|
||||
|
||||
Results
|
||||
*******
|
||||
|
||||
This job template has no output parameters.
|
||||
10
doc/JobTemplate/_python_version.rst
Normal file
@@ -0,0 +1,10 @@
|
||||
python_version
|
||||
==============
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'3.13'``
|
||||
:Possible Values: Any valid Python version conforming to the pattern ``<major>.<minor>`` or ``pypy-<major>.<minor>``. |br|
|
||||
See `actions/python-versions - available Python versions <https://github.com/actions/python-versions>`__
|
||||
and `actions/setup-python - configurable Python versions <https://github.com/actions/setup-python>`__.
|
||||
:Description: Python version used to run Python code in the job.
|
||||
15
doc/JobTemplate/_ubuntu_image_version.rst
Normal file
@@ -0,0 +1,15 @@
|
||||
ubuntu_image_version
|
||||
====================
|
||||
|
||||
:Type: string
|
||||
:Required: no
|
||||
:Default Value: ``'24.04'``
|
||||
:Possible Values: See `actions/runner-images - Available Images <https://github.com/actions/runner-images?tab=readme-ov-file#available-images>`__
|
||||
for available Ubuntu image versions.
|
||||
:Description: Version of the Ubuntu image used to run the job.
|
||||
|
||||
.. note::
|
||||
|
||||
Unfortunately, GitHub Actions has only a `limited set of functions <https://docs.github.com/en/actions/reference/workflows-and-actions/expressions#functions>`__,
|
||||
thus, the usual Ubuntu image name like ``'ubuntu-24.04'`` can't be split into image name and image
|
||||
version.
|
||||
@@ -1,67 +1,98 @@
|
||||
.. _JOBTMPL:
|
||||
.. index::
|
||||
single: GitHub Action Reusable Workflow
|
||||
|
||||
Overview
|
||||
########
|
||||
|
||||
The following list categorizes all pre-defined job templates, which can be instantiated in a pipeline (GitHub Action
|
||||
Workflow). They can also serve as an example for creating or driving own job templates.
|
||||
Workflow). They can also serve as an example for creating or deriving own job templates. All job templates are highly
|
||||
customizable.
|
||||
|
||||
**Table of Contents:**
|
||||
.. include:: Templates.rst
|
||||
|
||||
.. hlist::
|
||||
:columns: 2
|
||||
|
||||
* **Global Templates**
|
||||
|
||||
* :ref:`JOBTMPL/Parameters`
|
||||
|
||||
* **Unit Tests, Code Coverage, Code Quality, ...**
|
||||
|
||||
* :ref:`JOBTMPL/UnitTesting`
|
||||
* :ref:`JOBTMPL/CodeCoverage`
|
||||
* :ref:`JOBTMPL/StaticTypeChecking`
|
||||
* *code formatting (planned)*
|
||||
* *coding style (planned)*
|
||||
* *code linting (planned)*
|
||||
|
||||
* **Build and Packaging**
|
||||
|
||||
* :ref:`JOBTMPL/Package`
|
||||
|
||||
* **Documentation**
|
||||
|
||||
* :ref:`JOBTMPL/VerifyDocumentation`
|
||||
* :ref:`JOBTMPL/BuildTheDocs`
|
||||
|
||||
* **Releasing, Publishing**
|
||||
|
||||
* :ref:`JOBTMPL/GitHubReleasePage`
|
||||
* :ref:`JOBTMPL/PyPI`
|
||||
* :ref:`JOBTMPL/PublishTestResults`
|
||||
* :ref:`JOBTMPL/PublishToGitHubPages`
|
||||
|
||||
* **Cleanups**
|
||||
|
||||
* :ref:`JOBTMPL/ArtifactCleanup`
|
||||
|
||||
.. _JOBTMPL/Instantiation:
|
||||
.. index::
|
||||
single: GitHub Action Reusable Workflow; Instantiation
|
||||
|
||||
Instantiation
|
||||
*************
|
||||
|
||||
When instantiating a template, a ``jobs:<Name>:uses`` is used to refer to a template file. Unfortunately, besides the
|
||||
GitHub SLUG (*<Organization>/<Repository>*), also the full path to the template needs to be gives, but still it can't be
|
||||
outside of ``.github/workflows`` to create a cleaner repository structure. Finally, the path contains a branch name
|
||||
postfixed by ``@<branch>`` (tags are still not supported by GitHub Actions). A ``jobs:<Name>:with:`` section can be used
|
||||
to handover input parameters to the template.
|
||||
GitHub SLUG (*<Organization>/<Repository>*), also the full path to the template needs to be gives. Unfortunately, it
|
||||
can't be outside of the ``.github/workflows`` directory creating a cleaner repository structure. Finally, the path
|
||||
contains a branch name postfixed by ``@<branch>`` (tags are still not supported by GitHub Actions). Repositories usually
|
||||
offer a ``@v2``/``@r2`` syntax for refering to the second version/revision.
|
||||
|
||||
Allmost all templates are generic and offer lots of configuration options. For handing over input parameters, a
|
||||
``jobs:<Name>:with:`` node with a dictionary can be used. Additionally, some templates might require secrets, which
|
||||
are passed from GitHub's ``secrets`` context to the template by using a ``jobs:<Name>:secrets:`` node.
|
||||
|
||||
Some templates might provide output parameters, which can be used in dependent jobs by setting a job dependency using
|
||||
``jobs:<Name>:needs:``. The output parameter can be retrieved by accessing the ``needs`` context.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
name: Pipeline
|
||||
|
||||
on:
|
||||
push:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
# Every Friday at 22:00 - rerun pipeline to check for dependency-based issues
|
||||
- cron: '0 22 * * 5'
|
||||
|
||||
jobs:
|
||||
<InstanceName>:
|
||||
uses: <GitHubOrganization>/<Repository>/.github/workflows/<Template>.yml@v0
|
||||
uses: <GitHubOrganization>/<Repository>/.github/workflows/<Template>.yml@r6
|
||||
with:
|
||||
<Param1>: <Value>
|
||||
<Param1>: <Value1>
|
||||
<Param2>: <Value2>
|
||||
secrets:
|
||||
<Secret1>: ${{ secrets.<SecretVariable1> }}
|
||||
<Secret2>: ${{ secrets.<SecretVariable2> }}
|
||||
|
||||
<OtherInstance>:
|
||||
needs:
|
||||
- <InstanceName>
|
||||
...
|
||||
with:
|
||||
<Param1>: ${{ needs.<InstanceName>.outputs.<Output1> }}
|
||||
|
||||
|
||||
.. _JOBTMPL/CommonParameters:
|
||||
.. index::
|
||||
single: GitHub Action Reusable Workflow; Common Parameters
|
||||
|
||||
Common Parameters
|
||||
*****************
|
||||
|
||||
All jobs specified in the templates are executed in
|
||||
`images provided by GitHub Actions <https://github.com/actions/runner-images?tab=readme-ov-file#available-images>`__.
|
||||
Except for platform specific jobs (e.g., unit testing on macOS, Ubuntu, Windows Server, ...) allmost all other jobs use
|
||||
an Ubuntu image. This image can be configured by the job template input parameter :ref:`JOBTMPL/Common/Input/ubuntu_image`.
|
||||
Similarly, many jobs rely on Python scripting and therefore need a Python version, which can be configured via
|
||||
:ref:`JOBTMPL/Common/Input/python_version`.
|
||||
|
||||
.. _JOBTMPL/Common/Input/ubuntu_image:
|
||||
|
||||
ubuntu_image
|
||||
============
|
||||
|
||||
:Type: string
|
||||
:Required: usually no
|
||||
:Default Value: ``'ubuntu-24.04'``
|
||||
:Possible Values: See `actions/runner-images - Available Images <https://github.com/actions/runner-images?tab=readme-ov-file#available-images>`__
|
||||
for available Ubuntu image versions.
|
||||
:Description: Name of the Ubuntu image used to run a job.
|
||||
|
||||
|
||||
.. _JOBTMPL/Common/Input/ubuntu_image_version:
|
||||
|
||||
.. include:: _ubuntu_image_version.rst
|
||||
|
||||
|
||||
.. _JOBTMPL/Common/Input/python_version:
|
||||
|
||||
.. include:: _python_version.rst
|
||||
|
||||
88
doc/_static/css/override.css
vendored
@@ -1,4 +1,23 @@
|
||||
/* theme overrides */
|
||||
/*
|
||||
Theme overrides for ReadTheDocs Theme by Patrick Lehmann
|
||||
*/
|
||||
|
||||
/* General overrides */
|
||||
html {
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
footer {
|
||||
font-size: 95%;
|
||||
text-align: center
|
||||
}
|
||||
|
||||
footer p {
|
||||
margin-bottom: 0px /* 12px */;
|
||||
font-size: 95%
|
||||
}
|
||||
|
||||
/* Headline */
|
||||
.rst-content h1,
|
||||
.rst-content h2 {
|
||||
margin-top: 24px;
|
||||
@@ -14,34 +33,10 @@
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
.rst-content p {
|
||||
margin-bottom: 6px
|
||||
}
|
||||
|
||||
/* general overrides */
|
||||
html {
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
footer {
|
||||
font-size: 95%;
|
||||
text-align: center
|
||||
}
|
||||
|
||||
footer p {
|
||||
margin-bottom: 0px /* 12px */;
|
||||
font-size: 95%
|
||||
}
|
||||
|
||||
section > p,
|
||||
.section p,
|
||||
.simple li {
|
||||
text-align: justify
|
||||
}
|
||||
|
||||
.rst-content .topic-title {
|
||||
font-size: larger;
|
||||
font-weight: 700;
|
||||
text-decoration: underline;
|
||||
margin-top: 18px;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
@@ -53,6 +48,31 @@ section > p,
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
/* Paragraphs */
|
||||
.rst-content p {
|
||||
margin-bottom: 6px
|
||||
}
|
||||
|
||||
section > p,
|
||||
.section p,
|
||||
.simple li {
|
||||
text-align: justify
|
||||
}
|
||||
|
||||
/* Field lists*/
|
||||
/* last paragraph in a field list*/
|
||||
dl.field-list > dd > p:last-of-type {
|
||||
margin-bottom: 6px /* 12px */
|
||||
}
|
||||
/* Nested field lists */
|
||||
dl.field-list > dd > dl.field-list.simple {
|
||||
margin-bottom: 0px /* 24px */
|
||||
}
|
||||
/* code-block within field list */
|
||||
dl.field-list > dd > div:has(div.highlight) {
|
||||
margin-bottom: 0px /* 24px */
|
||||
}
|
||||
|
||||
/* wyrm overrides */
|
||||
.wy-menu-vertical header,
|
||||
.wy-menu-vertical p.caption {
|
||||
@@ -65,8 +85,6 @@ section > p,
|
||||
.wy-side-nav-search {
|
||||
margin-bottom: 0 /* .809em */;
|
||||
background-color: #333333 /* #2980b9 */;
|
||||
/* BTD: */
|
||||
/*color: #fcfcfc*/
|
||||
}
|
||||
|
||||
.wy-side-nav-search input[type=text] {
|
||||
@@ -74,15 +92,11 @@ section > p,
|
||||
}
|
||||
|
||||
.wy-side-nav-search .wy-dropdown > a, .wy-side-nav-search > a {
|
||||
/* BTD: */
|
||||
/*color: #fcfcfc;*/
|
||||
margin-bottom: 0.404em /* .809em */;
|
||||
}
|
||||
|
||||
.wy-side-nav-search > div.version {
|
||||
margin: 0 0 6px 0;
|
||||
/* BTD: */
|
||||
/*margin-top: -.4045em;*/
|
||||
}
|
||||
|
||||
.wy-nav .wy-menu-vertical a:hover {
|
||||
@@ -97,7 +111,7 @@ section > p,
|
||||
background: #333333 /* #2980b9 */;
|
||||
}
|
||||
|
||||
/* Sphinx Design */
|
||||
/* Theme overrides for Sphinx Design by Patrick Lehmann */
|
||||
.sd-tab-set {
|
||||
margin: 0
|
||||
}
|
||||
@@ -113,3 +127,11 @@ section > p,
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
.sd-container-fluid > .sd-row > .sd-col > p.rubric {
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
.sd-container-fluid > .sd-row > .sd-col > ul.simple {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
BIN
doc/_static/pyTooling-Actions-ArtifactCleanup.png
vendored
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
doc/_static/pyTooling-Actions-CheckDocumentation.png
vendored
Normal file
|
After Width: | Height: | Size: 86 KiB |
BIN
doc/_static/pyTooling-Actions-CompletePipeline.png
vendored
Normal file
|
After Width: | Height: | Size: 280 KiB |
BIN
doc/_static/pyTooling-Actions-ExtractConfiguration.png
vendored
Normal file
|
After Width: | Height: | Size: 152 KiB |
BIN
doc/_static/pyTooling-Actions-InstallPackage.png
vendored
Normal file
|
After Width: | Height: | Size: 68 KiB |
BIN
doc/_static/pyTooling-Actions-IntermediateCleanup.png
vendored
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
doc/_static/pyTooling-Actions-Package.png
vendored
Normal file
|
After Width: | Height: | Size: 92 KiB |
BIN
doc/_static/pyTooling-Actions-Parameters.png
vendored
Normal file
|
After Width: | Height: | Size: 631 KiB |
BIN
doc/_static/pyTooling-Actions-PrepareJob.png
vendored
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
doc/_static/pyTooling-Actions-PublishCoverageResults.png
vendored
Normal file
|
After Width: | Height: | Size: 151 KiB |
BIN
doc/_static/pyTooling-Actions-PublishOnPyPI.png
vendored
Normal file
|
After Width: | Height: | Size: 101 KiB |
BIN
doc/_static/pyTooling-Actions-PublishReleaseNotes.png
vendored
Normal file
|
After Width: | Height: | Size: 99 KiB |
BIN
doc/_static/pyTooling-Actions-PublishTestResults-Dorny.png
vendored
Normal file
|
After Width: | Height: | Size: 81 KiB |
BIN
doc/_static/pyTooling-Actions-PublishTestResults.png
vendored
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
doc/_static/pyTooling-Actions-PublishToGitHubPages.png
vendored
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
doc/_static/pyTooling-Actions-SimplePackage-Jobs.png
vendored
Normal file
|
After Width: | Height: | Size: 189 KiB |
BIN
doc/_static/pyTooling-Actions-SimplePackage.png
vendored
|
Before Width: | Height: | Size: 555 KiB After Width: | Height: | Size: 146 KiB |
BIN
doc/_static/pyTooling-Actions-SphinxDocumentation.png
vendored
Normal file
|
After Width: | Height: | Size: 150 KiB |
BIN
doc/_static/pyTooling-Actions-StaticTypeCheck.png
vendored
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
doc/_static/pyTooling-Actions-TagReleaseCommit.png
vendored
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
doc/_static/pyTooling-Actions-UnitTesting.png
vendored
Normal file
|
After Width: | Height: | Size: 153 KiB |
69
doc/conf.py
@@ -1,7 +1,7 @@
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
from sys import path as sys_path
|
||||
from sys import path as sys_path
|
||||
from os.path import abspath
|
||||
from pathlib import Path
|
||||
|
||||
@@ -12,7 +12,7 @@ from pyTooling.Packaging import extractVersionInformation
|
||||
# ==============================================================================
|
||||
githubNamespace = "pyTooling"
|
||||
githubProject = "Actions"
|
||||
pythonProject = "pyDummy"
|
||||
pythonProject = "myPackage"
|
||||
directoryName = pythonProject.replace('.', '/')
|
||||
|
||||
|
||||
@@ -35,6 +35,7 @@ sys_path.insert(0, abspath(f"../{directoryName}"))
|
||||
packageInformationFile = Path(f"../{directoryName}/__init__.py")
|
||||
versionInformation = extractVersionInformation(packageInformationFile)
|
||||
|
||||
project = f"{githubNamespace}/{githubProject}"
|
||||
author = versionInformation.Author
|
||||
copyright = versionInformation.Copyright
|
||||
version = ".".join(versionInformation.Version.split(".")[:2]) # e.g. 2.3 The short X.Y version.
|
||||
@@ -80,6 +81,7 @@ except Exception as ex:
|
||||
# ==============================================================================
|
||||
# Options for HTML output
|
||||
# ==============================================================================
|
||||
html_title = f"{githubNamespace}/{githubProject} v{versionInformation.Version}"
|
||||
html_theme = "sphinx_rtd_theme"
|
||||
html_theme_options = {
|
||||
"logo_only": True,
|
||||
@@ -190,7 +192,8 @@ extensions = [
|
||||
# Sphinx.Ext.InterSphinx
|
||||
# ==============================================================================
|
||||
intersphinx_mapping = {
|
||||
"python": ("https://docs.python.org/3", None),
|
||||
"python": ("https://docs.python.org/3", None),
|
||||
"pyEDAARpt": ("https://edaa-org.github.io/pyEDAA.Reports", None),
|
||||
}
|
||||
|
||||
|
||||
@@ -214,11 +217,15 @@ autodoc_typehints = "both"
|
||||
# Sphinx.Ext.ExtLinks
|
||||
# ==============================================================================
|
||||
extlinks = {
|
||||
"gh": (f"https://GitHub.com/%s", "gh:%s"),
|
||||
"ghissue": (f"https://GitHub.com/{githubNamespace}/{githubProject}/issues/%s", "issue #%s"),
|
||||
"ghpull": (f"https://GitHub.com/{githubNamespace}/{githubProject}/pull/%s", "pull request #%s"),
|
||||
"ghsrc": (f"https://GitHub.com/{githubNamespace}/{githubProject}/blob/main/%s", None),
|
||||
"wiki": (f"https://en.wikipedia.org/wiki/%s", None),
|
||||
"gh": (f"https://GitHub.com/%s", "GitHub: %s"),
|
||||
"ghissue": (f"https://GitHub.com/{githubNamespace}/{githubProject}/issues/%s", "issue #%s"),
|
||||
"ghpull": (f"https://GitHub.com/{githubNamespace}/{githubProject}/pull/%s", "pull request #%s"),
|
||||
"ghsrc": (f"https://GitHub.com/{githubNamespace}/{githubProject}/blob/main/%s", None),
|
||||
"wiki": (f"https://en.wikipedia.org/wiki/%s", None),
|
||||
"pypi": (f"https://pypi.org/project/%s/", "PyPI: %s"),
|
||||
"rtd": (f"https://%s.readthedocs.io/", "RTD: %s"),
|
||||
"ucrt64": (f"https://packages.msys2.org/packages/mingw-w64-ucrt-x86_64-%s", "UCRT64: %s"),
|
||||
"dockerhub": (f"https://hub.docker.com/r/%s", "Docker Hub: %s"),
|
||||
}
|
||||
|
||||
|
||||
@@ -260,28 +267,28 @@ todo_link_only = True
|
||||
# ==============================================================================
|
||||
# sphinx-reports
|
||||
# ==============================================================================
|
||||
# report_unittest_testsuites = {
|
||||
# "src": {
|
||||
# "name": f"{pythonProject}",
|
||||
# "xml_report": "../report/unit/unittest.xml",
|
||||
# }
|
||||
# }
|
||||
# report_codecov_packages = {
|
||||
# "src": {
|
||||
# "name": f"{pythonProject}",
|
||||
# "json_report": "../report/coverage/coverage.json",
|
||||
# "fail_below": 80,
|
||||
# "levels": "default"
|
||||
# }
|
||||
# }
|
||||
# report_doccov_packages = {
|
||||
# "src": {
|
||||
# "name": f"{pythonProject}",
|
||||
# "directory": f"../{directoryName}",
|
||||
# "fail_below": 80,
|
||||
# "levels": "default"
|
||||
# }
|
||||
# }
|
||||
report_unittest_testsuites = {
|
||||
"src": {
|
||||
"name": f"{pythonProject}",
|
||||
"xml_report": "../report/unit/unittest.xml",
|
||||
}
|
||||
}
|
||||
report_codecov_packages = {
|
||||
"src": {
|
||||
"name": f"{pythonProject}",
|
||||
"json_report": "../report/coverage/coverage.json",
|
||||
"fail_below": 80,
|
||||
"levels": "default"
|
||||
}
|
||||
}
|
||||
report_doccov_packages = {
|
||||
"src": {
|
||||
"name": f"{pythonProject}",
|
||||
"directory": f"../{directoryName}",
|
||||
"fail_below": 80,
|
||||
"levels": "default"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# ==============================================================================
|
||||
@@ -295,7 +302,7 @@ todo_link_only = True
|
||||
# ==============================================================================
|
||||
autoapi_modules = {
|
||||
f"{pythonProject}": {
|
||||
"template": "package",
|
||||
"template": "module",
|
||||
"output": pythonProject,
|
||||
"override": True
|
||||
}
|
||||
|
||||
242
doc/index.rst
@@ -35,65 +35,191 @@ However, Python being equally popular and capable, usage of JS/TS might be bypas
|
||||
This repository gathers reusable CI tooling for testing, packaging and distributing Python projects and documentation.
|
||||
|
||||
|
||||
GitHub Actions
|
||||
**************
|
||||
|
||||
.. include:: Action/Actions.rst
|
||||
|
||||
|
||||
GitHub Action Job Templates
|
||||
***************************
|
||||
|
||||
The following list categorizes all pre-defined job templates, which can be instantiated in a pipeline (GitHub Action
|
||||
Workflow):
|
||||
|
||||
.. hlist::
|
||||
:columns: 2
|
||||
|
||||
* **Global Templates**
|
||||
|
||||
* :ref:`JOBTMPL/Parameters`
|
||||
|
||||
* **Unit Tests, Code Coverage, Code Quality, ...**
|
||||
|
||||
* :ref:`JOBTMPL/UnitTesting`
|
||||
* :ref:`JOBTMPL/CodeCoverage`
|
||||
* :ref:`JOBTMPL/StaticTypeChecking`
|
||||
* *code formatting (planned)*
|
||||
* *coding style (planned)*
|
||||
* *code linting (planned)*
|
||||
|
||||
* **Build and Packaging**
|
||||
|
||||
* :ref:`JOBTMPL/Package`
|
||||
|
||||
* **Documentation**
|
||||
|
||||
* :ref:`JOBTMPL/VerifyDocumentation`
|
||||
* :ref:`JOBTMPL/BuildTheDocs`
|
||||
|
||||
* **Releasing, Publishing**
|
||||
|
||||
* :ref:`JOBTMPL/GitHubReleasePage`
|
||||
* :ref:`JOBTMPL/PyPI`
|
||||
* :ref:`JOBTMPL/PublishTestResults`
|
||||
* :ref:`JOBTMPL/PublishToGitHubPages`
|
||||
|
||||
* **Cleanups**
|
||||
|
||||
* :ref:`JOBTMPL/ArtifactCleanup`
|
||||
.. include:: JobTemplate/Templates.rst
|
||||
|
||||
|
||||
Example Pipelines
|
||||
=================
|
||||
|
||||
``ExamplePipeline.yml`` is an example Workflow which uses all of the Reusable Workflows.
|
||||
Python package/tool developers can copy it into their repos, in order to use al the reusable workflows straightaway.
|
||||
Minimal required modifications are the following:
|
||||
.. grid:: 2
|
||||
|
||||
- Set the ``name`` input of job ``Parameters``.
|
||||
- Specify the ``commands`` input of job ``StaticTypeCheck``.
|
||||
.. grid-item::
|
||||
:columns: 6
|
||||
|
||||
``ExamplePipeline.yml`` is an example Workflow which uses all of the Reusable Workflows.
|
||||
Python package/tool developers can copy it into their repos, in order to use al the reusable workflows straightaway.
|
||||
Minimal required modifications are the following:
|
||||
|
||||
* Set the ``name`` input of job ``Parameters``.
|
||||
* Specify the ``commands`` input of job ``StaticTypeCheck``.
|
||||
|
||||
.. rubric:: Behavior
|
||||
|
||||
.. include:: JobTemplate/AllInOne/_Behavior.rst
|
||||
|
||||
.. grid-item::
|
||||
:columns: 6
|
||||
|
||||
.. tab-set::
|
||||
|
||||
.. tab-item:: Directory Structure
|
||||
|
||||
.. code-block::
|
||||
|
||||
<RepositoryRoot>/
|
||||
.github/
|
||||
workflows/
|
||||
Pipeline.yml
|
||||
dist/
|
||||
requirements.txt
|
||||
docs/
|
||||
conf.py
|
||||
index.rst
|
||||
requirements.txt
|
||||
myPackage/
|
||||
ModuleA.py
|
||||
__init__.py
|
||||
py.typed
|
||||
tests/
|
||||
unit/
|
||||
TestA.py
|
||||
requirements.txt
|
||||
requirements.txt
|
||||
.editorconfig
|
||||
.gitignore
|
||||
LICENSE.md
|
||||
pyproject.toml
|
||||
README.md
|
||||
requirements.txt
|
||||
setup.py
|
||||
|
||||
.. tab-item:: Simple Package
|
||||
:selected:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
name: Pipeline
|
||||
|
||||
on:
|
||||
push:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
# Every Friday at 22:00 - rerun pipeline to check for dependency-based issues
|
||||
- cron: '0 22 * * 5'
|
||||
|
||||
jobs:
|
||||
SimplePackage:
|
||||
uses: pyTooling/Actions/.github/workflows/CompletePipeline.yml@r6
|
||||
with:
|
||||
package_name: myPackage
|
||||
codecov: true
|
||||
codacy: true
|
||||
dorny: true
|
||||
secrets:
|
||||
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
|
||||
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||
CODACY_TOKEN: ${{ secrets.CODACY_TOKEN }}
|
||||
|
||||
.. tab-item:: Namespace Package
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
name: Pipeline
|
||||
|
||||
on:
|
||||
push:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
# Every Friday at 22:00 - rerun pipeline to check for dependency-based issues
|
||||
- cron: '0 22 * * 5'
|
||||
|
||||
jobs:
|
||||
NamespacePackage:
|
||||
uses: pyTooling/Actions/.github/workflows/CompletePipeline.yml@r6
|
||||
with:
|
||||
package_namespace: myFramework
|
||||
package_name: Extension
|
||||
codecov: true
|
||||
codacy: true
|
||||
dorny: true
|
||||
secrets:
|
||||
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
|
||||
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||
CODACY_TOKEN: ${{ secrets.CODACY_TOKEN }}
|
||||
|
||||
.. tab-item:: :file:`pyproject.toml`
|
||||
|
||||
.. code-block:: toml
|
||||
|
||||
[build-system]
|
||||
requires = ["setuptools >= 80.0", "wheel ~= 0.45", "pyTooling ~= 8.5"]
|
||||
build-backend = "setuptools.build_meta"
|
||||
|
||||
[tool.mypy]
|
||||
packages = ["myPackage"]
|
||||
python_version = "3.13"
|
||||
strict = true
|
||||
pretty = true
|
||||
show_error_context = true
|
||||
show_error_codes = true
|
||||
namespace_packages = true
|
||||
html_report = "report/typing"
|
||||
|
||||
[tool.pytest]
|
||||
junit_xml = "report/unit/UnittestReportSummary.xml"
|
||||
|
||||
[tool.pyedaa-reports]
|
||||
junit_xml = "report/unit/unittest.xml"
|
||||
|
||||
[tool.pytest.ini_options]
|
||||
addopts = "--tb=native"
|
||||
python_files = "*"
|
||||
python_functions = "test_*"
|
||||
filterwarnings = ["error::DeprecationWarning", "error::PendingDeprecationWarning"]
|
||||
junit_logging = "all"
|
||||
|
||||
[tool.interrogate]
|
||||
color = true
|
||||
verbose = 1 # possible values: 0 (minimal output), 1 (-v), 2 (-vv)
|
||||
fail-under = 59
|
||||
ignore-setters = true
|
||||
|
||||
[tool.coverage.run]
|
||||
branch = true
|
||||
relative_files = true
|
||||
omit = ["*site-packages*", "setup.py", "tests/unit/*"]
|
||||
|
||||
[tool.coverage.report]
|
||||
skip_covered = false
|
||||
skip_empty = true
|
||||
exclude_lines = ["pragma: no cover", "raise NotImplementedError"]
|
||||
omit = ["tests/*"]
|
||||
|
||||
[tool.coverage.xml]
|
||||
output = "report/coverage/coverage.xml"
|
||||
|
||||
[tool.coverage.json]
|
||||
output = "report/coverage/coverage.json"
|
||||
|
||||
[tool.coverage.html]
|
||||
directory = "report/coverage/html"
|
||||
title="Code Coverage of myPackage"
|
||||
|
||||
|
||||
GitHub Actions
|
||||
**************
|
||||
.. image:: _static/pyTooling-Actions-SimplePackage.png
|
||||
|
||||
* :ref:`ACTION/Releaser`
|
||||
* :ref:`ACTION/WithPostStep`
|
||||
|
||||
References
|
||||
**********
|
||||
@@ -155,18 +281,16 @@ License
|
||||
:hidden:
|
||||
|
||||
JobTemplate/index
|
||||
JobTemplate/Parameters
|
||||
JobTemplate/CoverageCollection
|
||||
JobTemplate/UnitTesting
|
||||
JobTemplate/StaticTypeCheck
|
||||
JobTemplate/PublishTestResults
|
||||
JobTemplate/Package
|
||||
JobTemplate/PublishOnPyPI
|
||||
JobTemplate/VerifyDocs
|
||||
JobTemplate/BuildTheDocs
|
||||
JobTemplate/PublishToGitHubPages
|
||||
JobTemplate/Release
|
||||
JobTemplate/ArtifactCleanUp
|
||||
JobTemplate/AllInOne/index
|
||||
JobTemplate/Setup/index
|
||||
JobTemplate/Testing/index
|
||||
JobTemplate/Quality/index
|
||||
JobTemplate/Documentation/index
|
||||
JobTemplate/Package/index
|
||||
JobTemplate/Publish/index
|
||||
JobTemplate/Release/index
|
||||
JobTemplate/Cleanup/index
|
||||
JobTemplate/Deprecated/index
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
@@ -176,9 +300,10 @@ License
|
||||
:caption: pyDummy Example
|
||||
:hidden:
|
||||
|
||||
pyDummy/pyDummy
|
||||
Python Class Reference <myPackage/myPackage>
|
||||
unittests/index
|
||||
coverage/index
|
||||
CodeCoverage
|
||||
Doc. Coverage Report <DocCoverage>
|
||||
Static Type Check Report ➚ <typing/index>
|
||||
|
||||
@@ -192,4 +317,7 @@ License
|
||||
|
||||
License
|
||||
Doc-License
|
||||
Glossary
|
||||
genindex
|
||||
Python Module Index <modindex>
|
||||
TODO
|
||||
|
||||
@@ -54,6 +54,14 @@
|
||||
.. role:: addition
|
||||
:class: colorgreen
|
||||
|
||||
.. role:: bashcode(code)
|
||||
:language: bash
|
||||
:class: highlight
|
||||
|
||||
.. role:: pycode(code)
|
||||
:language: python
|
||||
:class: highlight
|
||||
|
||||
.. role:: jsoncode(code)
|
||||
:language: json
|
||||
:class: highlight
|
||||
|
||||