Skip to content

Commit

Permalink
chore: add release workflow (mainsail-crew#194)
Browse files Browse the repository at this point in the history
* chore: add release workflow

Signed-off-by: Patrick Gehrsitz <[email protected]>

* chore: fix GITHUB_TOKEN permissions

* chore: fix broken commit links

* chore: add post- and preprocessing for release workflow

* chore: update cliff action version

* chore: fix syntax error

* chore: fix PR url

* chore: bump to actions/checkout v4

---------

Signed-off-by: Patrick Gehrsitz <[email protected]>
  • Loading branch information
mryel00 authored and meteyou committed Nov 2, 2023
1 parent 767c53a commit e69e21a
Show file tree
Hide file tree
Showing 3 changed files with 257 additions and 0 deletions.
91 changes: 91 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
name: Release

on:
workflow_dispatch:
inputs:
version:
type: string
description: New version number in X.Y.Z
required: true

jobs:
update-master-branch:
runs-on: ubuntu-latest
steps:
- uses: everlytic/[email protected]
with:
github_token: ${{ secrets.PAT }}
source_ref: 'develop'
target_branch: 'master'
commit_message_template: '[Automated] Merged {source_ref} into target {target_branch}'

release:
needs: [ 'update-master-branch' ]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Fetch repo
uses: actions/checkout@v4
with:
ref: 'master'
fetch-depth: 0

- name: Get latest tag
id: latest_tag
shell: bash
run: |
echo "TAG_NAME=$(git describe --tags $(git rev-list --tags --max-count=1))" >> $GITHUB_OUTPUT
- name: Generate a changelog
uses: orhun/git-cliff-action@v2
id: generate-changelog
with:
config: ./cliff-release.toml
args: ${{ steps.latest_tag.outputs.TAG_NAME }}..HEAD

- name: Create release and upload build
uses: softprops/action-gh-release@v1
id: create-release
with:
name: v${{ github.event.inputs.version }}
tag_name: v${{ github.event.inputs.version }}
token: ${{ secrets.GITHUB_TOKEN }}
body: ${{ steps.generate-changelog.outputs.content }}

update-changelog:
needs: [ 'release' ]
name: Generate changelog
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: 'master'
token: ${{ secrets.PAT }}
fetch-depth: 0

- name: Get latest tag
id: latest_tag
shell: bash
run: |
echo "TAG_NAME=$(git describe --tags $(git rev-list --tags --max-count=1))" >> $GITHUB_OUTPUT
- name: Generate a changelog
uses: orhun/git-cliff-action@v2
id: git-cliff
with:
config: cliff.toml
args: v0.0.0..${{ steps.latest_tag.outputs.TAG_NAME }}
env:
OUTPUT: ${{ github.workspace }}/CHANGELOG.md

- uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: 'docs(changelog): update changelog'
file_pattern: CHANGELOG.md

- uses: everlytic/[email protected]
with:
github_token: ${{ secrets.PAT }}
source_ref: 'master'
target_branch: 'develop'
commit_message_template: '[Automated] Merged {source_ref} into target {target_branch}'
80 changes: 80 additions & 0 deletions cliff-release.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# configuration file for git-cliff (0.1.0)

[changelog]
# changelog header
header = """
# What's Changed
"""
# template for the changelog body
# https://tera.netlify.app/docs/#introduction
body = """
{% for group, commits in commits | group_by(attribute="group") %}\
### {{ group | striptags | trim | upper_first }}
{% for commit in commits
| filter(attribute="scope")
| sort(attribute="scope") %}
- **{{commit.scope}}**: {{ commit.message | upper_first | trim }} | [{{ commit.id | truncate(length=7, end="") }}](<REPO>/commit/{{ commit.id }})\
{%- if commit.breaking %}
{% raw %} {% endraw %}- **BREAKING**: {{commit.breaking_description}}
{%- endif -%}
{%- endfor -%}
{%- for commit in commits %}
{%- if commit.scope -%}
{% else -%}
{% raw %}\n{% endraw %}\
- {{ commit.message | upper_first | trim }} | [{{ commit.id | truncate(length=7, end="") }}](<REPO>/commit/{{ commit.id }})\
{%- if commit.breaking %}
{% raw %} {% endraw %}- **BREAKING**: {{commit.breaking_description}}
{%- endif -%}
{% endif -%}
{% endfor -%}
{% raw %}\n{% endraw %}
{% endfor %}\n\
"""
# remove the leading and trailing whitespaces from the template
trim = true
# changelog footer
footer = """
"""

# postprocessors
postprocessors = [
{ pattern = '(\(<REPO>/pull/[0-9]+\)\)) \| .+', replace = "${1}" },
{ pattern = '<REPO>', replace = "https://github.com/mainsail-crew/crowsnest" }, # replace repository URL
]

[git]
# allow only conventional commits
# https://www.conventionalcommits.org
conventional_commits = true
filter_unconventional = true
# regex for parsing and grouping commits
commit_parsers = [
# Commits to skip
{ message = "^docs\\(changelog\\):", group = "Changelog", skip = true}, # Old redundant commits
{ message = "^chore: push version number to", group = "9$Other", skip = true}, # Old redundant commits
{ message = "^chore\\(changelog\\): update changelog", group = "Changelog", skip = true}, # Old redundant commits

# Commits to parse
{ message = "^feat(\\(.*\\))?:", group = "<!-- 1 -->Features"},
{ message = "^feature(\\(.*\\))?:", group = "<!-- 1 -->Features"},
{ message = "^fix(\\(.*\\))?:", group = "<!-- 2 -->Bug Fixes and Improvements"},
{ message = "^perf(\\(.*\\))?:", group = "<!-- 3 -->Performance"},
{ message = "^refactor(\\(.*\\))?:", group = "<!-- 4 -->Refactor"},
{ message = "^style(\\(.*\\))?:", group = "<!-- 5 -->Styling"},
{ message = "^locale(\\(.*\\))?:", group = "<!-- 6 -->Localization"},
{ message = "^docs(\\(.*\\))?:", group = "<!-- 7 -->Documentation"},
{ message = "^test(\\(.*\\))?:", group = "<!-- 8 -->Other"},
{ message = "^chore(\\(.*\\))?:", group = "<!-- 8 -->Other"},
{ body = ".*security", group = "Security"},
]
commit_preprocessors = [
{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](<REPO>/pull/${2}))" },
]
# filter out the commits that are not matched by commit parsers
filter_commits = true
ignore_tags="v*-(beta|rc)*"
# glob pattern for matching git tags
tag_pattern = "v[0-9]*"
86 changes: 86 additions & 0 deletions cliff.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# configuration file for git-cliff (0.1.0)

