Build server for multiple arch (#106)
This commit is contained in:
parent
9177984ff6
commit
4cdd0cbd40
16 changed files with 111 additions and 28 deletions
6
.github/workflows/check.yml
vendored
6
.github/workflows/check.yml
vendored
|
|
@ -22,6 +22,12 @@ jobs:
|
||||||
with:
|
with:
|
||||||
node-version: "22.x"
|
node-version: "22.x"
|
||||||
check-latest: true
|
check-latest: true
|
||||||
|
|
||||||
|
- name: Setup Rust toolchain
|
||||||
|
uses: dtolnay/rust-toolchain@stable
|
||||||
|
with:
|
||||||
|
toolchain: "1.89.0"
|
||||||
|
components: clippy, rustfmt
|
||||||
|
|
||||||
- name: Setup rust
|
- name: Setup rust
|
||||||
run: |
|
run: |
|
||||||
|
|
|
||||||
6
.github/workflows/e2e.yml
vendored
6
.github/workflows/e2e.yml
vendored
|
|
@ -23,6 +23,12 @@ jobs:
|
||||||
node-version: "22.x"
|
node-version: "22.x"
|
||||||
check-latest: true
|
check-latest: true
|
||||||
|
|
||||||
|
- name: Setup Rust toolchain
|
||||||
|
uses: dtolnay/rust-toolchain@stable
|
||||||
|
with:
|
||||||
|
toolchain: "1.89.0"
|
||||||
|
components: clippy, rustfmt
|
||||||
|
|
||||||
- name: Setup rust
|
- name: Setup rust
|
||||||
run: |
|
run: |
|
||||||
cargo install sqlx-cli
|
cargo install sqlx-cli
|
||||||
|
|
|
||||||
1
.github/workflows/publish-docker.yml
vendored
1
.github/workflows/publish-docker.yml
vendored
|
|
@ -67,6 +67,7 @@ jobs:
|
||||||
uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 # v5.0.0
|
uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 # v5.0.0
|
||||||
with:
|
with:
|
||||||
context: sync-server
|
context: sync-server
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
push: ${{ github.ref_type == 'tag' }}
|
push: ${{ github.ref_type == 'tag' }}
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
|
|
||||||
21
.github/workflows/publish-plugin.yml
vendored
21
.github/workflows/publish-plugin.yml
vendored
|
|
@ -26,15 +26,32 @@ jobs:
|
||||||
npm ci
|
npm ci
|
||||||
npm run build
|
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
|
- name: Create release
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: |
|
run: |
|
||||||
tag="${GITHUB_REF#refs/tags/}"
|
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" \
|
gh release create "$tag" \
|
||||||
--title="$tag" \
|
--title="$tag" \
|
||||||
--draft \
|
--draft \
|
||||||
main.js manifest.json styles.css
|
*
|
||||||
|
|
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -14,6 +14,7 @@ sync-server/databases
|
||||||
|
|
||||||
# Rust build folders
|
# Rust build folders
|
||||||
sync-server/target
|
sync-server/target
|
||||||
|
sync-server/artifacts
|
||||||
sync-server/bindings/*.ts
|
sync-server/bindings/*.ts
|
||||||
|
|
||||||
*.log
|
*.log
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"id": "vault-link",
|
"id": "vault-link",
|
||||||
"name": "VaultLink",
|
"name": "VaultLink",
|
||||||
"version": "0.6.3",
|
"version": "0.6.4",
|
||||||
"minAppVersion": "0.0.0",
|
"minAppVersion": "0.0.0",
|
||||||
"description": "Self-hosted synchronization and collaboration for your Vault.",
|
"description": "Self-hosted synchronization and collaboration for your Vault.",
|
||||||
"author": "Andras Schmelczer",
|
"author": "Andras Schmelczer",
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "vault-link-obsidian-plugin",
|
"name": "vault-link-obsidian-plugin",
|
||||||
"version": "0.6.3",
|
"version": "0.6.4",
|
||||||
"description": "This is a sample plugin for Obsidian (https://obsidian.md)",
|
"description": "This is a sample plugin for Obsidian (https://obsidian.md)",
|
||||||
"main": "main.js",
|
"main": "main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|
@ -35,4 +35,4 @@
|
||||||
"webpack": "^5.99.9",
|
"webpack": "^5.99.9",
|
||||||
"webpack-cli": "^6.0.1"
|
"webpack-cli": "^6.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
6
frontend/package-lock.json
generated
6
frontend/package-lock.json
generated
|
|
@ -4494,7 +4494,7 @@
|
||||||
},
|
},
|
||||||
"obsidian-plugin": {
|
"obsidian-plugin": {
|
||||||
"name": "vault-link-obsidian-plugin",
|
"name": "vault-link-obsidian-plugin",
|
||||||
"version": "0.6.3",
|
"version": "0.6.4",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^22.15.30",
|
"@types/node": "^22.15.30",
|
||||||
|
|
@ -4538,7 +4538,7 @@
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"sync-client": {
|
"sync-client": {
|
||||||
"version": "0.6.3",
|
"version": "0.6.4",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"byte-base64": "^1.1.0",
|
"byte-base64": "^1.1.0",
|
||||||
"minimatch": "^10.0.1",
|
"minimatch": "^10.0.1",
|
||||||
|
|
@ -4596,7 +4596,7 @@
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"test-client": {
|
"test-client": {
|
||||||
"version": "0.6.3",
|
"version": "0.6.4",
|
||||||
"bin": {
|
"bin": {
|
||||||
"test-client": "dist/cli.js"
|
"test-client": "dist/cli.js"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "sync-client",
|
"name": "sync-client",
|
||||||
"version": "0.6.3",
|
"version": "0.6.4",
|
||||||
"main": "dist/sync-client.node.js",
|
"main": "dist/sync-client.node.js",
|
||||||
"browser": "dist/sync-client.web.js",
|
"browser": "dist/sync-client.web.js",
|
||||||
"types": "dist/types/index.d.ts",
|
"types": "dist/types/index.d.ts",
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "test-client",
|
"name": "test-client",
|
||||||
"version": "0.6.3",
|
"version": "0.6.4",
|
||||||
"private": true,
|
"private": true,
|
||||||
"bin": {
|
"bin": {
|
||||||
"test-client": "./dist/cli.js"
|
"test-client": "./dist/cli.js"
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"id": "vault-link",
|
"id": "vault-link",
|
||||||
"name": "VaultLink",
|
"name": "VaultLink",
|
||||||
"version": "0.6.3",
|
"version": "0.6.4",
|
||||||
"minAppVersion": "0.0.0",
|
"minAppVersion": "0.0.0",
|
||||||
"description": "Self-hosted synchronization and collaboration for your Vault.",
|
"description": "Self-hosted synchronization and collaboration for your Vault.",
|
||||||
"author": "Andras Schmelczer",
|
"author": "Andras Schmelczer",
|
||||||
|
|
|
||||||
46
scripts/build-sync-server-binaries.sh
Executable file
46
scripts/build-sync-server-binaries.sh
Executable file
|
|
@ -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-*
|
||||||
2
sync-server/Cargo.lock
generated
2
sync-server/Cargo.lock
generated
|
|
@ -2205,7 +2205,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sync_server"
|
name = "sync_server"
|
||||||
version = "0.6.3"
|
version = "0.6.4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"axum",
|
"axum",
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ authors = ["Andras Schmelczer <andras@schmelczer.dev>"]
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
repository = "https://github.com/schmelczer/vault-link"
|
repository = "https://github.com/schmelczer/vault-link"
|
||||||
version = "0.6.3"
|
version = "0.6.4"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
serde = { version = "1.0.219", default-features = false, features = ["derive"] }
|
serde = { version = "1.0.219", default-features = false, features = ["derive"] }
|
||||||
|
|
|
||||||
|
|
@ -1,33 +1,34 @@
|
||||||
FROM rust:1.89 AS builder
|
FROM rust:1.89-slim-trixie AS builder
|
||||||
|
|
||||||
WORKDIR /usr/src/backend
|
WORKDIR /usr/src/backend
|
||||||
|
|
||||||
RUN apt update && apt install -y musl-tools
|
RUN apt update && \
|
||||||
RUN cargo install sqlx-cli
|
apt install -y libssl-dev pkg-config && \
|
||||||
|
cargo install sqlx-cli
|
||||||
|
|
||||||
|
# Build application
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
RUN sqlx database create --database-url sqlite://db.sqlite3
|
RUN sqlx database create --database-url sqlite://db.sqlite3 && \
|
||||||
RUN sqlx migrate run --source src/app_state/database/migrations --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
|
FROM debian:trixie-slim
|
||||||
|
|
||||||
# Runtime image
|
|
||||||
FROM alpine:3.22.1
|
|
||||||
|
|
||||||
LABEL org.opencontainers.image.authors="andras@schmelczer.dev"
|
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
|
VOLUME /data
|
||||||
EXPOSE 3000/tcp
|
EXPOSE 3000/tcp
|
||||||
WORKDIR /data
|
WORKDIR /data
|
||||||
|
|
||||||
HEALTHCHECK \
|
HEALTHCHECK --interval=30s --timeout=5s \
|
||||||
--interval=30s \
|
|
||||||
--timeout=5s \
|
|
||||||
CMD curl -f http://localhost:3000/vaults/fake/ping || exit 1
|
CMD curl -f http://localhost:3000/vaults/fake/ping || exit 1
|
||||||
|
|
||||||
ENTRYPOINT ["/app/sync_server"]
|
ENTRYPOINT ["/app/sync_server"]
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,9 @@
|
||||||
[toolchain]
|
[toolchain]
|
||||||
channel = "1.89.0"
|
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"
|
profile = "default"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue