Skip to content

🩹 [Patch]: Workflow artifacts stay isolated - #541

Draft
Marius Storhaug (MariusStorhaug) wants to merge 6 commits into
mainfrom
complete-artifact-path-isolation
Draft

🩹 [Patch]: Workflow artifacts stay isolated#541
Marius Storhaug (MariusStorhaug) wants to merge 6 commits into
mainfrom
complete-artifact-path-isolation

Conversation

@MariusStorhaug

@MariusStorhaug Marius Storhaug (MariusStorhaug) commented Sep 10, 2026

Copy link
Copy Markdown
Member

Generated analyzer reports now stay in each consumer worktree’s .PSModule/TestResult directory, and documentation builds no longer bypass consumer ignore rules or stage generated artifacts.

Fixed: Generated workflow artifacts

Source and module analyzer jobs use the released PSModule/Invoke-ScriptAnalyzer v5.0.1 SHA and write deterministic per-suite, per-OS reports under .PSModule/TestResult/, relative to their configured consumer working directory. Documentation generation continues to pass .PSModule/docs to site publication as an artifact without committing generated files to the consumer repository.

Changed: Artifact-root reference

The pipeline-stage reference documents .PSModule as the consumer artifact root for module, documentation, site, test-result, and code-coverage output. It also distinguishes runner-only aggregation and lint output from consumer repository artifacts.

Adopting this release

No configuration, code, or invocation changes are required beyond selecting this release.

Release impact

  • Effective decision: release:patch.
  • Semantic effect: Patch release; existing caller inputs and generated documentation publication behavior remain compatible.
  • Release/base coordinates: Final coordinates are resolved by the release process.

Technical details

Consumer change record

Identifier / surface Before After Applicability / prerequisites Consumer action Verification
Analyzer test results The v5.0.0 Analyzer action did not honor Process’s report-path override through nested Invoke-Pester and could create root-level artifacts. Both analyzer workflows use PSModule/Invoke-ScriptAnalyzer@9acddbd55ff4634b738be3a219c76e3676aaf1cd # v5.0.1 and pass .PSModule/TestResult/<suite>-<os>-TestResult-Report.xml, resolved relative to the configured working directory. All consumers that enable source or module linting. None. Default and manifest consumer fixtures verify report creation, report paths, and the absence of root TestResult, CodeCoverage, and .temp directories.
Generated documentation Build-Docs renamed .gitignore and broadly staged the consumer worktree. Documentation remains the .PSModule/docs workflow artifact consumed by Build-Site; no generated files are staged. Consumers building documentation. None. Consumer fixture rejects .gitignore renames, broad staging, and legacy root artifact paths.
Artifact-root reference The location and scope of generated consumer artifacts were implicit in workflow code. Pipeline stages lists the .PSModule artifact directories and runner-only exceptions. Framework users and maintainers. None. The docs build and Markdown lint pass.

Template baseline

No template baseline applies to this framework workflow change.

Maintainer evidence

Test-first assertions were run red before the Analyzer v5.0.1 pin and report-path correction, then green afterward. The first released-pin fixture run exposed that TestResult_OutputPath resolves relative to the Analyzer WorkingDirectory; Process now passes a .PSModule/TestResult/... path rather than duplicating the consumer-relative directory. The default and manifest fixtures pass at 16077b909245356754319df78eb09cea7644ccd9. The artifact-root reference was added at 2001551566898e59efc764e68450c2238667d607; its docs build and Markdown lint pass.

Relevant issues (or links)

Related work

Marius Storhaug (MariusStorhaug) added a commit to PSModule/Invoke-ScriptAnalyzer that referenced this pull request Sep 10, 2026
Configured `TestResult_OutputPath` and `CodeCoverage_OutputPath` values
now reach `Invoke-Pester` unchanged, so enabled reports are written to
the locations selected by the caller. Callers that leave either input
empty retain the existing `Invoke-Pester` fallback path relative to
`WorkingDirectory`.

## Fixed: Configured report paths

The action now uses `Invoke-Pester` v5.1.1, which honors configured
report output paths and keeps its action-private temporary state outside
the caller worktree. Set either input independently when that report
needs a custom destination; the other report continues to use its
configured or default behavior.

```yaml
with:
  TestResult_OutputPath: artifacts/TestResult/results.xml
  CodeCoverage_OutputPath: artifacts/CodeCoverage/coverage.xml
```

## Adopting this release

