Skip to content

Commit

Permalink
ci: add pre-release
Browse files Browse the repository at this point in the history
  • Loading branch information
azrod committed Feb 2, 2024
1 parent 83c4775 commit 4b290ef
Show file tree
Hide file tree
Showing 6 changed files with 473 additions and 7 deletions.
234 changes: 234 additions & 0 deletions .github/workflows/new-release.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,234 @@
name: TagRelease

on:
workflow_dispatch:
inputs:
tagType:
description: 'TagType'
required: true
default: 'pre-tag'
type: choice
options:
- normal
- pre-tag
tag:
description: 'Tag version number (Eg: v0.1.0)'
required: true
type: string
message:
description: 'Tag message'
required: true

permissions:
contents: write
packages: write

jobs:
# * Step 0: Pre-Check
pre-check:
runs-on: ubuntu-latest
outputs:
TAG_NAME: ${{ steps.set-tag.outputs.TAG_NAME }}
PRERELEASE: ${{ steps.set-tag.outputs.PRERELEASE }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
token: ${{ secrets.PAT }}
# ! TODO add check if tag format is valid (semver)
- name: Check if tag is valid
run : |
# Check if the tag start with 'v', if not, add it
if [[ ! ${{ github.event.inputs.tag }} =~ ^v.* ]]; then
echo "Error tag format is invalid. The format is vx.x.x" >> "$GITHUB_OUTPUT"
exit 1
fi
- name: Construct Tag for Pre-Release
id: set-tag
run: |
# Construct the tag name
if [ "${{ github.event.inputs.tagType }}" == "pre-tag" ]; then
echo "TAG_NAME=$(echo ${{ github.event.inputs.tag }}-alpha$(date +%Y%m%d%H%M))" >> "$GITHUB_OUTPUT"
echo "PRERELEASE=true" >> "$GITHUB_OUTPUT"
else
echo "TAG_NAME=${{ github.event.inputs.tag }}" >> "$GITHUB_OUTPUT"
fi
# * Step 1: Check if everything is ok
tag-already-exist:
needs: [pre-check]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
token: ${{ secrets.PAT }}
- name: Check if tag not already exists
run: |
if git rev-parse ${{ needs.pre-check.outputs.TAG_NAME }} >/dev/null 2>&1; then
echo "Tag ${{ needs.pre-check.outputs.TAG_NAME }} already exists" >> "$GITHUB_OUTPUT"
exit 1
fi
golangci-lint:
needs: [pre-check]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
token: ${{ secrets.PAT }}
- uses: actions/setup-go@v5
with:
go-version-file: 'go.mod'
- run: go mod download
- name: golangci-lint
uses: golangci/golangci-lint-action@v3
with:
version: latest
# TODO add tests

# * Step 2: Create a new tag
tag:
needs: [golangci-lint, pre-check, tag-already-exist]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
token: ${{ secrets.PAT }}
- uses: rickstaa/action-create-tag@v1
id: "tag_create"
with:
tag: ${{ needs.pre-check.outputs.TAG_NAME }}
tag_exists_error: true
message: ${{ github.event.inputs.message }}

release-notes:
runs-on: ubuntu-latest
needs: [tag, pre-check]
steps:
- uses: actions/checkout@v4 # v3.5.3
with:
fetch-depth: 0
ref: ${{ needs.pre-check.outputs.TAG_NAME }}
- name: Generate Release Notes
run: |
echo "" > release-notes.txt
if [ ${{ needs.pre-check.outputs.PRERELEASE }} == "true" ]; then
echo "## :construction: Prerelease" >> release-notes.txt
export PREV_TAG=$(git tag --list 'v*' --sort=-version:refname | grep -E "v[0-9]+\.[0-9]+\.[0-9]+$" | head -n 1)
export PREV_VERSION=${PREV_TAG//v}
else
export PREV_TAG=$(git tag --list 'v*' --sort=-version:refname | grep -E "v[0-9]+\.[0-9]+\.[0-9]+$" | head -n 2 | tail -n 1)
export PREV_VERSION=${PREV_TAG//v}
fi
sed -n -e "1{/# /d;}" -e "2{/^$/d;}" -e "/# $PREV_VERSION/q;p" CHANGELOG.md >> release-notes.txt
- uses: actions/upload-artifact@v4
with:
name: release-notes
path: release-notes.txt
retention-days: 1
release-app:
runs-on: ubuntu-latest
needs: [release-notes, golangci-lint, pre-check]
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ needs.pre-check.outputs.TAG_NAME }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version-file: 'go.mod'
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- id: release-notes-download
name: Release Notes Download
uses: actions/download-artifact@6b208ae046db98c579e8a3aa621ab581ff575935 # v4.1.1
with:
name: release-notes
path: /tmp
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v5
if: success()
with:
distribution: goreleaser
version: latest
args: release --clean -f .goreleaser.yaml --release-notes=${{ steps.release-notes-download.outputs.download-path }}/release-notes.txt
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
trigger-doc-update:
needs: [release-app, pre-check]
runs-on: ubuntu-latest
if: needs.pre-check.outputs.PRERELEASE == 'false'
steps:
- name: Repository Dispatch
uses: peter-evans/repository-dispatch@v3
with:
event-type: update-doc
highest-version-tag:
needs: [pre-check,release-app]
runs-on: ubuntu-latest
if: needs.pre-check.outputs.PRERELEASE == 'false'
outputs:
tag: ${{ steps.highest-version-tag.outputs.tag }}
steps:
- uses: actions/checkout@v4 # v3.5.3
with:
ref: ${{ needs.pre-check.outputs.TAG_NAME }}
fetch-depth: 0
- name: Output highest version tag
id: highest-version-tag
run: |
HIGHEST=$(git tag | sort -V | tail -1)
echo "tag=$HIGHEST" >> "$GITHUB_OUTPUT"
changelog-newversion:
needs: [release-app, highest-version-tag, pre-check]
# write new changelog header only if release tag is the $HIGHEST i.e. exists on main
# and not a backport release branch (e.g. release/3.x). This results in
# manually updating the CHANGELOG header if releasing from the non-default branch.
# TODO: find a more deterministic way to determine release branch from tag commit
if: github.ref_name == needs.highest-version-tag.outputs.tag && needs.pre-check.outputs.PRERELEASE == 'false'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4 # v3.5.3
with:
token: ${{ secrets.PAT }}
fetch-depth: 0
ref: main
- name: Update Changelog Header
run: |
CHANGELOG_FILE_NAME="CHANGELOG.md"
PREVIOUS_RELEASE_TAG=${{ github.ref_name }}
# Add Release Date
RELEASE_DATE=`date +%B' '%e', '%Y`
sed -i -e "1 s/.*Unreleased.*/## ${PREVIOUS_RELEASE_TAG#v} ($RELEASE_DATE)/" $CHANGELOG_FILE_NAME
# Prepend next release line
echo Previous release is: $PREVIOUS_RELEASE_TAG
NEW_RELEASE_LINE=$(echo $PREVIOUS_RELEASE_TAG | awk -F. '{
$1 = substr($1,2)
$2 += 1
printf("%s.%01d.0\n\n", $1, $2);
}')
echo New minor version is: v$NEW_RELEASE_LINE
echo -e "## $NEW_RELEASE_LINE (Unreleased)\n$(cat $CHANGELOG_FILE_NAME)" > $CHANGELOG_FILE_NAME
- uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: "chore: Update CHANGELOG.md after ${{ github.ref_name }}"
commit_options: '--no-verify --signoff'
file_pattern: CHANGELOG.md
commit_user_name: Changelog[bot]
commit_user_email: changelog-bot@azrod.me
commit_author: Changelog Bot <changelog-bot@azrod.me>

81 changes: 81 additions & 0 deletions .github/workflows/pre-release.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
name: Pre-Release

on:
repository_dispatch:
types: [prerelease]


permissions:
contents: write
packages: write

jobs:
GolangCI-Lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.client_payload.tag }}
- uses: actions/setup-go@v5
with:
go-version-file: 'go.mod'
- run: go mod download
- name: golangci-lint
uses: golangci/golangci-lint-action@v3
with:
version: latest
release-notes:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4 # v3.5.3
with:
fetch-depth: 0
ref: ${{ github.event.client_payload.tag }}
- name: Generate Release Notes
run: |
export PREV_TAG=$(git tag --list 'v*' --sort=-version:refname | head -n 2 | tail -n 1)
export PREV_VERSION=${PREV_TAG//v}
echo "# :construction: Prerelease" > prerelease-notes.txt
sed -n -e "1{/# /d;}" -e "2{/^$/d;}" -e "/# $PREV_VERSION/q;p" CHANGELOG.md >> prerelease-notes.txt
- uses: actions/upload-artifact@v4
with:
name: prerelease-notes
path: prerelease-notes.txt
retention-days: 1
release-app:
runs-on: ubuntu-latest
needs: [release-notes, GolangCI-Lint]
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event.client_payload.tag }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version-file: 'go.mod'
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- id: release-notes-download
name: Release Notes Download
uses: actions/download-artifact@6b208ae046db98c579e8a3aa621ab581ff575935 # v4.1.1
with:
name: prerelease-notes
path: /tmp
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v5
if: success()
with:
distribution: goreleaser
version: latest
args: release --snapshot --clean -f .goreleaser-prerelease.yaml --release-notes=${{ steps.release-notes-download.outputs.download-path }}/prerelease-notes.txt
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

11 changes: 7 additions & 4 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
name: Release

on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+$'
repository_dispatch:
types: [release]

permissions:
contents: write
Expand All @@ -14,6 +13,8 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.client_payload.tag }}
- uses: actions/setup-go@v5
with:
go-version-file: 'go.mod'
Expand All @@ -28,6 +29,7 @@ jobs:
- uses: actions/checkout@v4 # v3.5.3
with:
fetch-depth: 0
ref: ${{ github.event.client_payload.tag }}
- name: Generate Release Notes
run: |
export PREV_TAG=$(git tag --list 'v*' --sort=-version:refname | head -n 2 | tail -n 1)
Expand All @@ -46,6 +48,7 @@ jobs:
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event.client_payload.tag }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Go
Expand Down Expand Up @@ -85,7 +88,7 @@ jobs:
steps:
- uses: actions/checkout@v4 # v3.5.3
with:
# Allow tag to be fetched when ref is a commit
ref: ${{ github.event.client_payload.tag }}
fetch-depth: 0
- name: Output highest version tag
id: highest-version-tag
Expand Down
Loading

0 comments on commit 4b290ef

Please sign in to comment.