This document describes the release process for the OTel Arrow repository.
A single release version covers both the Go components (under go/ and
collector/) and the Rust workspace (under rust/otap-dataflow/).
The repository uses two GitHub Actions workflows to manage releases:
- Prepare Release: Renders pending changelog entries, bumps versions, and opens a pull request.
- Push Release: Publishes opted-in Rust crates, creates git tags, and publishes the GitHub release.
This two-step process ensures that all changes are reviewed before the release is published.
- Maintainer Access: Only repository maintainers can trigger the release workflows.
- Clean Repository: Ensure your local repository has no uncommitted changes.
- Pending changelog entries: Each user-facing PR should have added a
YAML fragment under
go/.chloggen/(for Go changes) orrust/otap-dataflow/.chloggen/(for Rust changes). The release workflow collapses these into the appropriate CHANGELOG at release time. - Protected environment: The
releaseGitHub environment exists with the required maintainers as approvers. - Trusted publishing: crates.io trusts
.github/workflows/push-release.ymlin this repository with thereleaseenvironment.
Contributors do not edit go/CHANGELOG.md or
rust/otap-dataflow/CHANGELOG.md directly. Instead, each PR adds a YAML
fragment to the corresponding .chloggen/ directory by copying
TEMPLATE.yaml to a new file (see the README in each directory). The
changelog workflow enforces this on PRs that target main.
At release time, the Prepare Release workflow runs make chlog-update VERSION=v<version>, which:
- Renders all pending entries from
go/.chloggen/*.yamlintogo/CHANGELOG.mdunder a new## v<version>heading. - Renders all pending entries from
rust/otap-dataflow/.chloggen/*.yamlintorust/otap-dataflow/CHANGELOG.mdunder a new## v<version>heading. - Deletes the consumed
.yamlentry files.
You can preview what the next release will look like locally:
make chlog-install
make chlog-preview- Inspect
go/.chloggen/andrust/otap-dataflow/.chloggen/and confirm the pending entries describe the changes you want to release. - Optionally run
make chlog-previewlocally for a rendered view. - Commit any final changes to the
mainbranch.
- Go to the Actions tab in the GitHub repository.
- Select the "Prepare Release" workflow.
- Click "Run workflow".
- Fill in the required inputs:
- Version: The new version number (e.g.,
0.48.0). - Dry run: Check this box to preview changes without making them.
- Version: The new version number (e.g.,
Before making actual changes, run the workflow in dry-run mode:
- Set "Dry run mode" to
true. - Review the output to ensure all planned changes are correct.
- Verify that the version increment makes sense.
- Check the rendered release-notes preview (with
## Goand## Rustsections).
- Run the workflow again with "Dry run mode" set to
false. - The workflow will:
- Validate the version format and increment.
- Verify that the merge queue is empty and that
maindoes not change while the release contents are generated. - Auto-generate umbrella chloggen entries summarizing renovate[bot] and dependabot[bot] PRs merged since the last release tag (one per tree, skipped if none).
- Render pending chloggen entries into
go/CHANGELOG.mdandrust/otap-dataflow/CHANGELOG.md, deleting the consumed.yamlentries. - Bump the Rust workspace + root package versions in
rust/otap-dataflow/Cargo.toml. - Create a release branch (
otelbot/release-vX.Y.Z) and open a pull request.
- Review the automatically created pull request.
- Verify that:
- Both
go/CHANGELOG.mdandrust/otap-dataflow/CHANGELOG.mdrender the expected entries. rust/otap-dataflow/Cargo.tomlreflects the new version.
- Both
- Ensure all CI checks pass.
- Merge the pull request. While it is open, the required
changelogcheck blocks every other pull request from merging.
- Go to the Actions tab in the GitHub repository.
- Select the "Push Release" workflow.
- Click "Run workflow".
- Fill in the required inputs:
- Version: The same version number used in the prepare step
(e.g.,
0.48.0). - Dry run: Check this box to preview what will happen.
- Version: The same version number used in the prepare step
(e.g.,
Before publishing the release, run the push workflow in dry-run mode:
- Set "Dry run mode" to
true. - Review the output to ensure all git tags and release content look correct.
- Run the push release workflow again with "Dry run mode" set to
false. - The workflow will:
- Resolve the merged
otelbot/release-vX.Y.Zpull request and use its merge commit as the release commit. - Obtain a short-lived crates.io token through trusted publishing.
- Publish
otel-arrow-dfe-pdata-views, or skip the version if it already exists. - Wait until crates.io reports the version before creating release tags.
- Create git tags for the main release, the Go modules, and the Rust workspace at that release commit.
- Publish the GitHub release with the combined changelog content.
- Resolve the merged
Changes merged into main after the release pull request are not included in
these tags. Their .chloggen/ entries remain pending and are rendered into the
next release. Normal pull request merges resume after the release pull request
merges, even if the tags have not been created yet.
The following git tags are created:
vX.Y.Z- Main release tag.go/vX.Y.Z- Go module tag (coversgithub.tiyicn.workers.dev/open-telemetry/otel-arrow/go).rust/otap-dataflow/vX.Y.Z- Rust workspace tag.
The release process handles:
Go Modules:
github.com/open-telemetry/otel-arrow/go
Rust Workspace:
rust/otap-dataflow/aggregate git tag.otel-arrow-dfe-pdata-viewson crates.io. All other Rust workspace packages remain unpublished during the pilot.
- Copy
go/.chloggen/TEMPLATE.yaml(for Go changes) orrust/otap-dataflow/.chloggen/TEMPLATE.yaml(for Rust changes) to a new.yamlfile in the same directory, fill in the fields, and commit it. - If the PR truly doesn't need an entry (internal refactors, dev-only
dependency bumps, doc-only edits), include
chorein the PR title or apply thechorelabel.
- Revert the direct edit. Add a
.chloggen/*.yamlentry instead.
- Ensure the Prepare Release workflow has run and its PR has merged before running Push Release.
- Commit or stash any local changes before running the workflow.
- Ensure the new version follows semantic versioning and is greater than the current version.
- Confirm the crate's trusted publisher names
open-telemetry/otel-arrow, workflowpush-release.yml, and environmentrelease. - Confirm the workflow was started from an event and ref allowed by the
protected
releaseenvironment. - Do not restore or add a long-lived crates.io token to the workflow.
If the workflow fails partway through:
- Check whether
otel-arrow-dfe-pdata-views@X.Y.Zexists on crates.io. - If it exists, publication is irreversible. Re-run Push Release with the same version. The publisher skips the existing crate before resuming tags and the GitHub release.
- Never attempt to replace an existing crates.io version. Prepare a new patch version if the published contents are wrong.
- If publication did not occur, fix the underlying issue and re-run the workflow normally.
Do not yank a version merely because a later tag or GitHub release step failed. Yanking prevents normal dependency resolution and does not permit republishing the same version.
In case the automated workflow cannot be used, you can create a manual release:
-
Render the pending chloggen entries locally:
make chlog-install make chlog-update VERSION=vX.Y.Z
-
Bump the Rust workspace versions:
sed -i 's/^version = "[0-9]\+\.[0-9]\+\.[0-9]\+"/version = "X.Y.Z"/g' \ rust/otap-dataflow/Cargo.toml -
Commit the changes, open and merge a PR.
-
From the merged release commit, publish or verify the views crate with a short-lived crates.io token:
cd rust/otap-dataflow export CARGO_REGISTRY_TOKEN="REPLACE_WITH_SHORT_LIVED_TOKEN" cargo xtask crates-publish publish X.Y.Z unset CARGO_REGISTRY_TOKEN cd ../..
-
Create and push the release tags:
git tag -a vX.Y.Z -m "Release vX.Y.Z" git tag -a go/vX.Y.Z -m "Release go/vX.Y.Z" git tag -a rust/otap-dataflow/vX.Y.Z \ -m "Release rust/otap-dataflow/vX.Y.Z" git push origin vX.Y.Z go/vX.Y.Z \ rust/otap-dataflow/vX.Y.Z
-
Create a GitHub release manually.
- All Go components and the Rust workspace currently share a single release version. Rust crates track the Go release version going forward.
- Versions follow Semantic Versioning.
- This project is pre-1.0; minor-version releases may include breaking changes.
- Pre-release versions are not currently supported through the automated workflow.
- Only
otel-arrow-dfe-pdata-viewsis published to crates.io during the pilot. Consume every other Rust crate using the Rust workspace git tag.