Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

A GitHub action that builds your release notes / changelog fast, easy and exactly the way you want.

License

NotificationsYou must be signed in to change notification settings

mikepenz/release-changelog-builder-action

Use this GitHub action with your project
Add this Action to an existing workflow or create a new one
View on Marketplace

Repository files navigation

:octocat:📄🔖📦

... a GitHub action that builds your release notes / changelog fast simple and exactly the way you want.



What's included 🚀Setup 🛠️Sample 🖥️Customization 🖍️Contribute 🧬Local Testing 🧪License 📓


What's included 🚀

  • Super simple integration
    • ...even on huge repositories with hundreds of tags
  • Parallel releases support
  • Rich changelogs based on PRs
    • Alternative commit based mode
  • Blazingly fast execution
  • Supports any git project
  • Highly flexible configuration
  • Lightweight
  • Supports any branch
  • Rich build log output

Setup

Configure the workflow

Specify the action as part of your GitHub actions workflow:

-name:"Build Changelog"id:build_changeloguses:mikepenz/release-changelog-builder-action@{latest-release}

Important

When upgrading from v4 to v5, please ensure to read the upgrade warning in therelease notes, especially ifregexes are used.

Full Sample 🖥️

Below is a complete example showcasing how to define a build, which is executed when tagging the project. It consists of:

  • Prepare tag, via the GITHUB_REF environment variable
  • Build changelog, given the tag
  • Create a release on GitHub - specifying body with a constructed changelog
Example

name:'CI'on:push:tags:      -'*'jobs:release:if:startsWith(github.ref, 'refs/tags/')runs-on:ubuntu-lateststeps:      -name:Build Changelogid:github_releaseuses:mikepenz/release-changelog-builder-action@v5env:GITHUB_TOKEN:${{ secrets.GITHUB_TOKEN }}      -name:Create Releaseuses:mikepenz/action-gh-release@v0.2.0-a03#softprops/action-gh-releasewith:body:${{steps.github_release.outputs.changelog}}

Example w/ Configuration

jobs:release:if:startsWith(github.ref, 'refs/tags/')runs-on:ubuntu-lateststeps:      -name:Build Changeloguses:mikepenz/release-changelog-builder-action@v5with:configurationJson:|            {              "template": "#{{CHANGELOG}}\n\n<details>\n<summary>Uncategorized</summary>\n\n#{{UNCATEGORIZED}}\n</details>",              "categories": [                {                    "title": "## 💬 Other",                    "labels": ["other"]                },                {                    "title": "## 📦 Dependencies",                    "labels": ["dependencies"]                }              ]            }env:GITHUB_TOKEN:${{ secrets.GITHUB_TOKEN }}

Example Commit Mode w/ Configuration

jobs:release:if:startsWith(github.ref, 'refs/tags/')runs-on:ubuntu-lateststeps:      -name:Build Changeloguses:mikepenz/release-changelog-builder-action@v5with:mode:"COMMIT"configurationJson:|            {              "template": "#{{CHANGELOG}}",              "categories": [                {                    "title": "## Feature",                    "labels": ["feat", "feature"]                },                {                    "title": "## Fix",                    "labels": ["fix", "bug"]                },                {                    "title": "## Other",                    "labels": []                }              ],              "label_extractor": [                {                  "pattern": "^(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test){1}(\\([\\w\\-\\.]+\\))?(!)?: ([\\w ])+([\\s\\S]*)",                  "on_property": "title",                  "target": "$1"                }              ]            }env:GITHUB_TOKEN:${{ secrets.GITHUB_TOKEN }}

This example defines a regex to extract the label from the commit message. Handling flags from theConventional Commit Standards.

Action Inputs/Outputs

Action inputs

Depending on the use-case additional settings can be provided to the action

-name:"Complex Configuration"id:build_changelogif:startsWith(github.ref, 'refs/tags/')uses:mikepenz/release-changelog-builder-action@{latest-release}with:configuration:"configuration_complex.json"owner:"mikepenz"repo:"release-changelog-builder-action"ignorePreReleases:"false"fromTag:"0.3.0"toTag:"0.5.0"token:${{ secrets.PAT }}
Monorepo Configuration

Formonorepo setups, you can filter commits by path to generate changelogs only for specific components:

