Skip to content

Nightly Release

Nightly Release #7

Workflow file for this run

name: Nightly Release
on:
schedule:
# Run at 02:00 UTC every day
- cron: '0 2 * * *'
workflow_dispatch:
concurrency:
group: nightly-release
cancel-in-progress: true
jobs:
check-and-create-nightly:
runs-on: ubuntu-latest
permissions:
contents: write
outputs:
nightly_version: ${{ env.NIGHTLY_VERSION }}
skip_nightly: ${{ env.SKIP_NIGHTLY }}
changelog_body: ${{ env.CHANGELOG_BODY }}
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Check for unreleased commits
id: check_commits
run: |
# Find the latest release tag (any x.y.z release)
LATEST_RELEASE=$(git tag -l 'v*.*.*' --sort=-version:refname | grep -v 'prerelease' | grep -v '^nightly' | head -n1)
if [ -z "$LATEST_RELEASE" ]; then
echo "No existing releases found, creating first nightly"
COMMITS_SINCE_RELEASE=$(git rev-list HEAD --count)
LATEST_RELEASE_COMMIT=""
else
echo "Latest release: $LATEST_RELEASE"
COMMITS_SINCE_RELEASE=$(git rev-list ${LATEST_RELEASE}..HEAD --count)
LATEST_RELEASE_COMMIT="$LATEST_RELEASE"
fi
echo "Commits since latest release: $COMMITS_SINCE_RELEASE"
if [ "$COMMITS_SINCE_RELEASE" -eq "0" ]; then
echo "No new commits since latest release, skipping nightly"
echo "SKIP_NIGHTLY=true" >> "$GITHUB_ENV"
exit 0
fi
CURRENT_COMMIT=$(git rev-parse HEAD)
# Check for existing nightly with same commit
EXISTING_NIGHTLY_COMMIT=""
if git rev-parse --verify nightly >/dev/null 2>&1; then
EXISTING_NIGHTLY_COMMIT=$(git rev-list -n 1 nightly 2>/dev/null || echo "")
fi
if [ "$EXISTING_NIGHTLY_COMMIT" = "$CURRENT_COMMIT" ]; then
echo "Nightly release already exists for current commit"
echo "SKIP_NIGHTLY=true" >> "$GITHUB_ENV"
exit 0
fi
# Use fixed nightly tag name
NIGHTLY_VERSION="nightly"
echo "NIGHTLY_VERSION=$NIGHTLY_VERSION" >> "$GITHUB_ENV"
echo "Creating nightly release: $NIGHTLY_VERSION"
- name: Extract changelog for nightly
id: changelog
if: env.SKIP_NIGHTLY != 'true'
run: |
# Extract the Unreleased section from CHANGELOG.md using make target
CHANGELOG_CONTENT=$(make extract-changelog-unreleased)
# Save to environment variable, handling multiline content
{
echo 'CHANGELOG_BODY<<EOF'
echo "$CHANGELOG_CONTENT"
echo 'EOF'
} >> "$GITHUB_ENV"
- name: Delete existing nightly release and tag
if: env.SKIP_NIGHTLY != 'true'
run: |
# Delete existing nightly release if it exists
if gh release view nightly >/dev/null 2>&1; then
echo "Deleting existing nightly release"
gh release delete nightly --yes
fi
# Delete existing nightly tag if it exists
if git rev-parse --verify nightly >/dev/null 2>&1; then
echo "Deleting existing nightly tag"
git tag -d nightly
if ! git push origin :refs/tags/nightly; then
echo "Warning: Failed to delete remote nightly tag" >&2
exit 1
fi
fi
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Create nightly release
if: env.SKIP_NIGHTLY != 'true'
run: |
VERSION="${{ env.NIGHTLY_VERSION }}"
CURRENT_DATE=$(date -u +%Y-%m-%d)
SHORT_COMMIT=$(git rev-parse --short HEAD)
echo "Creating nightly release: $VERSION"
gh release create "$VERSION" \
--title "Nightly Release ($CURRENT_DATE - $SHORT_COMMIT)" \
--notes "${{ env.CHANGELOG_BODY }}" \
--prerelease
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
build-and-upload:
needs: check-and-create-nightly
if: needs.check-and-create-nightly.outputs.skip_nightly != 'true'
runs-on: ubuntu-latest
permissions:
contents: write
id-token: write # Permission for keyless signing
strategy:
matrix:
goos: [linux, windows, darwin]
goarch: [amd64, arm64]
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: 'go.mod'
- name: Install cosign
uses: sigstore/cosign-installer@v4.0.0
- name: Build release artifacts
env:
GOOS: ${{ matrix.goos }}
GOARCH: ${{ matrix.goarch }}
run: make build-release package-release
- name: Sign release artifacts
env:
GOOS: ${{ matrix.goos }}
GOARCH: ${{ matrix.goarch }}
run: make sign-release
- name: Upload assets to nightly release
run: make upload-release-assets VERSION="${{ needs.check-and-create-nightly.outputs.nightly_version }}"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}