From 4cdd0cbd40fc55fab2aa4c34bf42ea2f7380a67e Mon Sep 17 00:00:00 2001 From: Andras Schmelczer Date: Sat, 30 Aug 2025 21:50:34 +0100 Subject: [PATCH] Build server for multiple arch (#106) --- .github/workflows/check.yml | 6 ++++ .github/workflows/e2e.yml | 6 ++++ .github/workflows/publish-docker.yml | 1 + .github/workflows/publish-plugin.yml | 21 ++++++++++-- .gitignore | 1 + frontend/obsidian-plugin/manifest.json | 2 +- frontend/obsidian-plugin/package.json | 4 +-- frontend/package-lock.json | 6 ++-- frontend/sync-client/package.json | 2 +- frontend/test-client/package.json | 2 +- manifest.json | 2 +- scripts/build-sync-server-binaries.sh | 46 ++++++++++++++++++++++++++ sync-server/Cargo.lock | 2 +- sync-server/Cargo.toml | 2 +- sync-server/Dockerfile | 29 ++++++++-------- sync-server/rust-toolchain.toml | 7 +++- 16 files changed, 111 insertions(+), 28 deletions(-) create mode 100755 scripts/build-sync-server-binaries.sh diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 0f0d18e1..e2421e27 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -22,6 +22,12 @@ jobs: with: node-version: "22.x" check-latest: true + + - name: Setup Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + toolchain: "1.89.0" + components: clippy, rustfmt - name: Setup rust run: | diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 23f57786..c540f1e4 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -23,6 +23,12 @@ jobs: node-version: "22.x" check-latest: true + - name: Setup Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + toolchain: "1.89.0" + components: clippy, rustfmt + - name: Setup rust run: | cargo install sqlx-cli diff --git a/.github/workflows/publish-docker.yml b/.github/workflows/publish-docker.yml index b205448f..f9fee79b 100644 --- a/.github/workflows/publish-docker.yml +++ b/.github/workflows/publish-docker.yml @@ -67,6 +67,7 @@ jobs: uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 # v5.0.0 with: context: sync-server + platforms: linux/amd64,linux/arm64 push: ${{ github.ref_type == 'tag' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} diff --git a/.github/workflows/publish-plugin.yml b/.github/workflows/publish-plugin.yml index 18c934bb..ed223780 100644 --- a/.github/workflows/publish-plugin.yml +++ b/.github/workflows/publish-plugin.yml @@ -26,15 +26,32 @@ jobs: npm ci npm run build + - name: Setup Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + toolchain: "1.89.0" + components: clippy, rustfmt + + - name: Install cross-compilation tools + run: | + apt update + apt install -y gcc-aarch64-linux-gnu musl-tools gcc-mingw-w64-x86-64 + + - name: Build Linux and Windows binaries + run: ./scripts/build-sync-server-binaries.sh + - name: Create release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | tag="${GITHUB_REF#refs/tags/}" - cd frontend/obsidian-plugin/dist + mkdir -p release + cp frontend/obsidian-plugin/dist/* release/ + cp sync-server/artifacts/sync-server-* release/ + cd release gh release create "$tag" \ --title="$tag" \ --draft \ - main.js manifest.json styles.css + * diff --git a/.gitignore b/.gitignore index 98a00712..ef64105e 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ sync-server/databases # Rust build folders sync-server/target +sync-server/artifacts sync-server/bindings/*.ts *.log diff --git a/frontend/obsidian-plugin/manifest.json b/frontend/obsidian-plugin/manifest.json index b327da4f..6ae4ed36 100644 --- a/frontend/obsidian-plugin/manifest.json +++ b/frontend/obsidian-plugin/manifest.json @@ -1,7 +1,7 @@ { "id": "vault-link", "name": "VaultLink", - "version": "0.6.3", + "version": "0.6.4", "minAppVersion": "0.0.0", "description": "Self-hosted synchronization and collaboration for your Vault.", "author": "Andras Schmelczer", diff --git a/frontend/obsidian-plugin/package.json b/frontend/obsidian-plugin/package.json index 14b286c9..ea86ab84 100644 --- a/frontend/obsidian-plugin/package.json +++ b/frontend/obsidian-plugin/package.json @@ -1,6 +1,6 @@ { "name": "vault-link-obsidian-plugin", - "version": "0.6.3", + "version": "0.6.4", "description": "This is a sample plugin for Obsidian (https://obsidian.md)", "main": "main.js", "scripts": { @@ -35,4 +35,4 @@ "webpack": "^5.99.9", "webpack-cli": "^6.0.1" } -} \ No newline at end of file +} diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 7876659b..39fa503d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -4494,7 +4494,7 @@ }, "obsidian-plugin": { "name": "vault-link-obsidian-plugin", - "version": "0.6.3", + "version": "0.6.4", "license": "MIT", "devDependencies": { "@types/node": "^22.15.30", @@ -4538,7 +4538,7 @@ "license": "MIT" }, "sync-client": { - "version": "0.6.3", + "version": "0.6.4", "dependencies": { "byte-base64": "^1.1.0", "minimatch": "^10.0.1", @@ -4596,7 +4596,7 @@ "license": "MIT" }, "test-client": { - "version": "0.6.3", + "version": "0.6.4", "bin": { "test-client": "dist/cli.js" }, diff --git a/frontend/sync-client/package.json b/frontend/sync-client/package.json index 0046f5c2..68e740e2 100644 --- a/frontend/sync-client/package.json +++ b/frontend/sync-client/package.json @@ -1,6 +1,6 @@ { "name": "sync-client", - "version": "0.6.3", + "version": "0.6.4", "main": "dist/sync-client.node.js", "browser": "dist/sync-client.web.js", "types": "dist/types/index.d.ts", diff --git a/frontend/test-client/package.json b/frontend/test-client/package.json index ba40bd48..100f6457 100644 --- a/frontend/test-client/package.json +++ b/frontend/test-client/package.json @@ -1,6 +1,6 @@ { "name": "test-client", - "version": "0.6.3", + "version": "0.6.4", "private": true, "bin": { "test-client": "./dist/cli.js" diff --git a/manifest.json b/manifest.json index b327da4f..6ae4ed36 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "vault-link", "name": "VaultLink", - "version": "0.6.3", + "version": "0.6.4", "minAppVersion": "0.0.0", "description": "Self-hosted synchronization and collaboration for your Vault.", "author": "Andras Schmelczer", diff --git a/scripts/build-sync-server-binaries.sh b/scripts/build-sync-server-binaries.sh new file mode 100755 index 00000000..19297aa6 --- /dev/null +++ b/scripts/build-sync-server-binaries.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +set -e + +cd "$(dirname "$0")/../sync-server" + +# Setup database +sqlx database create --database-url sqlite://db.sqlite3 2>/dev/null || true +sqlx migrate run --source src/app_state/database/migrations --database-url sqlite://db.sqlite3 + +targets=${@:-"x86_64-unknown-linux-gnu x86_64-unknown-linux-musl aarch64-unknown-linux-gnu x86_64-pc-windows-gnu"} + +mkdir -p artifacts +rm -f artifacts/sync-server-* + + +for target in $targets; do + echo "Building $target..." + + # Set linkers for cross-compilation + case "$target" in + aarch64-unknown-linux-gnu) + export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc ;; + x86_64-unknown-linux-musl) + export CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=musl-gcc ;; + x86_64-pc-windows-gnu) + export CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER=x86_64-w64-mingw32-gcc ;; + esac + + rustup target add "$target" 2>/dev/null || true + + cargo build --release --target "$target" + ext="" + [[ "$target" == *windows* ]] && ext=".exe" + + name="sync-server-${target//-/_}$ext" + name="${name//x86_64_unknown_linux_gnu/linux-x86_64}" + name="${name//x86_64_unknown_linux_musl/linux-x86_64-musl}" + name="${name//aarch64_unknown_linux_gnu/linux-aarch64}" + name="${name//x86_64_pc_windows_gnu/windows-x86_64}" + + cp "target/$target/release/sync_server$ext" "artifacts/$name" + echo "✓ Built $name" +done + +ls -la ../artifacts/sync-server-* diff --git a/sync-server/Cargo.lock b/sync-server/Cargo.lock index 26669e0a..c0f2d9e9 100644 --- a/sync-server/Cargo.lock +++ b/sync-server/Cargo.lock @@ -2205,7 +2205,7 @@ dependencies = [ [[package]] name = "sync_server" -version = "0.6.3" +version = "0.6.4" dependencies = [ "anyhow", "axum", diff --git a/sync-server/Cargo.toml b/sync-server/Cargo.toml index 550a0998..08c84493 100644 --- a/sync-server/Cargo.toml +++ b/sync-server/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Andras Schmelczer "] edition = "2024" license = "MIT" repository = "https://github.com/schmelczer/vault-link" -version = "0.6.3" +version = "0.6.4" [dependencies] serde = { version = "1.0.219", default-features = false, features = ["derive"] } diff --git a/sync-server/Dockerfile b/sync-server/Dockerfile index bf6fb604..10aeb4ae 100644 --- a/sync-server/Dockerfile +++ b/sync-server/Dockerfile @@ -1,33 +1,34 @@ -FROM rust:1.89 AS builder +FROM rust:1.89-slim-trixie AS builder WORKDIR /usr/src/backend -RUN apt update && apt install -y musl-tools -RUN cargo install sqlx-cli +RUN apt update && \ + apt install -y libssl-dev pkg-config && \ + cargo install sqlx-cli +# Build application COPY . . -RUN sqlx database create --database-url sqlite://db.sqlite3 -RUN sqlx migrate run --source src/app_state/database/migrations --database-url sqlite://db.sqlite3 +RUN sqlx database create --database-url sqlite://db.sqlite3 && \ + sqlx migrate run --source src/app_state/database/migrations --database-url sqlite://db.sqlite3 && \ + cargo build --release -RUN cargo build --release --target x86_64-unknown-linux-musl - -# Runtime image -FROM alpine:3.22.1 +FROM debian:trixie-slim LABEL org.opencontainers.image.authors="andras@schmelczer.dev" -RUN apk add --no-cache curl +RUN apt update && \ + apt install -y curl ca-certificates && \ + apt clean && \ + rm -rf /var/lib/apt/lists/* -COPY --from=builder /usr/src/backend/target/x86_64-unknown-linux-musl/release/sync_server /app/sync_server +COPY --from=builder /usr/src/backend/target/release/sync_server /app/sync_server VOLUME /data EXPOSE 3000/tcp WORKDIR /data -HEALTHCHECK \ - --interval=30s \ - --timeout=5s \ +HEALTHCHECK --interval=30s --timeout=5s \ CMD curl -f http://localhost:3000/vaults/fake/ping || exit 1 ENTRYPOINT ["/app/sync_server"] diff --git a/sync-server/rust-toolchain.toml b/sync-server/rust-toolchain.toml index ed32db00..635d09fb 100644 --- a/sync-server/rust-toolchain.toml +++ b/sync-server/rust-toolchain.toml @@ -1,4 +1,9 @@ [toolchain] channel = "1.89.0" -targets = [ "x86_64-unknown-linux-gnu", "x86_64-unknown-linux-musl" ] +targets = [ + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl", + "aarch64-unknown-linux-gnu", + "x86_64-pc-windows-gnu", +] profile = "default"