-name:"App1 Changelog"id:build_app1_changelogif:startsWith(github.ref, 'refs/tags/')uses:mikepenz/release-changelog-builder-action@{latest-release}with:includeOnlyPaths:|      app1/      shared/fromTag:"v1.0.0"toTag:"v2.0.0"token:${{ secrets.GITHUB_TOKEN }}

Note

All input values are optional. It is only required to provide thetoken either via the input, or asenv variable.

InputDescription
configurationJsonProvide the configuration directly via the buildyml file. Please note that${{}} has to be written as#{{}} within theyml file.
configurationRelative path, to theconfiguration.json file, providing additional configurations
outputFileOptional relative path to a file to store the resulting changelog in.
ownerThe owner of the repository to generate the changelog for
repoName of the repository we want to process
fromTagDefines the 'start' from where the changelog will consider merged pull requests (can be a tag or a valid git ref)
toTagDefines until which tag the changelog will consider merged pull requests (can be a tag or a valid git ref)
pathAllows to specify an alternative sub directory, to use as base
tokenAlternative config to specify token. You should preferenv.GITHUB_TOKEN instead though
baseUrlAlternative config to specify base url for GitHub Enterprise authentication. Default value set tohttps://api.github.com
includeOpenEnables to also fetch currently open PRs. Default: false
ignorePreReleasesAllows to ignore pre-releases for changelog generation (E.g. for 1.0.1... 1.0.0-rc02 <- ignore, 1.0.0 <- pick). Only used iffromTag was not specified. Default: false
failOnErrorDefines if the action will result in a build failure if problems occurred. Default: false
fetchViaCommitsEnables PRs to get fetched via the commits identified between from->to tag. This will do 1 API request per commit -> Best for scenarios with squash merges
fetchReviewersWill enable fetching the users/reviewers who approved the PR. Default: false
fetchReleaseInformationWill enable fetching additional release information from tags. Default: false
fetchReviewsWill enable fetching the reviews on of the PR. Default: false
modeDefines the mode used to retrieve the information. Available options: [PR,COMMIT,HYBRID]. Defaults toPR. Hybrid mode treats commits like pull requests. Commit mode is a special configuration for projects which work without PRs. Uses commit messages as changelog. This mode looses access to information only available for PRs. Formerly set ascommitMode: true, this setting is now deprecated and should be converted tomode: "COMMIT". Note: the commit or hybrid modes are not fully supported.
offlineMode[EXPERIMENTAL] Enables offline mode which disables API requests to GitHub or Gitea. Only works with commitMode and retrieves tags and diffs from the local repository. Default: false
exportCacheWill enable exporting the fetched PR information to a cache, which can be re-used by later runs. Default: false
exportOnlyWhen enabled, will result in only exporting the cache, without generating a changelog. Default: false (RequiresexportCache to be enabled)
cacheThe file path to write/read the cache to/from.
includeOnlyPathsList of path patterns to include. Provide as multiline input (one per line). Only commits that touched these paths will be included in the changelog. Useful for monorepo setups where you want to filter commits by their affected paths. GitHub (non-offline mode): whenincludeOnlyPaths is defined, the action performs an extra API call per commit to determine which files were modified by that commit. This can significantly increase API usage for large diffs.

Warning

${{ secrets.GITHUB_TOKEN }} only grants rights to the current repository, for other repositories please use a PAT (Personal Access Token).

Action outputs

After action execution it will return thechangelog and additional information as step output. You can use it in any follow-up step by referencing the output by referencing it via the id of the step. For examplebuild_changelog.

# ${{steps.{CHANGELOG_STEP_ID}.outputs.changelog}}${{steps.build_changelog.outputs.changelog}}

A full set list of possible output values for this action.

OutputDescription
outputs.changelogThe built release changelog built from the merged pull requests
outputs.ownerSpecifies the owner of the repository processed
outputs.repoDescribes the repository name, which was processed
outputs.fromTagDefines thefromTag which describes the lower bound to process pull requests for
outputs.toTagDefines thetoTag which describes the upper bound to process pull request for
outputs.failedDefines if there was an issue with the action run, and the changelog may not have been generated correctly. [true, false]
outputs.pull_requestsDefines a, joined array with all PR IDs associated with the generated changelog.
outputs.categorized_prsCount of PRs which were successfully categorized as part of the action.
outputs.open_prsCount of open PRs. Only fetched ifincludeOpen is enabled.
outputs.uncategorized_prsCount of PRs which were not categorized as part of the action.
outputs.changed_filesCount of changed files in this release.
outputs.additionsCount of code additions in this release (lines).
outputs.deletionsCount of code deletions in this release (lines).
outputs.changesTotal count of changes in this release (lines).
outputs.commitsCount of commits which have been added in this release.
outputs.contributorsThe contributors of this release. Based on PR authors only.
outputs.categorizedThe categorized pull requests used to build the changelog as serialized JSON.
outputs.cacheThe file pointing to the cache for the current fetched data. Can be provided to another action step.

