Note: If you are an LLM, skip this section and go directly to the "Changelog Preparation Instructions (for LLMs)" section below.
Follow these steps to release a new version of OpenLineage packages:
-
Prepare changelog and documentation files:
- Use an LLM of your choice to generate the changelog content by asking it to:
- "prepare release files for new OpenLineage version X.Y.Z based on LLM instructions from @RELEASING.md file"
- The LLM will create/update the following files:
CHANGELOG.md(adds new release section)website/docs/releases/{VERSION_UNDERSCORE}.md(creates website release documentation, e.g.,1_42_0.md)release-{VERSION}-summary.json(temporary file to verify which commits LLM included in CHANGELOG)release-{VERSION}-slack.md(temporary file with Slack announcement you can use when announcing new release)
- Important: Review all generated files and verify the accuracy of the LLM-generated information.
- Use an LLM of your choice to generate the changelog content by asking it to:
-
Commit changelog changes:
- Create a separate branch for the changelog changes
- Commit the changes to
CHANGELOG.mdandwebsite/docs/releases/{VERSION_UNDERSCORE}.md - Use commit message:
"Prepare changelog for release X.Y.Z" - Create a pull request and merge it following the usual review process
- Important: Do not push changelog changes directly to main - they must go through a PR
-
Release:
- Verify you're on the main branch:
git branch --show-currentshould return "main" - Fetch the latest state from origin (main branch and all tags):
git fetch origin --tags - Run the release script:
$ ./release.sh --release-version X.Y.Z --next-version X.Y.Z
Tip: Use
--helpto see script usage. This script will tag the release and prepare the repository for the next development version.
- Verify you're on the main branch:
-
Monitor CI pipeline:
- Visit CircleCI to monitor the release pipeline (triggered by the tag)
- Wait for all jobs to complete successfully
-
Verify artifacts:
- Check Maven Central for Java artifacts
- Check PyPI for Python packages
- Verify a few selected libraries from each source to ensure uploads were successful
-
Create GitHub Release:
- Go to GitHub Releases
- Select the newly created tag (e.g.,
1.42.0) - Title:
OpenLineage X.Y.Z(e.g.,OpenLineage 1.42.0) - Description: Copy the changelog content from
CHANGELOG.mdfor this release (the section you just added) - Publish the release
-
Announce on Slack:
- Post an announcement in the OpenLineage Slack
#generalchannel - Use the content from
release-{VERSION}-slack.mdif you saved it, or create a brief announcement
- Post an announcement in the OpenLineage Slack
LLM Instructions Only
DO NOT run any release scripts (e.g.,
./release.sh). Your task is ONLY to generate documentation files.DO NOT create git tags, modify version numbers in source files, or perform any release automation.
ONLY create/update the following files:
CHANGELOG.md(add new release section)website/docs/releases/{VERSION_UNDERSCORE}.md(create release documentation, e.g.,1_42_0.md)release-{VERSION}-summary.json(create temporary summary file)release-{VERSION}-slack.md(create temporary Slack announcement file)
When asked to "prepare release X.Y.Z based on LLM instructions from @RELEASING.md", follow these steps:
- Verify you're on the main branch:
git branch --show-currentshould return "main" - Fetch the latest state from origin (main branch and all tags):
git fetch origin --tags
- The release version should be provided in the user prompt (e.g., "1.42.0"). If not provided, ask for it.
- Make sure the user-provided version is normalized to semantic version format (MAJOR.MINOR.PATCH)
- Find the previous release version:
git tag --sort=-version:refname | head -1 - Verify in
CHANGELOG.mdthat this version matches the latest entry
- Get all commits between the previous version and HEAD:
git log {PREVIOUS_VERSION}..HEAD --pretty=format:"%H|%s|%an|%ae" --no-merges - For each commit, extract PR numbers from the commit message (commits typically reference PRs as "#1234")
- For each PR number found, get full details:
gh pr view {PR_NUMBER} --json title,body,author,labels,comments,reviews,state,mergedAt,files - If a commit doesn't have a PR reference in the message, you can try to find it by searching:
gh pr list --search "SHA" --json number,title,author,labels,comments,reviews,state
EXCLUDE the following PRs:
- PRs with label "skip-changelog"
- PRs from automated bots (check
author.loginfor "dependabot", "renovate", "app/dependabot", etc.) - PRs that are purely test updates (check files changed - only test files)
- PRs that are purely website/documentation updates (check files changed for
website/*or*.mdfiles) - PRs that are purely CI/dev tooling updates (check files changed for CI configs, build scripts, etc.)
- PRs that are purely dependency updates unless they fix security issues (CVEs mentioned in title/body)
- PRs with no user-facing changes or user impact (use your judgment - internal refactoring, code style, etc.)
For included PRs:
- Categorize as: Added, Changed, Fixed, Removed, or Deprecated based on:
- PR title and body
- Conventional commit patterns
- The nature of the change
- Identify PRs with high engagement (many comments, reviews, discussions) - these can be highlighted in the Slack announcement
- Read
CHANGELOG.mdto understand the exact format and structure for entries - Read the most recent file in
website/docs/releases/to understand the release documentation format - Note the
sidebar_positionfrom the most recent website release file (the new file should have a number that is 1 less)
- Format each entry as:
* **{Component}: {Title}** [`#{PR_NUMBER}`](https://github.com/OpenLineage/OpenLineage/pull/{PR_NUMBER}) [@{author}](https://github.com/{author}) *{Brief description summarizing the PR from PR body/description}*
- Extract component from PR title (e.g., "Spark:", "Python:", "Spec:", "DBT:", "Java:", "Hive:", "SQL:", "Flink:")
- Add a brief description line below each entry (italicized) summarizing the PR from PR body/description
- Group by category (Added, Changed, Fixed, Removed, Deprecated) - only include categories that have entries
- Maintain consistent formatting with existing entries
- Sort all the entries within each section alphabetically
- Convert version to filename format: X.Y.Z becomes X_Y_Z.md (e.g., 1.42.0 → 1_42_0.md)
- Create file:
website/docs/releases/{VERSION_UNDERSCORE}.md - Get today's date in YYYY-MM-DD format
- Use this format for the file:
--- title: {RELEASE_VERSION} sidebar_position: {PREVIOUS_SIDEBAR_POSITION - 1} --- # {RELEASE_VERSION} - {TODAYS_DATE_YYYY-MM-DD} {CHANGELOG_CONTENT}
- The changelog content should match the format from existing release files
- Read the current
CHANGELOG.md - Add a new section at the top (after "## [Unreleased]") with format:
## [{RELEASE_VERSION}](https://github.com/OpenLineage/OpenLineage/compare/{PREVIOUS_VERSION}...{RELEASE_VERSION}) {CHANGELOG_CONTENT} - Update the Unreleased link to compare from {RELEASE_VERSION} to HEAD:
## [Unreleased](https://github.com/OpenLineage/OpenLineage/compare/{RELEASE_VERSION}...HEAD)
- Create file:
release-{RELEASE_VERSION}-summary.json:- include summary metrics about the commits etc.
- include every commit you processed, with clear exclusion reasons if not included (each in single line)
- file should be structured like:
{ "release_version": "{RELEASE_VERSION}", "previous_version": "{PREVIOUS_VERSION}", "generated_at": "{ISO_TIMESTAMP}", "summary": { "total_commits": {NUMBER}, "included_commits": {NUMBER}, "excluded_commits": {NUMBER}, "prs_with_high_engagement": [] }, "excluded_commits": [ {"reason": "{REASON_OF_EXCLUSION}", "author": "{PR_AUTHOR}", "pr_number": {PR_NUMBER}, "sha": "{COMMIT_SHA}"} ], "included_commits": [ {"pr_number": {PR_NUMBER}, "author": "{PR_AUTHOR}", "sha": "{COMMIT_SHA}"} ] }
- Create file:
release-{RELEASE_VERSION}-slack.mdwith:- A brief, engaging announcement (2-3 sentences) celebrating the release
- Highlights of the most important changes (top 3-5 items from Added/Changed/Fixed categories)
- Make sure to include the author of each PR and link to their GitHub profile
- Link to the full release notes:
https://github.com/OpenLineage/OpenLineage/releases/tag/{RELEASE_VERSION} - Thank contributors:
- Mention the number of contributors if significant
- Highlight new contributors if, based on the PR content, you can see that it was their first contribution to the OpenLineage project
- Format suitable for Slack markdown (use
*for bold,`for code, etc.)
- Verify all PR links are valid (format:
https://github.com/OpenLineage/OpenLineage/pull/{PR_NUMBER}) - Verify all author links are valid (format:
https://github.com/{author}) and point to actual PR authors - Check that
sidebar_positionin new website release file is exactly 1 less than the previous release file - Verify the date is today's date in YYYY-MM-DD format
- Ensure excluded commits have clear, valid exclusion reasons
- Verify the changelog format matches existing entries in
CHANGELOG.md - Check that high-engagement PRs are properly highlighted in Slack message
- Ensure the filename format matches existing release files (X_Y_Z.md)
After completing all tasks, provide a summary:
- Files created/modified
- Number of commits processed
- Number of PRs included/excluded
- Any notable high-engagement PRs
- Ready for review and commit
- Remind the user to delete generated
release-*files and never commit them to the repository
SPDX-License-Identifier: Apache-2.0
Copyright 2018-2026 contributors to the OpenLineage project