From 3155e8b3ac61a197f01a7c5996e3146bde1ac41c Mon Sep 17 00:00:00 2001 From: Nathaniel Graff Date: Thu, 30 Apr 2020 14:29:06 -0700 Subject: [PATCH] Create GitHub Actions release automation Signed-off-by: Nathaniel Graff --- .github/workflows/release.yml | 48 +++++++++++++++++++++++++++++++++ scripts/create-release-notes.sh | 29 ++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 .github/workflows/release.yml create mode 100755 scripts/create-release-notes.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..110f486 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,48 @@ +on: + push: + # Require one of the following patterns to match the tag + tags: + - 'v[0-9]+.[0-9]+.[0-9]+.[0-9]+' # ex. v20.00.00.00 + - 'v[0-9]+.[0-9]+.RC.[0-9]+' # ex. v20.00.RC.00 + +name: Create Release + +env: + PROJECT_NAME: Segger-SystemView-metal + # Release is a prerelease if the tag contains rc + PRERELEASE: ${{ contains(github.ref, 'RC') }} + +jobs: + release: + runs-on: ubuntu-latest + + steps: + - name: 'Checkout' + uses: actions/checkout@v2 + + # In order to generate release notes, we need a deep clone of the + # repository so that we can find the most recent tag and generate + # statistics based on it. + - name: 'Fetch History' + run: git fetch --prune --unshallow + + - name: 'Create Release Notes' + id: create-release-notes + run: | + tag=$(echo ${{ github.ref }} | cut -d '/' -f 3) + release_notes=$(./scripts/create-release-notes.sh ${{ env.PROJECT_NAME }} ${tag}) + # The string passed to Actions must urlencode newlines. + release_notes="${release_notes//$'\n'/'%0A'}" + # Use a magic "workflow command" to set the output for the step. + echo "::set-output name=release-notes::${release_notes}" + + - name: 'Create Release' + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref }} + release_name: ${{ env.PROJECT_NAME }} ${{ github.ref }} + body: ${{ steps.create-release-notes.outputs.release-notes }} + draft: false + prerelease: ${{ env.PRERELEASE }} diff --git a/scripts/create-release-notes.sh b/scripts/create-release-notes.sh new file mode 100755 index 0000000..8f85811 --- /dev/null +++ b/scripts/create-release-notes.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# Copyright (c) 2020 SiFive Inc. +# SPDX-License-Identifier: Apache-2.0 + +set -euo pipefail + +if [ "$#" -lt 2 ] ; then + >&2 echo "$0: please provide project name and release tag" + exit 1 +fi + +project=$1; shift 1; +current_release=$1; shift 1; + +# Get the most recent previous tag with git-describe. If this is +# the first tag in the repository, then this will return a commit +# hash (because of the --always flag). +last_release=$(git describe --tags --always HEAD~) + +echo "# Release notes for ${project} ${current_release}" +echo "## Statistics since ${last_release}" +echo "- $(git rev-list --count ${last_release}..HEAD) commits" +echo "-$(git diff --shortstat ${last_release} HEAD)" +echo "" +echo "## Authors" +git shortlog -s -n --no-merges ${last_release}..HEAD | cut -f 2 +echo "" +echo "## Merge history" +git log --merges --pretty=format:"%h %b" ${last_release}..HEAD