diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000000..55f473939b21 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,43 @@ +--- +# https://docs.corelightning.org/docs/release-checklist +name: "Release 🚀" +on: + push: + # TODO: Remove after testing. + branches: + - 7776-release-builds-automation + tags: + - 'v[0-9]+.[0-9]+' + - 'v[0-9]+.[0-9]+.[0-9]+' + - 'v[0-9]+.[0-9]+[0-9a-z]+' + workflow_dispatch: + +jobs: + ubuntu-noble: + name: Release + runs-on: ubuntu-24.04 + steps: + - name: Git checkout + uses: actions/checkout@v4 + + - name: Validate release + run: tools/check-release.sh + + # 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 + # TODO: Remove forced version after testing. + 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 610061ed6371..0924ff675f84 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 000000000000..127558b0e5e9 --- /dev/null +++ b/tools/check-release.sh @@ -0,0 +1,52 @@ +#! /bin/bash + +set -e + +# Git release tag checks and validation, to catch common release +# tagging issues prior to build via Github Actions. +# +# 1. The 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. + +echo "CI_ACTION_REF_NAME=$CI_ACTION_REF_NAME" + +# The tag should point to the HEAD of the branch. +VERSION=$(git tag --points-at HEAD) +echo "VERSION=$VERSION" +if [ "$VERSION" = "" ]; then + echo "No tagged version at HEAD?" >&2 + exit 1 +fi + +# The pushed tag should match the branch tag at the HEAD. +if [ "$VERSION" != "$CI_ACTION_REF_NAME" ]; then + echo "The pushed tag must match the version tag." >&2 + exit 1 +fi + +# The pushed tag should match the `make version` target output. +MAKE_VERSION=$(make version) +echo "MAKE_VERSION=$MAKE_VERSION" +if [ "$MAKE_VERSION" != "$CI_ACTION_REF_NAME" ]; then + echo "The pushed 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\]" CHANGELOG.md) +if [ $? != 0 ]; 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