ci: include .shipper/ hidden dir in release workflow artifact uploads#89
Conversation
`actions/upload-artifact@v7` defaults to `include-hidden-files: false`,
which skips dot-prefixed directories. The `.shipper/` state directory
(plan.txt, events.jsonl, receipt.json, state.json, lock) is hidden by
convention and was therefore being silently excluded from every
`.shipper/` upload step in `release.yml`.
Observed symptom during a rehearsal on `main`
(workflow_dispatch mode=rehearse, run 24500573949):
##[warning]No files were found with the provided path: .shipper/.
No artifacts will be uploaded.
Preflight completed successfully (Plan ID printed, 12 packages, dry-run
✓) and files were in fact present on disk — only the upload filter
dropped them.
Add `include-hidden-files: true` to every upload step that uploads
`.shipper/`:
- shipper-state-plan (publish-crates-io, pre-publish evidence)
- shipper-state-preflight (publish-crates-io, pre-publish evidence)
- shipper-state-final (publish-crates-io, post-publish evidence)
- shipper-rehearse-<run> (release-rehearse)
- shipper-state-resume-<run> (release-resume, post-resume evidence)
The binary artifact upload at line 104 (`shipper-${{ matrix.target }}.*`)
is unaffected — it uploads non-hidden files.
Effect: the evidence trail is intact before the first crates.io wave,
including plan/preflight artifacts that upload *before* any publish
happens, so a runner death mid-train still preserves the pre-publish
state.
|
Note Gemini is unable to generate a review for this pull request due to the file types involved not being currently supported. |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (1)
Summary by CodeRabbit
WalkthroughModified the GitHub Actions release workflow to include hidden files (prefixed with dots) when uploading Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~5 minutes Poem
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
Summary
Adds `include-hidden-files: true` to every `actions/upload-artifact@v7` step in `release.yml` that uploads `.shipper/`. Five upload steps affected:
The binary upload at line 104 (`shipper-${{ matrix.target }}.*`) is unaffected — it uploads non-hidden files.
Root cause
`actions/upload-artifact@v7` defaults to `include-hidden-files: false`, which causes it to skip any dot-prefixed directory and its contents. `.shipper/` is hidden by convention, so every upload from that path silently dropped its contents.
Observed symptom
Rehearsal run on `main` (#24500573949) logged:
```
##[warning]No files were found with the provided path: .shipper/.
No artifacts will be uploaded.
```
Despite this, the preflight step succeeded functionally — the plan_id matched the local-rehearsal plan_id exactly (`23ff8f854218ce1fef53dea51d9a0fcfccd87a55281052ea9eb843b6657238a0`), 12 packages reported, `Dry-run passed: 12`. Files were on disk; only the upload filter dropped them.
Reproduced locally: the same `shipper preflight` invocation writes `.shipper/events.jsonl` (27 events, ~8.5 KB). The CI-vs-local difference is entirely the artifact-upload filter, not the CLI.
Why this matters before tagging
The `shipper-state-plan` and `shipper-state-preflight` artifacts upload before any crates.io upload happens. If they silently drop their contents:
`shipper publish` itself writes state aggressively, so `shipper-state-final` would at least contain state.json and receipt.json even without the fix. But the train is safer with the full evidence chain intact.
Plan ID stability
This change only touches `.github/workflows/release.yml`. Plan ID is derived from workspace package identity + dependency graph, not workflow files. Re-rehearsal from this branch will confirm plan ID still matches `23ff8f85…7238a0`.
Test plan