Skip to content

Commit

Permalink
Create GitHub Actions release automation
Browse files Browse the repository at this point in the history
Signed-off-by: Nathaniel Graff <nathaniel.graff@sifive.com>
  • Loading branch information
nategraff-sifive committed May 1, 2020
1 parent 950dd49 commit 57c45c0
Show file tree
Hide file tree
Showing 4 changed files with 150 additions and 1 deletion.
89 changes: 89 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion doc/sphinx/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
29 changes: 29 additions & 0 deletions scripts/create-release-notes.sh
Original file line number Diff line number Diff line change
@@ -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
31 changes: 31 additions & 0 deletions scripts/tag-submodules.sh
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 57c45c0

Please sign in to comment.