-
Notifications
You must be signed in to change notification settings - Fork 2
135 lines (117 loc) · 4.8 KB
/
Copy pathrelease.yml
File metadata and controls
135 lines (117 loc) · 4.8 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
name: Release
on:
release:
types: [created]
workflow_dispatch:
inputs:
tag:
description: 'Tag to release (fallback only)'
required: true
default: 'v0.1.0'
env:
CARGO_TERM_COLOR: always
jobs:
build-and-release:
name: Build and Release (${{ matrix.target }})
runs-on: ${{ matrix.os }}
permissions:
contents: write
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
artifact_name: fls-x86_64-linux
- os: ubuntu-latest
target: aarch64-unknown-linux-gnu
artifact_name: fls-aarch64-linux
- os: ubuntu-latest
target: aarch64-unknown-linux-musl
artifact_name: fls-aarch64-linux-musl
- os: macos-latest
target: x86_64-apple-darwin
artifact_name: fls-x86_64-darwin
- os: macos-latest
target: aarch64-apple-darwin
artifact_name: fls-aarch64-darwin
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Install cross (Linux only)
if: runner.os == 'Linux' && matrix.target != 'x86_64-unknown-linux-gnu'
run: |
cargo install cross --git https://github.com/cross-rs/cross
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: ~/.cargo/registry
key: ${{ runner.os }}-${{ matrix.target }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo index
uses: actions/cache@v4
with:
path: ~/.cargo/git
key: ${{ runner.os }}-${{ matrix.target }}-cargo-git-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo build
uses: actions/cache@v4
with:
path: target
key: ${{ runner.os }}-${{ matrix.target }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }}
- name: Build (native)
if: matrix.target == 'x86_64-unknown-linux-gnu' || matrix.target == 'x86_64-apple-darwin' || matrix.target == 'aarch64-apple-darwin'
run: cargo build --release --target ${{ matrix.target }}
- name: Build (cross)
if: matrix.target != 'x86_64-unknown-linux-gnu' && matrix.target != 'x86_64-apple-darwin' && matrix.target != 'aarch64-apple-darwin'
run: cross build --release --target ${{ matrix.target }}
- name: Install UPX
run: |
if [ "${{ runner.os }}" = "Linux" ]; then
# Download and install UPX for Linux
curl -L https://github.com/upx/upx/releases/download/v4.2.1/upx-4.2.1-amd64_linux.tar.xz | tar xJ
sudo mv upx-4.2.1-amd64_linux/upx /usr/local/bin/
elif [ "${{ runner.os }}" = "macOS" ]; then
# Install UPX via Homebrew on macOS
brew install upx
fi
upx --version
shell: bash
- name: Prepare and compress binary
run: |
if [ -f "target/${{ matrix.target }}/release/fls" ]; then
cp "target/${{ matrix.target }}/release/fls" "${{ matrix.artifact_name }}"
echo "📦 Original binary size:"
ls -lh "${{ matrix.artifact_name }}"
original_size=$(stat -f%z "${{ matrix.artifact_name }}" 2>/dev/null || stat -c%s "${{ matrix.artifact_name }}")
# Compress with UPX
echo "🗜️ Compressing with UPX --best --lzma..."
if upx --best --lzma "${{ matrix.artifact_name }}"; then
echo "✅ Compression successful!"
ls -lh "${{ matrix.artifact_name }}"
compressed_size=$(stat -f%z "${{ matrix.artifact_name }}" 2>/dev/null || stat -c%s "${{ matrix.artifact_name }}")
ratio=$(awk "BEGIN {printf \"%.1f\", ($original_size - $compressed_size) * 100 / $original_size}")
echo "📉 Size reduction: ${ratio}%"
else
echo "⚠️ UPX compression failed, using uncompressed binary"
fi
# Create checksum
if command -v sha256sum &> /dev/null; then
sha256sum "${{ matrix.artifact_name }}" > "${{ matrix.artifact_name }}.sha256"
else
shasum -a 256 "${{ matrix.artifact_name }}" > "${{ matrix.artifact_name }}.sha256"
fi
fi
shell: bash
- name: Upload Release Asset
uses: softprops/action-gh-release@v1
with:
files: |
${{ matrix.artifact_name }}
${{ matrix.artifact_name }}.sha256
tag_name: ${{ github.event.release.tag_name || github.event.inputs.tag }}
draft: false
prerelease: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}