Skip to content

Commit 3aee63d

Browse files
committed
Reintroduced the cargo chef setup
1 parent de09415 commit 3aee63d

1 file changed

Lines changed: 63 additions & 41 deletions

File tree

provisioning/signer.Dockerfile

Lines changed: 63 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -12,72 +12,94 @@ RUN cargo chef prepare --recipe-path recipe.json
1212
# Builder stage
1313
FROM --platform=${BUILDPLATFORM} chef AS builder
1414
ARG TARGETOS TARGETARCH BUILDPLATFORM OPENSSL_VENDORED
15+
ENV BUILD_VAR_SCRIPT=/tmp/env.sh
1516
COPY --from=planner /app/recipe.json recipe.json
16-
COPY . .
17-
18-
# Get the latest Protoc since the one in the Debian repo is incredibly old
19-
RUN apt update && apt install -y unzip curl ca-certificates && \
20-
PROTOC_VERSION=$(curl -s "https://api.github.com/repos/protocolbuffers/protobuf/releases/latest" | grep -Po '"tag_name": "v\K[0-9.]+') && \
21-
if [ "$BUILDPLATFORM" = "linux/amd64" ]; then \
22-
PROTOC_ARCH=x86_64; \
23-
elif [ "$BUILDPLATFORM" = "linux/arm64" ]; then \
24-
PROTOC_ARCH=aarch_64; \
25-
else \
26-
echo "${BUILDPLATFORM} is not supported."; \
27-
exit 1; \
28-
fi && \
29-
curl -Lo protoc.zip https://github.com/protocolbuffers/protobuf/releases/latest/download/protoc-$PROTOC_VERSION-linux-$PROTOC_ARCH.zip && \
30-
unzip -q protoc.zip bin/protoc -d /usr && \
31-
unzip -q protoc.zip "include/google/*" -d /usr && \
32-
chmod a+x /usr/bin/protoc && \
33-
rm -rf protoc.zip
3417

