changelog add cli command
docs-builder changelog add [options]
Create a changelog file that describes a single item in the release documentation. For details and examples, go to Create changelogs.
--productsstring- Products affected in format
"product target lifecycle, ..."(for example,"elasticsearch 9.2.0 ga, cloud-serverless 2025-08-05"). The valid product identifiers are listed in products.yml. For more information about valid product and lifecycle values, go to Product format. --actionstring- Optional: What users must do to mitigate
--areasstring[]-
Optional: Area(s) affected (comma-separated or specify multiple times)
Repeatable: pass
--areasmultiple times to supply more than one value --[no-]concise-
Optional: Omit schema reference comments from generated YAML files. Useful in CI to produce compact output.
Default:
false --configstring-
Optional: Path to the changelog.yml configuration file. Defaults to 'docs/changelog.yml'
Constraints: symbolic links not allowed, must exist, extensions: yml, yaml, supports
~home expansion --descriptionstring- Optional: Additional information about the change (max 600 characters)
--[no-]no-extract-release-notes-
Turn off extraction of release notes from PR or issue descriptions. By default, the behavior is determined by the extract.release_notes changelog configuration setting. Release notes are extracted when using
--prsor--report(and from issues when using--issues).Default:
false --[no-]no-extract-issues-
Optional: Turn off extraction of linked references. When using --prs: turns off extraction of linked issues from the PR body (e.g., "Fixes #123"). When using --issues: turns off extraction of linked PRs from the issue body (e.g., "Fixed by #123"). By default, linked references are extracted in both cases.
Default:
false --feature-idstring- Optional: Feature flag ID
--[no-]highlight- Optional: Include in release highlights
--impactstring- Optional: How the user's environment is affected
--issuesstring[]-
Optional: Issue URL(s) or number(s) (comma-separated), or a path to a newline-delimited file containing issue URLs or numbers. Can be specified multiple times. Each occurrence can be either comma-separated issues (e.g.,
--issues "https://github.com/owner/repo/issues/123,456") or a file path (e.g.,--issues /path/to/file.txt). If --owner and --repo are provided, issue numbers can be used instead of URLs. If specified, --title can be derived from the issue. Creates one changelog file per issue. Mutually exclusive with --release-version and --report.Repeatable: pass
--issuesmultiple times to supply more than one value --ownerstring- Optional: GitHub repository owner (used when --prs or --issues contains just numbers, or when using --release-version). Falls back to bundle.owner in changelog.yml when not specified. If that value is also absent, "elastic" is used.
--outputstring- Optional: Output directory for the changelog. Falls back to bundle.directory in changelog.yml when not specified. Defaults to current directory.
--prsstring[]-
Optional: Pull request URL(s) or PR number(s) (comma-separated), or a path to a newline-delimited file containing PR URLs or numbers. Can be specified multiple times. Each occurrence can be either comma-separated PRs (e.g.,
--prs "https://github.com/owner/repo/pull/123,6789") or a file path (e.g.,--prs /path/to/file.txt). When specifying PRs directly, provide comma-separated values. When specifying a file path, provide a single value that points to a newline-delimited file. If --owner and --repo are provided, PR numbers can be used instead of URLs. If specified, --title can be derived from the PR. If mappings are configured, --areas and --type can also be derived from the PR. Creates one changelog file per PR. Mutually exclusive with --release-version and --report.Repeatable: pass
--prsmultiple times to supply more than one value --reportstring- Optional: URL or file path to a promotion report HTML document. Extracts GitHub pull request URLs and creates one changelog per PR (same parsing as
changelog bundle --report). Mutually exclusive with --prs, --issues, and --release-version. --release-versionstring- Optional: GitHub release tag to fetch PRs from (e.g., "v9.2.0" or "latest"). When specified, creates one changelog per PR in the release notes. Requires --repo (or bundle.repo in changelog.yml). Mutually exclusive with --prs, --issues, and --report. Does not create a bundle; use 'changelog gh-release' for that.
--repostring- Optional: GitHub repository name (used when --prs or --issues contains just numbers, or when using --release-version). Falls back to bundle.repo in changelog.yml when not specified.
--[no-]strip-title-prefix-
Optional: When used with --prs or --report, remove square brackets and text within them from the beginning of PR titles, and also remove a colon if it follows the closing bracket (e.g., "[Inference API] Title" becomes "Title", "[ES|QL]: Title" becomes "Title", "[Discover][ESQL] Title" becomes "Title")
Default:
false --subtypestring- Optional: Subtype for breaking changes (api, behavioral, configuration, etc.)
--titlestring- Optional: A short, user-facing title (max 80 characters). Required if neither --prs, --issues, nor --report is specified. If --prs and --title are specified, the latter value is used instead of what exists in the PR.
--typestring- Optional: Type of change (feature, enhancement, bug-fix, breaking-change, etc.). Required if neither --prs, --issues, nor --report is specified. If mappings are configured, type can be derived from the PR or issue.
--[no-]use-pr-number-
Use PR numbers for filenames instead of the configured
filenamestrategy. Requires--prs,--issues, or--report. Mutually exclusive with--use-issue-number. Refer to Filenames.Default:
false --[no-]use-issue-number-
Use issue numbers for filenames instead of the configured
filenamestrategy. Requires--prsor--issues. Mutually exclusive with--use-pr-number. Refer to Filenames.Default:
false -l--log-levelenum-
Minimum log level.
Values: trace, debug, information, warning, error, critical, none
Default:
information -c--config-sourceenum-
Override the configuration source: local, remote
Values: local, remote, embedded
--[no-]skip-private-repositories- Skip cloning private repositories
By default, output files are named according to the filename strategy in changelog.yml:
| Strategy | Example filename | Description |
|---|---|---|
timestamp (default) |
1735689600-fixes-enrich-and-lookup-join-resolution.yaml |
Uses a Unix timestamp with a sanitized title slug. |
pr |
137431.yaml |
Uses the PR number. |
issue |
2571.yaml |
Uses the issue number. |
Refer to changelog.example.yml or Changelog configuration reference.
You can override those settings with the --use-pr-number or --use-issue-number flags:
docs-builder changelog add \
--prs 1234 \
--products "elasticsearch 9.2.3" \
--use-pr-number
docs-builder changelog add \
--issues 4567 \
--products "elasticsearch 9.3.0" \
--use-issue-number
--use-pr-number and --use-issue-number are mutually exclusive; specify only one. --use-pr-number requires --prs, --issues, or --report. --use-issue-number requires --prs or --issues. The numbers are extracted from the URLs or identifiers you provide or from linked references in the issue or PR body when extraction is enabled.
Precedence: CLI flags (--use-pr-number / --use-issue-number) > filename in changelog.yml > default (timestamp).
The --products option accepts values with the format "product target lifecycle, ..." where:
productis a product ID that exists in products.yml (required)targetis the target version or date (optional)lifecycleexists in Lifecycle.cs (optional)
You can further limit the possible values with the products and lifecycles options in the changelog configuration file.
For example:
"kibana 9.2.0 ga""cloud-serverless 2025-08-05""cloud-enterprise 4.0.3, cloud-hosted 2025-10-31"
The changelog add command resolves product values in the following order:
- The
--productsCLI option always takes priority. - If
pivot.productsis defined in the changelog configuration file and the PR or issue has labels that match, those products are used. Multiple matching entries are all applied. - If
products.defaultis defined in the changelog configuration file, those default products are used. - If
--repois specified (orbundle.repois set in the changelog configuration file), the repository name is matched against known product IDs inproducts.ymland the derived value is used.
The same order applies when using --report (after PR URLs are resolved from the promotion report), and when using batch --prs with multiple pull requests.
If none of these steps yield at least one product, the command returns an error.
By default, the command checks docs/changelog.yml for a configuration file. You can specify a different path with --config.
If a configuration file exists, the command validates its values before generating changelog files:
- If the configuration file contains
lifecycles,products,subtype, ortypevalues that don't match the known valid values, validation fails. - If the configuration file contains
areasvalues and they don't match what you specify in--areas, validation fails. - If the configuration file contains
lifecyclesorproductsvalues that are a subset of the available values and you try to create a changelog with values outside that subset, validation fails.
In each of these cases where validation fails, a changelog file is not created.
If the configuration file contains rules.create definitions and a PR or issue has a blocking label, that PR is skipped and no changelog file is created for it.
For more information, refer to Create changelogs > Control changelog creation.
When running inside GitHub Actions, changelog add automatically reads the following environment variables to fill in arguments not provided on the command line:
| Environment variable | Fills | Set from |
|---|---|---|
CHANGELOG_PR_NUMBER |
--prs |
github.event.pull_request.number |
CHANGELOG_TITLE |
--title |
steps.evaluate.outputs.title |
CHANGELOG_DESCRIPTION |
--description |
steps.evaluate.outputs.description |
CHANGELOG_TYPE |
--type |
steps.evaluate.outputs.type |
CHANGELOG_PRODUCTS |
--products |
steps.evaluate.outputs.products |
CHANGELOG_OWNER |
--owner |
github.repository_owner |
CHANGELOG_REPO |
--repo |
github.event.repository.name |
Explicit CLI arguments always take priority over environment variables.
CHANGELOG_DESCRIPTION has additional precedence rules related to release note extraction:
- If
--descriptionis provided on the command line, it always wins. - If
--no-extract-release-notesis passed (orextract.release_notes: falseis set in the changelog configuration),CHANGELOG_DESCRIPTIONis ignored. - Otherwise,
CHANGELOG_DESCRIPTIONfills--descriptionwhen it is not set on the command line.
This allows the CI action to invoke changelog add with a minimal command line:
docs-builder changelog add --config docs/changelog.yml --output /tmp/staging --concise --strip-title-prefix