1. Select the release containing this fix in the
`PSModule/Invoke-ScriptAnalyzer` workflow reference.
2. Existing callers that leave both output-path inputs empty need no
configuration, code, or invocation changes; reports continue to use the
established `Invoke-Pester` defaults below `WorkingDirectory`.
3. Existing callers that already set `TestResult_OutputPath` or
`CodeCoverage_OutputPath` need no configuration change; the configured
location is now honored. Set either input when a report should use a new
custom destination.

## Release impact

| Field | Value |
| --- | --- |
| Effective decision | `release:patch`, selected for a
backward-compatible report-path correction. |
| Semantic effect | Patch, stable; configured output paths now work as
documented and omitted inputs retain their prior behavior. |
| Release/base coordinates | Final coordinates are resolved by the
release process at publication. The published record supplies the target
version, tag, immutable source, version-computation base, and
release/source baseline. |

---
<details>
<summary>Technical details</summary>

### Consumer change record

| Identifier / surface | Before | After | Applicability / prerequisites
| Consumer action | Verification |
| --- | --- | --- | --- | --- | --- |
| REPORT-PATH-OVERRIDE / `TestResult_OutputPath`,
`CodeCoverage_OutputPath` | `Invoke-Pester` v5.1.0 overwrote values
forwarded by this action, so configured destinations were not used. |
`Invoke-Pester` v5.1.1 retains each configured path. Empty inputs retain
`TestResult/PSScriptAnalyzer-TestResult-Report.xml` and
`CodeCoverage/PSScriptAnalyzer-CodeCoverage-Report.xml` below
`WorkingDirectory`. | Callers that enable test-result or code-coverage
reports. | Select this release. No change is needed for existing
configured paths or omitted inputs; optionally set either input to
choose a destination. | The action-test suite verifies explicit generic
`artifacts/...` paths, XML and JSON report creation, absence of legacy
root report and `.temp` directories for the explicit case, and preserved
fallback paths when inputs are omitted. |

### Template baseline

Not applicable. This composite action does not consume an integration
template. Downstream framework adoption is tracked separately in
PSModule/Process-PSModule#541.

### Maintainer evidence

- `action.yml` pins the published `Invoke-Pester` v5.1.1 fix to
immutable commit `c5494aba3c07d7bfd81bdbbc9f301e8fa4a729fb`.
- The focused action-test jobs cover both explicit overrides and
omitted-input fallback behavior; `tests/Assert-ReportPaths.ps1` verifies
generated XML and JSON reports and expected directory isolation.
- `README.md` documents the preserved fallback behavior and generic
explicit override example.
- Implementation plan progress: complete. The report-path regression was
made red against v5.1.0 before the dependency was updated, then passed
with v5.1.1.
- Standards and framework alignment: reviewed GitHub Actions dependency
pinning, action input contracts, PowerShell test conventions, and
Markdown documentation; aligned.
- Issue convergence sweep: the completed diff addresses the configured
report-path regression only; no additional issues were identified as
fully satisfied.

| Changed surface | Standards checked | Framework docs checked | Result
|
| --- | --- | --- | --- |
| `action.yml` | Dependencies, GitHub Actions | Composite action input
contract; Invoke-Pester v5.1.1 release notes | Aligned |
| `.github/workflows/Action-Test.yml`, `tests/Assert-ReportPaths.ps1` |
Testing, GitHub Actions, PowerShell | Invoke-Pester report-path and
temporary-state contract | Aligned |
| `README.md` | Documentation, Markdown | GitHub Action input
documentation | Aligned |

</details>
<details>
<summary>Relevant issues (or links)</summary>

### Related work

- Depends on PSModule/Invoke-Pester#78
- Followed by PSModule/Process-PSModule#541
- Followed by PSModule/Invoke-Pester#85
</details>
@github-actions

Copy link
Copy Markdown

Super-linter summary

Language Validation result
CHECKOV Pass ✅
CSS Pass ✅
CSS_PRETTIER Pass ✅
GITHUB_ACTIONS Pass ✅
GITHUB_ACTIONS_ZIZMOR Pass ✅
GITLEAKS Pass ✅
GIT_MERGE_CONFLICT_MARKERS Pass ✅
HTML Pass ✅
JAVASCRIPT_ES Pass ✅
JAVASCRIPT_PRETTIER Pass ✅
MARKDOWN Pass ✅
NATURAL_LANGUAGE Pass ✅
POWERSHELL Pass ✅
PRE_COMMIT Pass ✅
SPELL_CODESPELL Pass ✅
TRIVY Pass ✅
YAML Pass ✅

All files and directories linted successfully

For more information, see the GitHub Actions workflow run

Powered by Super-linter

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant