Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 3 additions & 75 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,82 +36,10 @@ jobs:
- uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Set up Docker Buildx cache
uses: actions/cache@v3
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Build Docker image for amd64
uses: docker/build-push-action@v5
with:
platforms: linux/amd64
push: false
tags: |
cybuerg/cfspeedtest:${{ github.sha }}-amd64
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-amd64,mode=max
outputs: type=docker,dest=/tmp/docker-image-amd64.tar

- name: Build Docker image for arm64
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
platforms: linux/arm64
platforms: linux/amd64,linux/arm64
push: false
tags: |
cybuerg/cfspeedtest:${{ github.sha }}-arm64
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-arm64,mode=max
outputs: type=docker,dest=/tmp/docker-image-arm64.tar
- name: Merge and move cache
run: |
mkdir -p /tmp/.buildx-cache-new
cp -r /tmp/.buildx-cache-amd64/* /tmp/.buildx-cache-new/ || true
cp -r /tmp/.buildx-cache-arm64/* /tmp/.buildx-cache-new/ || true
rm -rf /tmp/.buildx-cache
mv /tmp/.buildx-cache-new /tmp/.buildx-cache
- name: Upload Docker images as artifacts
uses: actions/upload-artifact@v4
with:
name: docker-images
path: |
/tmp/docker-image-amd64.tar
/tmp/docker-image-arm64.tar
retention-days: 1

verify-docker-image:
needs: docker-build
runs-on: ubuntu-latest
strategy:
matrix:
platform: [linux/amd64, linux/arm64]
steps:
- name: Download Docker images
uses: actions/download-artifact@v4
with:
name: docker-images
path: /tmp
- name: Load Docker image
run: |
if [ "${{ matrix.platform }}" = "linux/amd64" ]; then
docker load < /tmp/docker-image-amd64.tar
else
docker load < /tmp/docker-image-arm64.tar
fi
- name: Verify amd64 image
if: matrix.platform == 'linux/amd64'
run: |
docker run cybuerg/cfspeedtest:${{ github.sha }}-amd64 --help
docker run --entrypoint /bin/sh cybuerg/cfspeedtest:${{ github.sha }}-amd64 -c "file /usr/local/bin/cfspeedtest" | grep "x86-64"
- name: Set up QEMU
if: matrix.platform == 'linux/arm64'
uses: docker/setup-qemu-action@v3
with:
platforms: arm64

- name: Verify arm64 image
if: matrix.platform == 'linux/arm64'
run: |
docker run --platform linux/arm64 cybuerg/cfspeedtest:${{ github.sha }}-arm64 --help
docker run --platform linux/arm64 --entrypoint /bin/sh cybuerg/cfspeedtest:${{ github.sha }}-arm64 -c "file /usr/local/bin/cfspeedtest" | grep "aarch64"
cybuerg/cfspeedtest:${{ github.sha }}
47 changes: 4 additions & 43 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -52,55 +52,16 @@ jobs:
- uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Set up Docker Buildx cache
uses: actions/cache@v3
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Log in to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push Docker image for amd64
uses: docker/build-push-action@v5
with:
platforms: linux/amd64
push: true
tags: |
cybuerg/cfspeedtest:${{ github.ref_name }}-amd64
cybuerg/cfspeedtest:latest-amd64
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-amd64,mode=max

- name: Build and push Docker image for arm64
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
platforms: linux/arm64
platforms: linux/amd64,linux/arm64
push: true
tags: |
cybuerg/cfspeedtest:${{ github.ref_name }}-arm64
cybuerg/cfspeedtest:latest-arm64
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-arm64,mode=max

- name: Create and push multi-platform manifest
run: |
docker manifest create cybuerg/cfspeedtest:${{ github.ref_name }} \
cybuerg/cfspeedtest:${{ github.ref_name }}-amd64 \
cybuerg/cfspeedtest:${{ github.ref_name }}-arm64
docker manifest create cybuerg/cfspeedtest:latest \
cybuerg/cfspeedtest:latest-amd64 \
cybuerg/cfspeedtest:latest-arm64
docker manifest push cybuerg/cfspeedtest:${{ github.ref_name }}
docker manifest push cybuerg/cfspeedtest:latest

- name: Merge and move cache
run: |
mkdir -p /tmp/.buildx-cache-new
cp -r /tmp/.buildx-cache-amd64/* /tmp/.buildx-cache-new/ || true
cp -r /tmp/.buildx-cache-arm64/* /tmp/.buildx-cache-new/ || true
rm -rf /tmp/.buildx-cache
mv /tmp/.buildx-cache-new /tmp/.buildx-cache
cybuerg/cfspeedtest:${{ github.ref_name }}
cybuerg/cfspeedtest:latest
44 changes: 5 additions & 39 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,46 +1,12 @@
FROM --platform=$BUILDPLATFORM rust:slim-bullseye as builder

# Install cross-compilation tools if needed
ARG BUILDPLATFORM
ARG TARGETPLATFORM
RUN if [ "$TARGETPLATFORM" = "linux/arm64" ] && [ "$BUILDPLATFORM" = "linux/amd64" ]; then \
dpkg --add-architecture arm64 && \
apt-get update && \
apt-get install -y --no-install-recommends \
gcc-aarch64-linux-gnu libc6-dev-arm64-cross && \
rustup target add aarch64-unknown-linux-gnu && \
rm -rf /var/lib/apt/lists/*; \
fi

# Set the correct target
ARG RUST_TARGET="x86_64-unknown-linux-gnu"
RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
echo "RUST_TARGET=aarch64-unknown-linux-gnu"; \
export RUST_TARGET="aarch64-unknown-linux-gnu"; \
fi

# Create a new empty project for caching dependencies
FROM rust:slim-bullseye as builder
WORKDIR /usr/src/cfspeedtest
COPY Cargo.toml Cargo.lock ./
RUN mkdir -p src && \
echo "fn main() {}" > src/main.rs && \
echo "pub fn dummy() {}" > src/lib.rs && \
cargo fetch

# Build the actual application
COPY src ./src
RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
RUSTFLAGS="-C linker=aarch64-linux-gnu-gcc" \
cargo build --release --target aarch64-unknown-linux-gnu && \
cp target/aarch64-unknown-linux-gnu/release/cfspeedtest /usr/local/bin/; \
else \
cargo build --release && \
cp target/release/cfspeedtest /usr/local/bin/; \
fi
RUN cargo install --path .

FROM --platform=$TARGETPLATFORM debian:bullseye-slim
RUN apt-get update && apt-get install -y --no-install-recommends tini file && rm -rf /var/lib/apt/lists/*
COPY --from=builder /usr/local/bin/cfspeedtest /usr/local/bin/cfspeedtest
FROM debian:bullseye-slim
RUN apt-get update && apt-get install -y --no-install-recommends tini && rm -rf /var/lib/apt/lists/*
COPY --from=builder /usr/local/cargo/bin/cfspeedtest /usr/local/bin/cfspeedtest

# tini will be PID 1 and handle signal forwarding and process reaping
ENTRYPOINT ["/usr/bin/tini", "--", "cfspeedtest"]
Loading