-
Notifications
You must be signed in to change notification settings - Fork 3
159 lines (136 loc) · 5.11 KB
/
Copy pathnightly.yaml
File metadata and controls
159 lines (136 loc) · 5.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
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 }}