chore: add release workflow (#194)
* chore: add release workflow Signed-off-by: Patrick Gehrsitz <58853838+mryel00@users.noreply.github.com> * 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 <58853838+mryel00@users.noreply.github.com>
This commit is contained in:
parent
ae2bc21404
commit
b85de7b0ab
91
.github/workflows/release.yml
vendored
Normal file
91
.github/workflows/release.yml
vendored
Normal file
@ -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/branch-merge@1.1.5
|
||||
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/branch-merge@1.1.5
|
||||
with:
|
||||
github_token: ${{ secrets.PAT }}
|
||||
source_ref: 'master'
|
||||
target_branch: 'develop'
|
||||
commit_message_template: '[Automated] Merged {source_ref} into target {target_branch}'
|
80
cliff-release.toml
Normal file
80
cliff-release.toml
Normal file
@ -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
cliff.toml
Normal file
86
cliff.toml
Normal file
@ -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]*"
|
Loading…
x
Reference in New Issue
Block a user