Customization 🖍️

Note

Important

When running this action for non tags trigger thetoTag will be automatically resolved using the latest tag as retrieved by the git API.

Note

The first release tag is a special case since there is no previous release the action can reference to. For this case, there are two options:

  1. When checking out the source viagit (E.g.:actions/checkout), the action will use the first commit.
  2. Create an initial tag on the commit you want to begin a changelog from (for examplev0.0.1).

Note

By default not specifyingfromTag ortoTag will resolvetoTag from either theref or alternatively fallback to the latest tag from the git API.fromTag is resolved by sorting tags usingsemver. Tags not following semver are filtered out. Check theconfiguration for alternatives.

Note

If you are behind a corporate HTTP proxy, you can set thehttps_proxy environment variable to the proxy URL. For reference, please see the Octokitdocumentation.

Configuration

The action supports flexible and extensive configuration options to fine-tune it for the specific projects needs. To do so provide the configuration either directly to the step viaconfigurationJson or as file via theconfiguration.

Configuration in .yml

-name:Build Changeloguses:mikepenz/release-changelog-builder-action@v5with:configurationJson:|      {        "template": "#{{CHANGELOG}}\n\n<details>\n<summary>Uncategorized</summary>\n\n#{{UNCATEGORIZED}}\n</details>",        "categories": [          {              "title": "## 💬 Other",              "labels": ["other"]          }        ]      }

Configuration as json file

-name:"Build Changelog"uses:mikepenz/release-changelog-builder-action@{latest-release}with:configuration:"configuration.json"

[!WARNING]
It is required to have acheckout step prior to the changelog step ifconfiguration is used, to allow the action to discover the configuration file. UseconfigurationJson as alternative.

Note

Defaults for the configuration can be found in theconfiguration.ts

Note

It is possible to provide the configuration as file and as json via the yml file. The order of config values used:configurationJson >configuration >DefaultConfiguration.

The configuration is aJSON in the following format. (The below showcasesexample configurations for all possible options. In most scenarios most of the settings will not be needed, and the defaults will be appropriate.)

{"categories": [      {"title":"## 🚀 Features","labels": ["feature"]      },      {"title":"## 🐛 Fixes","labels": ["fix"]      },      {"key":"tests","title":"## 🧪 Tests","labels": ["test"]      },      {"title":"## 🧪 Tests and some 🪄 Magic","labels": ["test","magic"],"exclude_labels": ["no-magic"],"exhaustive":true,"exhaustive_rules":"false","empty_content":"- no matching PRs","rules": [          {"pattern":"open","on_property":"status","flags":"gu"          }        ]      }    ],"ignore_labels": ["ignore"    ],"sort": {"order":"ASC","on_property":"mergedAt"    },"template":"#{{CHANGELOG}}\n\n<details>\n<summary>Uncategorized</summary>\n\n#{{UNCATEGORIZED}}\n</details>","pr_template":"- #{{TITLE}}\n   - PR: ##{{NUMBER}}","empty_template":"- no changes","label_extractor": [      {"pattern":"(.) (.+)","target":"$1","flags":"gu"      },      {"pattern":"\\[Issue\\]","on_property":"title","method":"match"      }    ],"duplicate_filter": {"pattern":"\\[ABC-....\\]","on_property":"title","method":"match"    },"reference": {"pattern":".*\\\\#(.).*","on_property":"body","method":"replace","target":"$1"    },"transformers": [      {"pattern":"[\\-\\*] (\\[(...|TEST|CI|SKIP)\\])( )?(.+?)\n(.+?[\\-\\*] )(.+)","target":"- $4\n  - $6"      }    ],"trim_values":false,"max_tags_to_fetch":200,"max_pull_requests":200,"max_back_track_time_days":365,"exclude_merge_branches": ["Owner/qa"    ],"tag_resolver": {"method":"semver","filter": {"pattern":"api-(.+)","flags":"gu"      }    },"base_branches": ["dev"    ]}

