1+ name : Publish to GitHub Release
2+
3+ on :
4+ push :
5+ branches :
6+ - main
7+ workflow_dispatch :
8+
9+ jobs :
10+ check-version :
11+ runs-on : ubuntu-latest
12+ outputs :
13+ version_changed : ${{ steps.check.outputs.version_changed }}
14+ version : ${{ steps.check.outputs.version }}
15+ steps :
16+ - name : Check out the code
17+ uses : actions/checkout@v4
18+ with :
19+ fetch-depth : 2
20+
21+ - name : Check if version changed
22+ id : check
23+ run : |
24+ CURRENT_VERSION=$(grep '^version' Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/')
25+ echo "version=${CURRENT_VERSION}" >> "$GITHUB_OUTPUT"
26+
27+ # For workflow_dispatch, always treat as changed
28+ if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
29+ echo "version_changed=true" >> "$GITHUB_OUTPUT"
30+ echo "Manual trigger — treating version ${CURRENT_VERSION} as changed"
31+ exit 0
32+ fi
33+
34+ PREV_VERSION=$(git show HEAD~1:Cargo.toml 2>/dev/null | grep '^version' | head -1 | sed 's/.*"\(.*\)".*/\1/' || echo "")
35+
36+ if [ "$CURRENT_VERSION" != "$PREV_VERSION" ]; then
37+ echo "version_changed=true" >> "$GITHUB_OUTPUT"
38+ echo "Version changed: ${PREV_VERSION} -> ${CURRENT_VERSION}"
39+ else
40+ echo "version_changed=false" >> "$GITHUB_OUTPUT"
41+ echo "Version unchanged: ${CURRENT_VERSION}"
42+ fi
43+
44+ build :
45+ needs : check-version
46+ if : needs.check-version.outputs.version_changed == 'true'
47+ strategy :
48+ fail-fast : false
49+ matrix :
50+ include :
51+ - target : x86_64-unknown-linux-gnu
52+ os : ubuntu-latest
53+ archive : tar.gz
54+ - target : aarch64-unknown-linux-gnu
55+ os : ubuntu-latest
56+ archive : tar.gz
57+ - target : x86_64-apple-darwin
58+ os : macos-latest
59+ archive : tar.gz
60+ - target : aarch64-apple-darwin
61+ os : macos-latest
62+ archive : tar.gz
63+ - target : x86_64-pc-windows-msvc
64+ os : windows-latest
65+ archive : zip
66+ runs-on : ${{ matrix.os }}
67+ permissions :
68+ contents : read
69+ steps :
70+ - name : Check out the code
71+ uses : actions/checkout@v4
72+
73+ - name : Install Rust toolchain
74+ uses : dtolnay/rust-toolchain@stable
75+ with :
76+ targets : ${{ matrix.target }}
77+
78+ - name : Install cross-compilation tools (Linux ARM64)
79+ if : matrix.target == 'aarch64-unknown-linux-gnu'
80+ run : |
81+ sudo apt-get update
82+ sudo apt-get install -y gcc-aarch64-linux-gnu
83+
84+ - name : Build release binary
85+ env :
86+ CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER : aarch64-linux-gnu-gcc
87+ run : cargo build --release --target ${{ matrix.target }}
88+
89+ - name : Package (Unix)
90+ if : matrix.archive == 'tar.gz'
91+ run : |
92+ BINARY_NAME="reaper"
93+ ARCHIVE_NAME="reaper-v${{ needs.check-version.outputs.version }}-${{ matrix.target }}.tar.gz"
94+ cd target/${{ matrix.target }}/release
95+ tar czf "../../../${ARCHIVE_NAME}" "${BINARY_NAME}"
96+ cd ../../..
97+ echo "ARCHIVE_NAME=${ARCHIVE_NAME}" >> "$GITHUB_ENV"
98+
99+ - name : Package (Windows)
100+ if : matrix.archive == 'zip'
101+ shell : pwsh
102+ run : |
103+ $BINARY_NAME = "reaper.exe"
104+ $ARCHIVE_NAME = "reaper-v${{ needs.check-version.outputs.version }}-${{ matrix.target }}.zip"
105+ Compress-Archive -Path "target/${{ matrix.target }}/release/$BINARY_NAME" -DestinationPath "$ARCHIVE_NAME"
106+ echo "ARCHIVE_NAME=$ARCHIVE_NAME" >> $env:GITHUB_ENV
107+
108+ - name : Upload artifact
109+ uses : actions/upload-artifact@v4
110+ with :
111+ name : reaper-${{ matrix.target }}
112+ path : ${{ env.ARCHIVE_NAME }}
113+ retention-days : 1
114+
115+ release :
116+ needs : [check-version, build]
117+ runs-on : ubuntu-latest
118+ permissions :
119+ contents : write
120+ steps :
121+ - name : Check out the code
122+ uses : actions/checkout@v4
123+
124+ - name : Download all artifacts
125+ uses : actions/download-artifact@v4
126+ with :
127+ path : artifacts
128+ merge-multiple : true
129+
130+ - name : List artifacts
131+ run : ls -R artifacts/
132+
133+ - name : Generate checksums
134+ run : |
135+ cd artifacts
136+ sha256sum reaper-* > checksums-sha256.txt
137+ cat checksums-sha256.txt
138+
139+ - name : Create GitHub Release
140+ uses : softprops/action-gh-release@v2
141+ with :
142+ tag_name : v${{ needs.check-version.outputs.version }}
143+ name : Reaper v${{ needs.check-version.outputs.version }}
144+ generate_release_notes : true
145+ draft : false
146+ prerelease : false
147+ files : |
148+ artifacts/reaper-*
149+ artifacts/checksums-sha256.txt
0 commit comments