35-
# Build the application
18+
# Set up the build environment for cross-compilation if needed
3619
RUN if [ "$BUILDPLATFORM" = "linux/amd64" -a "$TARGETARCH" = "arm64" ]; then \
3720
# We're on x64, cross-compiling for arm64
3821
rustup target add aarch64-unknown-linux-gnu && \
3922
apt update && \
4023
apt install -y gcc-aarch64-linux-gnu && \
24+
echo "#!/bin/sh" > ${BUILD_VAR_SCRIPT} && \
25+
echo "export TARGET=aarch64-unknown-linux-gnu" >> ${BUILD_VAR_SCRIPT} && \
26+
echo "export TARGET_FLAG=--target=aarch64-unknown-linux-gnu" >> ${BUILD_VAR_SCRIPT} && \
27+
echo "export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=/usr/bin/aarch64-linux-gnu-gcc" >> ${BUILD_VAR_SCRIPT} && \
28+
echo "export RUSTFLAGS=\"-L /usr/aarch64-linux-gnu/lib -L $(dirname $(aarch64-linux-gnu-gcc -print-libgcc-file-name))\"" >> ${BUILD_VAR_SCRIPT} && \
4129
if [ "$OPENSSL_VENDORED" != "true" ]; then \
4230
# If we're linking to OpenSSL dynamically, we have to set it up for cross-compilation
4331
dpkg --add-architecture arm64 && \
4432
apt update && \
4533
apt install -y libssl-dev:arm64 zlib1g-dev:arm64 && \
46-
export PKG_CONFIG_ALLOW_CROSS="true" && \
47-
export PKG_CONFIG_LIBDIR="/usr/lib/aarch64-linux-gnu/pkgconfig" && \
48-
export OPENSSL_INCLUDE_DIR=/usr/include/aarch64-linux-gnu && \
49-
export OPENSSL_LIB_DIR=/usr/lib/aarch64-linux-gnu; \
34+
echo "export PKG_CONFIG_ALLOW_CROSS=true" >> ${BUILD_VAR_SCRIPT} && \
35+
echo "export PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu/pkgconfig" >> ${BUILD_VAR_SCRIPT} && \
36+
echo "export OPENSSL_INCLUDE_DIR=/usr/include/aarch64-linux-gnu" >> ${BUILD_VAR_SCRIPT} && \
37+
echo "export OPENSSL_LIB_DIR=/usr/lib/aarch64-linux-gnu" >> ${BUILD_VAR_SCRIPT}; \
5038
else \
51-
FEATURE_OPENSSL_VENDORED="--features openssl-vendored"; \
52-
fi && \
53-
TARGET="aarch64-unknown-linux-gnu" && \
54-
TARGET_FLAG="--target=${TARGET}" && \
55-
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER="/usr/bin/aarch64-linux-gnu-gcc" && \
56-
export RUSTFLAGS="-L /usr/aarch64-linux-gnu/lib -L $(dirname $(aarch64-linux-gnu-gcc -print-libgcc-file-name))"; \
39+
echo "export FEATURE_OPENSSL_VENDORED='--features openssl-vendored'" >> ${BUILD_VAR_SCRIPT}; \
40+
fi; \
5741
elif [ "$BUILDPLATFORM" = "linux/arm64" -a "$TARGETARCH" = "amd64" ]; then \
5842
# We're on arm64, cross-compiling for x64
5943
rustup target add x86_64-unknown-linux-gnu && \
6044
apt update && \
6145
apt install -y gcc-x86-64-linux-gnu && \
46+
echo "#!/bin/sh" > ${BUILD_VAR_SCRIPT} && \
47+
echo "export TARGET=x86_64-unknown-linux-gnu" >> ${BUILD_VAR_SCRIPT} && \
48+
echo "export TARGET_FLAG=--target=x86_64-unknown-linux-gnu" >> ${BUILD_VAR_SCRIPT} && \
49+
echo "export CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER=/usr/bin/x86_64-linux-gnu-gcc" >> ${BUILD_VAR_SCRIPT} && \
50+
echo "export RUSTFLAGS=\"-L /usr/x86_64-linux-gnu/lib -L $(dirname $(x86_64-linux-gnu-gcc -print-libgcc-file-name))\"" >> ${BUILD_VAR_SCRIPT} && \
6251
if [ "$OPENSSL_VENDORED" != "true" ]; then \
6352
# If we're linking to OpenSSL dynamically, we have to set it up for cross-compilation
6453
dpkg --add-architecture amd64 && \
6554
apt update && \
6655
apt install -y libssl-dev:amd64 zlib1g-dev:amd64 && \
67-
export PKG_CONFIG_ALLOW_CROSS="true" && \
68-
export PKG_CONFIG_LIBDIR="/usr/lib/x86_64-linux-gnu/pkgconfig" && \
69-
export OPENSSL_INCLUDE_DIR=/usr/include/x86_64-linux-gnu && \
70-
export OPENSSL_LIB_DIR=/usr/lib/x86_64-linux-gnu; \
56+
echo "export PKG_CONFIG_ALLOW_CROSS=true" >> ${BUILD_VAR_SCRIPT} && \
57+
echo "export PKG_CONFIG_LIBDIR=/usr/lib/x86_64-linux-gnu/pkgconfig" >> ${BUILD_VAR_SCRIPT} && \
58+
echo "export OPENSSL_INCLUDE_DIR=/usr/include/x86_64-linux-gnu" >> ${BUILD_VAR_SCRIPT} && \
59+
echo "export OPENSSL_LIB_DIR=/usr/lib/x86_64-linux-gnu" >> ${BUILD_VAR_SCRIPT}; \
7160
else \
72-
FEATURE_OPENSSL_VENDORED="--features openssl-vendored"; \
73-
fi && \
74-
TARGET="x86_64-unknown-linux-gnu" && \
75-
TARGET_FLAG="--target=${TARGET}" && \
76-
export CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER="/usr/bin/x86_64-linux-gnu-gcc"; \
77-
export RUSTFLAGS="-L /usr/x86_64-linux-gnu/lib -L $(dirname $(x86_64-linux-gnu-gcc -print-libgcc-file-name))"; \
61+
echo "export FEATURE_OPENSSL_VENDORED='--features openssl-vendored'" >> ${BUILD_VAR_SCRIPT}; \
62+
fi; \
63+
fi
64+
65+
# Run cook to prep the build
66+
RUN if [ -f ${BUILD_VAR_SCRIPT} ]; then \
67+
source ${BUILD_VAR_SCRIPT}; \
68+
echo "Cross-compilation environment set up for ${TARGET}"; \
69+
else \
70+
echo "No cross-compilation needed"; \
71+
fi && \
72+
export GIT_HASH=$(git rev-parse HEAD) && \
73+
cargo chef cook ${TARGET_FLAG} --release --recipe-path recipe.json ${FEATURE_OPENSSL_VENDORED}
74+
75+
# Now we can copy the source files
76+
COPY . .
77+
78+
# Get the latest Protoc since the one in the Debian repo is incredibly old
79+
RUN apt update && apt install -y unzip curl ca-certificates && \
80+
PROTOC_VERSION=$(curl -s "https://api.github.com/repos/protocolbuffers/protobuf/releases/latest" | grep -Po '"tag_name": "v\K[0-9.]+') && \
81+
if [ "$BUILDPLATFORM" = "linux/amd64" ]; then \
82+
PROTOC_ARCH=x86_64; \
83+
elif [ "$BUILDPLATFORM" = "linux/arm64" ]; then \
84+
PROTOC_ARCH=aarch_64; \
85+
else \
86+
echo "${BUILDPLATFORM} is not supported."; \
87+
exit 1; \
88+
fi && \
89+
curl -Lo protoc.zip https://github.com/protocolbuffers/protobuf/releases/latest/download/protoc-$PROTOC_VERSION-linux-$PROTOC_ARCH.zip && \
90+
unzip -q protoc.zip bin/protoc -d /usr && \
91+
unzip -q protoc.zip "include/google/*" -d /usr && \
92+
chmod a+x /usr/bin/protoc && \
93+
rm -rf protoc.zip
94+
95+
# Build the application
96+
RUN if [ -f ${BUILD_VAR_SCRIPT} ]; then \
97+
chmod +x ${BUILD_VAR_SCRIPT} && \
98+
. ${BUILD_VAR_SCRIPT}; \
99+
echo "Cross-compilation environment set up for ${TARGET}"; \
100+
else \
101+
echo "No cross-compilation needed"; \
78102
fi && \
79-
# Build the signer - general setup that works with or without cross-compilation
80-
# cargo chef cook ${TARGET_FLAG} --release --recipe-path recipe.json && \
81103
export GIT_HASH=$(git rev-parse HEAD) && \
82104
cargo build ${TARGET_FLAG} --release --bin commit-boost-signer ${FEATURE_OPENSSL_VENDORED} && \
83105
if [ ! -z "$TARGET" ]; then \

0 commit comments

Comments
 (0)