Skip to content

Nightly Release

Nightly Release #233

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-commits:
runs-on: ubuntu-latest
outputs:
skip_nightly: ${{ steps.check.outputs.skip_nightly }}
steps:
- name: Checkout code
uses: actions/checkout@v7
with:
fetch-depth: 0
- name: Check for unreleased commits
id: check
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)
else
echo "Latest release: $LATEST_RELEASE"
COMMITS_SINCE_RELEASE=$(git rev-list ${LATEST_RELEASE}..HEAD --count)
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_OUTPUT"
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_OUTPUT"
exit 0
fi
echo "skip_nightly=false" >> "$GITHUB_OUTPUT"
nightly-release:
needs: check-commits
if: needs.check-commits.outputs.skip_nightly != 'true'
runs-on: ubuntu-latest
permissions:
contents: write
id-token: write # Permission for keyless signing
steps:
- name: Checkout code
uses: actions/checkout@v7
with:
fetch-depth: 0
- name: Prepare nightly release
run: |
gh release delete nightly --yes --cleanup-tag || true
gh release create nightly \
--title "Nightly ($(date -u +%Y-%m-%d) - $(git rev-parse --short HEAD))" \
--generate-notes \
--prerelease
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: 'go.mod'
- name: Install cosign
uses: sigstore/cosign-installer@v4.1.1
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v7
with:
version: '~> v2'
args: release --snapshot --clean --skip=publish
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload artifacts
run: gh release upload nightly dist/*.zip dist/*.bundle dist/*checksums.txt --clobber
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}