-
Notifications
You must be signed in to change notification settings - Fork 1
357 lines (313 loc) · 11.9 KB
/
release.yml
File metadata and controls
357 lines (313 loc) · 11.9 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
351
352
353
354
355
356
357
name: Release
on:
push:
branches:
- main
jobs:
check-version:
runs-on: ubuntu-latest
permissions:
contents: read
outputs:
should_release: ${{ steps.check.outputs.should_release }}
version: ${{ steps.check.outputs.version }}
package_name: ${{ steps.get-name.outputs.package_name }}
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 2
- name: Get package name from Cargo.toml
id: get-name
run: |
PACKAGE_NAME=$(grep -m1 '^name' Cargo.toml | sed 's/name\s*=\s*"\(.*\)"/\1/')
echo "package_name=$PACKAGE_NAME" >> $GITHUB_OUTPUT
echo "Package name: $PACKAGE_NAME"
- name: Check if Cargo.toml version changed
id: check
run: |
CURRENT_VERSION=$(grep -m1 version Cargo.toml | cut -d '"' -f2)
git checkout HEAD^1
PREVIOUS_VERSION=$(grep -m1 version Cargo.toml | cut -d '"' -f2)
if [ "$CURRENT_VERSION" != "$PREVIOUS_VERSION" ]; then
echo "should_release=true" >> $GITHUB_OUTPUT
echo "version=$CURRENT_VERSION" >> $GITHUB_OUTPUT
echo "Version changed: $PREVIOUS_VERSION -> $CURRENT_VERSION"
else
echo "should_release=false" >> $GITHUB_OUTPUT
echo "Version unchanged: $CURRENT_VERSION"
fi
create-release:
needs: check-version
if: needs.check-version.outputs.should_release == 'true'
runs-on: ubuntu-latest
permissions:
contents: write
packages: write
outputs:
upload_url: ${{ steps.create_release.outputs.upload_url }}
steps:
- uses: actions/checkout@v3
- name: Create Release
id: create_release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
uses: softprops/action-gh-release@v1
with:
tag_name: v${{ needs.check-version.outputs.version }}
name: Release v${{ needs.check-version.outputs.version }}
draft: false
prerelease: false
build-release:
needs: [check-version, create-release]
if: needs.check-version.outputs.should_release == 'true'
permissions:
contents: write
strategy:
fail-fast: false # Continue with other builds if one fails
matrix:
include:
# Standard platforms (dynamically linked)
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
bin_path: target/x86_64-unknown-linux-gnu/release
asset_name: -linux-x86_64
# Windows builds
- os: windows-latest
target: x86_64-pc-windows-msvc
bin_path: target/x86_64-pc-windows-msvc/release
asset_name: -windows-x86_64.exe
extension: .exe
- os: windows-latest
target: i686-pc-windows-msvc
bin_path: target/i686-pc-windows-msvc/release
asset_name: -windows-i686.exe
extension: .exe
- os: windows-latest
target: aarch64-pc-windows-msvc
bin_path: target/aarch64-pc-windows-msvc/release
asset_name: -windows-arm64.exe
extension: .exe
# macOS builds
- os: macos-latest
target: x86_64-apple-darwin
bin_path: target/x86_64-apple-darwin/release
asset_name: -macos-x86_64
- os: macos-latest
target: aarch64-apple-darwin
bin_path: target/aarch64-apple-darwin/release
asset_name: -macos-arm64
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- name: Install Rust
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
target: ${{ matrix.target }}
override: true
# Install dependencies for macOS
- name: Install macOS dependencies
if: runner.os == 'macOS'
run: |
brew update
brew install openssl@1.1 protobuf@3
echo "OPENSSL_DIR=$(brew --prefix openssl@1.1)" >> $GITHUB_ENV
# Add protoc to PATH and check version
echo "PATH=$(brew --prefix protobuf@3)/bin:$PATH" >> $GITHUB_ENV
brew link --force protobuf@3
protoc --version
# Install OpenSSL for Linux
- name: Install Linux dependencies
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y pkg-config libssl-dev
# Build using cargo for native targets
- name: Build native
uses: actions-rs/cargo@v1
env:
RUST_BACKTRACE: 1
with:
command: build
args: --release --target ${{ matrix.target }}
- name: Set binary path variables
shell: bash
run: |
PACKAGE_NAME="${{ needs.check-version.outputs.package_name }}"
FULL_BIN_PATH="${{ matrix.bin_path }}/${PACKAGE_NAME}${{ matrix.extension || '' }}"
FULL_ASSET_NAME="${PACKAGE_NAME}${{ matrix.asset_name }}"
echo "PACKAGE_NAME=${PACKAGE_NAME}" >> $GITHUB_ENV
echo "FULL_BIN_PATH=${FULL_BIN_PATH}" >> $GITHUB_ENV
echo "FULL_ASSET_NAME=${FULL_ASSET_NAME}" >> $GITHUB_ENV
# Debug info
echo "Debug info:"
echo "- Package name: ${PACKAGE_NAME}"
echo "- Binary path: ${FULL_BIN_PATH}"
echo "- Asset name: ${FULL_ASSET_NAME}"
# Verify binary exists
if [ -f "${FULL_BIN_PATH}" ]; then
echo "✅ Binary exists at: ${FULL_BIN_PATH}"
ls -la "${FULL_BIN_PATH}"
else
echo "❌ Binary NOT found at: ${FULL_BIN_PATH}"
echo "Contents of target directory:"
find target -type f -name "${PACKAGE_NAME}*" | sort
fi
- name: Generate SHA256
shell: bash
run: |
# Verify binary exists again just before SHA256 generation
if [ ! -f "$FULL_BIN_PATH" ]; then
echo "❌ ERROR: Binary still not found at $FULL_BIN_PATH"
echo "Searching for any binaries:"
find target -type f -executable -o -name "*.exe" -o -name "*.wasm" | sort
exit 1
fi
echo "Generating SHA256 for $FULL_BIN_PATH"
if [[ "${{ runner.os }}" == "Windows" ]]; then
sha256sum "$FULL_BIN_PATH" > "$FULL_BIN_PATH.sha256"
else
shasum -a 256 "$FULL_BIN_PATH" > "$FULL_BIN_PATH.sha256"
fi
echo "SHA256 file contents:"
cat "$FULL_BIN_PATH.sha256"
- name: Upload Binary
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.FULL_BIN_PATH }}
asset_name: ${{ env.FULL_ASSET_NAME }}
asset_content_type: application/octet-stream
continue-on-error: true
- name: Upload SHA256
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.FULL_BIN_PATH }}.sha256
asset_name: ${{ env.FULL_ASSET_NAME }}.sha256
asset_content_type: text/plain
continue-on-error: true
# Use cross for more complex cross-compilation targets
cross-builds:
needs: [check-version, create-release]
if: needs.check-version.outputs.should_release == 'true'
runs-on: ubuntu-latest
permissions:
contents: write
strategy:
fail-fast: false
matrix:
include:
# Static Linux build
- target: x86_64-unknown-linux-musl
asset_suffix: -linux-x86_64-static
openssl_arch: amd64
# ARM64 Linux
- target: aarch64-unknown-linux-gnu
asset_suffix: -linux-arm64
openssl_arch: arm64
# ARM64 static Linux
- target: aarch64-unknown-linux-musl
asset_suffix: -linux-arm64-static
openssl_arch: arm64
# 32-bit Linux
- target: i686-unknown-linux-gnu
asset_suffix: -linux-i686
openssl_arch: i386
# 32-bit static Linux
- target: i686-unknown-linux-musl
asset_suffix: -linux-i686-static
openssl_arch: i386
# ARMv7 (32-bit ARM for Raspberry Pi)
- target: armv7-unknown-linux-gnueabihf
asset_suffix: -linux-armv7
openssl_arch: armhf
# ARMv7 static
- target: armv7-unknown-linux-musleabihf
asset_suffix: -linux-armv7-static
openssl_arch: armhf
# WebAssembly
- target: wasm32-unknown-unknown
asset_suffix: .wasm
extension: .wasm
no_openssl: true
steps:
- uses: actions/checkout@v3
- name: Install Rust
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
target: ${{ matrix.target }}
override: true
- name: Install cross
run: |
cargo install cross --git https://github.com/cross-rs/cross
- name: Set variables
run: |
PACKAGE_NAME="${{ needs.check-version.outputs.package_name }}"
ASSET_NAME="${PACKAGE_NAME}${{ matrix.asset_suffix }}"
BIN_PATH="target/${{ matrix.target }}/release/${PACKAGE_NAME}${{ matrix.extension || '' }}"
echo "PACKAGE_NAME=${PACKAGE_NAME}" >> $GITHUB_ENV
echo "ASSET_NAME=${ASSET_NAME}" >> $GITHUB_ENV
echo "BIN_PATH=${BIN_PATH}" >> $GITHUB_ENV
echo "Cross-build variables:"
echo "- Package: ${PACKAGE_NAME}"
echo "- Asset name: ${ASSET_NAME}"
echo "- Binary path: ${BIN_PATH}"
# Create Cross.toml with pre-build commands for OpenSSL
- name: Configure cross for OpenSSL
if: ${{ !matrix.no_openssl }}
run: |
cat > Cross.toml << EOF
[target.${{ matrix.target }}]
pre-build = [
"dpkg --add-architecture ${{ matrix.openssl_arch }}",
"apt-get update",
"apt-get install -y libssl-dev:${{ matrix.openssl_arch }}"
]
EOF
cat Cross.toml
# Special build for WebAssembly
- name: Build WebAssembly
if: matrix.target == 'wasm32-unknown-unknown'
run: |
rustup target add wasm32-unknown-unknown
cargo build --release --target wasm32-unknown-unknown
# Build using cross for non-WASM targets
- name: Build with cross
if: matrix.target != 'wasm32-unknown-unknown'
run: |
cross build --release --target ${{ matrix.target }}
- name: Generate SHA256
run: |
if [ -f "$BIN_PATH" ]; then
sha256sum "$BIN_PATH" > "$BIN_PATH.sha256"
else
echo "Binary not found at $BIN_PATH"
find target -name "$PACKAGE_NAME" -o -name "$PACKAGE_NAME.exe" -o -name "*.wasm" | sort
exit 1
fi
- name: Upload Binary
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.BIN_PATH }}
asset_name: ${{ env.ASSET_NAME }}
asset_content_type: application/octet-stream
- name: Upload SHA256
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.BIN_PATH }}.sha256
asset_name: ${{ env.ASSET_NAME }}.sha256
asset_content_type: text/plain