Any section of the configuration can be omitted to have defaults apply.

Warning

ignore_labels take precedence over category labels, allowing to specifically exclude certain PRs.

Please see theConfiguration Specification for detailed descriptions on the offered configuration options.

Template placeholders

Table of supported placeholders allowed to be used in thetemplate andempty_template (only supports placeholder marked for empty) configuration, to give additional control on defining the contents of the release notes / changelog.

PlaceholderDescriptionEmpty
#{{CHANGELOG}}The contents of the changelog, matching the labels as specified in the categories configuration
#{{UNCATEGORIZED}}All pull requests not matching a specified label in categories
#{{OPEN}}All open pull requests. Will only be fetched ifincludeOpen is enabled.
#{{IGNORED}}All pull requests defining labels matching theignore_labels configuration
#{{OWNER}}Describes the owner of the repository the changelog was generated forx
#{{REPO}}The repository name of the repo the changelog was generated forx
#{{FROM_TAG}}Defines the 'start' from where the changelog did consider merged pull requestsx
#{{FROM_TAG_DATE}}Defines the date at which the 'start' tag was created. RequiresfetchReleaseInformation.x
#{{TO_TAG}}Defines until which tag the changelog did consider merged pull requestsx
#{{TO_TAG_DATE}}Defines the date at which the 'until' tag was created. RequiresfetchReleaseInformation.x
#{{RELEASE_DIFF}}Introduces a link to the full diff between from tag and to tag releasesx
#{{CHANGED_FILES}}The count of changed files.
#{{ADDITIONS}}The count of code additions (lines).
#{{DELETIONS}}The count of code deletions (lines).
#{{CHANGES}}The count of total changes (lines).
#{{COMMITS}}The count of commits in this release.
#{{CONTRIBUTORS}}The contributors of this release. Based on PR Authors only.
#{{CATEGORIZED_COUNT}}The count of PRs which were categorized
#{{UNCATEGORIZED_COUNT}}The count of PRs and changes which were not categorized. No label overlapping with category labels
#{{OPEN_COUNT}}The count of open PRs. Will only be fetched ifincludeOpen is configured.
#{{IGNORED_COUNT}}The count of PRs and changes which were specifically ignored from the changelog.
#{{DAYS_SINCE}}Days between the 2 releases. RequiresfetchReleaseInformation to be enabled.x

PR Template placeholders

Table of supported placeholders allowed to be used in thepr_template configuration, which will be included in the release notes / changelog.

PlaceholderDescription
#{{NUMBER}}The number referencing this pull request. E.g. 13.
#{{TITLE}}Specified title of the merged pull request.
#{{URL}}Url linking to the pull request on GitHub.
#{{STATUS}}Status of the PR. Usually alwaysmerged. PossiblyOpen ifincludeOpen is configured.
#{{CREATED_AT}}The ISO time, the pull request was created at.
#{{MERGED_AT}}The ISO time, the pull request was merged at.
#{{MERGE_SHA}}The commit SHA, the pull request was merged with.
#{{AUTHOR}}Author creating and opening the pull request.
#{{AUTHOR_NAME}}The name of the Author creating and opening the pull request (Can be empty).
#{{LABELS}}The labels associated with this pull request, joined by,.
#{{MILESTONE}}Milestone this PR was part of, as assigned on GitHub.
#{{BODY}}Description/Body of the pull request as specified on GitHub.
#{{ASSIGNEES}}Login names of assigned GitHub users, joined by,.
#{{REVIEWERS}}GitHub Login names of specified reviewers, joined by,. RequiresfetchReviewers to be enabled.
#{{APPROVERS}}GitHub Login names of users who approved the PR, joined by,.

Important

v4 updates the default placeholders format to#{{}}. The old format${{}} will be supported until v5 for backwards compatibility.

Array Placeholders

Table of special array placeholders allowed to be used in thepr_template configuration.

Array placeholders follow the following format:(KEY)[(*/index)] for example:ASSIGNEES[*] orASSIGNEES[0].When using* values are joined by,.

PlaceholderDescription
#{{ASSIGNEES[*]}}Login names of assigned GitHub users.
#{{REVIEWERS[*]}}GitHub Login names of specified reviewers. RequiresfetchReviewers to be enabled.
#{{APPROVERS[*]}}GitHub Login names of users who approved the PR.

Additionally, there are special array placeholders likeREVIEWS which allows access to it's properties via(KEY)[(*/index)].(property).

