Skip to content

ci: include .shipper/ hidden dir in release workflow artifact uploads#89

Merged
EffortlessSteven merged 1 commit into
mainfrom
ci/fix-rehearse-artifact-upload
Apr 16, 2026
Merged

ci: include .shipper/ hidden dir in release workflow artifact uploads#89
EffortlessSteven merged 1 commit into
mainfrom
ci/fix-rehearse-artifact-upload

Conversation

@EffortlessSteven

Copy link
Copy Markdown
Member

Summary

Adds `include-hidden-files: true` to every `actions/upload-artifact@v7` step in `release.yml` that uploads `.shipper/`. Five upload steps affected:

Step Used by
`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-` `release-rehearse`
`shipper-state-resume-` `release-resume`

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:

  • A runner death between preflight and publish would leave no recoverable pre-publish evidence.
  • A resume-via-artifact-download flow (`release-resume`, which pulls `shipper-state-final`) would have less state to work with.

`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

  • Dispatch `release.yml mode=rehearse` against `ci/fix-rehearse-artifact-upload`.
  • Confirm `shipper-rehearse-` artifact is produced and contains `plan.txt` + `events.jsonl`.
  • Confirm plan_id in the uploaded plan.txt matches `23ff8f854218ce1fef53dea51d9a0fcfccd87a55281052ea9eb843b6657238a0`.

`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.
@gemini-code-assist

Copy link
Copy Markdown

Note

Gemini is unable to generate a review for this pull request due to the file types involved not being currently supported.

@coderabbitai

coderabbitai Bot commented Apr 16, 2026

Copy link
Copy Markdown

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 405d6011-2fcc-44d4-8f73-5a878ee714b0

📥 Commits

Reviewing files that changed from the base of the PR and between 5beab9b and 0021973.

📒 Files selected for processing (1)
  • .github/workflows/release.yml

Summary by CodeRabbit

  • Chores
    • Updated internal release workflow configuration to ensure hidden files are properly included during artifact archival across multiple pipeline stages.

Walkthrough

Modified the GitHub Actions release workflow to include hidden files (prefixed with dots) when uploading shipper/ directory artifacts across five deployment stages: plan, preflight, final, rehearsal, and post-resume states.

Changes

Cohort / File(s) Summary
GitHub Actions Workflow Configuration
.github/workflows/release.yml
Added include-hidden-files: true parameter to five actions/upload-artifact@v7 steps that archive the .shipper/ directory for plan, preflight, final, rehearsal, and post-resume stages.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~5 minutes

Poem

🐰 Hop, hop, the hidden files now show,
Five artifacts with secrets to bestow,
The dotted paths emerge from shadow's veil,
A shipper's state—complete, no detail to fail! 🎉

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: adding include-hidden-files: true to artifact uploads for the .shipper/ directory in the release workflow.
Description check ✅ Passed The description is comprehensive and directly related to the changeset, explaining the root cause, observed symptoms, impact, and test plan for the artifact upload fix.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ci/fix-rehearse-artifact-upload

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@EffortlessSteven EffortlessSteven merged commit 535556b into main Apr 16, 2026
23 checks passed
@codecov

codecov Bot commented Apr 16, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

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