Document Audita's annotated tag delivery failure
This commit is contained in:
109
docs/roadmap/audita-bug-report.md
Normal file
109
docs/roadmap/audita-bug-report.md
Normal file
@@ -0,0 +1,109 @@
|
||||
# Audita Bug Report: Annotated Tag IDs in Woodpecker Delivery Examples
|
||||
|
||||
**Status:** Reported; upstream correction requested.
|
||||
**Reviewed release:** ReleaseKit v0.4.1, commit
|
||||
`2d5a8110c61e31daf8698766114ae305d0e0e469`.
|
||||
**Affected consumer:** Audita v3.1.0.
|
||||
|
||||
## Summary and Impact
|
||||
|
||||
Audita copied ReleaseKit's module-selected Woodpecker delivery example. Its
|
||||
v3.1.0 delivery pipeline stopped during bootstrap because the example assumes
|
||||
`CI_COMMIT_SHA` always names a commit. In this Gitea/Woodpecker tag event, that
|
||||
value named the annotated tag object instead. Comparing it directly with the
|
||||
tag's peeled commit failed under `set -e`.
|
||||
|
||||
The failure occurred before Go bootstrap or ReleaseKit execution. This is a
|
||||
workflow/example integration defect; ReleaseKit's `ci-deliver --commit` contract
|
||||
correctly expects the source commit ID. Source publication succeeded; binary
|
||||
delivery did not begin.
|
||||
|
||||
## Verified Evidence
|
||||
|
||||
The clone log fetched and reset the checkout using object
|
||||
`473d29007172cdb0a928e1dcc0556d3e8f469931`. Inspection of Audita's published tag
|
||||
confirmed:
|
||||
|
||||
| Identity | Object ID |
|
||||
| --- | --- |
|
||||
| Annotated `v3.1.0` tag object | `473d29007172cdb0a928e1dcc0556d3e8f469931` |
|
||||
| Source commit identified by that tag | `2d41748006d785bc3ee1350927ed5424feaf294b` |
|
||||
|
||||
`git cat-file -t` identifies the first object as `tag`.
|
||||
`git rev-parse 'v3.1.0^{commit}'` returns the second object. The authoritative
|
||||
remote's tag and peeled-tag refs agree with these values.
|
||||
|
||||
The existing example assigns `expected_commit` from the raw lowercased event
|
||||
ID, then compares it with `refs/tags/${CI_COMMIT_TAG}^{commit}`. Consequently,
|
||||
the script compares two different object identities and exits with status 1.
|
||||
Its multiline log contains the script text without an explanatory error from
|
||||
the failed `test`, which initially made the failure location unclear.
|
||||
|
||||
## Minimal Reproduction
|
||||
|
||||
In a checkout containing Audita's published `v3.1.0` tag:
|
||||
|
||||
```sh
|
||||
CI_COMMIT_TAG=v3.1.0
|
||||
CI_COMMIT_SHA=473d29007172cdb0a928e1dcc0556d3e8f469931
|
||||
tag_commit=$(git rev-parse "refs/tags/${CI_COMMIT_TAG}^{commit}")
|
||||
expected_commit=$(printf '%s' "$CI_COMMIT_SHA" | tr '[:upper:]' '[:lower:]')
|
||||
test "$tag_commit" = "$expected_commit"
|
||||
```
|
||||
|
||||
The final command fails. Resolving `${CI_COMMIT_SHA}^{commit}` instead returns
|
||||
the same source commit as the tag and makes the comparison succeed.
|
||||
|
||||
## Recommended Correction
|
||||
|
||||
After fetching the event tag, resolve the event object to its commit before
|
||||
comparison:
|
||||
|
||||
```sh
|
||||
expected_commit=$(git rev-parse --verify "$${CI_COMMIT_SHA}^{commit}")
|
||||
```
|
||||
|
||||
Continue comparing the event's resolved commit with the selected tag's peeled
|
||||
commit and checking the detached HEAD and clean worktree. Pass the resolved
|
||||
value to ReleaseKit:
|
||||
|
||||
```sh
|
||||
--commit "$${expected_commit}"
|
||||
```
|
||||
|
||||
The doubled dollar signs above preserve Woodpecker's existing interpolation
|
||||
escaping. Peeling the event ID independently preserves the mismatch check;
|
||||
simply replacing it with the selected tag's commit would discard that check.
|
||||
Both annotated tag object IDs and commit IDs resolve through this approach.
|
||||
ReleaseKit's CLI/API need no broader interpretation of `--commit`.
|
||||
|
||||
Apply the correction consistently to:
|
||||
|
||||
- [Module-selected tag delivery](../../examples/woodpecker/tag-delivery.yml),
|
||||
the example Audita adopted.
|
||||
- [ReleaseKit source delivery](../../examples/woodpecker/releasekit-source-delivery.yml).
|
||||
- [Multi-module Woodpecker delivery](../../examples/multi-module/woodpecker.yml).
|
||||
- [Delivery consumer guidance](../consumers/delivery.md#woodpecker-tag-workflows),
|
||||
including the separately installed-tool example that passes the raw event ID.
|
||||
Review other maintained copies of the same bootstrap when implementing.
|
||||
|
||||
## Verification and Consumer Resolution
|
||||
|
||||
Use an offline Git fixture to execute the example bootstrap with an annotated
|
||||
tag-object event, an annotated tag's commit event, and a lightweight tag's commit
|
||||
event. Verify that the delivery invocation receives the peeled source commit
|
||||
and that an unrelated event commit is rejected before delivery. Stub tool
|
||||
bootstrap/delivery at the external boundary; hosted uploads or real credentials
|
||||
are unnecessary for this regression.
|
||||
|
||||
Audita implemented this correction in commit
|
||||
[`7cd5edd65027c25fd3d1fd927695d403e9dd8311`](https://gitea.maximumdirect.net/eric/audita/src/commit/7cd5edd65027c25fd3d1fd927695d403e9dd8311).
|
||||
Its executable-workflow regression reproduced the annotated-tag failure before
|
||||
the fix, passed afterward, and retained the unrelated-commit rejection. The
|
||||
complete offline Audita suite also passed.
|
||||
|
||||
Published tags and tagged workflows remain unchanged. Future consumers should
|
||||
receive corrected examples; retrying an existing tag's unchanged faulty workflow
|
||||
will still fail. Existing artifacts can be delivered from the original tagged
|
||||
source using the resolved commit ID through the documented delivery path,
|
||||
without moving the source tag or replacing published contents.
|
||||
Reference in New Issue
Block a user