For example:REVIEWS[*].author orREVIEWS[*].body

PlaceholderDescription
#{{REVIEWS[*].author}}GitHub Login names of specified reviewers.
#{{REVIEWS[*].body}}The body of the review.
#{{REVIEWS[*].htmlURL}}The URL to the given review.
#{{REVIEWS[*].submittedAt}}The date went he review was submitted.
#{{REVIEWS[*].state}}The state of the given review.

Similar toREVIEWS,REFERENCED PRs also offer special placeholders.

PlaceholderDescription
#{{REFERENCED[*].number}}The PR number of the referenced PR.
#{{REFERENCED[*].title}}The title of the referenced PR.
#{{REFERENCED[*]."..."}}Allows to use most other PR properties as placeholder.

Commit Template placeholders

Table of supported placeholders allowed to be used in thecommit_template configuration, which will be included in the release notes / changelog. Applies toHYBRID andCOMMIT modes only.

PlaceholderDescription
#{{NUMBER}}Always 0.
#{{TITLE}}The commit summary.
#{{STATUS}}Alwaysmerged.
#{{CREATED_AT}}The ISO time of the commit.
#{{MERGE_SHA}}The commit SHA.
#{{AUTHOR}}The username of the commit Author.
#{{AUTHOR_NAME}}The name of the commit Author (Can be empty).
#{{BODY}}The commit message.

Configuration Specification

Table of descriptions for theconfiguration.json options to configure the resulting release notes / changelog.

InputDescription
categoriesAn array ofcategory specifications, offering a flexible way to group changes into categories.
category.keyOptional key used for thecategorized json output.
category.titleThe display name of a category in the changelog.
category.labelsAn array of labels, to match pull request labels against. If any PR label matches any category label, the pull request will show up under this category. (Seeexhaustive to change this)
category.exclude_labelsSimilar tolabels, an array of labels to match PRs against, but if a match occurs the PR is excluded from this category.
category.exhaustiveWill require all labels defined within this category to be present on the matching PR.
category.exhaustive_rulesWill require all rules defined within this category to be valid on the matching PR. If not defined, defaults to the value ofexhaustive
category.empty_contentIf the category has no matching PRs, this content will be used. When not set, the category will be skipped in the changelog.
category.rulesAn array ofrules used to match PRs against. Any match will include the PR. (Seeexhaustive to change this)
category.rules.patternAregex pattern to match the property value towards. UsesRegExp.test("val")
category.rules.flagsDefines the regex flags specified for the pattern. Default:gu.
category.rules.on_propertyThe PR property to match against.Possible values.
category.modeDefines if this category applies to PRs, commits or both. Allowed values:PR,COMMIT,HYBRID. Default:HYBRID.
ignore_labelsAn array of labels, to match pull request labels against. If any PR label overlaps, the pull request will be ignored from the changelog. This takes precedence over category labels
sortAsort specification, offering the ability to define sort order and property.
sort.orderThe sort order. Allowed values:ASC,DESC
sort.on_propertyThe property to sort on. Allowed values:mergedAt,title
templateSpecifies the global template to pick for creating the changelog. SeeTemplate placeholders for possible values
pr_templateDefines the per pull request template. SeePR Template placeholders for possible values
commit_templateDefines the per commit template. Used inHYBRID andCOMMIT modes only. If empty, uses the template defined forpr_template. SeeCommit Template placeholders for possible values.
empty_templateTemplate to pick if no changes are detected. SeeTemplate placeholders for possible values
label_extractor.[{<EXTRACTOR>}]An array ofExtractor specifications, offering a flexible API to extract additional labels from a PR. Please see the documentation related toRegex Configuration for more details.
duplicate_filter.{<EXTRACTOR>}Defines theExtractor to use for retrieving the identifier for a PR. In case of duplicates will keep the last matching pull request (depends onsort). Please see the documentation related toRegex Configuration for more details.
reference.{<EXTRACTOR>}Defines theExtractor to use for resolving the "PR-number" for a parent PR. In case of a match, the child PR will not be included in the release notes. Please see the documentation related toRegex Configuration for more details.
transformers.[{<REGEX>}]An array ofRegex specifications, offering a flexible API to modify the text per pull request. This is applied on the change text created withpr_template.transformers are executed per change, in the order specified. Please see the documentation related toRegex Configuration for more details.
max_tags_to_fetchThe maximum amount of tags to load from the API to find the previous tag. Loaded paginated with 100 per page
max_pull_requestsThe maximum amount of pull requests to load from the API. Loaded paginated with 30 per page
max_back_track_time_daysDefines the max amount of days to go back in time per changelog
exclude_merge_branchesAn array of branches to be ignored from processing as merge commits
tag_resolverSection to provide configuration for the tag resolving logic. Used if nofromTag is provided
tag_resolver.methodDefines the method to use. Current options are:semver,sort. Default:semver
tag_resolver.filterDefines a regex object which is used to filter out tags not matching.
tag_resolver.transformer.{<REGEX>}Defines a regex transformer used to optionally transform the tag after the filter was applied. Allows to adjust the format to e.g. semver. Please see the documentation related toRegex Configuration for more details.
base_branchesThe target branches for the merged PR, ignores PRs with different target branch. Values can be aregex. Default: allow all base branches
trim_valuesDefines if all values inserted in templates aretrimmed. Default: false

