From af0588c5efcb75a8d8f45348d1801511f1041597 Mon Sep 17 00:00:00 2001 From: Joshua Coles Date: Fri, 9 Aug 2024 09:57:48 +0100 Subject: [PATCH] Replace the Docker build with the one from toggl-bridge as it's better --- .github/workflows/build.yml | 89 ++++++++++++++++++++++++++++++------- Dockerfile | 88 +++++------------------------------- Dockerfile.cache | 48 -------------------- 3 files changed, 86 insertions(+), 139 deletions(-) delete mode 100644 Dockerfile.cache diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6e0f228..1466242 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,39 +1,98 @@ -name: Build and Publish Docker Container +name: Rust CI on: push: - branches: - - main + branches: [ main ] + pull_request: + branches: [ main ] + +env: + CARGO_TERM_COLOR: always jobs: build: + name: Build and Test runs-on: ubuntu-latest - container: - image: catthehacker/ubuntu:act-latest + container: catthehacker/ubuntu:act-latest steps: - - name: Checkout code - uses: actions/checkout@v2 + - uses: actions/checkout@v3 + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + override: true + components: rustfmt, clippy + + - name: Add ARM64 target + run: rustup target add aarch64-unknown-linux-gnu + + - name: Install ARM64 toolchain + run: | + apt-get update + apt-get install -y gcc-aarch64-linux-gnu + + - name: Cache dependencies + uses: actions/cache@v3 + with: + path: | + ~/.cargo + target/ + key: "${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}" + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Build (x86_64) + uses: actions-rs/cargo@v1 + with: + command: build + args: --release --all-features + + - name: Build (ARM64) + uses: actions-rs/cargo@v1 + with: + command: build + args: --release --all-features --target aarch64-unknown-linux-gnu + env: + CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc + + - name: Run tests + uses: actions-rs/cargo@v1 + with: + command: test + args: --all-features + + - name: Upload artifacts + uses: actions/upload-artifact@v3 + with: + name: binaries + path: | + target/release/${{ github.event.repository.name }} + target/aarch64-unknown-linux-gnu/release/${{ github.event.repository.name }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 + uses: docker/setup-buildx-action@v2 - - name: Login to Docker - uses: docker/login-action@v1 + - name: Login to DockerHub + uses: docker/login-action@v2 with: registry: git.joshuacoles.me username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - - name: Build and Push Docker image - uses: docker/build-push-action@v5 + - name: Build and push multi-arch Docker image + uses: docker/build-push-action@v4 with: context: . + file: ./Dockerfile + platforms: linux/amd64,linux/arm64 push: true - file: ./Dockerfile.cache tags: git.joshuacoles.me/${{ github.repository }}:latest,git.joshuacoles.me/${{ github.repository }}:${{ github.sha }} - cache-from: type=gha - cache-to: type=gha,mode=max - uses: robiningelbrecht/ntfy-action@v1.0.0 name: Notify via ntfy.sh diff --git a/Dockerfile b/Dockerfile index 645f027..1602664 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,78 +1,14 @@ -# syntax=docker/dockerfile:1 - -# Comments are provided throughout this file to help you get started. -# If you need more help, visit the Dockerfile reference guide at -# https://docs.docker.com/engine/reference/builder/ - -################################################################################ -# Create a stage for building the application. - -ARG RUST_VERSION=1.76.0 -ARG APP_NAME=monzo-ingestion -FROM rust:${RUST_VERSION}-slim-bullseye AS build -ARG APP_NAME +FROM --platform=$BUILDPLATFORM debian:bullseye-slim AS builder +ARG TARGETPLATFORM WORKDIR /app +COPY . . +RUN case "$TARGETPLATFORM" in \ + "linux/amd64") BINARY_PATH="target/release/toggl-bridge" ;; \ + "linux/arm64") BINARY_PATH="target/aarch64-unknown-linux-gnu/release/toggl-bridge" ;; \ + *) exit 1 ;; \ + esac && \ + mv "$BINARY_PATH" /usr/local/bin/toggl-bridge -# Build the application. -# Leverage a cache mount to /usr/local/cargo/registry/ -# for downloaded dependencies and a cache mount to /app/target/ for -# compiled dependencies which will speed up subsequent builds. -# Leverage a bind mount to the src directory to avoid having to copy the -# source code into the container. Once built, copy the executable to an -# output directory before the cache mounted /app/target is unmounted. -RUN --mount=type=bind,source=src,target=src \ - --mount=type=bind,source=entity,target=entity \ - --mount=type=bind,source=migration,target=migration \ - --mount=type=bind,source=Cargo.toml,target=Cargo.toml \ - --mount=type=bind,source=Cargo.lock,target=Cargo.lock \ - --mount=type=cache,target=/app/target/ \ - --mount=type=cache,target=/usr/local/cargo/registry/ \ - <