From 780b6f466cd5b778a8668f47a08c9475ade3e257 Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Thu, 20 Nov 2025 21:18:57 +0100 Subject: [PATCH 01/15] Bumped version of actions/checkout to @v6. --- .github/workflows/ApplicationTesting.yml | 2 +- .github/workflows/BuildTheDocs.yml | 2 +- .github/workflows/CheckCodeQuality.yml | 6 +++--- .github/workflows/CheckDocumentation.yml | 2 +- .github/workflows/CompletePipeline.yml | 2 +- .github/workflows/CoverageCollection.yml | 2 +- .github/workflows/ExtractConfiguration.yml | 2 +- .github/workflows/NightlyRelease.yml | 2 +- .github/workflows/Package.yml | 2 +- .github/workflows/Parameters.yml | 2 +- .github/workflows/PrepareJob.yml | 2 +- .github/workflows/PublishCoverageResults.yml | 2 +- .github/workflows/PublishReleaseNotes.yml | 2 +- .github/workflows/PublishTestResults.yml | 2 +- .github/workflows/PublishToGitHubPages.yml | 2 +- .github/workflows/SphinxDocumentation.yml | 4 ++-- .github/workflows/StaticTypeCheck.yml | 2 +- .github/workflows/UnitTesting.yml | 2 +- .github/workflows/VerifyDocs.yml | 2 +- .github/workflows/_Checking_Parameters.yml | 14 +++++++------- 20 files changed, 29 insertions(+), 29 deletions(-) diff --git a/.github/workflows/ApplicationTesting.yml b/.github/workflows/ApplicationTesting.yml index ec8d853..64984b3 100644 --- a/.github/workflows/ApplicationTesting.yml +++ b/.github/workflows/ApplicationTesting.yml @@ -86,7 +86,7 @@ jobs: steps: - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: ๐Ÿ“ฅ Download artifacts '${{ inputs.wheel }}' from 'Package' job uses: pyTooling/download-artifact@v6 diff --git a/.github/workflows/BuildTheDocs.yml b/.github/workflows/BuildTheDocs.yml index 3e4f6f6..91c72dc 100644 --- a/.github/workflows/BuildTheDocs.yml +++ b/.github/workflows/BuildTheDocs.yml @@ -41,7 +41,7 @@ jobs: run: printf "::warning title=%s::%s\n" "Deprecated" "'BuildTheDocs.yml' template is deprecated. Please switch to 'SphinxDocumentation.yml'. See https://pytooling.github.io/Actions/JobTemplate/Documentation/SphinxDocumentation.html" - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: ๐Ÿ›ณ๏ธ Build documentation uses: buildthedocs/btd@v0 diff --git a/.github/workflows/CheckCodeQuality.yml b/.github/workflows/CheckCodeQuality.yml index 7666fd4..a23e22c 100644 --- a/.github/workflows/CheckCodeQuality.yml +++ b/.github/workflows/CheckCodeQuality.yml @@ -71,7 +71,7 @@ jobs: steps: - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: lfs: true submodules: true @@ -140,7 +140,7 @@ jobs: steps: - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: lfs: true submodules: true @@ -180,7 +180,7 @@ jobs: steps: - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: lfs: true submodules: true diff --git a/.github/workflows/CheckDocumentation.yml b/.github/workflows/CheckDocumentation.yml index 5b71d5e..4df1c76 100644 --- a/.github/workflows/CheckDocumentation.yml +++ b/.github/workflows/CheckDocumentation.yml @@ -50,7 +50,7 @@ jobs: runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}" steps: - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: ๐Ÿ Setup Python ${{ inputs.python_version }} uses: actions/setup-python@v6 diff --git a/.github/workflows/CompletePipeline.yml b/.github/workflows/CompletePipeline.yml index eeca265..976d2f0 100644 --- a/.github/workflows/CompletePipeline.yml +++ b/.github/workflows/CompletePipeline.yml @@ -188,7 +188,7 @@ jobs: code_version: ${{ steps.extract.outputs.code_version }} steps: - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: # The command 'git describe' (used for version) needs the history. fetch-depth: 0 diff --git a/.github/workflows/CoverageCollection.yml b/.github/workflows/CoverageCollection.yml index c0185d8..6c43403 100644 --- a/.github/workflows/CoverageCollection.yml +++ b/.github/workflows/CoverageCollection.yml @@ -75,7 +75,7 @@ jobs: run: printf "::warning title=%s::%s\n" "Deprecated" "'CoverageCollection.yml' template is deprecated. Please switch to 'PublishReleaseNotes.yml'. See https://pytooling.github.io/Actions/JobTemplate/Testing/UnitTesting.html" - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: lfs: true submodules: true diff --git a/.github/workflows/ExtractConfiguration.yml b/.github/workflows/ExtractConfiguration.yml index d84bfc5..8aa8581 100644 --- a/.github/workflows/ExtractConfiguration.yml +++ b/.github/workflows/ExtractConfiguration.yml @@ -82,7 +82,7 @@ jobs: steps: - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: ๐Ÿ Setup Python ${{ inputs.python_version }} uses: actions/setup-python@v6 diff --git a/.github/workflows/NightlyRelease.yml b/.github/workflows/NightlyRelease.yml index c19829e..cee735f 100644 --- a/.github/workflows/NightlyRelease.yml +++ b/.github/workflows/NightlyRelease.yml @@ -104,7 +104,7 @@ jobs: run: printf "::warning title=%s::%s\n" "NightlyRelease" "'NightlyRelease.yml' template is deprecated. Please switch to 'PublishReleaseNotes.yml'. See https://pytooling.github.io/Actions/JobTemplate/Release/PublishReleaseNotes.html" - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: # The command 'git describe' (used for version) needs the history. fetch-depth: 0 diff --git a/.github/workflows/Package.yml b/.github/workflows/Package.yml index ae97139..96cf4e5 100644 --- a/.github/workflows/Package.yml +++ b/.github/workflows/Package.yml @@ -53,7 +53,7 @@ jobs: artifact: ${{ inputs.artifact }} steps: - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: lfs: true submodules: true diff --git a/.github/workflows/Parameters.yml b/.github/workflows/Parameters.yml index 9227533..fd523dd 100644 --- a/.github/workflows/Parameters.yml +++ b/.github/workflows/Parameters.yml @@ -154,7 +154,7 @@ jobs: steps: - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: # The command 'git describe' (used for version) needs the history. fetch-depth: 0 diff --git a/.github/workflows/PrepareJob.yml b/.github/workflows/PrepareJob.yml index 517a0f0..1ebad0a 100644 --- a/.github/workflows/PrepareJob.yml +++ b/.github/workflows/PrepareJob.yml @@ -131,7 +131,7 @@ jobs: steps: - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: # The command 'git describe' (used for version) needs the history. fetch-depth: 0 diff --git a/.github/workflows/PublishCoverageResults.yml b/.github/workflows/PublishCoverageResults.yml index 36efcd2..6ca47e1 100644 --- a/.github/workflows/PublishCoverageResults.yml +++ b/.github/workflows/PublishCoverageResults.yml @@ -109,7 +109,7 @@ jobs: steps: - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: lfs: true submodules: true diff --git a/.github/workflows/PublishReleaseNotes.yml b/.github/workflows/PublishReleaseNotes.yml index 36c090a..6377976 100644 --- a/.github/workflows/PublishReleaseNotes.yml +++ b/.github/workflows/PublishReleaseNotes.yml @@ -132,7 +132,7 @@ jobs: steps: - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: # The command 'git describe' (used for version) needs the history. fetch-depth: 0 diff --git a/.github/workflows/PublishTestResults.yml b/.github/workflows/PublishTestResults.yml index 57b0c77..e968c38 100644 --- a/.github/workflows/PublishTestResults.yml +++ b/.github/workflows/PublishTestResults.yml @@ -102,7 +102,7 @@ jobs: steps: - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: ๐Ÿ“ฅ Download Artifacts uses: pyTooling/download-artifact@v6 diff --git a/.github/workflows/PublishToGitHubPages.yml b/.github/workflows/PublishToGitHubPages.yml index 62ec0da..882816d 100644 --- a/.github/workflows/PublishToGitHubPages.yml +++ b/.github/workflows/PublishToGitHubPages.yml @@ -53,7 +53,7 @@ jobs: steps: - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: ๐Ÿ“ฅ Download artifacts '${{ inputs.doc }}' from 'SphinxDocumentation' job uses: pyTooling/download-artifact@v6 diff --git a/.github/workflows/SphinxDocumentation.yml b/.github/workflows/SphinxDocumentation.yml index ce0312f..18515da 100644 --- a/.github/workflows/SphinxDocumentation.yml +++ b/.github/workflows/SphinxDocumentation.yml @@ -86,7 +86,7 @@ jobs: steps: - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: lfs: true submodules: true @@ -145,7 +145,7 @@ jobs: steps: - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: lfs: true submodules: true diff --git a/.github/workflows/StaticTypeCheck.yml b/.github/workflows/StaticTypeCheck.yml index 1a68b31..7aa1a4c 100644 --- a/.github/workflows/StaticTypeCheck.yml +++ b/.github/workflows/StaticTypeCheck.yml @@ -94,7 +94,7 @@ jobs: steps: - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: ๐Ÿ Setup Python ${{ inputs.python_version }} uses: actions/setup-python@v6 diff --git a/.github/workflows/UnitTesting.yml b/.github/workflows/UnitTesting.yml index a865fe5..331dcb2 100644 --- a/.github/workflows/UnitTesting.yml +++ b/.github/workflows/UnitTesting.yml @@ -181,7 +181,7 @@ jobs: steps: - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: lfs: true submodules: true diff --git a/.github/workflows/VerifyDocs.yml b/.github/workflows/VerifyDocs.yml index 4e89d0e..9357064 100644 --- a/.github/workflows/VerifyDocs.yml +++ b/.github/workflows/VerifyDocs.yml @@ -44,7 +44,7 @@ jobs: steps: - name: โฌ Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: ๐Ÿ Setup Python uses: actions/setup-python@v6 diff --git a/.github/workflows/_Checking_Parameters.yml b/.github/workflows/_Checking_Parameters.yml index e180e58..f230ee9 100644 --- a/.github/workflows/_Checking_Parameters.yml +++ b/.github/workflows/_Checking_Parameters.yml @@ -64,7 +64,7 @@ jobs: shell: python steps: - name: Checkout repository to access local Action - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Checking job matrix from 'Params_Default' uses: ./.github/actions/CheckJobMatrix @@ -92,7 +92,7 @@ jobs: shell: python steps: - name: Checkout repository to access local Action - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Checking job matrix from 'Params_PythonVersions' uses: ./.github/actions/CheckJobMatrix @@ -114,7 +114,7 @@ jobs: shell: python steps: - name: Checkout repository to access local Action - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Checking job matrix from 'Params_Systems' uses: ./.github/actions/CheckJobMatrix @@ -136,7 +136,7 @@ jobs: shell: python steps: - name: Checkout repository to access local Action - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Checking job matrix from 'Params_Include' uses: ./.github/actions/CheckJobMatrix @@ -158,7 +158,7 @@ jobs: shell: python steps: - name: Checkout repository to access local Action - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Checking job matrix from 'Params_Exclude' uses: ./.github/actions/CheckJobMatrix @@ -180,7 +180,7 @@ jobs: shell: python steps: - name: Checkout repository to access local Action - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Checking job matrix from 'Params_Disable' uses: ./.github/actions/CheckJobMatrix @@ -202,7 +202,7 @@ jobs: shell: python steps: - name: Checkout repository to access local Action - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Checking job matrix from 'Params_All' uses: ./.github/actions/CheckJobMatrix From 15933832543fe3273929855289bbcc81ca813570 Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Sat, 13 Dec 2025 22:44:13 +0100 Subject: [PATCH 02/15] Updated actions/upload-artifact@v5 to actions/upload-artifact@v6. --- .github/workflows/ApplicationTesting.yml | 2 +- .github/workflows/BuildTheDocs.yml | 2 +- .github/workflows/CoverageCollection.yml | 2 +- .github/workflows/LaTeXDocumentation.yml | 2 +- .github/workflows/Package.yml | 2 +- .github/workflows/PublishCoverageResults.yml | 8 ++++---- .github/workflows/PublishTestResults.yml | 2 +- .github/workflows/SphinxDocumentation.yml | 4 ++-- .github/workflows/StaticTypeCheck.yml | 6 +++--- .github/workflows/UnitTesting.yml | 12 ++++++------ .github/workflows/_Checking_ArtifactCleanup.yml | 4 ++-- .github/workflows/_Checking_Nightly.yml | 4 ++-- 12 files changed, 25 insertions(+), 25 deletions(-) diff --git a/.github/workflows/ApplicationTesting.yml b/.github/workflows/ApplicationTesting.yml index 64984b3..c6293bc 100644 --- a/.github/workflows/ApplicationTesting.yml +++ b/.github/workflows/ApplicationTesting.yml @@ -262,7 +262,7 @@ jobs: - name: ๐Ÿ“ค Upload 'TestReportSummary.xml' artifact if: inputs.apptest_xml_artifact != '' - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 with: name: ${{ inputs.apptest_xml_artifact }}-${{ matrix.system }}-${{ matrix.runtime }}-${{ matrix.python }} working-directory: report/unit diff --git a/.github/workflows/BuildTheDocs.yml b/.github/workflows/BuildTheDocs.yml index 91c72dc..fcd7981 100644 --- a/.github/workflows/BuildTheDocs.yml +++ b/.github/workflows/BuildTheDocs.yml @@ -49,7 +49,7 @@ jobs: skip-deploy: true - name: ๐Ÿ“ค Upload 'documentation' artifacts - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 if: inputs.artifact != '' with: name: ${{ inputs.artifact }} diff --git a/.github/workflows/CoverageCollection.yml b/.github/workflows/CoverageCollection.yml index 6c43403..35d202f 100644 --- a/.github/workflows/CoverageCollection.yml +++ b/.github/workflows/CoverageCollection.yml @@ -163,7 +163,7 @@ jobs: - name: ๐Ÿ“ค Upload 'Coverage Report' artifact continue-on-error: true - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 with: name: ${{ inputs.artifact }} working-directory: ${{ steps.getVariables.outputs.coverage_report_html_directory }} diff --git a/.github/workflows/LaTeXDocumentation.yml b/.github/workflows/LaTeXDocumentation.yml index cbdd327..36609fc 100644 --- a/.github/workflows/LaTeXDocumentation.yml +++ b/.github/workflows/LaTeXDocumentation.yml @@ -83,7 +83,7 @@ jobs: latexmk -${{ inputs.processor }} "${{ inputs.document }}.tex" - name: ๐Ÿ“ค Upload 'PDF Documentation' artifact - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 if: inputs.pdf_artifact != '' with: name: ${{ inputs.pdf_artifact }} diff --git a/.github/workflows/Package.yml b/.github/workflows/Package.yml index 96cf4e5..d310c04 100644 --- a/.github/workflows/Package.yml +++ b/.github/workflows/Package.yml @@ -106,7 +106,7 @@ jobs: run: python setup.py bdist_wheel - name: ๐Ÿ“ค Upload wheel artifact - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 with: name: ${{ inputs.artifact }} working-directory: dist diff --git a/.github/workflows/PublishCoverageResults.yml b/.github/workflows/PublishCoverageResults.yml index 6ca47e1..c9a311a 100644 --- a/.github/workflows/PublishCoverageResults.yml +++ b/.github/workflows/PublishCoverageResults.yml @@ -156,7 +156,7 @@ jobs: tree -pash ${{ fromJson(inputs.coverage_report_html).directory }} - name: ๐Ÿ“ค Upload 'Coverage SQLite Database' artifact - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 if: inputs.coverage_sqlite_artifact != '' continue-on-error: true with: @@ -166,7 +166,7 @@ jobs: retention-days: 1 - name: ๐Ÿ“ค Upload 'Coverage XML Report' artifact - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 if: inputs.coverage_xml_artifact != '' continue-on-error: true with: @@ -177,7 +177,7 @@ jobs: retention-days: 1 - name: ๐Ÿ“ค Upload 'Coverage JSON Report' artifact - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 if: inputs.coverage_json_artifact != '' continue-on-error: true with: @@ -188,7 +188,7 @@ jobs: retention-days: 1 - name: ๐Ÿ“ค Upload 'Coverage HTML Report' artifact - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 if: inputs.coverage_html_artifact != '' continue-on-error: true with: diff --git a/.github/workflows/PublishTestResults.yml b/.github/workflows/PublishTestResults.yml index e968c38..7f1a2fb 100644 --- a/.github/workflows/PublishTestResults.yml +++ b/.github/workflows/PublishTestResults.yml @@ -156,7 +156,7 @@ jobs: fail_ci_if_error: true - name: ๐Ÿ“ค Upload merged 'JUnit Test Summary' artifact - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 if: inputs.merged_junit_artifact != '' with: name: ${{ inputs.merged_junit_artifact }} diff --git a/.github/workflows/SphinxDocumentation.yml b/.github/workflows/SphinxDocumentation.yml index 18515da..87ee175 100644 --- a/.github/workflows/SphinxDocumentation.yml +++ b/.github/workflows/SphinxDocumentation.yml @@ -129,7 +129,7 @@ jobs: sphinx-build -v -n -b html -d _build/doctrees -j $(nproc) -w _build/html.log . _build/html - name: ๐Ÿ“ค Upload 'HTML Documentation' artifact - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 if: inputs.html_artifact != '' continue-on-error: true with: @@ -272,7 +272,7 @@ jobs: done - name: ๐Ÿ“ค Upload 'LaTeX Documentation' artifact - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 if: inputs.latex_artifact != '' continue-on-error: true with: diff --git a/.github/workflows/StaticTypeCheck.yml b/.github/workflows/StaticTypeCheck.yml index 7aa1a4c..5d5a327 100644 --- a/.github/workflows/StaticTypeCheck.yml +++ b/.github/workflows/StaticTypeCheck.yml @@ -142,7 +142,7 @@ jobs: fi - name: ๐Ÿ“ค Upload '${{ inputs.html_artifact }}' HTML artifact - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 if: ${{ inputs.html_artifact != '' }} continue-on-error: true with: @@ -153,7 +153,7 @@ jobs: retention-days: 1 - name: ๐Ÿ“ค Upload '${{ inputs.junit_artifact }}' JUnit artifact - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 if: ${{ inputs.junit_artifact != '' }} continue-on-error: true with: @@ -164,7 +164,7 @@ jobs: retention-days: 1 - name: ๐Ÿ“ค Upload '${{ inputs.cobertura_artifact }}' Cobertura artifact - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 if: ${{ inputs.cobertura_artifact != '' }} continue-on-error: true with: diff --git a/.github/workflows/UnitTesting.yml b/.github/workflows/UnitTesting.yml index 331dcb2..000f979 100644 --- a/.github/workflows/UnitTesting.yml +++ b/.github/workflows/UnitTesting.yml @@ -421,7 +421,7 @@ jobs: # Upload artifacts - name: ๐Ÿ“ค Upload '${{ fromJson(inputs.unittest_report_xml).filename }}' artifact - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 if: inputs.unittest_xml_artifact != '' continue-on-error: true with: @@ -434,7 +434,7 @@ jobs: # - name: ๐Ÿ“ค Upload 'Unit Tests HTML Report' artifact # if: inputs.unittest_html_artifact != '' # continue-on-error: true -# uses: pyTooling/upload-artifact@v5 +# uses: pyTooling/upload-artifact@v6 # with: # name: ${{ inputs.unittest_html_artifact }}-${{ matrix.system }}-${{ matrix.runtime }}-${{ matrix.python }} # path: ${{ inputs.unittest_report_html_directory }} @@ -444,7 +444,7 @@ jobs: - name: ๐Ÿ“ค Upload 'Coverage SQLite Database' artifact if: inputs.coverage_sqlite_artifact != '' continue-on-error: true - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 with: name: ${{ inputs.coverage_sqlite_artifact }}-${{ matrix.system }}-${{ matrix.runtime }}-${{ matrix.python }} path: .coverage @@ -455,7 +455,7 @@ jobs: - name: ๐Ÿ“ค Upload 'Coverage XML Report' artifact if: inputs.coverage_xml_artifact != '' && steps.convert_xml.outcome == 'success' continue-on-error: true - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 with: name: ${{ inputs.coverage_xml_artifact }}-${{ matrix.system }}-${{ matrix.runtime }}-${{ matrix.python }} working-directory: ${{ fromJson(inputs.coverage_report_xml).directory }} @@ -466,7 +466,7 @@ jobs: - name: ๐Ÿ“ค Upload 'Coverage JSON Report' artifact if: inputs.coverage_json_artifact != '' && steps.convert_json.outcome == 'success' continue-on-error: true - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 with: name: ${{ inputs.coverage_json_artifact }}-${{ matrix.system }}-${{ matrix.runtime }}-${{ matrix.python }} working-directory: ${{ fromJson(inputs.coverage_report_json).directory }} @@ -477,7 +477,7 @@ jobs: - name: ๐Ÿ“ค Upload 'Coverage HTML Report' artifact if: inputs.coverage_html_artifact != '' && steps.convert_html.outcome == 'success' continue-on-error: true - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 with: name: ${{ inputs.coverage_html_artifact }}-${{ matrix.system }}-${{ matrix.runtime }}-${{ matrix.python }} working-directory: ${{ fromJson(inputs.coverage_report_html).directory }} diff --git a/.github/workflows/_Checking_ArtifactCleanup.yml b/.github/workflows/_Checking_ArtifactCleanup.yml index 8700067..a85c553 100644 --- a/.github/workflows/_Checking_ArtifactCleanup.yml +++ b/.github/workflows/_Checking_ArtifactCleanup.yml @@ -25,7 +25,7 @@ jobs: run: printf "%s\n" "${{ matrix.runs-on }}-${{ matrix.python }}" >> artifact.txt - name: ๐Ÿ“ค Upload artifact for ${{ matrix.system }}-${{ matrix.python }} - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 with: name: ${{ fromJson(needs.Params.outputs.artifact_names).unittesting_xml }}-${{ matrix.system }}-${{ matrix.python }} path: artifact.txt @@ -42,7 +42,7 @@ jobs: run: printf "%s\n" "Package" >> package.txt - name: ๐Ÿ“ค Upload artifact for ${{ matrix.system }}-${{ matrix.python }} - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 with: name: ${{ fromJson(needs.Params.outputs.artifact_names).package_all }} path: package.txt diff --git a/.github/workflows/_Checking_Nightly.yml b/.github/workflows/_Checking_Nightly.yml index 57beb1f..c583c2c 100644 --- a/.github/workflows/_Checking_Nightly.yml +++ b/.github/workflows/_Checking_Nightly.yml @@ -17,7 +17,7 @@ jobs: printf "%s\n" "Build log $(date --utc '+%d.%m.%Y - %H:%M:%S')" > build.log - name: ๐Ÿ“ค Upload artifact - uses: pyTooling/upload-artifact@v5 + uses: pyTooling/upload-artifact@v6 with: name: document path: | @@ -32,7 +32,7 @@ jobs: printf "%s\n" "Program $(date --utc '+%d.%m.%Y - %H:%M:%S')" > program.py - name: ๐Ÿ“ค Upload artifact - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: other path: | From 800976853f509046848376284912eae0fac08dd2 Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Sat, 13 Dec 2025 22:44:33 +0100 Subject: [PATCH 03/15] Updated actions/download-artifact@v6 to actions/download-artifact@v7. --- .github/workflows/ApplicationTesting.yml | 2 +- .github/workflows/InstallPackage.yml | 2 +- .github/workflows/LaTeXDocumentation.yml | 2 +- .github/workflows/PublishCoverageResults.yml | 2 +- .github/workflows/PublishOnPyPI.yml | 2 +- .github/workflows/PublishTestResults.yml | 2 +- .github/workflows/PublishToGitHubPages.yml | 6 +++--- .github/workflows/SphinxDocumentation.yml | 8 ++++---- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ApplicationTesting.yml b/.github/workflows/ApplicationTesting.yml index c6293bc..b5eb6cc 100644 --- a/.github/workflows/ApplicationTesting.yml +++ b/.github/workflows/ApplicationTesting.yml @@ -89,7 +89,7 @@ jobs: uses: actions/checkout@v6 - name: ๐Ÿ“ฅ Download artifacts '${{ inputs.wheel }}' from 'Package' job - uses: pyTooling/download-artifact@v6 + uses: pyTooling/download-artifact@v7 with: name: ${{ inputs.wheel }} path: install diff --git a/.github/workflows/InstallPackage.yml b/.github/workflows/InstallPackage.yml index 2e28e99..ad03205 100644 --- a/.github/workflows/InstallPackage.yml +++ b/.github/workflows/InstallPackage.yml @@ -53,7 +53,7 @@ jobs: steps: - name: ๐Ÿ“ฅ Download artifacts '${{ inputs.wheel }}' from 'Package' job - uses: pyTooling/download-artifact@v6 + uses: pyTooling/download-artifact@v7 with: name: ${{ inputs.wheel }} path: install diff --git a/.github/workflows/LaTeXDocumentation.yml b/.github/workflows/LaTeXDocumentation.yml index 36609fc..524c619 100644 --- a/.github/workflows/LaTeXDocumentation.yml +++ b/.github/workflows/LaTeXDocumentation.yml @@ -60,7 +60,7 @@ jobs: continue-on-error: ${{ inputs.can-fail == 'true' }} steps: - name: ๐Ÿ“ฅ Download artifacts '${{ inputs.latex_artifact }}' from 'SphinxDocumentation' job - uses: pyTooling/download-artifact@v6 + uses: pyTooling/download-artifact@v7 with: name: ${{ inputs.latex_artifact }} path: latex diff --git a/.github/workflows/PublishCoverageResults.yml b/.github/workflows/PublishCoverageResults.yml index c9a311a..ec2ec8b 100644 --- a/.github/workflows/PublishCoverageResults.yml +++ b/.github/workflows/PublishCoverageResults.yml @@ -115,7 +115,7 @@ jobs: submodules: true - name: ๐Ÿ“ฅ Download Artifacts - uses: pyTooling/download-artifact@v6 + uses: pyTooling/download-artifact@v7 with: pattern: ${{ inputs.coverage_artifacts_pattern }} path: artifacts diff --git a/.github/workflows/PublishOnPyPI.yml b/.github/workflows/PublishOnPyPI.yml index 9ad2a1f..5108b95 100644 --- a/.github/workflows/PublishOnPyPI.yml +++ b/.github/workflows/PublishOnPyPI.yml @@ -56,7 +56,7 @@ jobs: steps: - name: ๐Ÿ“ฅ Download artifacts '${{ inputs.artifact }}' from 'Package' job - uses: pyTooling/download-artifact@v6 + uses: pyTooling/download-artifact@v7 with: name: ${{ inputs.artifact }} path: dist diff --git a/.github/workflows/PublishTestResults.yml b/.github/workflows/PublishTestResults.yml index 7f1a2fb..1db8989 100644 --- a/.github/workflows/PublishTestResults.yml +++ b/.github/workflows/PublishTestResults.yml @@ -105,7 +105,7 @@ jobs: uses: actions/checkout@v6 - name: ๐Ÿ“ฅ Download Artifacts - uses: pyTooling/download-artifact@v6 + uses: pyTooling/download-artifact@v7 with: pattern: ${{ inputs.unittest_artifacts_pattern }} path: artifacts diff --git a/.github/workflows/PublishToGitHubPages.yml b/.github/workflows/PublishToGitHubPages.yml index 882816d..2fd4dc9 100644 --- a/.github/workflows/PublishToGitHubPages.yml +++ b/.github/workflows/PublishToGitHubPages.yml @@ -56,20 +56,20 @@ jobs: uses: actions/checkout@v6 - name: ๐Ÿ“ฅ Download artifacts '${{ inputs.doc }}' from 'SphinxDocumentation' job - uses: pyTooling/download-artifact@v6 + uses: pyTooling/download-artifact@v7 with: name: ${{ inputs.doc }} path: public - name: ๐Ÿ“ฅ Download artifacts '${{ inputs.coverage }}' from 'Coverage' job - uses: pyTooling/download-artifact@v6 + uses: pyTooling/download-artifact@v7 if: ${{ inputs.coverage != '' }} with: name: ${{ inputs.coverage }} path: public/coverage - name: ๐Ÿ“ฅ Download artifacts '${{ inputs.typing }}' from 'StaticTypeCheck' job - uses: pyTooling/download-artifact@v6 + uses: pyTooling/download-artifact@v7 if: ${{ inputs.typing != '' }} with: name: ${{ inputs.typing }} diff --git a/.github/workflows/SphinxDocumentation.yml b/.github/workflows/SphinxDocumentation.yml index 87ee175..f17cde6 100644 --- a/.github/workflows/SphinxDocumentation.yml +++ b/.github/workflows/SphinxDocumentation.yml @@ -105,7 +105,7 @@ jobs: python -m pip install --disable-pip-version-check ${{ inputs.requirements }} - name: ๐Ÿ“ฅ Download artifacts '${{ inputs.unittest_xml_artifact }}' from 'Unittesting' job - uses: pyTooling/download-artifact@v6 + uses: pyTooling/download-artifact@v7 if: inputs.unittest_xml_artifact != '' with: name: ${{ inputs.unittest_xml_artifact }} @@ -113,7 +113,7 @@ jobs: investigate: true - name: ๐Ÿ“ฅ Download artifacts '${{ inputs.coverage_json_artifact }}' from 'PublishCoverageResults' job - uses: pyTooling/download-artifact@v6 + uses: pyTooling/download-artifact@v7 if: inputs.coverage_json_artifact != '' with: name: ${{ inputs.coverage_json_artifact }} @@ -164,7 +164,7 @@ jobs: python -m pip install --disable-pip-version-check ${{ inputs.requirements }} - name: ๐Ÿ“ฅ Download artifacts '${{ inputs.unittest_xml_artifact }}' from 'Unittesting' job - uses: pyTooling/download-artifact@v6 + uses: pyTooling/download-artifact@v7 if: inputs.unittest_xml_artifact != '' with: name: ${{ inputs.unittest_xml_artifact }} @@ -172,7 +172,7 @@ jobs: investigate: true - name: ๐Ÿ“ฅ Download artifacts '${{ inputs.coverage_json_artifact }}' from 'PublishCoverageResults' job - uses: pyTooling/download-artifact@v6 + uses: pyTooling/download-artifact@v7 if: inputs.coverage_json_artifact != '' with: name: ${{ inputs.coverage_json_artifact }} From 8198b215a767c13343500816497855ad96bc6e34 Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Sat, 13 Dec 2025 22:48:00 +0100 Subject: [PATCH 04/15] Changed macos-13 (x86-64) to macos-15-intel (x86-64). --- .github/workflows/Parameters.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Parameters.yml b/.github/workflows/Parameters.yml index fd523dd..36f097e 100644 --- a/.github/workflows/Parameters.yml +++ b/.github/workflows/Parameters.yml @@ -103,7 +103,7 @@ on: macos_intel_image: description: 'The used GitHub Action image for macOS (Intel x86-64) based jobs.' required: false - default: 'macos-13' + default: 'macos-15-intel' type: string macos_arm_image: description: 'The used GitHub Action image for macOS (ARM aarch64) based jobs.' From 7c249a1ae0d781e78f8c9d51693f00fdc55326cb Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Sat, 13 Dec 2025 22:57:42 +0100 Subject: [PATCH 05/15] Test macos-15-intel. --- .github/workflows/_Checking_AvailableRunners.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/_Checking_AvailableRunners.yml b/.github/workflows/_Checking_AvailableRunners.yml index 1b8b7ea..db58455 100644 --- a/.github/workflows/_Checking_AvailableRunners.yml +++ b/.github/workflows/_Checking_AvailableRunners.yml @@ -16,10 +16,9 @@ jobs: include: - {icon: '๐Ÿง', name: 'Ubuntu 22.04 (x86-64)', image: 'ubuntu-22.04', shell: 'bash', can-fail: false} - {icon: '๐Ÿง', name: 'Ubuntu 24.04 (x86-64)', image: 'ubuntu-24.04', shell: 'bash', can-fail: false} # latest - - {icon: '๐ŸŽ', name: 'macOS-13 (x86-64)', image: 'macos-13', shell: 'bash', can-fail: false} - {icon: '๐ŸŽ', name: 'macOS-14 (x86-64)', image: 'macos-14-large', shell: 'bash', can-fail: true } # not in free plan - - {icon: '๐ŸŽ', name: 'macOS-15 (x86-64)', image: 'macos-15-large', shell: 'bash', can-fail: true } # not in free plan - - {icon: '๐Ÿ', name: 'macOS-13 (aarch64)', image: 'macos-13-xlarge', shell: 'bash', can-fail: true } # not in free plan +### - {icon: '๐ŸŽ', name: 'macOS-15 (x86-64)', image: 'macos-15-large', shell: 'bash', can-fail: true } # same as -intel; not in free plan + - {icon: '๐ŸŽ', name: 'macOS-15 (x86-64)', image: 'macos-15-intel', shell: 'bash', can-fail: false} - {icon: '๐Ÿ', name: 'macOS-14 (aarch64)', image: 'macos-14', shell: 'bash', can-fail: false} # latest - {icon: '๐Ÿ', name: 'macOS-15 (aarch64)', image: 'macos-15', shell: 'bash', can-fail: false} - {icon: '๐ŸชŸ', name: 'Windows Server 2022', image: 'windows-2022', shell: 'bash', can-fail: false} From 388f55721c4e5fe52a0da55ec1061890d4256e81 Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Sat, 13 Dec 2025 23:52:16 +0100 Subject: [PATCH 06/15] Trying to find a workarounf for mypy's dependency to librt. --- .github/workflows/CompletePipeline.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CompletePipeline.yml b/.github/workflows/CompletePipeline.yml index 976d2f0..b5e924d 100644 --- a/.github/workflows/CompletePipeline.yml +++ b/.github/workflows/CompletePipeline.yml @@ -238,7 +238,7 @@ jobs: jobs: ${{ needs.UnitTestingParams.outputs.python_jobs }} # TODO: shouldn't this be configured by a parameter? Same as directories requirements: "-r tests/unit/requirements.txt" -# pacboy: "msys/git python-lxml:p" + pacboy: "gcc:p" 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 }} From 92a168c8c84302e5ed5809e7d97956a5d2b2f4c7 Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Sun, 14 Dec 2025 01:24:13 +0100 Subject: [PATCH 07/15] Fixed linebreak in printf. --- .github/workflows/PublishReleaseNotes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/PublishReleaseNotes.yml b/.github/workflows/PublishReleaseNotes.yml index 6377976..7eb3d28 100644 --- a/.github/workflows/PublishReleaseNotes.yml +++ b/.github/workflows/PublishReleaseNotes.yml @@ -775,7 +775,7 @@ jobs: if [[ $? -eq 0 ]]; then printf "${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}\n" - printf " checking assets SHA256 checksum ... \n" + printf " checking assets SHA256 checksum ... " ghSHA256=$(gh release view --json assets --jq ".assets[] | select(.name == \"${asset}\") | .digest" ${{ inputs.tag }}) if [[ "${ghSHA256}" == "${sha256Checksums[$asset]}" ]]; then printf "${ANSI_LIGHT_GREEN}[PASSED]${ANSI_NOCOLOR}\n" From 323fa17773972b01e7d39c104b53c992663faed4 Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Sun, 14 Dec 2025 16:25:54 +0100 Subject: [PATCH 08/15] Allow explicit relative path in requirements file. --- .github/workflows/CompletePipeline.yml | 1 - .github/workflows/UnitTesting.yml | 11 ++++++++--- doc/requirements.txt | 4 ++-- tests/requirements.txt | 7 ------- tests/unit/requirements.txt | 7 +++++++ 5 files changed, 17 insertions(+), 13 deletions(-) diff --git a/.github/workflows/CompletePipeline.yml b/.github/workflows/CompletePipeline.yml index b5e924d..068bd91 100644 --- a/.github/workflows/CompletePipeline.yml +++ b/.github/workflows/CompletePipeline.yml @@ -237,7 +237,6 @@ jobs: with: jobs: ${{ needs.UnitTestingParams.outputs.python_jobs }} # TODO: shouldn't this be configured by a parameter? Same as directories - requirements: "-r tests/unit/requirements.txt" pacboy: "gcc:p" unittest_report_xml: ${{ needs.ConfigParams.outputs.unittest_report_xml }} coverage_report_xml: ${{ needs.ConfigParams.outputs.coverage_report_xml }} diff --git a/.github/workflows/UnitTesting.yml b/.github/workflows/UnitTesting.yml index 000f979..7e119d5 100644 --- a/.github/workflows/UnitTesting.yml +++ b/.github/workflows/UnitTesting.yml @@ -47,7 +47,7 @@ on: requirements: description: 'Python dependencies to be installed through pip.' required: false - default: '-r tests/requirements.txt' + default: '-r ./requirements.txt' type: string mingw_requirements: description: 'Override Python dependencies to be installed through pip on MSYS2 (MINGW64) only.' @@ -82,7 +82,7 @@ on: root_directory: description: 'Working directory for running tests.' required: false - default: '' + default: '.' type: string tests_directory: description: 'Path to the directory containing tests (relative from root_directory).' @@ -234,7 +234,12 @@ jobs: requirements = "${{ inputs.requirements }}" if requirements.startswith("-r"): - requirementsFile = Path(requirements[2:].lstrip()) + requirements = requirements[2:].lstrip() + if requirements.startswith("./"): + requirementsFile = Path("${{ inputs.root_directory || '.' }}") / Path("${{ inputs.tests_directory || '.' }}") / Path("${{ inputs.unittest_directory || '.' }}") / Path(requirements[2:]) + else: + requirementsFile = Path(requirements) + try: dependencies = loadRequirementsFile(requirementsFile) except FileNotFoundError as ex: diff --git a/doc/requirements.txt b/doc/requirements.txt index 725f8ae..92f1e46 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -11,9 +11,9 @@ docutils_stubs ~= 0.0.22 sphinx_rtd_theme ~= 3.0 # Sphinx Extenstions -sphinxcontrib-mermaid ~= 1.0 +sphinxcontrib-mermaid ~= 1.2 autoapi >= 2.0.1 sphinx_design ~= 0.6 sphinx-copybutton >= 0.5 -sphinx_autodoc_typehints ~= 3.5 +sphinx_autodoc_typehints ~= 3.6 sphinx_reports ~= 0.9 diff --git a/tests/requirements.txt b/tests/requirements.txt index 7a7add3..57f5464 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,12 +1,5 @@ -r ../requirements.txt -# Coverage collection -Coverage ~= 7.11 - -# Test Runner -pytest ~= 9.0 -pytest-cov ~= 7.0 - # Static Type Checking mypy[reports] ~= 1.18 typing_extensions ~= 4.15 diff --git a/tests/unit/requirements.txt b/tests/unit/requirements.txt index 3c8d7e7..98d75ba 100644 --- a/tests/unit/requirements.txt +++ b/tests/unit/requirements.txt @@ -1 +1,8 @@ -r ../requirements.txt + +# Coverage collection +Coverage ~= 7.13 + +# Test Runner +pytest ~= 9.0 +pytest-cov ~= 7.0 From 8354c4a084dd9737bf8777640cfa5143e259c153 Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Sun, 14 Dec 2025 18:39:14 +0100 Subject: [PATCH 09/15] Read requirements for static typing from 'tests/typing/'. --- .github/workflows/StaticTypeCheck.yml | 10 +++++----- tests/typing/requirements.txt | 6 ++++++ 2 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 tests/typing/requirements.txt diff --git a/.github/workflows/StaticTypeCheck.yml b/.github/workflows/StaticTypeCheck.yml index 5d5a327..6f90bfa 100644 --- a/.github/workflows/StaticTypeCheck.yml +++ b/.github/workflows/StaticTypeCheck.yml @@ -38,7 +38,7 @@ on: requirements: description: 'Python dependencies to be installed through pip.' required: false - default: '-r tests/requirements.txt' + default: '-r tests/typing/requirements.txt' type: string mypy_options: description: 'Additional mypy options.' @@ -49,18 +49,18 @@ on: description: 'Cobertura file to upload as an artifact.' required: false default: >- - { "fullpath": "report/typing/cobertura.xml", + { "fullpath": "report/typing/cobertura.xml", "directory": "report/typing", - "filename": "cobertura.xml" + "filename": "cobertura.xml" } type: string junit_report: description: 'JUnit file to upload as an artifact.' required: false default: >- - { "fullpath": "report/typing/StaticTypingSummary.xml", + { "fullpath": "report/typing/StaticTypingSummary.xml", "directory": "report/typing", - "filename": "StaticTypingSummary.xml" + "filename": "StaticTypingSummary.xml" } type: string html_report: diff --git a/tests/typing/requirements.txt b/tests/typing/requirements.txt new file mode 100644 index 0000000..95ab13e --- /dev/null +++ b/tests/typing/requirements.txt @@ -0,0 +1,6 @@ +-r ../../requirements.txt + +# Static Type Checking +mypy[reports] ~= 1.19 +typing_extensions ~= 4.15 +lxml >= 5.4, <7.0 From d3e7e4f6edf6076e4802d332dbc57b153b00fc77 Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Sun, 14 Dec 2025 18:42:50 +0100 Subject: [PATCH 10/15] Reorganized unit testing requirements. --- .idea/Actions.iml | 2 +- tests/platform/requirements.txt | 2 +- tests/requirements.txt | 10 ++++------ tests/unit/requirements.txt | 2 +- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/.idea/Actions.iml b/.idea/Actions.iml index b80e16a..0a9dd38 100644 --- a/.idea/Actions.iml +++ b/.idea/Actions.iml @@ -8,7 +8,7 @@ - + \ No newline at end of file diff --git a/tests/platform/requirements.txt b/tests/platform/requirements.txt index 3c8d7e7..68e4e38 100644 --- a/tests/platform/requirements.txt +++ b/tests/platform/requirements.txt @@ -1 +1 @@ --r ../requirements.txt +-r ../unit/requirements.txt diff --git a/tests/requirements.txt b/tests/requirements.txt index 57f5464..f9f4443 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,6 +1,4 @@ --r ../requirements.txt - -# Static Type Checking -mypy[reports] ~= 1.18 -typing_extensions ~= 4.15 -lxml >= 5.4, <7.0 +# Collect all testing requirements +-r platform/requirements.txt +-r typing/requirements.txt +-r unit/requirements.txt diff --git a/tests/unit/requirements.txt b/tests/unit/requirements.txt index 98d75ba..a2ffbaa 100644 --- a/tests/unit/requirements.txt +++ b/tests/unit/requirements.txt @@ -1,4 +1,4 @@ --r ../requirements.txt +-r ../../requirements.txt # Coverage collection Coverage ~= 7.13 From 1bef5347ae2a54be775a77e5a8e41a116d6d60b4 Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Sun, 14 Dec 2025 19:18:20 +0100 Subject: [PATCH 11/15] Compute path to requirements.txt. --- .github/workflows/UnitTesting.yml | 48 +++++++++++++++++++++++-------- doc/requirements.txt | 2 +- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/.github/workflows/UnitTesting.yml b/.github/workflows/UnitTesting.yml index 7e119d5..88cbb54 100644 --- a/.github/workflows/UnitTesting.yml +++ b/.github/workflows/UnitTesting.yml @@ -205,6 +205,38 @@ jobs: run: | py -3.9 -m pip install --disable-pip-version-check --break-system-packages -U tomli + - name: Compute path to requirements file + id: requirements + shell: python + run: | + from os import getenv + from pathlib import Path + from sys import version + + print(f"Python: {version}") + + requirements = "${{ inputs.requirements }}" + if requirements.startswith("-r"): + requirements = requirements[2:].lstrip() + if requirements.startswith("./"): + requirementsFile = Path("${{ inputs.root_directory || '.' }}") / Path("${{ inputs.tests_directory || '.' }}") / Path("${{ inputs.unittest_directory || '.' }}") / Path(requirements[2:]) + else: + requirementsFile = Path(requirements) + + if not requirementsFile.exists(): + print(f"::error title=FileNotFoundError::{ex}") + exit(1) + + print(f"requirements file: {requirementsFile.as_posix()}") + + # Write requirements path to special file + github_output = Path(getenv("GITHUB_OUTPUT")) + print(f"GITHUB_OUTPUT: {github_output}") + with github_output.open("a+") as f: + f.write(f"requirements=-r {requirementsFile.as_posix()}\n") + else: + print(f"requirements list: {requirements}") + - name: Compute pacman/pacboy packages id: pacboy if: matrix.system == 'msys2' @@ -215,8 +247,6 @@ jobs: from re import compile from sys import version - print(f"Python: {version}") - def loadRequirementsFile(requirementsFile: Path): requirements = [] with requirementsFile.open("r") as file: @@ -232,16 +262,10 @@ jobs: return requirements - requirements = "${{ inputs.requirements }}" + requirements = "${{ steps.requirements.outputs.requirements }}" if requirements.startswith("-r"): - requirements = requirements[2:].lstrip() - if requirements.startswith("./"): - requirementsFile = Path("${{ inputs.root_directory || '.' }}") / Path("${{ inputs.tests_directory || '.' }}") / Path("${{ inputs.unittest_directory || '.' }}") / Path(requirements[2:]) - else: - requirementsFile = Path(requirements) - try: - dependencies = loadRequirementsFile(requirementsFile) + dependencies = loadRequirementsFile(Path(requirements[2:].lstrip())) except FileNotFoundError as ex: print(f"::error title=FileNotFoundError::{ex}") exit(1) @@ -329,7 +353,7 @@ jobs: if: matrix.system != 'msys2' run: | python -m pip install --disable-pip-version-check -U wheel tomli - python -m pip install --disable-pip-version-check ${{ inputs.requirements }} + python -m pip install --disable-pip-version-check ${{ steps.requirements.outputs.requirements }} - name: ๐Ÿ”ง Install pip dependencies (MSYS2) if: matrix.system == 'msys2' @@ -337,7 +361,7 @@ jobs: if [ -n '${{ inputs.mingw_requirements }}' ]; then python -m pip install --disable-pip-version-check --break-system-packages ${{ inputs.mingw_requirements }} else - python -m pip install --disable-pip-version-check --break-system-packages ${{ inputs.requirements }} + python -m pip install --disable-pip-version-check --break-system-packages ${{ steps.requirements.outputs.requirements }} fi # Before scripts diff --git a/doc/requirements.txt b/doc/requirements.txt index 92f1e46..1effbe5 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -15,5 +15,5 @@ sphinxcontrib-mermaid ~= 1.2 autoapi >= 2.0.1 sphinx_design ~= 0.6 sphinx-copybutton >= 0.5 -sphinx_autodoc_typehints ~= 3.6 +sphinx_autodoc_typehints ~= 3.5 # 3.6 is conflicting with old sphinx_design and rtd theme due to sphinx<9 and docutils<0.22 sphinx_reports ~= 0.9 From 18379306dba01aa6a8ab019d32a73d329bbe654f Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Sun, 14 Dec 2025 23:23:03 +0100 Subject: [PATCH 12/15] Don't install GCC in MSYS2. --- .github/workflows/CompletePipeline.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/CompletePipeline.yml b/.github/workflows/CompletePipeline.yml index 068bd91..73ccb71 100644 --- a/.github/workflows/CompletePipeline.yml +++ b/.github/workflows/CompletePipeline.yml @@ -237,7 +237,6 @@ jobs: with: jobs: ${{ needs.UnitTestingParams.outputs.python_jobs }} # TODO: shouldn't this be configured by a parameter? Same as directories - pacboy: "gcc:p" 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 }} From e5a874819f7948da9bcf96cefb6f3106cb20366a Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Sun, 14 Dec 2025 23:25:08 +0100 Subject: [PATCH 13/15] Deploy GitHub pages using an Action instead of a special branch. --- .github/workflows/ExtractConfiguration.yml | 2 +- .github/workflows/PublishToGitHubPages.yml | 42 ++++++++++++---------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/.github/workflows/ExtractConfiguration.yml b/.github/workflows/ExtractConfiguration.yml index 8aa8581..c5a8f31 100644 --- a/.github/workflows/ExtractConfiguration.yml +++ b/.github/workflows/ExtractConfiguration.yml @@ -68,7 +68,7 @@ on: jobs: Extract: - name: ๐Ÿ““ Extract configurations from pyproject.toml + name: ๐Ÿ”ฌ Extract configurations from pyproject.toml runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}" outputs: unittest_report_xml: ${{ steps.getVariables.outputs.unittest_report_xml }} diff --git a/.github/workflows/PublishToGitHubPages.yml b/.github/workflows/PublishToGitHubPages.yml index 2fd4dc9..b8805f4 100644 --- a/.github/workflows/PublishToGitHubPages.yml +++ b/.github/workflows/PublishToGitHubPages.yml @@ -45,16 +45,24 @@ on: default: '' type: string + outputs: + github_pages_url: + description: "URL to GitHub Pages." + value: ${{ jobs.PrepareGitHubPages.outputs.github_pages_url }} + jobs: - - PublishToGitHubPages: - name: ๐Ÿ“š Publish to GH-Pages + PrepareGitHubPages: + name: ๐Ÿ“– Merge multiple contents for publishing runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}" - + permissions: + pages: write # to deploy to Pages + id-token: write # to verify the deployment originates from an appropriate source + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + outputs: + github_pages_url: ${{ steps.deployment.outputs.page_url }} steps: - - name: โฌ Checkout repository - uses: actions/checkout@v6 - - name: ๐Ÿ“ฅ Download artifacts '${{ inputs.doc }}' from 'SphinxDocumentation' job uses: pyTooling/download-artifact@v7 with: @@ -75,15 +83,13 @@ jobs: name: ${{ inputs.typing }} path: public/typing - - name: '๐Ÿ““ Publish site to GitHub Pages' + - name: ๐Ÿ“‘ Upload static files as artifact if: github.event_name != 'pull_request' - run: | - cd public - touch .nojekyll - git init - cp ../.git/config ./.git/config - git add . - git config --local user.email "BuildTheDocs@GitHubActions" - git config --local user.name "GitHub Actions" - git commit -a -m "update ${{ github.sha }}" - git push -u origin +HEAD:gh-pages + uses: actions/upload-pages-artifact@v4 + with: + path: public/ + + - name: ๐Ÿ“– Deploy to GitHub Pages + id: deployment + if: github.event_name != 'pull_request' + uses: actions/deploy-pages@v4 From 9459e295d1e51c1696edfa2cd53f390093df3112 Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Tue, 16 Dec 2025 20:05:42 +0100 Subject: [PATCH 14/15] Create an asset table. --- .github/workflows/PublishReleaseNotes.yml | 467 +++++++++++++--------- .github/workflows/_Checking_Nightly.yml | 11 +- 2 files changed, 277 insertions(+), 201 deletions(-) diff --git a/.github/workflows/PublishReleaseNotes.yml b/.github/workflows/PublishReleaseNotes.yml index 7eb3d28..56c243e 100644 --- a/.github/workflows/PublishReleaseNotes.yml +++ b/.github/workflows/PublishReleaseNotes.yml @@ -191,198 +191,6 @@ jobs: exit 1 fi - - name: ๐Ÿ“‘ Assemble Release Notes - id: createReleaseNotes - run: | - set +e - - ANSI_LIGHT_RED=$'\x1b[91m' - ANSI_LIGHT_GREEN=$'\x1b[92m' - ANSI_LIGHT_YELLOW=$'\x1b[93m' - ANSI_LIGHT_BLUE=$'\x1b[94m' - ANSI_NOCOLOR=$'\x1b[0m' - - export GH_TOKEN=${{ github.token }} - - # Save release description (from parameter in a file) - head -c -1 <<'EOF' > __DESCRIPTION__.md - ${{ inputs.description }} - EOF - - # Save release footer (from parameter in a file) - head -c -1 <<'EOF' > __FOOTER__.md - ${{ inputs.description_footer }} - EOF - - # Download Markdown from PullRequest - # Readout second parent's SHA - # Search PR with that SHA - # Load description of that PR - printf "Read second parent of current SHA (%s) ... " "${{ github.ref }}" - FATHER_SHA=$(git rev-parse ${{ github.ref }}^2 -- 2> /dev/null) - if [[ $? -ne 0 || "{FATHER_SHA}" == "" ]]; then - printf "${ANSI_LIGHT_RED}[FAILED]${ANSI_NOCOLOR}\n" - printf "โ†’ ${ANSI_LIGHT_YELLOW}Skipped readout of pull request description. This is not a merge commit.${ANSI_NOCOLOR}\n" - else - printf "${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}\n" - - printf "Search Pull Request to '%s' and branch containing SHA %s ... " "${{ inputs.release_branch }}" "${FATHER_SHA}" - PULL_REQUESTS=$(gh pr list --base "${{ inputs.release_branch }}" --search "${FATHER_SHA}" --state "merged" --json "title,number,mergedBy,mergedAt,body") - if [[ $? -ne 0 || "${PULL_REQUESTS}" == "" ]]; then - printf "${ANSI_LIGHT_RED}[FAILED]${ANSI_NOCOLOR}\n" - printf "${ANSI_LIGHT_RED}Couldn't find a merged Pull Request to '%s'. -> %s${ANSI_NOCOLOR}\n" "${{ inputs.release_branch }}" "${PULL_REQUESTS}" - printf "::error title=PullRequest::Couldn't find a merged Pull Request to '%s'. -> %s\n" "${{ inputs.release_branch }}" "${PULL_REQUESTS}" - exit 1 - else - printf "${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}\n" - - PR_TITLE="$( printf "%s\n" "${PULL_REQUESTS}" | jq --raw-output ".[0].title")" - PR_NUMBER="$( printf "%s\n" "${PULL_REQUESTS}" | jq --raw-output ".[0].number")" - PR_BODY="$( printf "%s\n" "${PULL_REQUESTS}" | jq --raw-output ".[0].body")" - PR_MERGED_BY="$(printf "%s\n" "${PULL_REQUESTS}" | jq --raw-output ".[0].mergedBy.login")" - PR_MERGED_AT="$(printf "%s\n" "${PULL_REQUESTS}" | jq --raw-output ".[0].mergedAt")" - - printf "Found Pull Request:\n" - printf " %s\n" "Title: ${PR_TITLE}" - printf " %s\n" "Number: ${PR_NUMBER}" - printf " %s\n" "MergedBy: ${PR_MERGED_BY}" - printf " %s\n" "MergedAt: ${PR_MERGED_AT} ($(date -d"${PR_MERGED_AT}" '+%d.%m.%Y - %H:%M:%S'))" - fi - - printf "%s\n" "${PR_BODY}" > __PULLREQUEST__.md - fi - - # Check if a release description file should be used and exists. - if [[ "${{ inputs.description_file }}" != "" ]]; then - if [[ ! -f "${{ inputs.description_file }}" ]]; then - printf "${ANSI_LIGHT_RED}Release description file '%s' not found.${ANSI_NOCOLOR}\n" "${{ inputs.description_file }}" - printf "::error title=%s::%s\n" "FileNotFound" "Release description file '${{ inputs.description_file }}' not found." - exit 1 - elif [[ -s "${{ inputs.description_file }}" ]]; then - printf "Use '%s' as main release description.\n" "${{ inputs.description_file }}" - cp -v "${{ inputs.description_file }}" __NOTES__.md - else - printf "${ANSI_LIGHT_RED}Release description file '%s' is empty.${ANSI_NOCOLOR}\n" "${{ inputs.description_file }}" - printf "::error title=%s::%s\n" "FileNotFound" "Release description file '${{ inputs.description_file }}' is empty." - exit 1 - fi - # Check if the main release description is provided by a template parameter - elif [[ -s __DESCRIPTION__.md ]]; then - printf "Use '__DESCRIPTION__.md' as main release description.\n" - mv -v __DESCRIPTION__.md __NOTES__.md - # Check if the pull request serves as the main release description text. - elif [[ -s __PULLREQUEST__.md ]]; then - printf "Use '__PULLREQUEST__.md' as main release description.\n" - mv -v __PULLREQUEST__.md __NOTES__.md - - printf "Append '%%%%FOOTER%%%%' to '__NOTES__.md'.\n" - printf "\n%%%%FOOTER%%%%\n" >> __NOTES__.md - else - printf "${ANSI_LIGHT_RED}No release description specified (file, parameter, PR text).${ANSI_NOCOLOR}\n" - printf "::error title=%s::%s\n" "MissingDescription" "No release description specified (file, parameter, PR text)." - exit 1 - fi - - # Read release notes main file for placeholder substitution - NOTES=$(<__NOTES__.md) - - # Inline description - if [[ -s __DESCRIPTION__.md ]]; then - NOTES="${NOTES//%%DESCRIPTION%%/$(<__DESCRIPTION__.md)}" - else - NOTES="${NOTES//%%DESCRIPTION%%/}" - fi - - # Inline PullRequest and increase headline levels - if [[ -s __PULLREQUEST__.md ]]; then - while [[ "${NOTES}" =~ %%(PULLREQUEST(\+[0-3])?)%% ]]; do - case "${BASH_REMATCH[1]}" in - "PULLREQUEST+0" | "PULLREQUEST") - NOTES="${NOTES//${BASH_REMATCH[0]}/$(<__PULLREQUEST__.md)}" - ;; - "PULLREQUEST+1") - NOTES="${NOTES//${BASH_REMATCH[0]}/$(cat __PULLREQUEST__.md | sed -E 's/^(#+) /\1# /gm;t')}" - ;; - "PULLREQUEST+2") - NOTES="${NOTES//${BASH_REMATCH[0]}/$(cat __PULLREQUEST__.md | sed -E 's/^(#+) /\1### /gm;t')}" - ;; - "PULLREQUEST+3") - NOTES="${NOTES//${BASH_REMATCH[0]}/$(cat __PULLREQUEST__.md | sed -E 's/^(#+) /\1### /gm;t')}" - ;; - esac - done - else - while [[ "${NOTES}" =~ %%(PULLREQUEST(\+[0-3])?)%% ]]; do - NOTES="${NOTES//${BASH_REMATCH[0]}/}" - done - fi - - # inline Footer - if [[ -s __FOOTER__.md ]]; then - NOTES="${NOTES//%%FOOTER%%/$(<__FOOTER__.md)}" - else - NOTES="${NOTES//%%FOOTER%%/}" - fi - - # Apply replacements - while IFS=$'\r\n' read -r patternLine; do - # skip empty lines - [[ "$patternLine" == "" ]] && continue - - pattern="%${patternLine%%=*}%" - replacement="${patternLine#*=}" - NOTES="${NOTES//$pattern/$replacement}" - done <<<'${{ inputs.replacements }}' - - # Workarounds for stupid GitHub variables - owner_repo="${{ github.repository }}" - repo=${owner_repo##*/} - - # Replace special identifiers - NOTES="${NOTES//%%gh_server%%/${{ github.server_url }}}" - NOTES="${NOTES//%%gh_workflow_name%%/${{ github.workflow }}}" - NOTES="${NOTES//%%gh_owner%%/${{ github.repository_owner }}}" - NOTES="${NOTES//%%gh_repo%%/${repo}}" - NOTES="${NOTES//%%gh_owner_repo%%/${{ github.repository }}}" - #NOTES="${NOTES//%%gh_pages%%/https://${{ github.repository_owner }}.github.io/${repo}/}" - NOTES="${NOTES//%%gh_runid%%/${{ github.run_id }}}" - NOTES="${NOTES//%%gh_actor%%/${{ github.actor }}}" - NOTES="${NOTES//%%gh_sha%%/${{ github.sha }}}" - NOTES="${NOTES//%%date%%/$(date '+%Y-%m-%d')}" - NOTES="${NOTES//%%time%%/$(date '+%H:%M:%S %Z')}" - NOTES="${NOTES//%%datetime%%/$(date '+%Y-%m-%d %H:%M:%S %Z')}" - - # Write final release notes to file - printf "%s\n" "${NOTES}" > __NOTES__.md - - # Display partial contents for debugging - if [[ -s __DESCRIPTION__.md ]]; then - printf "::group::${ANSI_LIGHT_BLUE}%s${ANSI_NOCOLOR}\n" "Content of '__DESCRIPTION__.md' ($(stat --printf="%s" "__DESCRIPTION__.md") B) ...." - cat __DESCRIPTION__.md - printf "::endgroup::\n" - else - printf "${ANSI_LIGHT_YELLOW}No '__DESCRIPTION__.md' found.${ANSI_NOCOLOR}\n" - fi - if [[ -s __PULLREQUEST__.md ]]; then - printf "::group::${ANSI_LIGHT_BLUE}%s${ANSI_NOCOLOR}\n" "Content of '__PULLREQUEST__.md' ($(stat --printf="%s" "__PULLREQUEST__.md") B) ...." - cat __PULLREQUEST__.md - printf "::endgroup::\n" - else - printf "${ANSI_LIGHT_YELLOW}No '__PULLREQUEST__.md' found.${ANSI_NOCOLOR}\n" - fi - if [[ -s __FOOTER__.md ]]; then - printf "::group::${ANSI_LIGHT_BLUE}%s${ANSI_NOCOLOR}\n" "Content of '__FOOTER__.md' ($(stat --printf="%s" "__FOOTER__.md") B) ...." - cat __FOOTER__.md - printf "::endgroup::\n" - else - printf "${ANSI_LIGHT_YELLOW}No '__FOOTER__.md' found.${ANSI_NOCOLOR}\n" - fi - - # Print final release notes - printf "::group::${ANSI_LIGHT_BLUE}%s${ANSI_NOCOLOR}\n" "Content of '__NOTES__.md' ($(stat --printf="%s" "__NOTES__.md") B) ...." - cat __NOTES__.md - printf "::endgroup::\n" - - name: ๐Ÿ“‘ Create new Release Page id: createReleasePage if: inputs.mode == 'release' @@ -397,6 +205,15 @@ jobs: export GH_TOKEN=${{ github.token }} + tee "__PRELIMINARY_NOTES__.md" <&1)" @@ -439,6 +254,14 @@ jobs: export GH_TOKEN=${{ github.token }} + tee "__PRELIMINARY_NOTES__.md" <&1)" @@ -553,6 +374,10 @@ jobs: ) fi + # Write Markdown table header + printf "| Asset Name | File Size | SHA256 |\n" > __ASSETS__.md + printf "|------------|-----------|--------|\n" >> __ASSETS__.md + ERRORS=0 # A dictionary of 0/1 to avoid duplicate downloads declare -A downloadedArtifacts @@ -741,6 +566,13 @@ jobs: sha256Checksums[$asset]="sha256:${sha256}" printf "${ANSI_LIGHT_BLUE}${sha256}${ANSI_NOCOLOR}\n" + # Add asset to Markdown table + printf "| %s | %s | %s |\n" \ + "[${title}](${{ github.server_url }}/${{ github.repository }}/releases/download/${{ inputs.tag }}/${uploadFile#*/})" \ + "$(stat --printf="%s" "${uploadFile}" | numfmt --format "%.1f" --suffix=B --to=iec-i)" \ + "\`${sha256}\`" \ + >> __ASSETS__.md + # Add asset to JSON inventory if [[ "${{ inputs.inventory-json }}" != "" ]]; then if [[ "${categories}" != "${title}" ]]; then @@ -829,6 +661,245 @@ jobs: exit 1 fi + - name: ๐Ÿ“‘ Assemble Release Notes + id: createReleaseNotes + run: | + set +e + + ANSI_LIGHT_RED=$'\x1b[91m' + ANSI_LIGHT_GREEN=$'\x1b[92m' + ANSI_LIGHT_YELLOW=$'\x1b[93m' + ANSI_LIGHT_BLUE=$'\x1b[94m' + ANSI_NOCOLOR=$'\x1b[0m' + + export GH_TOKEN=${{ github.token }} + + # Save release description (from parameter in a file) + head -c -1 <<'EOF' > __DESCRIPTION__.md + ${{ inputs.description }} + EOF + + # Save release footer (from parameter in a file) + head -c -1 <<'EOF' > __FOOTER__.md + ${{ inputs.description_footer }} + EOF + + # Download Markdown from PullRequest + # Readout second parent's SHA + # Search PR with that SHA + # Load description of that PR + printf "Read second parent of current SHA (%s) ... " "${{ github.ref }}" + FATHER_SHA=$(git rev-parse ${{ github.ref }}^2 -- 2> /dev/null) + if [[ $? -ne 0 || "{FATHER_SHA}" == "" ]]; then + printf "${ANSI_LIGHT_RED}[FAILED]${ANSI_NOCOLOR}\n" + printf "โ†’ ${ANSI_LIGHT_YELLOW}Skipped readout of pull request description. This is not a merge commit.${ANSI_NOCOLOR}\n" + else + printf "${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}\n" + + printf "Search Pull Request to '%s' and branch containing SHA %s ... " "${{ inputs.release_branch }}" "${FATHER_SHA}" + PULL_REQUESTS=$(gh pr list --base "${{ inputs.release_branch }}" --search "${FATHER_SHA}" --state "merged" --json "title,number,mergedBy,mergedAt,body") + if [[ $? -ne 0 || "${PULL_REQUESTS}" == "" ]]; then + printf "${ANSI_LIGHT_RED}[FAILED]${ANSI_NOCOLOR}\n" + printf "${ANSI_LIGHT_RED}Couldn't find a merged Pull Request to '%s'. -> %s${ANSI_NOCOLOR}\n" "${{ inputs.release_branch }}" "${PULL_REQUESTS}" + printf "::error title=PullRequest::Couldn't find a merged Pull Request to '%s'. -> %s\n" "${{ inputs.release_branch }}" "${PULL_REQUESTS}" + exit 1 + else + printf "${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}\n" + + PR_TITLE="$( printf "%s\n" "${PULL_REQUESTS}" | jq --raw-output ".[0].title")" + PR_NUMBER="$( printf "%s\n" "${PULL_REQUESTS}" | jq --raw-output ".[0].number")" + PR_BODY="$( printf "%s\n" "${PULL_REQUESTS}" | jq --raw-output ".[0].body")" + PR_MERGED_BY="$(printf "%s\n" "${PULL_REQUESTS}" | jq --raw-output ".[0].mergedBy.login")" + PR_MERGED_AT="$(printf "%s\n" "${PULL_REQUESTS}" | jq --raw-output ".[0].mergedAt")" + + printf "Found Pull Request:\n" + printf " %s\n" "Title: ${PR_TITLE}" + printf " %s\n" "Number: ${PR_NUMBER}" + printf " %s\n" "MergedBy: ${PR_MERGED_BY}" + printf " %s\n" "MergedAt: ${PR_MERGED_AT} ($(date -d"${PR_MERGED_AT}" '+%d.%m.%Y - %H:%M:%S'))" + fi + + printf "%s\n" "${PR_BODY}" > __PULLREQUEST__.md + fi + + # Check if a release description file should be used and exists. + if [[ "${{ inputs.description_file }}" != "" ]]; then + if [[ ! -f "${{ inputs.description_file }}" ]]; then + printf "${ANSI_LIGHT_RED}Release description file '%s' not found.${ANSI_NOCOLOR}\n" "${{ inputs.description_file }}" + printf "::error title=%s::%s\n" "FileNotFound" "Release description file '${{ inputs.description_file }}' not found." + exit 1 + elif [[ -s "${{ inputs.description_file }}" ]]; then + printf "Use '%s' as main release description.\n" "${{ inputs.description_file }}" + cp -v "${{ inputs.description_file }}" __NOTES__.md + else + printf "${ANSI_LIGHT_RED}Release description file '%s' is empty.${ANSI_NOCOLOR}\n" "${{ inputs.description_file }}" + printf "::error title=%s::%s\n" "FileNotFound" "Release description file '${{ inputs.description_file }}' is empty." + exit 1 + fi + # Check if the main release description is provided by a template parameter + elif [[ -s __DESCRIPTION__.md ]]; then + printf "Use '__DESCRIPTION__.md' as main release description.\n" + mv -v __DESCRIPTION__.md __NOTES__.md + # Check if the pull request serves as the main release description text. + elif [[ -s __PULLREQUEST__.md ]]; then + printf "Use '__PULLREQUEST__.md' as main release description.\n" + mv -v __PULLREQUEST__.md __NOTES__.md + + printf "Append '%%%%FOOTER%%%%' to '__NOTES__.md'.\n" + printf "\n%%%%FOOTER%%%%\n" >> __NOTES__.md + else + printf "${ANSI_LIGHT_RED}No release description specified (file, parameter, PR text).${ANSI_NOCOLOR}\n" + printf "::error title=%s::%s\n" "MissingDescription" "No release description specified (file, parameter, PR text)." + exit 1 + fi + + # Read release notes main file for placeholder substitution + NOTES=$(<__NOTES__.md) + + # Inline description + if [[ -s __DESCRIPTION__.md ]]; then + NOTES="${NOTES//%%DESCRIPTION%%/$(<__DESCRIPTION__.md)}" + else + NOTES="${NOTES//%%DESCRIPTION%%/}" + fi + + # Inline PullRequest and increase headline levels + if [[ -s __PULLREQUEST__.md ]]; then + while [[ "${NOTES}" =~ %%(PULLREQUEST(\+[0-3])?)%% ]]; do + case "${BASH_REMATCH[1]}" in + "PULLREQUEST+0" | "PULLREQUEST") + NOTES="${NOTES//${BASH_REMATCH[0]}/$(<__PULLREQUEST__.md)}" + ;; + "PULLREQUEST+1") + NOTES="${NOTES//${BASH_REMATCH[0]}/$(cat __PULLREQUEST__.md | sed -E 's/^(#+) /\1# /gm;t')}" + ;; + "PULLREQUEST+2") + NOTES="${NOTES//${BASH_REMATCH[0]}/$(cat __PULLREQUEST__.md | sed -E 's/^(#+) /\1### /gm;t')}" + ;; + "PULLREQUEST+3") + NOTES="${NOTES//${BASH_REMATCH[0]}/$(cat __PULLREQUEST__.md | sed -E 's/^(#+) /\1### /gm;t')}" + ;; + esac + done + else + while [[ "${NOTES}" =~ %%(PULLREQUEST(\+[0-3])?)%% ]]; do + NOTES="${NOTES//${BASH_REMATCH[0]}/}" + done + fi + + # Inline Files table + if [[ -s __ASSETS__.md ]]; then + NOTES="${NOTES//%%ASSETS%%/$(<__ASSETS__.md)}" + else + NOTES="${NOTES//%%ASSETS%%/}" + fi + + # Inline Footer + if [[ -s __FOOTER__.md ]]; then + NOTES="${NOTES//%%FOOTER%%/$(<__FOOTER__.md)}" + else + NOTES="${NOTES//%%FOOTER%%/}" + fi + + # Apply replacements + while IFS=$'\r\n' read -r patternLine; do + # skip empty lines + [[ "$patternLine" == "" ]] && continue + + pattern="%${patternLine%%=*}%" + replacement="${patternLine#*=}" + NOTES="${NOTES//$pattern/$replacement}" + done <<<'${{ inputs.replacements }}' + + # Workarounds for stupid GitHub variables + owner_repo="${{ github.repository }}" + repo=${owner_repo##*/} + + # Replace special identifiers + NOTES="${NOTES//%%gh_server%%/${{ github.server_url }}}" + NOTES="${NOTES//%%gh_workflow_name%%/${{ github.workflow }}}" + NOTES="${NOTES//%%gh_owner%%/${{ github.repository_owner }}}" + NOTES="${NOTES//%%gh_repo%%/${repo}}" + NOTES="${NOTES//%%gh_owner_repo%%/${{ github.repository }}}" + #NOTES="${NOTES//%%gh_pages%%/https://${{ github.repository_owner }}.github.io/${repo}/}" + NOTES="${NOTES//%%gh_runid%%/${{ github.run_id }}}" + NOTES="${NOTES//%%gh_actor%%/${{ github.actor }}}" + NOTES="${NOTES//%%gh_sha%%/${{ github.sha }}}" + NOTES="${NOTES//%%date%%/$(date '+%Y-%m-%d')}" + NOTES="${NOTES//%%time%%/$(date '+%H:%M:%S %Z')}" + NOTES="${NOTES//%%datetime%%/$(date '+%Y-%m-%d %H:%M:%S %Z')}" + + # Write final release notes to file + printf "%s\n" "${NOTES}" > __NOTES__.md + + # Display partial contents for debugging + if [[ -s __DESCRIPTION__.md ]]; then + printf "::group::${ANSI_LIGHT_BLUE}%s${ANSI_NOCOLOR}\n" "Content of '__DESCRIPTION__.md' ($(stat --printf="%s" "__DESCRIPTION__.md") B) ...." + cat __DESCRIPTION__.md + printf "::endgroup::\n" + else + printf "${ANSI_LIGHT_YELLOW}No '__DESCRIPTION__.md' found.${ANSI_NOCOLOR}\n" + fi + if [[ -s __PULLREQUEST__.md ]]; then + printf "::group::${ANSI_LIGHT_BLUE}%s${ANSI_NOCOLOR}\n" "Content of '__PULLREQUEST__.md' ($(stat --printf="%s" "__PULLREQUEST__.md") B) ...." + cat __PULLREQUEST__.md + printf "::endgroup::\n" + else + printf "${ANSI_LIGHT_YELLOW}No '__PULLREQUEST__.md' found.${ANSI_NOCOLOR}\n" + fi + if [[ -s __ASSETS__.md ]]; then + printf "::group::${ANSI_LIGHT_BLUE}%s${ANSI_NOCOLOR}\n" "Content of '__ASSETS__.md' ($(stat --printf="%s" "__ASSETS__.md") B) ...." + cat __ASSETS__.md + printf "::endgroup::\n" + else + printf "${ANSI_LIGHT_YELLOW}No '__ASSETS__.md' found.${ANSI_NOCOLOR}\n" + fi + if [[ -s __FOOTER__.md ]]; then + printf "::group::${ANSI_LIGHT_BLUE}%s${ANSI_NOCOLOR}\n" "Content of '__FOOTER__.md' ($(stat --printf="%s" "__FOOTER__.md") B) ...." + cat __FOOTER__.md + printf "::endgroup::\n" + else + printf "${ANSI_LIGHT_YELLOW}No '__FOOTER__.md' found.${ANSI_NOCOLOR}\n" + fi + + # Print final release notes + printf "::group::${ANSI_LIGHT_BLUE}%s${ANSI_NOCOLOR}\n" "Content of '__NOTES__.md' ($(stat --printf="%s" "__NOTES__.md") B) ...." + cat __NOTES__.md + printf "::endgroup::\n" + + - name: ๐Ÿ“‘ Update release notes + id: updateReleaseNotes + run: | + set +e + + ANSI_LIGHT_RED=$'\x1b[91m' + ANSI_LIGHT_GREEN=$'\x1b[92m' + ANSI_LIGHT_YELLOW=$'\x1b[93m' + ANSI_LIGHT_BLUE=$'\x1b[94m' + ANSI_NOCOLOR=$'\x1b[0m' + + export GH_TOKEN=${{ github.token }} + + if [[ -s __ASSETS__.md ]]; then + addNotes=("--notes-file" "__ASSETS__.md") + else + printf " ${ANSI_LIGHT_RED}File '%s' not found.${ANSI_NOCOLOR}\n" "__ASSETS__.md" + printf "::error title=%s::%s\n" "InternalError" "File '__ASSETS__.md' not found." + exit 1 + fi + + printf "Updating release '%s' ... " "${{ inputs.tag }}" + message="$(gh release edit "${addNotes[@]}" "${{ inputs.tag }}" 2>&1)" + if [[ $? -eq 0 ]]; then + printf "${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}\n" + printf " Release page: %s\n" "${message}" + else + printf "${ANSI_LIGHT_RED}[FAILED]${ANSI_NOCOLOR}\n" + printf " ${ANSI_LIGHT_RED}Couldn't update release '%s' -> Error: '%s'.${ANSI_NOCOLOR}\n" "${{ inputs.tag }}" "${message}" + printf "::error title=%s::%s\n" "InternalError" "Couldn't update release '${{ inputs.tag }}' -> Error: '${message}'." + exit 1 + fi + - name: ๐Ÿ“‘ Remove draft state from Release Page id: removeDraft if: ${{ ! inputs.draft }} diff --git a/.github/workflows/_Checking_Nightly.yml b/.github/workflows/_Checking_Nightly.yml index c583c2c..865ed46 100644 --- a/.github/workflows/_Checking_Nightly.yml +++ b/.github/workflows/_Checking_Nightly.yml @@ -29,6 +29,7 @@ jobs: - name: ๐Ÿ–‰ Program run: | printf "%s\n" "Document other $(date --utc '+%d.%m.%Y - %H:%M:%S')" > document1.txt + printf "%s\n" "Document other $(date --utc '+%d.%m.%Y - %H:%M:%S')" > document2.txt printf "%s\n" "Program $(date --utc '+%d.%m.%Y - %H:%M:%S')" > program.py - name: ๐Ÿ“ค Upload artifact @@ -55,7 +56,7 @@ jobs: version=4.2.0 tool=myTool prog=program - tag: 4.2.0 + tag: v4.2.0 title: "Nightly Test Release" description: | This *nightly* release contains all latest and important artifacts created by %tool%'s CI pipeline. @@ -63,10 +64,14 @@ jobs: # %tool% %version% * %prog% + + # Attached files: + + %%ASSETS%% assets: | document: document1.txt: Documentation document: build.log: Logfile - %tool% - %tool% - other: document1.txt: SBOM - %version% + other: document2.txt: SBOM - %version% other: %prog%.py: Application - %tool% - %version% document:!archive1.zip: Archive 1 - zip document:!archive2.tgz: Archive 2 - tgz @@ -108,7 +113,7 @@ jobs: # artifact: file: labels: asset title document: document1.txt: doc,html: Documentation document: build.log: build,log: Logfile - %tool% - %tool% - other: document1.txt: build,SBOM:SBOM - %version% + other: document2.txt: build,SBOM:SBOM - %version% other: %prog%.py: app,binary:Application - %tool% - %version% document:!archive1.zip: Archive 1 - zip document:!archive2.tgz: Archive 2 - tgz From 69f7689c69c7260f67da572282aee1cd2d230a1f Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Wed, 17 Dec 2025 00:18:25 +0100 Subject: [PATCH 15/15] Removed releaser. --- releaser/DEVELOPMENT.md | 8 -- releaser/Dockerfile | 12 --- releaser/README.md | 181 ------------------------------- releaser/action.yml | 45 -------- releaser/composite/action.yml | 59 ----------- releaser/pyproject.toml | 2 - releaser/releaser.py | 193 ---------------------------------- 7 files changed, 500 deletions(-) delete mode 100644 releaser/DEVELOPMENT.md delete mode 100644 releaser/Dockerfile delete mode 100644 releaser/README.md delete mode 100644 releaser/action.yml delete mode 100644 releaser/composite/action.yml delete mode 100644 releaser/pyproject.toml delete mode 100755 releaser/releaser.py diff --git a/releaser/DEVELOPMENT.md b/releaser/DEVELOPMENT.md deleted file mode 100644 index 3fdc386..0000000 --- a/releaser/DEVELOPMENT.md +++ /dev/null @@ -1,8 +0,0 @@ -# Releaser Development - -- [pyTooling/pyAttributes](https://github.com/pyTooling/pyAttributes) or - [willmcgugan/rich](https://github.com/willmcgugan/rich) might be used to enhance the UX. - -- It might be desirable to have pyTooling.Version.SemVersion handle the regular expression from - [semver.org](https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string), and use - proper Python classes in **Releaser**. diff --git a/releaser/Dockerfile b/releaser/Dockerfile deleted file mode 100644 index 080b725..0000000 --- a/releaser/Dockerfile +++ /dev/null @@ -1,12 +0,0 @@ -FROM python:3.12-slim-bookworm -COPY releaser.py /releaser.py -RUN pip install PyGithub --progress-bar off \ - && apt update -qq \ - && apt install -y curl \ - && curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | \ - dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \ - && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | \ - tee /etc/apt/sources.list.d/github-cli.list > /dev/null \ - && apt update -qq \ - && apt install -y gh -CMD ["/releaser.py"] diff --git a/releaser/README.md b/releaser/README.md deleted file mode 100644 index b63de11..0000000 --- a/releaser/README.md +++ /dev/null @@ -1,181 +0,0 @@ -# Releaser - -**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. -Combined with a workflow that is executed periodically, **Releaser** allows to provide a fixed release name for users willing -to use daily/nightly artifacts of a project. - -Furthermore, when any [semver](https://semver.org) compilant tagged commit is pushed, **Releaser** can create a release -and upload assets. - -## Context - -GitHub provides official clients for the GitHub API through [github.com/octokit](https://github.com/octokit): - -- [octokit.js](https://github.com/octokit/octokit.js) ([octokit.github.io/rest.js](https://octokit.github.io/rest.js)) -- [octokit.rb](https://github.com/octokit/octokit.rb) ([octokit.github.io/octokit.rb](http://octokit.github.io/octokit.rb)) -- [octokit.net](https://github.com/octokit/octokit.net) ([octokitnet.rtfd.io](https://octokitnet.rtfd.io)) - -When GitHub Actions was released in 2019, two Actions were made available through -[github.com/actions](https://github.com/actions) for dealing with GitHub Releases: - -- [actions/create-release](https://github.com/actions/create-release) -- [actions/upload-release-asset](https://github.com/actions/upload-release-asset) - -However, those Actions were contributed by an employee in spare time, not officially supported by GitHub. -Therefore, they were unmaintained before GitHub Actions was out of the private beta -(see [actions/upload-release-asset#58](https://github.com/actions/upload-release-asset/issues/58)) -and, a year later, archived. -Those Actions are based on [actions/toolkit](https://github.com/actions/toolkit)'s hydrated version of octokit.js. - -From a practical point of view, [actions/github-script](https://github.com/actions/github-script) is the natural replacement to those Actions, since it allows to use a pre-authenticated *octokit.js* client along with the workflow run context. -Still, it requires writing plain JavaScript. - -Alternatively, there are non-official GitHub API libraries available in other languages (see [docs.github.com: rest/overview/libraries](https://docs.github.com/en/rest/overview/libraries)). -**Releaser** is based on [PyGithub/PyGithub](https://github.com/PyGithub/PyGithub), a Python client for the GitHub API. - -**Releaser** was originally created in [eine/tip](https://github.com/eine/tip), as an enhanced alternative to using -`actions/create-release` and `actions/upload-release-asset`, in order to cover certain use cases that were being -migrated from Travis CI to GitHub Actions. -The main limitation of GitHub's Actions was/is verbosity and not being possible to dynamically define the list of assets -to be uploaded. - -On the other hand, GitHub Actions artifacts do require login in order to download them. -Conversely, assets of GitHub Releases can be downloaded without login. -Therefore, in order to make CI results available to the widest audience, some projects prefer having tarballs available -as assets. -In this context, one of the main use cases of **Releaser** is pushing artifacts as release assets. -Thus, the name of the Action. - -GitHub provides an official CLI tool, written in golang: [cli/cli](https://github.com/cli/cli). -When the Python version of **Releaser** was written, `cli` was evaluated as an alternative to *PyGitHub*. -`gh release` was (and still is) not flexible enough to update the reference of a release, without deleting and -recreating it (see [cli.github.com: manual/gh_release_create](https://cli.github.com/manual/gh_release_create)). -Deletion and recreation is unfortunate, because it notifies all the watchers of a repository -(see [eine/tip#111](https://github.com/eine/tip/issues/111)). -However, [cli.github.com: manual/gh_release_upload](https://cli.github.com/manual/gh_release_upload) handles uploading -artifacts as assets faster and with better stability for larger files than *PyGitHub* -(see [msys2/msys2-installer#36](https://github.com/msys2/msys2-installer/pull/36)). -Furthermore, the GitHub CLI is installed on GitHub Actions' default virtual environments. -Although `gh` does not support login through SSH (see [cli/cli#3715](https://github.com/cli/cli/issues/3715)), on GitHub -Actions a token is available `${{ github.token }}`. -Therefore, **Releaser** uses `gh release upload` internally. - -## Usage - -The following block shows a minimal YAML workflow file: - -```yml -name: 'workflow' - -on: - schedule: - - cron: '0 0 * * 5' - -jobs: - mwe: - runs-on: ubuntu-24.04 - steps: - - # Clone repository - - uses: actions/checkout@v5 - - # Build your application, tool, artifacts, etc. - - name: Build - run: | - echo "Build some tool and generate some artifacts" > artifact.txt - - # Update tag and pre-release - # - Update (force-push) tag to the commit that is used in the workflow. - # - Upload artifacts defined by the user. - - uses: pyTooling/Actions/releaser@r0 - with: - token: ${{ secrets.GITHUB_TOKEN }} - files: | - artifact.txt - README.md -``` - -### Composite Action - -The default implementation of **Releaser** is a Container Action. -Therefore, a pre-built container image is pulled before starting the job. -Alternatively, a Composite Action version is available: `uses: pyTooling/Actions/releaser/composite@main`. -The Composite version installs the dependencies on the host (the runner environment), instead of using a container. -Both implementations are functionally equivalent from **Releaser**'s point of view; however, the Composite Action allows -users to tweak the version of Python by using [actions/setup-python](https://github.com/actions/setup-python) before. - -## Options - -All options can be optionally provided as environment variables: `INPUT_TOKEN`, `INPUT_FILES`, `INPUT_TAG`, `INPUT_RM` -and/or `INPUT_SNAPSHOTS`. - -### token (required) - -Token to make authenticated API calls; can be passed in using `{{ secrets.GITHUB_TOKEN }}`. - -### files (required) - -Either a single filename/pattern or a multi-line list can be provided. All the artifacts are uploaded regardless of the -hierarchy. - -For creating/updating a release without uploading assets, set `files: none`. - -### tag - -The default tag name for the tip/nightly pre-release is `tip`, but it can be optionally overriden through option `tag`. - -### rm - -Set option `rm` to `true` for systematically removing previous artifacts (e.g. old versions). -Otherwise (by default), all previours artifacts are preserved or overwritten. - -Note: - If all the assets are removed, or if the release itself is removed, tip/nightly assets won't be available for - users until the workflow is successfully run. - For instance, Action [setup-ghdl-ci](https://github.com/ghdl/setup-ghdl-ci) uses assets from [ghdl/ghdl: releases/tag/nightly](https://github.com/ghdl/ghdl/releases/tag/nightly). - Hence, it is recommended to try removing the conflictive assets only, in order to maximise the availability. - -### snapshots - -Whether to create releases from any tag or to treat some as snapshots. -By default, all the tags with non-empty `prerelease` field (see [semver.org: Is there a suggested regular expression (RegEx) to check a SemVer string?](https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string)) -are considered snapshots; neither a release is created nor assets are uploaded. - -## Advanced/complex use cases - -**Releaser** is essentially a very thin wrapper to use the GitHub Actions context data along with the classes -and methods of PyGithub. - -Similarly to [actions/github-script](https://github.com/actions/github-script), users with advanced/complex requirements -might find it desirable to write their own Python script, instead of using **Releaser**. -In fact, since `shell: python` is supported in GitHub Actions, using Python does *not* require any Action. -For prototyping purposes, the following job might be useful: - -```yml - Release: - name: '๐Ÿ“ฆ Release' - runs-on: ubuntu-24.04 - needs: - - ... - if: github.event_name != 'pull_request' && (github.ref == 'refs/heads/master' || contains(github.ref, 'refs/tags/')) - steps: - - - uses: actions/download-artifact@v3 - - - shell: bash - run: pip install PyGithub --progress-bar off - - - name: Set list of files for uploading - id: files - shell: python - run: | - from github import Github - print("ยท Get GitHub API handler (authenticate)") - gh = Github('${{ github.token }}') - print("ยท Get Repository handler") - gh_repo = gh.get_repo('${{ github.repository }}') -``` - -Find a non-trivial use case at [msys2/msys2-autobuild](https://github.com/msys2/msys2-autobuild). diff --git a/releaser/action.yml b/releaser/action.yml deleted file mode 100644 index 62068a4..0000000 --- a/releaser/action.yml +++ /dev/null @@ -1,45 +0,0 @@ -# ==================================================================================================================== # -# Authors: # -# Unai Martinez-Corral # -# # -# ==================================================================================================================== # -# Copyright 2020-2025 The pyTooling Authors # -# # -# Licensed under the Apache License, Version 2.0 (the "License"); # -# you may not use this file except in compliance with the License. # -# You may obtain a copy of the License at # -# # -# http://www.apache.org/licenses/LICENSE-2.0 # -# # -# Unless required by applicable law or agreed to in writing, software # -# distributed under the License is distributed on an "AS IS" BASIS, # -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -# See the License for the specific language governing permissions and # -# limitations under the License. # -# # -# SPDX-License-Identifier: Apache-2.0 # -# ==================================================================================================================== # -name: 'Releaser' -description: 'Publish releases, upload assets and update tip/nightly tags' -inputs: - token: - description: 'Token to make authenticated API calls; can be passed in using {{ secrets.GITHUB_TOKEN }}' - required: true - files: - description: 'Multi-line list of glob patterns describing the artifacts to be uploaded' - required: true - tag: - description: 'Name of the tag that corresponds to the tip/nightly pre-release' - required: false - default: tip - rm: - description: 'Whether to delete all the previous artifacts, or only replacing the ones with the same name' - required: false - default: false - snapshots: - description: 'Whether to create releases from any tag or to treat some as snapshots' - required: false - default: true -runs: - using: 'docker' - image: 'docker://ghcr.io/pytooling/releaser' diff --git a/releaser/composite/action.yml b/releaser/composite/action.yml deleted file mode 100644 index 3f4e638..0000000 --- a/releaser/composite/action.yml +++ /dev/null @@ -1,59 +0,0 @@ -# ==================================================================================================================== # -# Authors: # -# Unai Martinez-Corral # -# # -# ==================================================================================================================== # -# Copyright 2020-2025 The pyTooling Authors # -# # -# Licensed under the Apache License, Version 2.0 (the "License"); # -# you may not use this file except in compliance with the License. # -# You may obtain a copy of the License at # -# # -# http://www.apache.org/licenses/LICENSE-2.0 # -# # -# Unless required by applicable law or agreed to in writing, software # -# distributed under the License is distributed on an "AS IS" BASIS, # -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -# See the License for the specific language governing permissions and # -# limitations under the License. # -# # -# SPDX-License-Identifier: Apache-2.0 # -# ==================================================================================================================== # -name: 'Releaser' -description: 'Publish releases, upload assets and update tip/nightly tags' -inputs: - token: - description: 'Token to make authenticated API calls; can be passed in using {{ secrets.GITHUB_TOKEN }}' - required: true - files: - description: 'Multi-line list of glob patterns describing the artifacts to be uploaded' - required: true - tag: - description: 'Name of the tag that corresponds to the tip/nightly pre-release' - required: false - default: tip - rm: - description: 'Whether to delete all the previous artifacts, or only replacing the ones with the same name' - required: false - default: false - snapshots: - description: 'Whether to create releases from any tag or to treat some as snapshots' - required: false - default: true -runs: - using: 'composite' - steps: - - - shell: bash - run: | - [ "$(source /etc/os-release && echo $VERSION_ID)" == "24.04" ] && UBUNTU_2404_ARGS='--break-system-packages' || unset UBUNTU_2404_ARGS - pip install --disable-pip-version-check --progress-bar off $UBUNTU_2404_ARGS PyGithub - - - shell: bash - run: '''${{ github.action_path }}/../releaser.py''' - env: - INPUT_TOKEN: ${{ inputs.token }} - INPUT_FILES: ${{ inputs.files }} - INPUT_TAG: ${{ inputs.tag }} - INPUT_RM: ${{ inputs.rm }} - INPUT_SNAPSHOTS: ${{ inputs.snapshots }} diff --git a/releaser/pyproject.toml b/releaser/pyproject.toml deleted file mode 100644 index 55ec8d7..0000000 --- a/releaser/pyproject.toml +++ /dev/null @@ -1,2 +0,0 @@ -[tool.black] -line-length = 120 diff --git a/releaser/releaser.py b/releaser/releaser.py deleted file mode 100755 index a75d1ad..0000000 --- a/releaser/releaser.py +++ /dev/null @@ -1,193 +0,0 @@ -#!/usr/bin/env python3 -# ==================================================================================================================== # -# Authors: # -# Patrick Lehmann # -# Unai Martinez-Corral # -# # -# ==================================================================================================================== # -# Copyright 2020-2025 The pyTooling Authors # -# # -# Licensed under the Apache License, Version 2.0 (the "License"); # -# you may not use this file except in compliance with the License. # -# You may obtain a copy of the License at # -# # -# http://www.apache.org/licenses/LICENSE-2.0 # -# # -# Unless required by applicable law or agreed to in writing, software # -# distributed under the License is distributed on an "AS IS" BASIS, # -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -# See the License for the specific language governing permissions and # -# limitations under the License. # -# # -# SPDX-License-Identifier: Apache-2.0 # -# ==================================================================================================================== # -import re -from sys import argv as sys_argv, stdout, exit as sys_exit -from os import environ, getenv -from glob import glob -from pathlib import Path -from github import Github, GithubException -from subprocess import check_call - - -paramTag = getenv("INPUT_TAG", "tip") -paramFiles = getenv("INPUT_FILES", None).split() -paramRM = getenv("INPUT_RM", "false") == "true" -paramSnapshots = getenv("INPUT_SNAPSHOTS", "true").lower() == "true" -paramToken = ( - environ["GITHUB_TOKEN"] - if "GITHUB_TOKEN" in environ - else environ["INPUT_TOKEN"] - if "INPUT_TOKEN" in environ - else None -) -paramRepo = getenv("GITHUB_REPOSITORY", None) -paramRef = getenv("GITHUB_REF", None) -paramSHA = getenv("GITHUB_SHA", None) - - -def GetListOfArtifacts(argv, files): - print("ยท Get list of artifacts to be uploaded") - args = files if files is not None else [] - if len(argv) > 1: - args += argv[1:] - if len(args) == 1 and args[0].lower() == "none": - print("! Skipping 'files' because it's set to 'none'.") - return [] - elif len(args) == 0: - stdout.flush() - raise (Exception("Glob patterns need to be provided as positional arguments or through envvar 'INPUT_FILES'!")) - else: - flist = [] - for item in args: - print(f" glob({item!s}):") - for fname in [fname for fname in glob(item, recursive=True) if not Path(fname).is_dir()]: - if Path(fname).stat().st_size == 0: - print(f" - ! Skipping empty file {fname!s}.") - continue - print(f" - {fname!s}") - flist.append(fname) - if len(flist) < 1: - stdout.flush() - raise (Exception("Empty list of files to upload/update!")) - return sorted(flist) - - -def GetGitHubAPIHandler(token): - print("ยท Get GitHub API handler (authenticate)") - if token is not None: - return Github(token) - raise (Exception("Need credentials to authenticate! Please, provide 'GITHUB_TOKEN' or 'INPUT_TOKEN'")) - - -def CheckRefSemVer(gh_ref, tag, snapshots): - print("ยท Check SemVer compliance of the reference/tag") - env_tag = None - if gh_ref[0:10] == "refs/tags/": - env_tag = gh_ref[10:] - if env_tag != tag: - rexp = r"^(?P0|[1-9]\d*)\.(?P0|[1-9]\d*)\.(?P0|[1-9]\d*)(?:-(?P(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$" - semver = re.search(rexp, env_tag) - if semver == None and env_tag[0] == "v": - semver = re.search(rexp, env_tag[1:]) - tag = env_tag - if semver == None: - print(f"! Could not get semver from {gh_ref!s}") - print(f"! Treat tag '{tag!s}' as a release") - return (tag, env_tag, False) - else: - if semver.group("prerelease") is None: - # is a regular semver compilant tag - return (tag, env_tag, False) - elif snapshots: - # is semver compilant prerelease tag, thus a snapshot (we skip it) - print("! Skipping snapshot prerelease.") - sys_exit() - - return (tag, env_tag, True) - - -def GetRepositoryHandler(gh, repo): - print("ยท Get Repository handler") - if repo is None: - stdout.flush() - raise (Exception("Repository name not defined! Please set 'GITHUB_REPOSITORY")) - return gh.get_repo(repo) - - -def GetOrCreateRelease(gh_repo, tag, sha, is_prerelease): - print("ยท Get Release handler") - gh_tag = None - try: - gh_tag = gh_repo.get_git_ref(f"tags/{tag!s}") - except Exception: - stdout.flush() - - if gh_tag: - try: - return (gh_repo.get_release(tag), False) - except Exception: - return (gh_repo.create_git_release(tag, tag, "", draft=True, prerelease=is_prerelease), True) - else: - err_msg = f"Tag/release '{tag!s}' does not exist and could not create it!" - if sha is None: - raise (Exception(err_msg)) - try: - return ( - gh_repo.create_git_tag_and_release( - tag, "", tag, "", sha, "commit", draft=True, prerelease=is_prerelease - ), - True, - ) - except Exception: - raise (Exception(err_msg)) - - -def UpdateReference(gh_release, tag, sha, is_prerelease, is_draft): - print("ยท Update Release reference (force-push tag)") - - if is_draft: - # Unfortunately, it seems not possible to update fields 'created_at' or 'published_at'. - print(" > Update (pre-)release") - gh_release.update_release( - gh_release.title, - "" if gh_release.body is None else gh_release.body, - draft=False, - prerelease=is_prerelease, - tag_name=gh_release.tag_name, - target_commitish=gh_release.target_commitish, - ) - - if sha is not None: - print(f" > Force-push '{tag!s}' to {sha!s}") - gh_repo.get_git_ref(f"tags/{tag!s}").edit(sha) - - -files = GetListOfArtifacts(sys_argv, paramFiles) -stdout.flush() -[tag, env_tag, is_prerelease] = CheckRefSemVer(paramRef, paramTag, paramSnapshots) -stdout.flush() -gh_repo = GetRepositoryHandler(GetGitHubAPIHandler(paramToken), paramRepo) -stdout.flush() -[gh_release, is_draft] = GetOrCreateRelease(gh_repo, tag, paramSHA, is_prerelease) -stdout.flush() - -if paramRM: - print("ยท RM set. All previous assets are being cleared...") - for asset in gh_release.get_assets(): - print(f" - {asset.name}") - asset.delete_asset() -stdout.flush() - -if len(files) > 0: - print("ยท Upload assets") - env = environ.copy() - env["GITHUB_TOKEN"] = paramToken - cmd = ["gh", "release", "upload", "--repo", paramRepo, "--clobber", tag] + files - print(f" > {' '.join(cmd)}") - check_call(cmd, env=env) - stdout.flush() -else: - print("! Skipping uploading assets because the file list is empty.") - -UpdateReference(gh_release, tag, paramSHA if env_tag is None else None, is_prerelease, is_draft)