Skip to content

Commit

Permalink
ci: create canary releases on commit (#73)
Browse files Browse the repository at this point in the history
ci: small bugfixes
ci: add git-cliff
docs: add changelogs
ci: drop changelog compare links
.
Changelog comparing links are of questionable utility in a mono-repo
given the resulting list isn't filtered by subpath.
  • Loading branch information
cjorge-graphops committed Jun 26, 2023
1 parent 17bc1eb commit f74bcce
Show file tree
Hide file tree
Showing 26 changed files with 3,024 additions and 1,382 deletions.
41 changes: 0 additions & 41 deletions .chglog/CHANGELOG.tpl.md

This file was deleted.

24 changes: 0 additions & 24 deletions .chglog/config.yml

This file was deleted.

80 changes: 80 additions & 0 deletions .cliff.toml
@@ -0,0 +1,80 @@
# git-cliff ~ default configuration file
# https://git-cliff.org/docs/configuration
#
# Lines starting with "#" are comments.
# Configuration options are organized into tables and keys.
# See documentation for more information on available options.

[changelog]
# changelog header
header = """
# Changelog\n
All notable changes to this project will be documented in this file.\n
"""
# template for the changelog body
# https://tera.netlify.app/docs
body = """
{% if version %}\
## {{ version | trim_start_matches(pat="v") }} - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
## unreleased
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
### {{ group | upper_first }}
{% for commit in commits %}
- {% if commit.breaking %}🚨 **breaking** {% endif %}{{ commit.message | upper_first }} ([{{ commit.id | truncate(length=6, end="") }}](https://github.com/graphops/launchpad-charts/commit/{{ commit.id }}))\
{% endfor %}
{% endfor %}\n
"""
# remove the leading and trailing whitespace from the template
trim = true
# changelog footer
footer = """
"""

[git]
# parse the commits based on https://www.conventionalcommits.org
conventional_commits = true
# filter out the commits that are not conventional
filter_unconventional = true
# process each line of a commit as an individual commit
split_commits = true
# regex for preprocessing the commit messages
commit_preprocessors = [
# { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](https://github.com/orhun/git-cliff/issues/${2}))"}, # replace issue numbers
# Parse renovate's commit body table to descriminate updated images
{ pattern = '[\|].*[\|]\s*(\S*)\s*[\|]\s*(\S*)\s*[\|]\s*(\S*)\s*[\|]', replace = "feat(deps): Update ${1} from ${2} to ${3}" },
]
# regex for parsing and grouping commits
commit_parsers = [
{ message = "^feat", group = "<!-- 0 -->✨ Features" },
{ message = "^chore\\(deps\\)", group = "<!-- 0 -->✨ Features" },
{ message = "^fix", group = "<!-- 1 -->🐛 Bug Fixes" },
{ message = "^doc", group = "<!-- 3 -->📚 Documentation" },
{ message = "^perf", group = "<!-- 4 -->⚡️ Performance" },
{ message = "^refactor", group = "<!-- 2 -->♻️ Refactor" },
{ message = "^style", group = "<!-- 5 -->🎨 Styling" },
{ message = "^test", group = "<!-- 6 -->🧪 Testing" },
{ message = "^chore\\(release\\): prepare for", skip = true },
{ message = "^chore\\(pr\\)", skip = true },
{ message = "^chore\\(pull\\)", skip = true },
{ message = "^chore", group = "<!-- 7 -->⚙️ Miscellaneous Tasks" },
{ body = ".*security", group = "<!-- 8 -->🛡️ Security" },
]
# protect breaking changes from being skipped due to matching a skipping commit_parser
protect_breaking_commits = false
# filter out the commits that are not matched by commit parsers
filter_commits = true
# glob pattern for matching git tags
tag_pattern = "v[0-9]*"
# regex for skipping tags
#skip_tags = "v0.1.0-beta.1"
skip_tags = ""
# regex for ignoring tags
ignore_tags = ""
# sort the tags topologically
topo_order = false
# sort the commits inside sections by oldest/newest order
sort_commits = "newest"
# limit the number of commits included in the changelog.
# limit_commits = 42
81 changes: 44 additions & 37 deletions .github/workflows/make-chart-release.yaml
Expand Up @@ -8,11 +8,6 @@ on:
required: true
description: "What tag to release"
workflow_dispatch:
inputs:
tag:
type: string
required: true
description: "What tag to release"

jobs:
init:
Expand All @@ -22,62 +17,58 @@ jobs:
outputs:
name: ${{ steps.parse_tag.outputs.name }}
version: ${{ steps.parse_tag.outputs.version }}
fullversion: ${{ steps.parse_tag.outputs.fullversion }}
prerelease: ${{ steps.parse_tag.outputs.prerelease }}
tag: ${{ steps.parse_tag.outputs.tag }}
steps:
- name: Parse tag
id: parse_tag
run: |
echo "tag=${{ inputs.tag }}" >> $GITHUB_OUTPUT
name=$(echo "${{ inputs.tag }}" | sed -r 's/^(.*)-([v]?[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+)(-pre\.)?([[:digit:]]+)?$/\1/g')
name=$(echo "${{ inputs.tag }}" | sed -r 's/^(.*)-([v]?[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+)(-canary.)?([[:digit:]]+)?$/\1/g')
echo "name=$name" >> $GITHUB_OUTPUT
version=$(echo "${{ inputs.tag }}" | sed -r 's/^(.*)-([v]?[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+)(-pre\.)?([[:digit:]]+)?$/\2/g')
version=$(echo "${{ inputs.tag }}" | sed -r 's/^(.*)-([v]?[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+)(-canary.)?([[:digit:]]+)?$/\2/g')
fullversion=$(echo "${{ inputs.tag }}" | sed -r 's/^(.*)-([v]?[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+(-pre\.[[:digit:]]+)?)/\2/g')
echo "fullversion=$fullversion" >> $GITHUB_OUTPUT
echo "version=$version" >> $GITHUB_OUTPUT
prerelease=$(echo "${{ inputs.tag }}" | sed -r 's/^(.*)-([v]?[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+)(-pre\.)?([[:digit:]]+)?$/\4/g')
prerelease=$(echo "${{ inputs.tag }}" | sed -r 's/^(.*)-([v]?[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+)(-canary.)?([[:digit:]]+)?$/\4/g')
echo "prerelease=$prerelease" >> $GITHUB_OUTPUT
changelog:
release-notes:
needs: init
runs-on: ubuntu-latest
container: quay.io/git-chglog/git-chglog:0.15.0
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0

- name: Install main dependencies
- name: Setup node
uses: actions/setup-node@v3

- name: Yarn install
run: |
apk --upgrade add bash grep
set -x -e
- name: Generate chart changelog
id: gen_chglog
shell: bash
yarn install
- name: Get chart name
id: chart_name
run: |
set -x
# TODO: Bundle all of that logic in a Github Action to make it easy to share.
chart_file="charts/${{ needs.init.outputs.name }}/Chart.yaml"
chart_name=$(grep -Po "(?<=^name: ).+" ${chart_file})
chart_version=$(grep -Po "(?<=^version: ).+" ${chart_file})
chart_tag="${chart_name}-${chart_version}"
chart_path="charts/${chart_name}"
name="$(echo ${{ inputs.tag }} | sed -E 's/(.*)-[[:digit:]]+.[[:digit:]]+.[[:digit:]]+.*/\1/g')"
echo "name=$name" >> $GITHUB_OUTPUT
current_tag=${{ needs.init.outputs.tag }}
- name: Generate release notes
id: release_notes
env:
CHART: ${{ steps.chart_name.outputs.name }}
run: |
set -x -e
if [[ "${chart_tag}" =~ ^.*-[0-9]+\.[0-9]+\.[0-9]+-pre.* ]]; then
# on pre-releases we want the changelog to span all pre-releases from .1 to current
first_pre="$(echo ${current_tag} | sed -r 's/(.*-[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+-pre\.).*/\11/g')"
query_tag="${first_pre}..${current_tag}"
else
query_tag="${current_tag}"
fi
export GIT_CLIFF__GIT__TAG_PATTERN="$CHART-*"
GIT_CLIFF__GIT__IGNORE_TAGS="$CHART-v?[0-9]+.[0-9]+.[0-9]+-.*"
# Generate RELEASE-NOTES.md file (used for Github release notes).
git-chglog \
--output "RELEASE-NOTES.md" \
--tag-filter-pattern "${chart_name}" \
--path "${chart_path}" \
"${query_tag}"
yarn git-cliff -c ".cliff.toml" --include-path "charts/$CHART/**" --strip all -l -t "${{ needs.init.outputs.tag }}" -o "RELEASE-NOTES.md"
- uses: actions/upload-artifact@v3
with:
Expand All @@ -87,7 +78,7 @@ jobs:
release:
needs:
- init
- changelog
- release-notes
runs-on: ubuntu-latest
permissions:
contents: write # for creating releases
Expand All @@ -107,9 +98,25 @@ jobs:
with:
version: v3.12.0

- name: Update chart version
if: needs.init.outputs.prerelease != ''
run: |
set -x -e
chart_file="charts/${{ needs.init.outputs.name }}/Chart.yaml"
sed -E -i 's/^version: [[:digit:]]+.[[:digit:]]+.[[:digit:]]+.*/version: ${{ needs.init.outputs.fullversion }}/' "$chart_file"
- name: Generate Helm package
id: helm_package
run: |
set -x -e
chart_file="charts/${{ needs.init.outputs.name }}/Chart.yaml"
chart_version="$(grep -Po '(?<=^version: ).+' "${chart_file}")"
if [[ ! "$chart_version" == ${{ needs.init.outputs.fullversion }} ]]; then
echo "Chart version doesn't match release tag, please update"
fi
helm package "charts/${{ needs.init.outputs.name }}"
- name: Upload artifact
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/make-charts-index.yaml
Expand Up @@ -4,7 +4,7 @@ on:
workflow_dispatch:
inputs:
repoName:
type: options
type: choice
required: true
description: "Repository name?"
default: "stable"
Expand Down
97 changes: 97 additions & 0 deletions .github/workflows/trigger-push-canary.yaml
@@ -0,0 +1,97 @@

name: Release on Commit (Canary)

on:
push:
branches:
- 'renovate/*'

jobs:
find-tags-to-release:
runs-on: ubuntu-latest
permissions:
contents: write # for creating tags
outputs:
release-tags: ${{ steps.list-release-tags.outputs.release-tags }}
release-streams: ${{ steps.list-release-tags.outputs.release-streams }}
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0

- name: Configure Git
run: |
git config user.name "${{ github.actor }}"
git config user.email "${{ github.actor}}@users.noreply.github.com"
- name: Get list of changed charts
id: list-changed-charts
uses: tj-actions/changed-files@v35.9.2
with:
files: charts/**
dir_names: "true"
dir_names_max_depth: "2"

- name: List and create tags
id: list-release-tags
shell: bash
run: |
tags=()
declare -A release_streams=()
for chart_dir in ${{ steps.list-changed-charts.outputs.all_modified_files }}; do
chart_name=$(echo ${chart_dir} | cut -d '/' -f 2)
latest_version="$(git -c 'versionsort.suffix=-' tag --sort 'version:refname' --list "$chart_name-*" | grep -Ev '.*-[[:digit:]]+.[[:digit:]]+.[[:digit:]]+-.*' | tail -n1)"
next_patch="$(echo "$latest_version" | sed -E 's/(.*-)?([[:digit:]]+).([[:digit:]]+).([[:digit:]]+)/echo \2.\3.$((\4 + 1))/e')"
last_pre_tag="$(git -c 'versionsort.suffix=-' tag --sort 'version:refname' --list "$chart_name-$next_patch-*" | tail -n1)"
if [ -z "$last_pre_tag" ]; then
index=1
else
index=$(echo "$last_pre_tag" | sed -E 's/(.*-)?[[:digit:]]+.[[:digit:]]+.[[:digit:]]+-canary.([[:digit:]]+)(#.*)?/echo $((\2 + 1))/e')
fi
next_tag="$chart_name-$next_patch-canary.$index"
tags+=("$next_tag")
git tag -a "$next_tag" -m "Release $next_tag"
release_streams["canary"]=1
done
git push --tags
echo "release-tags<<EOF" >> $GITHUB_OUTPUT
echo "$(jq -Rc '. / " "' <<< ${tags[*]})" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
echo "release-streams<<EOF" >> $GITHUB_OUTPUT
echo "$(jq -Rc '. / " "' <<< ${!release_streams[@]})" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
call-release:
needs: find-tags-to-release
uses: ./.github/workflows/make-chart-release.yaml
permissions:
contents: write # for updating index.yaml
strategy:
matrix:
tag: ${{ fromJson(needs.find-tags-to-release.outputs.release-tags) }}
fail-fast: false
if: ${{ needs.find-tags-to-release.outputs.release-tags != '[]' }}
with:
tag: ${{ matrix.tag }}

call-update-helm-repo:
needs:
- call-release
- find-tags-to-release
uses: ./.github/workflows/update-helm-repo.yaml
permissions:
contents: write # for updating index.yaml
strategy:
matrix:
repo: ${{ fromJson(needs.find-tags-to-release.outputs.release-streams) }}
if: ${{ needs.find-tags-to-release.outputs.release-streams != '[]' }}
with:
repo: ${{ matrix.repo }}

0 comments on commit f74bcce

Please sign in to comment.