Bundle changelogs
You can use docs-builder changelog commands to created consolidated data files ("release bundles") that list all the notable changes associated with a particular release.
These files are ultimately used to generate release documentation.
This page describes how to create these files from the command line. For details about the equivalent GitHub action, refer to the docs-actions README.
- Create a changelog configuration file to define all the default behavior and optional profiles and rules. Refer to Configure changelogs.
- Create changelogs that describe all the notable changes. Refer to Create changelogs.
To have accurate release notes, there must be a definitive source of truth for what was shipped in each release. This is a superset of what will appear in the documentation.
The source of truth can be:
- a list of GitHub pull requests
- a list of GitHub issues
- a buildkite promotion report (which contains a list of PRs)
- automated release notes for GitHub releases
- all changelog files that exist in a specific folder
- all changelog files that match specific products, versions, and lifecycles
Deriving the source of truth from the contents of a folder or from the metadata in changelogs are the least accurate options (unless you have additional processes to confirm the validity of that information). It is recommended to use lists that are generated as part of your release coordination activities. Consider your options carefully and discuss with your docs team if necessary.
Not everything that was shipped will have a changelog. For example, you can configure rules that control changelog creation for work that's not publicly notable or spans multiple PRs.
Your release workflow should not assume there will be a one-to-one mapping between what was shipped and what will be documented.
The changelog bundle command has two modes of operation. You can:
- specify all the command options every time you run the command, or
- define "profiles" in the changelog configuration file
The latter method is more convenient and consistent for repetitive workflows, therefore it's the recommended method described here.
You must create profiles that match your chosen source of truth.
It is strongly recommended to set output_products in your profile so your bundles have a single top-level product entry that provides the context of the release. This context is particularly important if you'll be applying bundle rules.
For the most up-to-date changelog configuration options, refer to changelog.example.yml and Changelog configuration reference.
If the source of truth for what was shipped in each release is:
- a list of GitHub pull requests
- a list of GitHub issues
- a buildkite promotion report (which contains a list of PRs)
... your profile does not have any mandatory settings. However it's a good idea to define the basic bundle settings and the profile settings for the output filename and output products. For example:
bundle:
directory: docs/changelog
output_directory: docs/releases
repo: elasticsearch
owner: elastic
resolve: true
profiles:
serverless-report:
output: "serverless/{version}.yaml"
output_products: "cloud-serverless {version}"
elasticsearch-release:
output: "elasticsearch/{version}.yaml"
output_products: "elasticsearch {version} {lifecycle}"
- The directory that contains changelog files.
- The directory that contains changelog bundles.
- Resolve the changelog files in the bundle rather than just referencing them. Otherwise, when you move or remove changelog files the bundle cannot be rendered.
- If
outputis omitted, the default path and file names are used. This example shows how you can use a{version}variable to customize the bundle's filename. - The bundle's product metadata, which affects the rules that are applied and the product and version titles that ultimately appear in the documentation. If omitted, it's derived from all the changelogs in the bundle.
If you have automated GitHub release notes, the changelog bundle command can fetch the release from GitHub, parse PR references from the release notes, and uses them as the bundle filter.
Only automated GitHub release notes (the default format or Release Drafter format) are supported at this time.
Your profile must contain source: github_release.
It's also a good idea to include the basic bundle settings and the profile settings for the output filename and output products.
For example:
bundle:
resolve: true
profiles:
agent-gh-release:
source: github_release
repo: apm-agent-dotnet
owner: elastic
output: "agent-{version}.yaml"
output_products: "apm-agent-dotnet {version} {lifecycle}"
- This profile fetches the PR list from the GitHub release notes for the version tag specified in the command.
- For
source: github_releaseprofiles, the{lifecycle}placeholder inoutputandoutput_productsis inferred from full release tag name. For example, if the release tag isv1.34.1-preview.1the lifecycle ispreview. Refer to changelog bundle cli command > Lifecycle inference for more details.
If the source of truth for what was shipped in each release is:
- the
productsinformation that exists in each changelog - all changelog files that exist in a specific folder
... you must include products in your profile.
For example:
bundle:
directory: docs/changelog
output_directory: docs/releases
resolve: true
repo: elasticsearch
owner: elastic
profiles:
# Collect all changelogs
release-all:
products: "* * *"
output: "all.yaml"
# Find changelogs with any lifecycle and a partial date
serverless-monthly:
products: "cloud-serverless {version}-* *"
output: "serverless-{version}.yaml"
output_products: "cloud-serverless {version}"
# Find changelogs with a specific lifecycle
elasticsearch-ga-only:
products: "elasticsearch {version} ga"
output: "elasticsearch-{version}.yaml"
# Infer the lifecycle from the version
elasticsearch-with-lifecycle:
products: "elasticsearch {version} {lifecycle}"
output: "elasticsearch-{version}.yaml"
output_products: "elasticsearch {version}"
- This profile collects all changelogs from the
directory. - This profile collects any changelogs that have
product: cloud-serverless, any lifecycle, and the date partially specified in the command. - This profile collects any changelogs that have
product: elasticsearch,lifecycle: ga, and the version specified in the command. - In this case, the lifecycle is inferred from the version specified in the command. For example, if the version is
9.2.0-beta.1the lifecycle isbeta. Refer to changelog bundle cli command > Lifecycle inference.
The products field determines which changelog files are gathered for consideration. You can still apply rules afterward to further filter changelogs from the bundle. The input stage and bundle filtering stage are conceptually separate.
If you created profiles, you can use them with the changelog bundle command like this:
docs-builder changelog bundle <profile> <version|report|url-list>
The second argument accepts a version string, a promotion report URL or path, or a URL list file (a plain-text file with one fully-qualified GitHub URL per line).
If you are using a {version} placeholder in the output_products or output fields, you must provide that value as well as your report or URL argument.
For example, if the source of truth for what was shipped in each release is:
a list of GitHub pull requests or issues:
# Bundle changelogs from a PR list ({lifecycle} → "ga" inferred from "9.2.0") docs-builder changelog bundle elasticsearch-release 9.2.0 ./prs.txt... where
prs.txtis a newline delimited file with PR or issue URLs like this this:https://github.com/elastic/kibana/pull/123 https://github.com/elastic/kibana/pull/456a buildkite promotion report:
# Bundle changelogs from a buildkite report ({version} → "2026-02-13") docs-builder changelog bundle serverless-report 2026-02-13 ./promotion-report.htmlautomated release notes for GitHub releases:
# Bundle changelogs from the release notes of a specific GitHub tag docs-builder changelog bundle agent-gh-release v1.34.1 # Use "latest" to fetch the most recent release docs-builder changelog bundle agent-gh-release latestAlternatively, use the changelog gh-release command, which creates the changelogs and bundles at the same time.
NoteThis method requires a
GITHUB_TOKENorGH_TOKENenvironment variable (or an activeghlogin) to fetch release details from the GitHub API.all changelog files that exist in a specific folder:
docs-builder changelog bundle release-all '*'all changelog files that match specific products, versions, and lifecycles:
# Bundle changelogs with partial dates docs-builder changelog bundle serverless-monthly 2026-02 # Bundle changelogs for a GA release ({lifecycle} → "ga" inferred from "9.2.0") docs-builder changelog bundle elasticsearch-with-lifecycle 9.2.0 # Bundle changelogs for a beta release ({lifecycle} → "beta" inferred from "9.2.0-beta.1") docs-builder changelog bundle elasticsearch-with-lifecycle 9.2.0-beta.1
By default all changelogs that match the chosen source of truth are included in the bundle.
It is strongly recommended to pull all of the content from each changelog into the bundle; otherwise you can't move or remove your changelogs. If your bundle contains only references to the files, add set bundle.resolve to true and re-generate your bundle.
To apply additional filtering by the changelog type, areas, or products, add bundle rules.
When you need to add changelogs to an existing bundle, you can use the docs-builder changelog bundle-amend command, which creates amend bundles.
For example:
docs-builder changelog bundle-amend \
./docs/releases/9.3.0.yaml \
--add "./docs/changelog/138723.yaml,./docs/changelog/1770424335.yaml"
Amend bundles follow a specific naming convention: {parent-bundle-name}.amend-{N}.yaml where {N} is a sequence number.
There is currently no command to remove changelogs from a bundle. You must edit the bundle file manually or else re-generate the bundle with an updated source of truth or a new rule that excludes the changelog.
When bundles are turned into docs (either via the changelog render command or the {changelog} directive), amend files are automatically merged with their parent bundles.
The changelogs from all matching amend files are combined with the parent bundle's changelogs and the result is rendered as a single release.
Don't explicitly list the amend bundles in the --input option of the docs-builder changelog render command--you'll get duplicate entries in the output files. List only the original/parent bundles.
For more details and examples, go to changelog bundle-amend cli command.
A single changelog file might be applicable to multiple releases (for example, it might be delivered in both Stack and Serverless releases or Elastic Cloud Hosted and Enterprise releases on different timelines). After it has been included in all of the relevant bundles, it is reasonable to delete the changelog to keep your repository clean.
If you create docs with changelog directives, run the docs-builder changelog bundle command with the --resolve option or set bundle.resolve to true in the changelog configuration file (so that bundle files are self-contained).
Otherwise, the build will fail if you remove changelogs that the directive requires.
Likewise, the docs-builder changelog render command fails for "unresolved" bundles after you delete the changelogs.
You can use the docs-builder changelog remove command to remove changelogs.
If you created profiles, you can use them like this:
docs-builder changelog remove <profile> <version|report|url-list>
For example, if the source of truth for what was shipped in each release is:
a list of GitHub pull requests or issues:
docs-builder changelog remove elasticsearch-release ./prs.txta buildkite promotion report:
docs-builder changelog remove serverless-report ./promotion-report.htmlautomated release notes for GitHub releases:
docs-builder changelog remove agent-gh-release 1.34.1NoteThis method requires a
GITHUB_TOKENorGH_TOKENenvironment variable (or an activeghlogin) to fetch release details from the GitHub API.all changelog files that exist in a specific folder:
docs-builder changelog remove release-all '*'all changelog files that match specific products, versions, and lifecycles:
docs-builder changelog remove serverless-monthly 2026-02
Before deleting, the command automatically scans for bundles that still hold unresolved (file:) references to the matching changelog files.
If any are found, the command reports an error for each dependency.
This check prevents the {changelog} directive from failing at build time with missing file errors.
To proceed with removal even when unresolved bundle dependencies exist, use --force.
To preview what would be removed without deleting anything, use --dry-run.
For full option details, go to changelog remove cli command.
The following sections provide more details about optional and advanced steps.
Not everything that was shipped in a release and has a changelog necessarily belongs in the release bundle.
If you want to automatically include or exclude changelogs from bundles based on their areas, types, or products, you can accomplish this with rules in your changelog configuration file. Bundle rules run as a secondary stage after the candidate changelogs are collected (for example, based on a PR list, promotion report, or other valid source of truth).
For example, you might choose to omit other or docs types of changelogs.
Or you might choose to omit all changelogs related to specific features (areas) from a product's release bundles.
You can define rules at the global level (applies to all products) like this:
rules:
bundle:
exclude_products: elasticsearch
exclude_types: deprecation
exclude_areas:
- Internal
Alternatively, you can define product-specific rules:
rules:
bundle:
products:
cloud-serverless:
include_areas:
- "Search"
- "Monitoring"
elasticsearch:
exclude_areas:
- Autoscaling
Product-specific rules override the global rules entirely—they do not merge. For details, refer to Changelog configuration reference > rules.bundle and Changelog configuration reference > Advanced rule examples.
Changelogs have an optional feature-id field that you can use to associate the change with a specific feature or project.
If there are features or projects that are not yet ready for public documentation, you can list those IDs in the hide_features setting:
bundle:
directory: docs/changelog
output_directory: docs/releases
repo: elasticsearch
owner: elastic
resolve: true
profiles:
serverless-report:
output: "serverless/{version}.yaml"
output_products: "cloud-serverless {version}"
hide_features:
- feature-flag-1
- feature-flag-2
- The feature identifiers to hide.
When you use this profile to create a bundle, the list is carried forward into its metadata.
Any changelogs with matching feature-id values are commented out when you publish the bundle.
A changelog can reference multiple pull requests and issues in its prs and issues fields.
You can allowlist links to certain repos with the link_allow_repos setting.
For example:
bundle:
directory: docs/changelog
output_directory: docs/releases
repo: elasticsearch
owner: elastic
resolve: true
link_allow_repos:
- elastic/elasticsearch
- elastic/kibana
- elastic/roadmap
- Only links to these owner/repo pairs are shown in the release docs. Others are rewritten to
# PRIVATE:sentinels.
There are no implicit values for this setting. You must list every repo whose links should appear, including the current repo. When this setting is omitted entirely, no link filtering is applied.
You must set bundle.resolve to true in the changelog configuration file (so that bundle files are self-contained) in order to hide the private links. The bundle's changelog entries are sanitized but the individual changelog files are unchanged.
If you are working in a private repo and do not want any pull request or issue links to appear (even if they target a public repo), you can also configure link visibility in the changelog directive and changelog render command.
After you've created release bundles, you can use them to generate release docs.