1+ name : Build gnd Binaries
2+
3+ on :
4+ workflow_dispatch :
5+
6+ jobs :
7+ build :
8+ name : Build gnd for ${{ matrix.target }}
9+ runs-on : ${{ matrix.runner }}
10+ strategy :
11+ fail-fast : false
12+ matrix :
13+ include :
14+ - target : x86_64-unknown-linux-gnu
15+ runner : ubuntu-latest
16+ asset_name : gnd-linux-x86_64
17+ - target : aarch64-unknown-linux-gnu
18+ runner : ubuntu-24.04-arm
19+ asset_name : gnd-linux-aarch64
20+ - target : x86_64-apple-darwin
21+ runner : macos-13
22+ asset_name : gnd-macos-x86_64
23+ - target : aarch64-apple-darwin
24+ runner : macos-latest
25+ asset_name : gnd-macos-aarch64
26+ - target : x86_64-pc-windows-msvc
27+ runner : windows-latest
28+ asset_name : gnd-windows-x86_64.exe
29+
30+ steps :
31+ - name : Checkout repository
32+ uses : actions/checkout@v4
33+
34+ - name : Install Rust toolchain
35+ run : |
36+ rustup toolchain install stable
37+ rustup target add ${{ matrix.target }}
38+ rustup default stable
39+
40+ - name : Rust Cache
41+ uses : Swatinem/rust-cache@v2
42+ with :
43+ key : ${{ matrix.target }}
44+
45+ - name : Install dependencies (Ubuntu)
46+ if : startsWith(matrix.runner, 'ubuntu')
47+ run : |
48+ sudo apt-get update
49+ sudo apt-get install -y libpq-dev protobuf-compiler musl-tools libssl-dev
50+
51+ - name : Install dependencies (macOS)
52+ if : startsWith(matrix.runner, 'macos')
53+ run : |
54+ brew install postgresql protobuf
55+
56+ - name : Install protobuf (Windows)
57+ if : startsWith(matrix.runner, 'windows')
58+ run : choco install protoc
59+
60+ - name : Cache vcpkg
61+ uses : actions/cache@v4
62+ if : startsWith(matrix.runner, 'windows')
63+ id : vcpkg-cache
64+ with :
65+ path : |
66+ ${{ github.workspace }}/vcpkg
67+ C:/vcpkg/installed
68+ C:/vcpkg/packages
69+ key : ${{ runner.os }}-vcpkg-${{ hashFiles('**/Cargo.lock') }}
70+ restore-keys : |
71+ ${{ runner.os }}-vcpkg-
72+
73+ - name : Install vcpkg and dependencies (Windows)
74+ if : startsWith(matrix.runner, 'windows') && steps.vcpkg-cache.outputs.cache-hit != 'true'
75+ run : |
76+ # Install vcpkg
77+ git clone https://github.com/microsoft/vcpkg.git
78+ cd vcpkg
79+ .\bootstrap-vcpkg.bat
80+
81+ # Install libpq using vcpkg
82+ .\vcpkg.exe install libpq:x64-windows
83+ shell : pwsh
84+
85+ - name : Set Windows environment variables
86+ if : startsWith(matrix.runner, 'windows')
87+ run : |
88+ echo "VCPKG_ROOT=${{ github.workspace }}/vcpkg" | Out-File -FilePath $env:GITHUB_ENV -Append
89+ echo "LIBPQ_DIR=${{ github.workspace }}/vcpkg/installed/x64-windows" | Out-File -FilePath $env:GITHUB_ENV -Append
90+ echo "RUSTFLAGS=-L ${{ github.workspace }}/vcpkg/installed/x64-windows/lib" | Out-File -FilePath $env:GITHUB_ENV -Append
91+ shell : pwsh
92+
93+ - name : Build gnd binary (Unix/Mac)
94+ if : ${{ !startsWith(matrix.runner, 'windows') }}
95+ run : cargo build --bin gnd --release --target ${{ matrix.target }}
96+
97+ - name : Build gnd binary (Windows)
98+ if : startsWith(matrix.runner, 'windows')
99+ run : cargo build --bin gnd --release --target ${{ matrix.target }}
100+ env :
101+ LIBPQ_DIR : ${{ format('{0}/vcpkg/installed/x64-windows', github.workspace) }}
102+ VCPKGRS_DYNAMIC : 1
103+
104+ - name : Sign macOS binary
105+ if : startsWith(matrix.runner, 'macos')
106+ uses : lando/code-sign-action@v3
107+ with :
108+ file : target/${{ matrix.target }}/release/gnd
109+ certificate-data : ${{ secrets.APPLE_CERT_DATA }}
110+ certificate-password : ${{ secrets.APPLE_CERT_PASSWORD }}
111+ certificate-id : ${{ secrets.APPLE_TEAM_ID }}
112+ options : --options runtime
113+
114+ - name : Notarize macOS binary
115+ if : startsWith(matrix.runner, 'macos')
116+ uses : lando/notarize-action@v2
117+ with :
118+ product-path : target/${{ matrix.target }}/release/gnd
119+ appstore-connect-username : ${{ secrets.NOTARIZATION_USERNAME }}
120+ appstore-connect-password : ${{ secrets.NOTARIZATION_PASSWORD }}
121+ appstore-connect-team-id : ${{ secrets.APPLE_TEAM_ID }}
122+
123+ - name : Prepare binary (Unix)
124+ if : ${{ !startsWith(matrix.runner, 'windows') }}
125+ run : |
126+ cp target/${{ matrix.target }}/release/gnd ${{ matrix.asset_name }}
127+ chmod +x ${{ matrix.asset_name }}
128+ gzip ${{ matrix.asset_name }}
129+
130+ - name : Prepare binary (Windows)
131+ if : startsWith(matrix.runner, 'windows')
132+ run : |
133+ copy target\${{ matrix.target }}\release\gnd.exe ${{ matrix.asset_name }}
134+ 7z a -tzip ${{ matrix.asset_name }}.zip ${{ matrix.asset_name }}
135+
136+ - name : Upload artifact
137+ uses : actions/upload-artifact@v4
138+ with :
139+ name : ${{ matrix.asset_name }}
140+ path : |
141+ ${{ matrix.asset_name }}.gz
142+ ${{ matrix.asset_name }}.zip
143+ if-no-files-found : error
144+
145+ release :
146+ name : Create Release
147+ needs : build
148+ if : startsWith(github.ref, 'refs/tags/')
149+ runs-on : ubuntu-latest
150+ steps :
151+ - name : Checkout code
152+ uses : actions/checkout@v4
153+
154+ - name : Setup GitHub CLI
155+ run : |
156+ # GitHub CLI is pre-installed on GitHub-hosted runners
157+ gh --version
158+ env :
159+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
160+
161+ - name : Download all artifacts
162+ uses : actions/download-artifact@v4
163+ with :
164+ path : artifacts
165+
166+ - name : Display structure of downloaded artifacts
167+ run : ls -R artifacts
168+
169+ - name : Upload Assets to Release
170+ run : |
171+ # Extract version from ref (remove refs/tags/ prefix)
172+ VERSION=${GITHUB_REF#refs/tags/}
173+
174+ # Upload Linux x86_64 asset
175+ gh release upload $VERSION artifacts/gnd-linux-x86_64/gnd-linux-x86_64.gz --repo $GITHUB_REPOSITORY
176+
177+ # Upload Linux ARM64 asset
178+ gh release upload $VERSION artifacts/gnd-linux-aarch64/gnd-linux-aarch64.gz --repo $GITHUB_REPOSITORY
179+
180+ # Upload macOS x86_64 asset
181+ gh release upload $VERSION artifacts/gnd-macos-x86_64/gnd-macos-x86_64.gz --repo $GITHUB_REPOSITORY
182+
183+ # Upload macOS ARM64 asset
184+ gh release upload $VERSION artifacts/gnd-macos-aarch64/gnd-macos-aarch64.gz --repo $GITHUB_REPOSITORY
185+
186+ # Upload Windows x86_64 asset
187+ gh release upload $VERSION artifacts/gnd-windows-x86_64.exe/gnd-windows-x86_64.exe.zip --repo $GITHUB_REPOSITORY
188+ env :
189+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
0 commit comments