diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 58bf1c0..cd2b977 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -46,26 +46,14 @@ jobs: type=semver,pattern={{major}}.{{minor}} type=sha - - name: Build and push x86_64 + - name: Build and push uses: docker/build-push-action@v6 with: context: . - file: Dockerfile.x86_64 + file: Dockerfile push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta.outputs.tags }} - platforms: linux/amd64 - labels: ${{ steps.meta.outputs.labels }} - cache-from: type=gha - cache-to: type=gha,mode=max - - - name: Build and push aarch64 - uses: docker/build-push-action@v6 - with: - context: . - file: Dockerfile.aarch64 - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta.outputs.tags }} - platforms: linux/arm64 + platforms: linux/amd64,linux/arm64 labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c2e3f29 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,57 @@ +FROM --platform=$BUILDPLATFORM oven/bun:1-alpine AS css-builder +WORKDIR /temp +COPY package.json bun.lockb ./ +RUN bun install --frozen-lockfile +COPY gridPlugin.js tailwind.config.js ./ +COPY src ./src +RUN bunx tailwindcss -i ./src/style.css -o ./out.css --minify + +FROM --platform=$BUILDPLATFORM rust:1.80 AS build + +RUN apt-get update && apt-get install --no-install-recommends -y \ + musl-tools \ + && rm -rf /var/lib/apt/lists/* + +ARG TARGETPLATFORM +RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \ + apt-get update && apt-get install --no-install-recommends -y \ + gcc-aarch64-linux-gnu \ + && rm -rf /var/lib/apt/lists/* \ + && rustup target add aarch64-unknown-linux-musl \ + elif [ "$TARGETPLATFORM" = "linux/amd64" ]; then \ + rustup target add x86_64-unknown-linux-musl; \ + else \ + echo "Unsupported platform: $TARGETPLATFORM" && exit 1; \ + fi + +# Set up the build environment +WORKDIR /usr/src +RUN USER=root cargo new --bin vesta +WORKDIR /usr/src/vesta +COPY Cargo.toml Cargo.lock ./ +COPY src ./src + +RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \ + export CC_aarch64_unknown_linux_musl=aarch64-linux-gnu-gcc; \ + export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=aarch64-linux-gnu-gcc; \ + cargo build --release --target=aarch64-unknown-linux-musl; \ + elif [ "$TARGETPLATFORM" = "linux/amd64" ]; then \ + cargo build --release --target=x86_64-unknown-linux-musl; \ + fi + +FROM scratch +WORKDIR /app +COPY ./static static +COPY --from=css-builder /temp/out.css ./static/style.css + +# Copy the appropriate binary based on the target platform +ARG TARGETPLATFORM +COPY --from=build /usr/src/vesta/target/aarch64-unknown-linux-musl/release/vesta /app/vesta-arm64 +COPY --from=build /usr/src/vesta/target/x86_64-unknown-linux-musl/release/vesta /app/vesta-amd64 +RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \ + mv /app/vesta-arm64 /app/vesta; \ + elif [ "$TARGETPLATFORM" = "linux/amd64" ]; then \ + mv /app/vesta-amd64 /app/vesta; \ + fi + +CMD ["/app/vesta"] diff --git a/Dockerfile.aarch64 b/Dockerfile.aarch64 deleted file mode 100644 index 5cca25a..0000000 --- a/Dockerfile.aarch64 +++ /dev/null @@ -1,36 +0,0 @@ -FROM --platform=$BUILDPLATFORM oven/bun:1-alpine AS css-builder -WORKDIR /temp -COPY package.json bun.lockb ./ -RUN bun install --frozen-lockfile - -COPY gridPlugin.js tailwind.config.js ./ -COPY src ./src -RUN bunx tailwindcss -i ./src/style.css -o ./out.css --minify - -FROM --platform=$BUILDPLATFORM rust:1.80 AS build - -RUN apt-get update && apt-get install -y \ - musl-tools \ - gcc-aarch64-linux-gnu \ - && rm -rf /var/lib/apt/lists/* - -RUN rustup target add aarch64-unknown-linux-musl - -ENV CC_aarch64_unknown_linux_musl=aarch64-linux-gnu-gcc \ - CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=aarch64-linux-gnu-gcc - -WORKDIR /usr/src -RUN USER=root cargo new --bin vesta -WORKDIR /usr/src/vesta -COPY Cargo.toml Cargo.lock ./ -COPY src ./src -RUN cargo build --release --target=aarch64-unknown-linux-musl - -FROM scratch - -WORKDIR /app -COPY ./static static -COPY --from=css-builder /temp/out.css ./static/style.css -COPY --from=build /usr/src/vesta/target/aarch64-unknown-linux-musl/release/vesta /app/vesta - -CMD ["/app/vesta"] diff --git a/Dockerfile.x86_64 b/Dockerfile.x86_64 deleted file mode 100644 index d8d33f0..0000000 --- a/Dockerfile.x86_64 +++ /dev/null @@ -1,28 +0,0 @@ -FROM oven/bun:1-alpine AS css-builder -WORKDIR /temp -COPY package.json bun.lockb ./ -RUN bun install --frozen-lockfile - -COPY gridPlugin.js tailwind.config.js ./ -COPY src ./src -RUN bunx tailwindcss -i ./src/style.css -o ./out.css --minify - -FROM rust:1.80-alpine AS build - -RUN apk add --no-cache musl-dev - -WORKDIR /usr/src -RUN USER=root cargo new --bin vesta -WORKDIR /usr/src/vesta -COPY Cargo.toml Cargo.lock ./ -COPY src ./src -RUN cargo build --release - -FROM scratch - -WORKDIR /app -COPY ./static static -COPY --from=css-builder /temp/out.css ./static/style.css -COPY --from=build /usr/src/vesta/target/release/vesta /app/vesta - -CMD ["/app/vesta"]