Changes
-
@r7consumers need no adjustment. No input, output, secret or default was added, renamed or removed anywhere
in this release. Repositories that already requestpagesindocumentation_stepsstart publishing documentation
again on their next release without any change on their side. -
IntermediateCleanUp.ymlis deprecated and will be removed inr8. It is superseded by
CleanupArtifacts.yml, whichCompletePipeline.ymlalready instantiates for both of its cleanup jobs. The template
now emits a deprecation warning as its first step, mirroringArtifactCleanUp.yml, and states the migration:# before sqlite_coverage_artifacts_prefix: ${{ fromJson(needs.Params.outputs.artifact_names).codecoverage_sqlite }}- xml_unittest_artifacts_prefix: ${{ fromJson(needs.Params.outputs.artifact_names).unittesting_xml }}- # after json: ${{ needs.Params.outputs.artifact_names }} artifact-json-ids: >- codecoverage_sqlite:-* unittesting_xml:-*
This deprecation is why the release is v7.15.0 and not a patch: semver requires a minor increment when public API
functionality is marked deprecated. -
CheckCodeQuality.yml'sartifactinput is now unused. It is kept declared, because removing an input from a
stable release branch breaks every consumer that passes it —CompletePipelinedoes. See the note at the bottom. -
All
ifexpressions inCompletePipeline.ymlthat combine a status check function with further terms are written
as folded block scalars, one term per line.
Bug Fixes
-
CompletePipeline.yml: documentation was never published to GitHub Pages when application testing is disabled.
PDFDocumentationandPublishToGitHubPageswere the last two jobs whoseifcarried no status check function:if: contains(inputs.documentation_steps, 'pages')
Without one, GitHub keeps the implicit
success(), and that is evaluated over the entire dependency closure, not
just overneeds. With the defaultapptest: 'false',AppTestingParamsandAppTestingare skipped, and that
state reaches both jobs throughPublishTestResults→Documentation. Those two survive on!cancelled(), but
surviving does not stop the propagation, so both documentation jobs were skipped although their condition was true
and all of their direct dependencies had succeeded.Present since v7.12.0, which reactivated application testing (
1a11cbb) and addedAppTestingto
PublishTestResults.needs. v7.14.0 (#236) converted the jobs that were failing loudly to!cancelled()but did not
reach these two, because they fail silently — a skipped job is not a red pipeline.Both now read:
if: >- ${{ !failure() && !cancelled() && contains(inputs.documentation_steps, 'pages') }}
!failure()rather thanalways(): a skipped dependency must no longer suppress the job, a failed one still
must — that was the pre-v7.12.0 behavior.Verified against the pyVHDLModel v0.38.0 release, modelling the job graph of
run 30691716593 against the observed results:job status function direct needsall successfulskipped ancestors result VersionCheckno yes – success Installno yes – success PDFDocumentationno yes AppTestingParams,AppTestingskipped PublishToGitHubPagesno yes AppTestingParams,AppTestingskipped Documentation,IntermediateCleanUp,ArtifactCleanUp,TriggerTaggedReleaseyes – AppTestingParams,AppTestingsuccess Every job without a status check function and with a skipped ancestor was skipped; every job without one and with a
clean ancestor set ran. No counterexample.Impact: no repository using
CompletePipeline.ymlhas published documentation since v7.12.0 (2026-07-13). Affected
releases are pyVHDLModel v0.38.0 and sphinx-reports v0.11.2; both can be republished by dispatchingPipelineon
their tags oncer7carries this release. -
PrepareJob.yml: submodules were never detected. The check tested for a file named.gitsubmodules; Git's file
is.gitmodules.has_submoduleswas therefore always'false', andgit_submodule_count,git_submodule_names
andgit_submodule_pathskept their initial empty values — for every repository, since the workflow was introduced.Verified against a scratch repository with two submodules:
has_submodules=true,count=2,names=libA:libB,
paths=deps/libA:deps/libB, andhas_submodules=falseonce.gitmodulesis removed.Nothing consumes these four outputs today, which is why nobody hit it.
-
CleanupArtifacts.yml: an unknown artifact ID raisedNameError. Both compute steps calledprintf(...)in
theircase _:fallback, but the step runsshell: python, whereprintfis not a function. Since ashell: python
step aborts on an exception, anartifact-json-idsentry that is not a key of the JSON dictionary meant no
artifact of that set was deleted and the cleanup job failed — not "one entry skipped".Reproduced against both revisions:
BEFORE -> exit code 1 NameError: name 'printf' is not defined. Did you mean: 'print'? AFTER -> Name 'unknown_key' not found in JSON dictionary. Artifact to delete: pyX-UnitTestReportSummary-XML-* pyX-Packages -
CheckCodeQuality.yml: the security scan could be skipped silently. TheBanditstep was guarded by
if: inputs.artifact != '', although the step writes its report to a fixed path (report/bandit/report.xml) and
never used that parameter. An empty artifact name skipped the scan while the job installed bandit, ran to the end
and reported success — a green security check that scanned nothing. The guard is removed.
Documentation
Everything in this section is documentation only; no job template behaviour depends on it.
-
The complete documentation rework (#245). Every
workflow_callinput, output and secret of every job template
now has a detail section and a summary-table row, cross-checked against the YAML by script. Highlights:- Three templates documented for the first time:
ApplicationTesting(was a.. todo::stub titled "idea"),
CheckCodeQualityandCleanupArtifacts(no page at all) — which is whyCompletePipelinehad been linking to
the deprecated cleanup template for the job it actually instantiates. VerifyDocswas a stub too; it is documented and marked on hold, since it is instantiated nowhere.CleanupArtifacts'artifact-json-idssyntax is written down for the first time.- 14 documented default values corrected against the workflow files, e.g.
reports/unit→report/unit. - Every Behavior list names the input parameter that configures, enables or disables each step.
- One convention for tool links (
:term:in prose,:term:X(:pypi:PyPI package)in dependency lists), one
convention for boolean parameters (Possible Values lists the values, Description explains them — applied to all
29 of them). Dependency.rstseparates what a job template installs from what the caller supplies throughrequirements,
apt,brewandpacboy.- Glossary gained
pyTooling/MiKTeX,wheel,upload-artifact,download-artifact,pylintandradon. - Index directives completed: 13 pages were missing entries for tools they mention.
- Three templates documented for the first time:
-
New Conditional Jobs section on the Development page (
doc/Deveopment.rst, previously a single.. todo::).
It documents the status check functions and the implicitsuccess(), the propagation of skipped jobs along the
transitive dependency closure with the defect above as the worked example, which function to pick for which kind of
job, and how to verify that a switch skips only what it should. The GitHub specifics live there instead of in
comments inside the workflow files. -
TagReleaseCommitdocuments why a dispatched tag pipeline is titled with the workflow name, and proposes
run-name: ${{ github.ref_type == 'tag' && github.ref_name || '' }}in the calling workflow as the fix. Untested
end to end — see the note below. -
The documentation builds with zero page-level Sphinx warnings.
Unit Tests
-
_Checking_NamespacePackage_Pipeline.ymlnow requests'html latex pdf'. It is the pipeline with application
testing disabled, so it combines a skipped upstream job with a job conditioned ondocumentation_steps:
PDFDocumentationmust run, and would have been skipped before this change.pagesis deliberately not added —
PublishToGitHubPagesdeploys, and the verification pipeline would overwrite this repository's own GitHub Pages
site. Testing that half needs a dry-run mode on the job template; recorded as a finding rather than approximated.Verified on run 30764122048:
AppTestingParamsand
AppTestingskipped,PDFDocumentationexecuted, run conclusion success. -
_Checking_CleanupArtifacts.ymlpasses anunknown_keyentry, so thecase _:branch is exercised by the
verification pipeline rather than only by a typo in production. -
_Checking_SimplePackage_Pipeline.ymlis green again. It had failed on every push for at least six runs, always
inCodeQuality / 🩺 Linting, on two findings in the dummy package (Missing function or method docstring,
Consider using 'sys.exit' instead).pylintexits non-zero for any message and the step has no
continue-on-error, so a real regression could not be told apart from the standing failure. Both fixtures now rate
10.00/10. -
All seven
_Checking_*workflows carryrun-name, so a dispatched tag run is titled with the tag. This repository
does not exercise that path — its own tags arrive aspushevents — so the line is correct but unproven here. -
The
PrepareJobsubmodule logic and theCleanupArtifactsfallback branch were executed offline against both
revisions before pushing; output quoted above. All changed shell scripts passbash -n, all changed workflows parse
as YAML.
Related Issues and Pull-Requests
- Contains #245 (documentation rework, finding A4) and #246 (three workflow fixes, findings A11, A12, A13), both
already merged intodev. - Follow-up to #236 (v7.14.0), Fix jobs being skipped when application testing is disabled, which fixed the same
defect class for six other jobs but missed the two that skip silently. - Regression introduced by
1a11cbb, Reactivated Application Testing, released with v7.12.0. - Reported from the VHDL/pyVHDLModel v0.38.0 release run,
where the release completed butPublishToGitHubPageswas skipped on bothmainand thev0.38.0tag.
Important
r7 must be updated after merging, or no consumer publishes documentation.
Note
CheckCodeQuality.yml's artifact input is now referenced nowhere. It is declared required: true, so it cannot be
dropped without breaking consumers that pass it on @r7. Two options for r8: remove it, or give it a purpose by
uploading the bandit XML report under that name.
Note
Open findings not addressed here: A7 (PDFDocumentation fails on 763 unresolved LaTeX references), A3
(PublishTestResults exercises the released package, not the branch), A10 (PublishToGitHubPages cannot be verified
without deploying), A16 (mingw_requirements bypasses the ./ path resolution), A17 and A18 (both scheduled for
r8).
Published from Verification of Pipeline Templates (Namespace Package) workflow triggered by Paebbels on 2026-08-03 23:37:35 UTC.
This automatic release was created by pyTooling/Actions::Release.yml