[changelog]
# changelog header
header = """
<!-- THIS FILE IS UPDATED AUTOMATICALLY, ANY CHANGES WILL BE OVERRIDDEN -->
# Changelog
All notable changes to Crowsnest will be documented in this file.\n
"""
# template for the changelog body
# https://tera.netlify.app/docs/#introduction
body = """
{% if version %}\
## [{{ version | trim_start_matches(pat="v") }}](https://github.com/mainsail-crew/crowsnest/releases/tag/{{version}}) - {{ timestamp | date(format="%Y-%m-%d") }}
\
{% else %}\
## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}\
### {{ group | striptags | trim | upper_first }}
{% for commit in commits
| filter(attribute="scope")
| sort(attribute="scope") %}
- **{{commit.scope}}**: {{ commit.message | upper_first | trim }} | [{{ commit.id | truncate(length=7, end="") }}](<REPO>/commit/{{ commit.id }})\
{%- if commit.breaking %}
{% raw %} {% endraw %}- **BREAKING**: {{commit.breaking_description}}
{%- endif -%}
{%- endfor -%}
{%- for commit in commits %}
{%- if commit.scope -%}
{% else -%}
{% raw %}\n{% endraw %}\
- {{ commit.message | upper_first | trim }} | [{{ commit.id | truncate(length=7, end="") }}](<REPO>/commit/{{ commit.id }})\
{%- if commit.breaking %}
{% raw %} {% endraw %}- **BREAKING**: {{commit.breaking_description}}
{%- endif -%}
{% endif -%}
{% endfor -%}
{% raw %}\n{% endraw %}
{% endfor %}\n\
"""
# remove the leading and trailing whitespaces from the template
trim = true
# changelog footer
footer = """
"""

# postprocessors
postprocessors = [
{ pattern = '(\(<REPO>/pull/[0-9]+\)\)) \| .+', replace = "${1}" },
{ pattern = '<REPO>', replace = "https://github.com/mainsail-crew/crowsnest" }, # replace repository URL
]

[git]
# allow only conventional commits
# https://www.conventionalcommits.org
conventional_commits = true
filter_unconventional = false
# regex for parsing and grouping commits
commit_parsers = [
# Commits to skip
{ message = "^docs\\(changelog\\):", group = "Changelog", skip = true}, # Old redundant commits
{ message = "^chore: push version number to", group = "9$Other", skip = true}, # Old redundant commits
{ message = "^chore\\(changelog\\): update changelog", group = "Changelog", skip = true}, # Old redundant commits

# Commits to parse
{ message = "^feat(\\(.*\\))?:", group = "<!-- 1 -->Features"},
{ message = "^feature(\\(.*\\))?:", group = "<!-- 1 -->Features"},
{ message = "^fix(\\(.*\\))?:", group = "<!-- 2 -->Bug Fixes and Improvements"},
{ message = "^perf(\\(.*\\))?:", group = "<!-- 3 -->Performance"},
{ message = "^refactor(\\(.*\\))?:", group = "<!-- 4 -->Refactor"},
{ message = "^style(\\(.*\\))?:", group = "<!-- 5 -->Styling"},
{ message = "^locale(\\(.*\\))?:", group = "<!-- 6 -->Localization"},
{ message = "^docs(\\(.*\\))?:", group = "<!-- 7 -->Documentation"},
{ message = "^test(\\(.*\\))?:", group = "<!-- 8 -->Other"},
{ message = "^chore(\\(.*\\))?:", group = "<!-- 8 -->Other"},
{ body = ".*security", group = "Security"},
]
commit_preprocessors = [
{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](<REPO>/pull/${2}))" },
]
# filter out the commits that are not matched by commit parsers
filter_commits = true
ignore_tags="v*-(beta|rc)*"
# glob pattern for matching git tags
tag_pattern = "v[0-9]*"

0 comments on commit e69e21a

Please sign in to comment.