-
Notifications
You must be signed in to change notification settings - Fork 1
351 lines (286 loc) · 11.1 KB
/
Copy pathrelease.yml
File metadata and controls
351 lines (286 loc) · 11.1 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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
name: Build and Release qp
on:
push:
tags:
- 'v*'
workflow_dispatch: # allow manual trigger from github UI
inputs:
ref:
description: 'Git ref to build'
required: true
default: 'main'
permissions:
contents: write
jobs:
build:
name: Build qp for ${{ matrix.arch }}
runs-on: ubuntu-latest
env:
TAG_NAME: ${{ github.ref_type == 'tag' && github.ref_name || inputs.ref }}
strategy:
matrix:
arch: [x86_64, armv7h, aarch64, mipsel]
include:
- arch: x86_64
goarch: amd64
- arch: armv7h
goarch: arm
goarm: 7
- arch: aarch64
goarch: arm64
- arch: mipsel
goarch: mipsle
gomips: softfloat
steps:
- name: echo TAG_NAME
run: |
echo "Resolved TAG_NAME is: ${{ env.TAG_NAME }}"
- name: Checkout repository
uses: actions/checkout@v3
with:
ref: ${{ inputs.ref }}
- name: Set up Go 1.24.1
uses: actions/setup-go@v4
with:
go-version: 1.24.1
- name: Build qp binary
run: |
export GOOS=linux GOARCH=${{ matrix.goarch }}
if [ -n "${{ matrix.goarm }}" ]; then
export GOARM=${{ matrix.goarm }}
fi
if [ -n "${{ matrix.gomips }}" ]; then
export GOMIPS=${{ matrix.gomips }}
fi
go build -trimpath -ldflags="-s -w \
-X qp/internal/about.Version=${{ env.TAG_NAME }} \
-X qp/internal/about.Commit=$(git rev-parse HEAD) \
-X qp/internal/about.Date=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
-v -o qp-${{ matrix.arch }} ./cmd/qp
- name: Upload built binary
uses: actions/upload-artifact@v4
with:
name: qp-${{ matrix.arch }}
path: qp-${{ matrix.arch }}
release:
name: Release qp
needs: build
runs-on: ubuntu-latest
env:
TAG_NAME: ${{ github.ref_type == 'tag' && github.ref_name || inputs.ref }}
steps:
- name: echo TAG_NAME
run: |
echo "Resolved TAG_NAME is: ${{ env.TAG_NAME }}"
- name: Install dependencies for .SRCINFO and NEWS generation
run: |
sudo apt-get update
sudo apt-get install -y pacman fakeroot makepkg gh git python3
- name: Checkout repository
uses: actions/checkout@v3
with:
ref: ${{ inputs.ref }}
- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: ./release
merge-multiple: true
- name: Import GPG key
run: |
echo "$GPG_PRIVATE_KEY" | gpg --batch --import
KEY_ID=$(gpg --list-keys --with-colons | awk -F: '/^pub/ { print $5; exit }')
echo -e "5\ny\n" | gpg --batch --yes --no-tty --command-fd 0 --expert --edit-key "$KEY_ID" trust
env:
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
- name: Inject version and date into man page
run: |
VERSION="${TAG_NAME#v}"
DATE=$(date -u +'%B %Y')
sed -e "s/@VERSION@/${VERSION}/g" -e "s/@DATE@/$DATE/g" qp.1 > ./release/qp.1
- name: Checkout packaging branch
run: |
git fetch origin packaging
git checkout packaging
- name: Create Draft Release
run: |
gh release create "${{ env.TAG_NAME }}" \
--draft \
--generate-notes
echo "created=true" >> $GITHUB_ENV
env:
GH_TOKEN: ${{ github.token }}
- name: Generate NEWS file
run: |
touch ./release/NEWS
echo "# qp Release Notes" > ./release/NEWS
gh release list --limit 100 | \
cut -f1 | \
grep -E '^v[0-9]+\.' | \
sort -Vr | \
awk -v min="4.1.4" '{
ver = $1;
sub(/^v/, "", ver);
if (system("dpkg --compare-versions " ver " ge " min) == 0) print $1
}' | \
while read tag; do
echo "" >> ./release/NEWS
echo "## $tag" >> ./release/NEWS
gh release view "$tag" --json body --template '{{.body}}' | sed 's/^#/##/' >> ./release/NEWS
echo "" >> ./release/NEWS
done
# clean up spacing between sections
sed -e 's/\r$//' -e '/^[[:space:]]*$/d' ./release/NEWS > ./release/NEWS.cleaned
awk -f ./normalize_news.awk ./release/NEWS.cleaned > ./release/NEWS.final
mv ./release/NEWS.final ./release/NEWS
rm -f ./release/NEWS.cleaned ./release/NEWS.final
env:
GH_TOKEN: ${{ github.token }}
- name: Checkout source branch
run: |
git checkout ${{ env.TAG_NAME }}
- name: Package AUR source tarball with manpage and NEWS
run: |
mkdir -p ./release/temp-qp/qp-${{ env.TAG_NAME }}
git archive --format=tar HEAD | tar -x -C ./release/temp-qp/qp-${{ env.TAG_NAME }}
cp ./release/NEWS ./release/temp-qp/qp-${{ env.TAG_NAME }}/
echo "-s -w \
-X qp/internal/about.Version=${TAG_NAME} \
-X qp/internal/about.Commit=$(git rev-parse HEAD) \
-X qp/internal/about.Date=$(date -u +%Y-%m-%dT%H:%M:%SZ)" > ./release/temp-qp/qp-${TAG_NAME}/.ldflags
cp ./release/qp.1 ./release/temp-qp/qp-${{ env.TAG_NAME }}/qp.1
tar -czf ./release/qp-${{ env.TAG_NAME }}.tar.gz -C ./release/temp-qp qp-${{ env.TAG_NAME }}
- name: Checkout packaging branch
run: |
git checkout packaging
- name: Package AUR binaries with manpage and NEWS
run: |
source ./packaging_targets.sh
for binary in ./release/qp-*; do
arch=$(basename "$binary" | cut -d'-' -f2)
if should_package aur_archs "$arch"; then
echo "Packaging $binary for AUR"
tar -czvf ./release/qp-${{ env.TAG_NAME }}-${arch}.tar.gz -C ./release "$(basename "$binary")" qp.1 NEWS
else
echo "Skipping $binary for AUR packaging"
fi
done
- name: Package .deb
run: |
source ./packaging_targets.sh
chmod +x ./package_deb.sh
for binary in ./release/qp-*; do
arch=$(basename "$binary" | cut -d'-' -f2)
if should_package deb_archs "$arch"; then
echo "Packaging $binary as .deb"
./package_deb.sh "${TAG_NAME#v}" "" "$binary" ./release/NEWS ./release/qp.1 ./debian/copyright ./release
else
echo "Skipping $binary for .deb packaging"
fi
done
- name: Package .ipk for opkg
run: |
source ./packaging_targets.sh
chmod +x ./package_opkg.sh
git clone https://git.yoctoproject.org/opkg-utils
cd opkg-utils && sudo make install && cd ..
for binary in ./release/qp-*; do
arch=$(basename "$binary" | cut -d'-' -f2)
if should_package opkg_archs "$arch"; then
./package_opkg.sh "${TAG_NAME#v}" "$arch" "$binary" ./release/NEWS ./release/qp.1 ./release
fi
done
- name: Generate SHA256 checksums
run: |
cd ./release
sha256sum qp-*.tar.gz > SHA256SUMS.txt
- name: Sign release tarballs
run: |
for file in ./release/qp-*.tar.gz; do
gpg --batch --yes --armor --detach-sign "$file"
done
- name: Upload signatures to query-packages-signatures release
run: |
gh release create "${{ env.TAG_NAME }}" \
--repo Zweih/query-packages-signatures \
--title "Signatures for qp ${{ env.TAG_NAME }}" \
--notes "Detached signatures for qp release ${{ env.TAG_NAME }}" \
./release/qp-*.asc
env:
GH_TOKEN: ${{ secrets.QP_SIGNATURES_TOKEN }}
- name: Update PKGBUILDs for qp-bin and qp-src
run: |
source ./packaging_targets.sh
chmod +x ./update_checksums.sh
VERSION="${TAG_NAME#v}"
CHECKSUMS_FILE=./release/SHA256SUMS.txt
for pkg in qp-bin qp-src; do
sed -i "s/^pkgver=.*/pkgver=${VERSION}/" $pkg/PKGBUILD
sed -i "s/^pkgrel=.*/pkgrel=1/" $pkg/PKGBUILD
for binary in ./release/qp-*; do
arch=$(basename "$binary" | cut -d'-' -f2)
if should_package aur_archs "$arch"; then
./update_checksums.sh $pkg/PKGBUILD $CHECKSUMS_FILE
fi
done
done
- name: Generate pkgver for qp-git
run: |
cd qp-git
makepkg --nobuild --nodeps --clean --cleanbuild --noconfirm
echo "Updated qp-git/pkgver to $(grep '^pkgver=' PKGBUILD | cut -d'=' -f2)"
rm -rf src pkg qp
- name: Generate .SRCINFO for qp-bin, qp-src, and qp-git
run: |
for pkg in qp-bin qp-src qp-git; do
(cd $pkg && makepkg --printsrcinfo --noconfirm > .SRCINFO)
done
- name: Commit updated PKGBUILDs, .SRCINFOs, and NEWS to packaging branch
run: |
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
cp ./release/NEWS .
git add NEWS
for pkg in qp-bin qp-src qp-git; do
git add $pkg/PKGBUILD $pkg/.SRCINFO
done
git commit -m "Update packaging for release ${{ env.TAG_NAME }}"
git push origin packaging
- name: Filter .ipk packages to main vs extra repo
run: |
chmod +x ./filter_release_ipks.sh
./filter_release_ipks.sh
- name: Publish Release
run: |
cd ./release
gh release upload "${{ env.TAG_NAME }}" qp-*.tar.gz qp-*.deb qp-*.ipk --clobber
cd ..
env:
GH_TOKEN: ${{ github.token }}
- name: Publish extra .ipk packages to qp-extra-packages
if: ${{ env.TAG_NAME != '' }}
run: |
cd ./release-extra
if ls *.ipk 1> /dev/null 2>&1; then
echo "Creating draft release in qp-extra-packages..."
gh release create "${{ env.TAG_NAME }}" \
--repo Zweih/qp-extra-packages \
--title "qp ${{ env.TAG_NAME }} extra packages" \
--notes "Extended architecture packages for qp ${{ env.TAG_NAME }}" \
--draft
echo "Uploading extra .ipk packages..."
gh release upload "${{ env.TAG_NAME }}" *.ipk \
--repo Zweih/qp-extra-packages \
--clobber
else
echo "No extra .ipk packages to upload."
fi
cd ..
env:
GH_TOKEN: ${{ secrets.QP_EXTRA_PACKAGES_TOKEN }}
- name: Delete Draft Release if Job Failed
if: ${{ (failure() || cancelled()) && env.created == 'true' }}
run: |
echo "Workflow failed. Deleting draft release ${TAG_NAME}..."
gh release delete "${TAG_NAME}" --yes || echo "No release found or already deleted."
env:
GH_TOKEN: ${{ github.token }}