Regex Configuration

Since v5.x or newer, the regex configuration was unified to allow the same functionalities to be used for the various use-cases.This applies to all configurations outlined inConfiguration Specification andCustom placeholders that allow a regex object.

InputDescription
.patternTheregex pattern to use
.targetThe result pattern. The result text will be used as label. If empty, no label is created. (Usage depends on themethod used for the regex).

Javascript methods (replace,replaceAll,match) define the regex in JavaScript format (e.g. double backslash to escape a dot \.). For example to include all matching tags and exclude the rest, use negative lookahead to exclude tags. For example, api.* will only include tags starting with "api", ^(?!alpha).* will exclude all tags starting with "alpha".
.methodThe extraction method used. Defaults to:replace. Alternative values:replaceAll,match. These methods specified references the JavaScript String method. And a special methodregexr, that functions similar to thelist within the regexr tool.
.flagsDefines the regex flags specified for the pattern. Default:gu.
.on_emptyDefines the placeholder to be filled in, if the regex does not lead to a result.
.on_propertyThis is available forExtractor type regex objects. With the property describing a field available in PRs. (e.g.: title, body, ...) Default:body.
Example regex configuration block

Sample extracts a ticket number from the title

Sample PR title input

[XYZ-1234] This is my PR title

Regex replace pattern

{  "name": "TICKET",  "source": "TITLE",  "transformer": {    "pattern": "\\s*\\[([A-Z].{2,4}-.{2,5})\\][\\S\\s]*",    "target": "- [$1](https://corp.ticket-system.com/browse/$1)"  }}

Regexr style pattern (Useregexr.com to test).To test on Regexr inverse the escaping of\\ to\

{  "name": "TICKET",  "source": "TITLE",  "transformer": {    "pattern": "\\[([A-Z]{2,4}-.{2,5})\\]",    "method": "regexr",    "target": '- [$1](https://corp.ticket-system.com/browse/$1)'  }}

Warning

Usages of\ in the json have to be escaped. E.g.\ becomes\\.

Custom placeholders

Starting with v3.2.0 the action provides a feature of definingCUSTOM_PLACEHOLDERS.

Custom placeholders allow to extract values from any existing placeholder and insert them into the target template.

Example

Custom placeholders can be defined via theconfiguration.json ascustom_placeholders. See the below example json:

{"template":"**Epics**\n#{{EPIC[*]}}\n\n#{{CHANGELOG}}","pr_template":"- #{{TITLE}} - #{{URL}} #{{EPIC}}","custom_placeholders": [    {"name":"EPIC","source":"BODY","transformer": {"pattern":"[\\S\\s]*?(https:\\/\\/corp\\.atlassian\\.net\\/browse\\/EPIC-.{2,4})[\\S\\s]*","target":"- $1"      }    }  ]}

This example will look for JIRA tickets in the EPIC project, and extract all of these tickets. The exciting part for that case is, that the ticket is PR-bound but can be used in the global TEMPLATE, but equally also in the PR template. This is unique for CUSTOM PLACEHOLDERS as standard placeholders do not offer this functionality.

InputDescription
custom_placeholdersAn array ofPlaceholder specifications, offering a flexible API to extract custom placeholders from existing placeholders.
custom_placeholders.nameThe name of the custom placeholder. Will be used within the template.
custom_placeholders.sourceThe source PLACEHOLDER, requires to be one of the existing Template or PR Template placeholders.
custom_placeholders.transformer.{<REGEX>}The transformer specification used to extract the value from the original source PLACEHOLDER. Please see the documentation related toRegex Configuration for more details.

