diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..61788f56a --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,66 @@ +--- +# https://docs.corelightning.org/docs/release-checklist +name: "Release 🚀" +on: + push: + tags: + - 'v[0-9]+.[0-9]+' + - 'v[0-9]+.[0-9]+.[0-9]+' + - 'v[0-9]+.[0-9]+[0-9a-z]+' + workflow_dispatch: + +jobs: + check: + name: Check + outputs: + version: steps.capture.outputs.version + runs-on: ubuntu-24.04 + steps: + - name: Git checkout + uses: actions/checkout@v4 + with: + fetch-tags: true + + - name: Determine version from pushed tag + if: ${{ github.ref_type == 'tag' }} + run: echo "VERSION=${{ github.ref_name }}" >> "$GITHUB_ENV" + + # Relevant for testing branches. + - name: Determine version from pushed branch tag + if: ${{ github.ref_type == 'branch' }} + run: echo "VERSION=$(git tag --points-at HEAD)" >> "$GITHUB_ENV" + + - name: Validate release + run: tools/check-release.sh --version=${VERSION} + + - name: Catpure version output + id: capture + run: echo "version=${VERSION}" >> "$GITHUB_OUTPUT" + + release: + name: Release + needs: check + runs-on: ubuntu-24.04 + steps: + - name: Git checkout + uses: actions/checkout@v4 + with: + fetch-tags: true + + # tools/build-release.sh requires lowdown + - name: Prepare base environment + run: | + sudo apt-get install -y lowdown + ./configure + + - name: Build environment setup + run: contrib/cl-repro.sh + + - name: Build release + run: tools/build-release.sh bin-Fedora-28-amd64 bin-Ubuntu + + - name: Upload release artifacts + uses: actions/upload-artifact@v4 + with: + path: release/ + if-no-files-found: error diff --git a/tools/build-release.sh b/tools/build-release.sh index 610061ed6..0924ff675 100755 --- a/tools/build-release.sh +++ b/tools/build-release.sh @@ -158,7 +158,7 @@ for target in $TARGETS; do # Capitalize the first letter of distro D=$(echo "$d" | awk '{print toupper(substr($0,1,1))substr($0,2)}') echo "Building Ubuntu $D Image" - docker run --rm -v "$(pwd)":/repo -e FORCE_MTIME="$MTIME" -e FORCE_VERSION="$VERSION" -ti cl-repro-"$d" + docker run --rm -v "$(pwd)":/repo -e FORCE_MTIME="$MTIME" -e FORCE_VERSION="$VERSION" cl-repro-"$d" echo "Ubuntu $D Image Built" done ;; diff --git a/tools/check-release.sh b/tools/check-release.sh new file mode 100755 index 000000000..90da958a5 --- /dev/null +++ b/tools/check-release.sh @@ -0,0 +1,74 @@ +#! /bin/bash + +set -e + +# Checks a version tag and performs validation, to catch common release +# tagging issues prior to build via Github Actions. +# +# 1. The version tag should point to the HEAD of the branch. +# - tools/build-release.sh#67 +# 2. The pushed tag should match the branch tag at the HEAD. +# 3. The CHANGELOG.md contains a header entry for the version tag. +# 4. The CHANGELOG.md entry for that version tag can be parsed for a date. + +for arg; do + case "$arg" in + --version=*) + VERSION=${arg#*=} + ;; + --help) + echo "Usage: [--version=]" + exit 0 + ;; + *) + echo "Unknown arg $arg" >&2 + exit 1 + ;; + esac + shift +done + +echo "VERSION: ${VERSION}" + +# Version is required. +if [ "$VERSION" = "" ]; then + echo "The --version argument is required." + exit 1 +fi + +# A tag should point to the HEAD of the branch. +HEAD_VERSION=$(git tag --points-at HEAD) +if [ "$HEAD_VERSION" = "" ]; then + echo "No tagged version at HEAD?" >&2 + exit 1 +fi + +# The version tag should match the branch tag at the HEAD. +if [ "$HEAD_VERSION" != "$VERSION" ]; then + echo "The HEAD tag must match the version tag." >&2 + exit 1 +fi + +# The version tag should match the `make version` target output. +MAKE_VERSION=$(make version) +echo "MAKE_VERSION=$MAKE_VERSION" +if [ "$MAKE_VERSION" != "$VERSION" ]; then + echo "The version tag must match the \`make version\` target output." >&2 + exit 1 +fi + +# The CHANGELOG.md contains a header entry for the version tag. +CHANGELOG_TITLE=$(grep "## \[${VERSION#v}\]" CHANGELOG.md) +if [ "$CHANGELOG_TITLE" = "" ]; then + echo "No entry in the CHANGELOG.md found for $VERSION." >&2 + exit 1 +fi +echo "CHANGELOG_TITLE=$CHANGELOG_TITLE" + +# The CHANGELOG.md entry for that version tag can be parsed for a date. +RELEASE_DATE=$(sed -n "s/^## \\[.*${VERSION#v}\\] - \\([-0-9]*\\).*/\\1/p" < CHANGELOG.md) +echo "RELEASE_DATE=$RELEASE_DATE" +if [ "$RELEASE_DATE" = "" ]; then + echo "The release title in CHANGELOG.md cannot be parsed for a date." >&2 + exit 1 +fi