diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..c11174b25 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,89 @@ +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: freedom-e-sdk + # Release is a prerelease if the tag contains rc + PRERELEASE: ${{ contains(github.ref, 'RC') }} + +jobs: + release: + runs-on: ubuntu-latest + + steps: + # Perform a recursive, PAT-authenticated checkout of all freedom-e-sdk + # submodules. This allows us to create and push tags to each submodule, + # triggering their own release workflow. + - name: 'Checkout' + uses: actions/checkout@v2 + with: + submodules: 'recursive' + token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} + + # 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 + + # We tag submodules before creating the release notes or the release + # to make sure that they get tagged. + - name: 'Tag Submodules for Release' + run: | + tag=$(echo ${{ github.ref }} | cut -d '/' -f 3) + ./scripts/tag-submodules.sh ${tag} + + - 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 }} + + - name: 'Clean Documentation Output Folder' + run: | + cd doc/html + git fetch + git checkout master + git reset --hard origin/master + rm -rf * .buildinfo .doctrees + + - name: 'Build Sphinx Documenattion' + run: | + tag=$(echo ${{ github.ref }} | cut -d '/' -f 3) + docker run \ + --rm \ + -v $(pwd)/doc:/docs \ + -e RELEASE_TAG="${tag}" \ + sphinxdoc/sphinx \ + make html + + - name: 'Publish Documentation' + run: | + tag=$(echo ${{ github.ref }} | cut -d '/' -f 3) + cd doc/html + git config user.email "no-reply@sifive.com" + git config user.name "actions-bot" + git add . + git commit -m "Documentation for ${{ env.PROJECT_NAME }} ${tag}" + git push diff --git a/doc/sphinx/conf.py b/doc/sphinx/conf.py index 160540e43..5688a5d52 100644 --- a/doc/sphinx/conf.py +++ b/doc/sphinx/conf.py @@ -24,7 +24,7 @@ author = 'SiFive Inc.' # The short X.Y version -version = "master" +version = os.environ['RELEASE_TAG'] # The full version, including alpha/beta/rc tags release = version diff --git a/scripts/create-release-notes.sh b/scripts/create-release-notes.sh new file mode 100755 index 000000000..8f8581122 --- /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 diff --git a/scripts/tag-submodules.sh b/scripts/tag-submodules.sh new file mode 100755 index 000000000..45a14c271 --- /dev/null +++ b/scripts/tag-submodules.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +set -euo pipefail + +if [ "$#" -lt 1 ] ; then + >&2 echo "Please provide a tag" + exit 1 +fi + +tag=$1; shift 1; + +submodules=(\ + freedom-metal \ + freedom-devicetree-tools \ + FreeRTOS-metal \ + Segger_SystemView-metal \ + scl-metal \ + scripts/cmsis-svd-generator \ + scripts/devicetree-overlay-generator \ + scripts/elf2hex \ + scripts/esdk-settings-generator \ + scripts/ldscript-generator \ + scripts/openocdcfg-generator \ +) + +set -x + +for submodule in ${submodules[@]} ; do + git -C ${submodule} tag ${tag} + git -C ${submodule} push -f origin ${tag} +done