Skip to content
This repository was archived by the owner on Feb 10, 2026. It is now read-only.

Commit fcb7a30

Browse files
authored
add
1 parent fa47e73 commit fcb7a30

File tree

1 file changed

+319
-0
lines changed

1 file changed

+319
-0
lines changed

.github/workflows/build.yaml

Lines changed: 319 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,319 @@
1+
name: Rust-Cargo Build
2+
3+
on:
4+
push:
5+
pull_request:
6+
workflow_dispatch:
7+
inputs:
8+
version:
9+
description: Terracotta Version
10+
type: string
11+
12+
permissions:
13+
contents: write
14+
15+
env:
16+
CARGO_TERM_COLOR: always
17+
name: terracotta
18+
RUST_BACKTRACE: full
19+
TERRACOTTA_U_S: ${{ secrets.TERRACOTTA_U_S }}
20+
21+
defaults:
22+
run:
23+
shell: bash
24+
25+
jobs:
26+
build-windows:
27+
strategy:
28+
fail-fast: false
29+
matrix:
30+
include:
31+
- runs-on: windows-latest
32+
os: windows
33+
arch: x86_64
34+
target: x86_64-pc-windows-msvc
35+
- runs-on: windows-11-arm
36+
os: windows
37+
arch: arm64
38+
target: aarch64-pc-windows-msvc
39+
runs-on: ${{ matrix.runs-on }}
40+
name: Build (${{ matrix.target }})
41+
steps:
42+
- name: Checkout
43+
uses: actions/checkout@v4
44+
- name: Install GitHub Artifact Client
45+
uses: lhotari/gh-actions-artifact-client@v2
46+
- name: Compute Version
47+
run: |
48+
if [ -z "${{ github.event.inputs.version }}" ]; then
49+
echo "TERRACOTTA_VERSION=${GITHUB_SHA::7}" >> $GITHUB_ENV
50+
else
51+
echo "TERRACOTTA_VERSION=${{ github.event.inputs.version }}" >> $GITHUB_ENV
52+
fi
53+
- name: Build
54+
run: |
55+
rustup target add --toolchain nightly "${{ matrix.target }}"
56+
rustup component add rust-src --toolchain "nightly-$(rustc --print host-tuple)"
57+
cargo +nightly build --release --bin terracotta --target "${{ matrix.target }}" \
58+
-Z build-std=core,std,alloc,proc_macro,panic_abort \
59+
-Z build-std-features=default,optimize_for_size
60+
env:
61+
RUSTFLAGS: -Zunstable-options -Cpanic=immediate-abort
62+
- name: Upload Artifact
63+
run: |
64+
source="terracotta-${TERRACOTTA_VERSION}-${{ matrix.os }}-${{ matrix.arch }}.exe"
65+
cp "target/${{ matrix.target }}/release/terracotta.exe" "$source"
66+
7z a "$source.zip" "$source"
67+
cat "$source.zip" | gh-actions-artifact-client.js upload -r 90 "$source"
68+
build-unix:
69+
strategy:
70+
fail-fast: false
71+
matrix:
72+
include:
73+
- { os: linux, arch: x86_64, target: x86_64-unknown-linux-musl }
74+
- { os: linux, arch: arm64, target: aarch64-unknown-linux-musl, runs-on: ubuntu-24.04-arm }
75+
- { os: linux, arch: riscv64, target: riscv64gc-unknown-linux-gnu, glibc-version: 2.27 }
76+
- { os: linux, arch: loongarch64, target: loongarch64-unknown-linux-gnu }
77+
- { os: freebsd, arch: x86_64, target: x86_64-unknown-freebsd }
78+
- { os: android, arch: armv7 , target: armv7-linux-androideabi }
79+
- { os: android, arch: arm64v8a, target: aarch64-linux-android }
80+
- { os: android, arch: x86, target: i686-linux-android }
81+
- { os: android, arch: x86_64, target: x86_64-linux-android }
82+
runs-on: ${{ matrix.runs-on || 'ubuntu-24.04' }}
83+
name: Build (${{ matrix.target }})
84+
steps:
85+
- name: Checkout
86+
uses: actions/checkout@v4
87+
- name: Install GitHub Artifact Client
88+
uses: lhotari/gh-actions-artifact-client@v2
89+
- name: Compute Version
90+
run: |
91+
if [ -z "${{ github.event.inputs.version }}" ]; then
92+
echo "TERRACOTTA_VERSION=${GITHUB_SHA::7}" >> $GITHUB_ENV
93+
else
94+
echo "TERRACOTTA_VERSION=${{ github.event.inputs.version }}" >> $GITHUB_ENV
95+
fi
96+
- name: Setup Android SDK (Android)
97+
if: ${{ matrix.os == 'android' }}
98+
uses: android-actions/setup-android@v3
99+
with:
100+
cmdline-tools-version: 11076708
101+
packages: 'build-tools;34.0.0 ndk;26.0.10792818 tools platform-tools platforms;android-34 '
102+
- name: Install cargo-ndk and protobuf-compiler (Android)
103+
if: ${{ matrix.os == 'android' }}
104+
run: |
105+
sudo apt update
106+
sudo apt install --yes --no-install-recommends protobuf-compiler libprotobuf-dev
107+
cargo install cargo-ndk --force
108+
- name: Install musl libc (linux x86_64 | linux arm64)
109+
if: ${{ contains(fromJSON('["x86_64", "arm64"]'), matrix.arch) && matrix.os == 'linux' }}
110+
run: |
111+
sudo apt update
112+
sudo apt install --yes --no-install-recommends build-essential musl-tools musl-dev
113+
- name: Install Zig (linux riscv64 | linux loongarch64)
114+
if: ${{ contains(fromJSON('["riscv64", "loongarch64"]'), matrix.arch) && matrix.os == 'linux' }}
115+
uses: mlugg/setup-zig@v2
116+
- name: Install cargo-zigbuild (linux riscv64 | linux loongarch64)
117+
if: ${{ contains(fromJSON('["riscv64", "loongarch64"]'), matrix.arch) && matrix.os == 'linux' }}
118+
run: cargo install cargo-zigbuild --force
119+
- name: Build (linux x86_64 | linux arm64)
120+
if: ${{ contains(fromJSON('["x86_64", "arm64"]'), matrix.arch) && matrix.os == 'linux' }}
121+
run: |
122+
rustup target add --toolchain nightly "${{ matrix.target }}"
123+
rustup component add rust-src --toolchain "nightly-$(rustc --print host-tuple)"
124+
cargo +nightly build --release --bin terracotta --target "${{ matrix.target }}" \
125+
-Z build-std=core,std,alloc,proc_macro,panic_abort \
126+
-Z build-std-features=default,optimize_for_size
127+
env:
128+
RUSTFLAGS: -Zunstable-options -Cpanic=immediate-abort
129+
- name: Build (linux riscv64 | linux loongarch64)
130+
if: ${{ contains(fromJSON('["riscv64", "loongarch64"]'), matrix.arch) && matrix.os == 'linux' }}
131+
run: |
132+
rustup target add --toolchain nightly "${{ matrix.target }}"
133+
cargo +nightly zigbuild --release --bin terracotta --target "${{ matrix.target }}.${{ matrix.glibc-version }}"
134+
- name: Build (freebsd x86_64)
135+
if: ${{ contains(fromJSON('["x86_64"]'), matrix.arch) && matrix.os == 'freebsd' }}
136+
uses: cross-platform-actions/action@v0.30.0
137+
with:
138+
operating_system: freebsd
139+
architecture: ${{ matrix.arch }}
140+
version: '13.2'
141+
shell: bash
142+
run: |
143+
sudo pkg install -y llvm-devel curl ca_root_nss
144+
curl --proto 'https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
145+
export CC=clang
146+
export CXX=clang++
147+
. $HOME/.cargo/env
148+
rustup target add --toolchain nightly "${{ matrix.target }}"
149+
cargo +nightly build --release --bin terracotta --target "${{ matrix.target }}"
150+
- name: Build (Android)
151+
if: ${{ matrix.os == 'android' }}
152+
run: |
153+
export PATH="$PATH:$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin"
154+
export NDK_HOME="$ANDROID_NDK_HOME"
155+
156+
rustup target add --toolchain nightly "${{ matrix.target }}"
157+
rustup component add rust-src --toolchain "nightly-$(rustc --print host-tuple)"
158+
cargo +nightly ndk build --release --lib --target "${{ matrix.target }}" \
159+
-Z build-std=core,std,alloc,proc_macro,panic_abort \
160+
-Z build-std-features=default,optimize_for_size
161+
env:
162+
RUSTFLAGS: -Zunstable-options -Cpanic=unwind
163+
- name: Upload Artifact
164+
run: |
165+
if [ "${{ matrix.os }}" = "android" ]; then
166+
source="terracotta-${TERRACOTTA_VERSION}-${{ matrix.os }}-${{ matrix.arch }}.so"
167+
cp "target/${{ matrix.target }}/release/libterracotta.so" "$source"
168+
else
169+
source="terracotta-${TERRACOTTA_VERSION}-${{ matrix.os }}-${{ matrix.arch }}"
170+
cp "target/${{ matrix.target }}/release/terracotta" "$source"
171+
fi
172+
173+
chmod 755 "$source"
174+
tar -cf "$source.tar" "$source"
175+
zip -q - "$source.tar" | gh-actions-artifact-client.js upload -r 90 "$source.tar"
176+
build-macos:
177+
strategy:
178+
fail-fast: false
179+
matrix:
180+
include:
181+
- runs-on: macos-15-intel
182+
os: macos
183+
arch: x86_64
184+
target: x86_64-apple-darwin
185+
- runs-on: macos-latest
186+
os: macos
187+
arch: arm64
188+
target: aarch64-apple-darwin
189+
runs-on: ${{ matrix.runs-on }}
190+
name: Build (${{ matrix.target }})
191+
steps:
192+
- name: Checkout
193+
uses: actions/checkout@v4
194+
- name: Install GitHub Artifact Client
195+
uses: lhotari/gh-actions-artifact-client@v2
196+
- name: Compute Version
197+
run: |
198+
if [ -z "${{ github.event.inputs.version }}" ]; then
199+
echo "TERRACOTTA_VERSION=${GITHUB_SHA::7}" >> $GITHUB_ENV
200+
else
201+
echo "TERRACOTTA_VERSION=${{ github.event.inputs.version }}" >> $GITHUB_ENV
202+
fi
203+
- name: Build
204+
run: |
205+
rustup target add --toolchain nightly "${{ matrix.target }}"
206+
rustup component add rust-src --toolchain "nightly-$(rustc --print host-tuple)"
207+
cargo +nightly build --release --bin terracotta --target "${{ matrix.target }}" \
208+
-Z build-std=core,std,alloc,proc_macro,panic_abort \
209+
-Z build-std-features=default,optimize_for_size
210+
env:
211+
RUSTFLAGS: -Zunstable-options -Cpanic=immediate-abort
212+
- name: Upload Artifact
213+
run: |
214+
source="terracotta-${TERRACOTTA_VERSION}-${{ matrix.os }}-${{ matrix.arch }}"
215+
216+
cp "target/${{ matrix.target }}/release/terracotta" "$source"
217+
chmod 755 "$source"
218+
tar -cf "$source.tar" "$source"
219+
zip -q - "$source.tar" | gh-actions-artifact-client.js upload -r 90 "$source.tar"
220+
221+
chmod -R 755 build/macos/scripts
222+
TEMP_DIR=$(mktemp -d)
223+
mkdir -p "$TEMP_DIR"
224+
225+
cp -R build/macos/terracotta.app "$TEMP_DIR"
226+
mkdir -p "$TEMP_DIR/terracotta.app/Contents/MacOS/"
227+
cp "target/${{ matrix.target }}/release/terracotta" "$TEMP_DIR/terracotta.app/Contents/MacOS/terracotta"
228+
229+
chmod -R 755 "$TEMP_DIR/"
230+
PKG_OUTPUT="$source.pkg"
231+
232+
pkgbuild \
233+
--root "$TEMP_DIR" \
234+
--identifier "net.burningtnt.terracotta" \
235+
--version "1.0" \
236+
--install-location "/Applications" \
237+
--scripts build/macos/scripts \
238+
--component-plist build/macos/terracotta.plist \
239+
"$PKG_OUTPUT"
240+
zip -q - $PKG_OUTPUT | gh-actions-artifact-client.js upload -r 90 "$source.pkg"
241+
assemble-packages:
242+
runs-on: ubuntu-latest
243+
name: Assemble Artifact
244+
needs:
245+
- build-windows
246+
- build-unix
247+
- build-macos
248+
steps:
249+
- name: Install GitHub Artifact Client
250+
uses: lhotari/gh-actions-artifact-client@v2
251+
- name: Compute Version
252+
run: |
253+
if [ -z "${{ github.event.inputs.version }}" ]; then
254+
echo "TERRACOTTA_VERSION=${GITHUB_SHA::7}" >> $GITHUB_ENV
255+
else
256+
echo "TERRACOTTA_VERSION=${{ github.event.inputs.version }}" >> $GITHUB_ENV
257+
fi
258+
- name: Assemble Artifacts
259+
run: |
260+
artifacts_direct=(
261+
"terracotta-${TERRACOTTA_VERSION}-windows-x86_64.exe"
262+
"terracotta-${TERRACOTTA_VERSION}-windows-arm64.exe"
263+
"terracotta-${TERRACOTTA_VERSION}-macos-x86_64.pkg"
264+
"terracotta-${TERRACOTTA_VERSION}-macos-arm64.pkg"
265+
)
266+
artifacts_tar=(
267+
"terracotta-${TERRACOTTA_VERSION}-linux-x86_64"
268+
"terracotta-${TERRACOTTA_VERSION}-linux-arm64"
269+
"terracotta-${TERRACOTTA_VERSION}-linux-riscv64"
270+
"terracotta-${TERRACOTTA_VERSION}-linux-loongarch64"
271+
"terracotta-${TERRACOTTA_VERSION}-freebsd-x86_64"
272+
"terracotta-${TERRACOTTA_VERSION}-macos-x86_64"
273+
"terracotta-${TERRACOTTA_VERSION}-macos-arm64"
274+
"terracotta-${TERRACOTTA_VERSION}-android-armv7.so"
275+
"terracotta-${TERRACOTTA_VERSION}-android-arm64v8a.so"
276+
"terracotta-${TERRACOTTA_VERSION}-android-x86.so"
277+
"terracotta-${TERRACOTTA_VERSION}-android-x86_64.so"
278+
)
279+
280+
file=$(mktemp -t XXXXXX.zip)
281+
for artifact in "${artifacts_direct[@]}"; do
282+
gh-actions-artifact-client.js download "$artifact" > "$file"
283+
unzip -p "$file" > "$artifact"
284+
done
285+
for artifact in "${artifacts_tar[@]}"; do
286+
gh-actions-artifact-client.js download "$artifact.tar" > "$file"
287+
unzip -p "$file" | tar -xOf - > "$artifact"
288+
done
289+
rm "$file"
290+
291+
chmod 755 terracotta-${TERRACOTTA_VERSION}-*
292+
7z -m0=LZMA2 -mx=9 -ms=on a terracotta.7z terracotta-${TERRACOTTA_VERSION}-*
293+
zip -r - terracotta.7z | gh-actions-artifact-client.js upload -r 90 "terracotta-${TERRACOTTA_VERSION}-all.7z"
294+
295+
if [ ! -z "${{ github.event.inputs.version }}" ]; then
296+
mkdir -p bundle
297+
298+
curl -L -o VCRUNTIME140.DLL "https://github.com/burningtnt/Terracotta/raw/refs/heads/binaries/windows_x86_64/vcruntime140.dll"
299+
tar -czvf bundle/terracotta-${TERRACOTTA_VERSION}-windows-x86_64-pkg.tar.gz terracotta-${TERRACOTTA_VERSION}-windows-x86_64.exe VCRUNTIME140.DLL
300+
curl -L -o VCRUNTIME140.DLL "https://github.com/burningtnt/Terracotta/raw/refs/heads/binaries/windows_arm64/vcruntime140.dll"
301+
tar -czvf bundle/terracotta-${TERRACOTTA_VERSION}-windows-arm64-pkg.tar.gz terracotta-${TERRACOTTA_VERSION}-windows-arm64.exe VCRUNTIME140.DLL
302+
tar -czvf bundle/terracotta-${TERRACOTTA_VERSION}-linux-x86_64-pkg.tar.gz terracotta-${TERRACOTTA_VERSION}-linux-x86_64
303+
tar -czvf bundle/terracotta-${TERRACOTTA_VERSION}-linux-arm64-pkg.tar.gz terracotta-${TERRACOTTA_VERSION}-linux-arm64
304+
tar -czvf bundle/terracotta-${TERRACOTTA_VERSION}-linux-riscv64-pkg.tar.gz terracotta-${TERRACOTTA_VERSION}-linux-riscv64
305+
tar -czvf bundle/terracotta-${TERRACOTTA_VERSION}-linux-loongarch64-pkg.tar.gz terracotta-${TERRACOTTA_VERSION}-linux-loongarch64
306+
tar -czvf bundle/terracotta-${TERRACOTTA_VERSION}-freebsd-x86_64-pkg.tar.gz terracotta-${TERRACOTTA_VERSION}-freebsd-x86_64
307+
308+
tar -czvf bundle/terracotta-${TERRACOTTA_VERSION}-macos-x86_64-pkg.tar.gz terracotta-${TERRACOTTA_VERSION}-macos-x86_64 terracotta-${TERRACOTTA_VERSION}-macos-x86_64.pkg
309+
tar -czvf bundle/terracotta-${TERRACOTTA_VERSION}-macos-arm64-pkg.tar.gz terracotta-${TERRACOTTA_VERSION}-macos-arm64 terracotta-${TERRACOTTA_VERSION}-macos-arm64.pkg
310+
311+
cp terracotta-${TERRACOTTA_VERSION}-android-armv7.so bundle/terracotta-${TERRACOTTA_VERSION}-android-armv7.so
312+
cp terracotta-${TERRACOTTA_VERSION}-android-arm64v8a.so bundle/terracotta-${TERRACOTTA_VERSION}-android-arm64v8a.so
313+
cp terracotta-${TERRACOTTA_VERSION}-android-x86.so bundle/terracotta-${TERRACOTTA_VERSION}-android-x86.so
314+
cp terracotta-${TERRACOTTA_VERSION}-android-x86_64.so bundle/terracotta-${TERRACOTTA_VERSION}-android-x86_64.so
315+
316+
gh release create v"${{ github.event.inputs.version }}" -R "${{ github.repository }}" --draft --generate-notes bundle/terracotta-${TERRACOTTA_VERSION}-*
317+
fi
318+
env:
319+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

0 commit comments

Comments
 (0)