A placeholder with the name asCUSTOM_PLACEHOLDER can be used as#{{CUSTOM_PLACEHOLDER}} in the target template.By default the same restriction applies as for PR vs. template placeholder. E.g. a global placeholder can only be used in the global template (and not in the PR template).

Custom placeholders offer one new feature, though. PR-related placeholders can be used in the global template via the following syntax:

  • CUSTOM_PLACEHOLDER[*] - Will join all found values and insert them at the given location in the global template
  • CUSTOM_PLACEHOLDER[0] /CUSTOM_PLACEHOLDER[index] - Will insert the first found value (item at index) into the global template

Gitea support 🧪

Starting with v4.1.0 the action is also compatible withgitea.

Warning

The API from gitea does not allow to retrieve thediff via its API, requiring the repo to be checked out

The API for gitea is equal to the one from GitHub, however it requires theplatform to be specified.

-name:Build Changeloguses:https://github.com/mikepenz/release-changelog-builder-action@v5with:platform:"gitea"# gitea or GitHub, default is GitHubconfiguration:"configuration.json"token:${{ secrets.GITEA_TOKEN }}

Contribute 🧬

# Install the dependencies$ npm install# Verify lint is happy$ npm run lint -- --fix# Build the typescript and package it for distribution$ npm run build&& npm run package# Run the tests, use to debug, and test it out$ npmtest

It's suggested to export the token to your path before running the tests so that API calls can be done to GitHub.

export GITHUB_TOKEN=your_personal_github_pat

Local Testing 🧪

This GitHub action is fully developed in Typescript and can be run locally vianpm or right from the browser usingGitHub Codespace.

Open in GitHub Codespaces

Doing so is a great way to test the action and/or your custom configurations locally, without the need to push and re-run GitHub actions over and over again.

To run locally, or to access private repositories (GitHub Codespaces has automatic access to public repos with the default token), you will require to provide a validGITHUB_TOKEN with read-only permissions to access the repositories you want to run this action towards. (See more details inToken Permission)

To test your own configuration and use-case, the project contains a__tests__/demo/demo.test.ts file, modify this one to your needs. (e.g., change repo, change token, change settings, ...), and then run it via:

npmtest -- -- demo.test.ts
Debugging with Breakpoints

One major benefit of setting up a custom test is that it will allow you to use JavaScripts full debugging support, including the option of breakpoints via (for example) Visual Code.

From GitHub codespaces, open the terminal panel -> Click the small arrow down beside+ and pickJavaScript Debug Terminal (make sure to export the token again). Now execute the test with this terminal. (This is very similar to local Visual Code environments).

Run common tests

To run the common tests of the action, you require to export a valid GitHub token.

# Export the token in the CLI you use to execute.export GITHUB_TOKEN=your_read_only_github_token

Afterwards it is possible to run any test included in the project:

npmtest -- -- main.test.ts# modify the file name to run other testcases

Token Permission

Permissions depend on the specific use-case, however this action only requiresread-only permissions as it will not make modifications to the repository.

GitHub actions

Depending on the given environment it may be required to define teh token scope for GitHub actions toread forcontents andpull-requests.

permissions:  contents: read  pull-requests: read

GitHub Actions token scope.

Fine-grained personal access tokens

ForFine-grained personal access tokens this means:

  • read forPull requests
    • Covered by thepull-requests scope
  • read forCommits
    • Covered by thecontents scope
  • read forTags (if not available thefrom andto refs have to be provided)
    • Covered by thecontents scope
  • read tolist reviews
    • Covered by thecontents scope

Classic tokens

For Classic tokens you only have to create the token without special permissions.

Developed By

Credits

Other actions

License

Copyright for portions of pr-release-notes are held by Nikolay Blagoev, 2019-2020 as part of project pull-release-notes.All other copyright for project pr-release-notes are held by Mike Penz, 2024.

Fork License

All patches and changes applied to the original source are licensed under the Apache 2.0 license.

Copyright 2025 Mike PenzLicensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License at   http://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.

Sample result release notes / changelog

About

A GitHub action that builds your release notes / changelog fast, easy and exactly the way you want.

Topics

Resources

License

Security policy

Stars

Watchers

Forks

Sponsor this project

 

Contributors26


[8]ページ先頭

©2009-2025 Movatter.jp