Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 24 additions & 77 deletions .github/workflows/nightly.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,41 +11,35 @@ concurrency:
cancel-in-progress: true

jobs:
check-and-create-nightly:
check-commits:
runs-on: ubuntu-latest
permissions:
contents: write
outputs:
nightly_version: ${{ env.NIGHTLY_VERSION }}
skip_nightly: ${{ env.SKIP_NIGHTLY }}
changelog_body: ${{ env.CHANGELOG_BODY }}
skip_nightly: ${{ steps.check.outputs.skip_nightly }}
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Check for unreleased commits
id: check_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)
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
Comment on lines 27 to 36

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

The grep -v 'prerelease' filter may not match actual prerelease tags.

Prerelease tags typically follow the pattern v1.0.0-rc.1 or v1.0.0-alpha.1, not containing the literal string "prerelease". This filter likely has no effect. You probably want to exclude tags containing a hyphen after the version:

🐛 Suggested fix
          # 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)
+          LATEST_RELEASE=$(git tag -l 'v*.*.*' --sort=-version:refname | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | head -n1)

The regex ^v[0-9]+\.[0-9]+\.[0-9]+$ matches only strict semver release tags (e.g., v1.2.3) and excludes prereleases (v1.2.3-rc.1) and nightly tags.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/nightly.yaml around lines 27 - 36, The current git tag
filter uses grep -v 'prerelease' which won't match typical prerelease tags like
v1.0.0-rc.1; update the LATEST_RELEASE tag selection (the pipeline that assigns
LATEST_RELEASE) to only include strict semver release tags by replacing the grep
filter with a regex that matches ^v[0-9]+\.[0-9]+\.[0-9]+$ so prereleases (e.g.,
v1.2.3-rc.1) and nightly tags are excluded; keep the existing --sort and the
later logic that computes COMMITS_SINCE_RELEASE unchanged.


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"
echo "skip_nightly=true" >> "$GITHUB_OUTPUT"
exit 0
fi

Expand All @@ -59,31 +53,26 @@ jobs:

if [ "$EXISTING_NIGHTLY_COMMIT" = "$CURRENT_COMMIT" ]; then
echo "Nightly release already exists for current commit"
echo "SKIP_NIGHTLY=true" >> "$GITHUB_ENV"
echo "skip_nightly=true" >> "$GITHUB_OUTPUT"
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)
echo "skip_nightly=false" >> "$GITHUB_OUTPUT"

# Save to environment variable, handling multiline content
{
echo 'CHANGELOG_BODY<<EOF'
echo "$CHANGELOG_CONTENT"
echo 'EOF'
} >> "$GITHUB_ENV"
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@v6
with:
fetch-depth: 0

- 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
Expand All @@ -95,44 +84,11 @@ jobs:
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
git push origin :refs/tags/nightly 2>/dev/null || true
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:
Expand All @@ -141,19 +97,10 @@ jobs:
- 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 }}"
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v6
with:
version: '~> v2'
args: release --nightly --clean
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
98 changes: 9 additions & 89 deletions .github/workflows/prerelease.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,97 +12,27 @@ on:
type: string

jobs:
determine-version:
prerelease:
runs-on: ubuntu-latest
permissions:
contents: write
outputs:
prerelease_version: ${{ env.PRERELEASE_VERSION }}
changelog_body: ${{ env.CHANGELOG_BODY }}
id-token: write # Permission for keyless signing
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
fetch-depth: 0
ref: ${{ inputs.tag || '' }}

- name: Extract version from tag
id: get_version
- name: Validate prerelease tag
run: |
# Get version from tag (either from push event or manual input)
if [ "${{ github.event_name }}" = "push" ]; then
VERSION="${{ github.ref_name }}"
else
VERSION="${{ inputs.tag }}"
fi

# Validate version format using make target
make validate-prerelease-tag VERSION="$VERSION"

echo "PRERELEASE_VERSION=$VERSION" >> "$GITHUB_ENV"
echo "Pre-release version: $VERSION"

- name: Extract changelog
id: changelog
run: |
VERSION="${{ env.PRERELEASE_VERSION }}"
# Extract the base release version (without -rc.N suffix)
RELEASE_VERSION=$(echo "$VERSION" | sed 's/-rc\.[0-9]*$//')

# Extract changelog using make target (tries version-specific, then unreleased)
CHANGELOG_CONTENT=$(make extract-changelog-version VERSION="$RELEASE_VERSION" 2>/dev/null || echo "Pre-release build for ${RELEASE_VERSION}. See CHANGELOG.md for details.")

# Save to environment variable, handling multiline content
{
echo 'CHANGELOG_BODY<<EOF'
echo "$CHANGELOG_CONTENT"
echo 'EOF'
} >> "$GITHUB_ENV"

- name: Create or update pre-release
run: |
VERSION="${{ env.PRERELEASE_VERSION }}"

# Check if release already exists
if gh release view "$VERSION" >/dev/null 2>&1; then
echo "Pre-release $VERSION already exists, checking if changelog needs to be updated..."

# Get current release notes
CURRENT_NOTES=$(gh release view "$VERSION" --json body -q .body)

# Check if changelog content is already in the notes
if echo "$CURRENT_NOTES" | grep -qF "${{ env.CHANGELOG_BODY }}"; then
echo "Changelog already present in release notes, skipping update..."
else
echo "Appending changelog to existing release notes..."
NEW_NOTES="${CURRENT_NOTES}\n\n---\n\n${{ env.CHANGELOG_BODY }}"
gh release edit "$VERSION" --notes "$NEW_NOTES"
fi
else
echo "Creating pre-release $VERSION..."
gh release create "$VERSION" \
--title "$VERSION" \
--notes "${{ env.CHANGELOG_BODY }}" \
--prerelease
fi
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

build-and-upload:
needs: determine-version
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
with:
fetch-depth: 0

- name: Set up Go
uses: actions/setup-go@v6
with:
Expand All @@ -111,20 +41,10 @@ jobs:
- name: Install cosign
uses: sigstore/cosign-installer@v4.0.0

- name: Build release artifacts
env:
GOOS: ${{ matrix.goos }}
GOARCH: ${{ matrix.goarch }}
VERSION: ${{ needs.determine-version.outputs.prerelease_version }}
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 release
run: make upload-release-assets VERSION="${{ needs.determine-version.outputs.prerelease_version }}"
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v6
with:
version: '~> v2'
args: release --clean
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Loading