From 5a44f07d4c5a4c7f61ea67e96d2d3aacfe0cef70 Mon Sep 17 00:00:00 2001 From: 4Ply Date: Sat, 28 Dec 2024 17:00:55 +0200 Subject: [PATCH] Automatically publish changelog to Github release --- .github/workflows/changelog.yml | 35 +++++++++++++++++ cliff.toml | 66 +++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 .github/workflows/changelog.yml create mode 100644 cliff.toml diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml new file mode 100644 index 0000000..6c1773e --- /dev/null +++ b/.github/workflows/changelog.yml @@ -0,0 +1,35 @@ +name: Publish changelog +permissions: + contents: write + +on: + push: + tags: + - '[0-9]+.[0-9]+.[0-9]+' + +jobs: + generate-changelog: + name: Generate changelog + runs-on: ubuntu-22.04 + outputs: + release_body: ${{ steps.git-cliff.outputs.content }} + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Generate a changelog + uses: orhun/git-cliff-action@main + id: git-cliff + with: + config: cliff.toml + args: --strip all -v --latest --github-repo ${{ github.repository }} + + - name: Create Github release + uses: softprops/action-gh-release@v2 + if: startsWith(github.ref, 'refs/tags/') + with: + make_latest: true + body_path: ${{ steps.git-cliff.outputs.changelog }} diff --git a/cliff.toml b/cliff.toml new file mode 100644 index 0000000..2710b83 --- /dev/null +++ b/cliff.toml @@ -0,0 +1,66 @@ +# git-cliff ~ configuration file +# https://git-cliff.org/docs/configuration + +[changelog] + +# template for the changelog body +# https://keats.github.io/tera/docs/#introduction +body = """ +{% if version -%} + ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} +{% for group, commits in commits | group_by(attribute="group") %} + ### {{ group | upper_first }} + {% for commit in commits %} + - {{ commit.message | split(pat="\n") | first | upper_first | trim }}\ + {% endfor %} +{% endfor %}\n +{% endif -%} +""" + +# template for the changelog footer +footer = """ +{% for release in releases -%} + {% if release.version -%} + {% if release.previous.version -%} + [{{ release.version | trim_start_matches(pat="v") }}]: \ + https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}\ + /compare/{{ release.previous.version }}..{{ release.version }} + {% endif -%} + {% else -%} + [unreleased]: https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}\ + /compare/{{ release.previous.version }}..HEAD + {% endif -%} +{% endfor %} + +""" + +# remove the leading and trailing whitespace from the templates +trim = true + +[git] +# parse the commits based on https://www.conventionalcommits.org +conventional_commits = true +# filter out the commits that are not conventional +filter_unconventional = false +# regex for parsing and grouping commits +commit_parsers = [ + { message = "^[a|A]dd", group = "Added" }, + { message = "^[s|S]upport", group = "Added" }, + { message = "^[r|R]emove", group = "Removed" }, + { message = "^.*: add", group = "Added" }, + { message = "^.*: support", group = "Added" }, + { message = "^.*: remove", group = "Removed" }, + { message = "^.*: delete", group = "Removed" }, + { message = "^test", group = "Fixed" }, + { message = "^fix", group = "Fixed" }, + { message = "^.*: fix", group = "Fixed" }, + { message = "^.*", group = "Changed" }, + # { message = ".*changelog.*", changelog = true }, +] +# filter out the commits that are not matched by commit parsers +filter_commits = false +# sort the tags topologically +topo_order = false +# sort the commits inside sections by oldest/newest order +sort_commits = "newest" +