Skip to content

Commit

Permalink
Docker build time in CI
Browse files Browse the repository at this point in the history
  • Loading branch information
avalonche committed Dec 11, 2024
1 parent 424e4a3 commit e008479
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 19 deletions.
8 changes: 7 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@ jobs:
type=pep440,pattern={{major}}.{{minor}}
type=raw,value=latest,enable=${{ !contains(env.RELEASE_VERSION, '-') }}
# https://github.com/dtolnay/rust-toolchain
- name: Setup rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
target: x86_64-unknown-linux-gnu,aarch64-unknown-linux-gnu

# https://github.com/WarpBuilds/rust-cache
- name: Run WarpBuilds/rust-cache
uses: WarpBuilds/rust-cache@v2
Expand Down Expand Up @@ -79,7 +85,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v2
uses: actions/checkout@v4

- name: Create release
id: create_release
Expand Down
73 changes: 55 additions & 18 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,27 +1,64 @@
FROM lukemathwalker/cargo-chef:latest AS chef
#
# Base container (with sccache and cargo-chef)
#
# - https://github.com/mozilla/sccache
# - https://github.com/LukeMathWalker/cargo-chef
#
# Based on https://depot.dev/blog/rust-dockerfile-best-practices
#
FROM rust:1.82 as base

ARG FEATURES

RUN cargo install sccache --version ^0.8
RUN cargo install cargo-chef --version ^0.1

RUN apt-get update \
&& apt-get install -y clang libclang-dev

ENV CARGO_HOME=/usr/local/cargo
ENV RUSTC_WRAPPER=sccache
ENV SCCACHE_DIR=/sccache

#
# Planner container (running "cargo chef prepare")
#
FROM base AS planner
WORKDIR /app

# Prepare build plan
FROM chef AS planner
COPY ./Cargo.toml ./Cargo.lock ./
COPY ./src ./src
RUN cargo chef prepare
COPY . .

# Build application
FROM chef AS builder
RUN --mount=type=cache,target=/usr/local/cargo/registry \
--mount=type=cache,target=/usr/local/cargo/git \
--mount=type=cache,target=$SCCACHE_DIR,sharing=locked \
cargo chef prepare --recipe-path recipe.json

# Install system dependencies
RUN apt-get update && \
apt-get install -y openssl libclang-dev libssl3 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
#
# Builder container (running "cargo chef cook" and "cargo build --release")
#
FROM base as builder
WORKDIR /app
# Default binary filename
ARG ROLLUP_BOOST_BIN="rollup-boost"
COPY --from=planner /app/recipe.json recipe.json

RUN --mount=type=cache,target=$SCCACHE_DIR,sharing=locked \
cargo chef cook --release --recipe-path recipe.json

COPY --from=planner /app/recipe.json .
RUN cargo chef cook --release
COPY . .
RUN cargo build --release

FROM debian:bullseye-slim AS final
COPY --from=builder /app/target/release/rollup-boost /usr/local/bin/
RUN --mount=type=cache,target=/usr/local/cargo/registry \
--mount=type=cache,target=/usr/local/cargo/git \
--mount=type=cache,target=$SCCACHE_DIR,sharing=locked \
cargo build --release --features="$FEATURES" --package=${ROLLUP_BOOST_BIN}

#
# Runtime container
#
FROM gcr.io/distroless/cc-debian12
WORKDIR /app

ARG ROLLUP_BOOST_BIN="rollup-boost"
COPY --from=builder /app/target/release/${ROLLUP_BOOST_BIN} /usr/local/bin/

ENTRYPOINT ["/usr/local/bin/rollup-boost"]

0 comments on commit e008479

Please sign in to comment.