Skip to content

Commit 059ac4c

Browse files
Switch to cross multiarch build
1 parent cb37382 commit 059ac4c

File tree

2 files changed

+81
-37
lines changed

2 files changed

+81
-37
lines changed

.github/workflows/build.yml

+67-19
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,97 @@
1-
name: Build Service
1+
name: Build container
2+
23
on:
34
push:
4-
branches:
5-
- main
65
workflow_dispatch:
76

7+
env:
8+
REGISTRY_IMAGE: ghcr.io/randomairborne/tinylevel
9+
810
permissions:
9-
contents: read
1011
packages: write
12+
contents: read
1113

1214
jobs:
1315
check:
1416
uses: ./.github/workflows/check.yml
17+
1518
build:
16-
needs: [check]
19+
needs: [ check ]
1720
runs-on: ubuntu-latest
21+
strategy:
22+
fail-fast: false
23+
matrix:
24+
platform:
25+
- docker: linux/amd64
26+
llvm: x86_64
27+
- docker: linux/arm64
28+
llvm: aarch64
1829
steps:
19-
- name: Correct env
20-
run: echo "REPO=${GITHUB_REPOSITORY,,}" >>${GITHUB_ENV}
21-
22-
- name: Check out code into the proper directory
30+
- name: Check out code
2331
uses: actions/checkout@v4
2432

2533
- name: Set up Docker Buildx
26-
id: buildx
2734
uses: docker/setup-buildx-action@v3
2835

29-
- name: Login to GitHub Container Registry
36+
- name: Log in to GitHub Container Registry
3037
uses: docker/login-action@v3
3138
with:
3239
registry: ghcr.io
3340
username: ${{ github.repository_owner }}
3441
password: ${{ secrets.GITHUB_TOKEN }}
3542

36-
- name: Build container
37-
uses: docker/build-push-action@v5
43+
- name: Build and push by digest
44+
id: build
45+
uses: docker/build-push-action@v6
3846
with:
3947
context: .
40-
push: true
41-
tags: ghcr.io/${{ env.REPO }}:latest,ghcr.io/${{ env.REPO }}:git-${{ github.sha }}
42-
platforms: linux/amd64
43-
cache-from: type=gha
44-
cache-to: type=gha,mode=max
48+
platforms: ${{ matrix.platform.docker }}
49+
build-args: |
50+
LLVMTARGETARCH=${{ matrix.platform.llvm }}
51+
outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
52+
53+
- name: Export digest
54+
run: |
55+
mkdir -p /tmp/digests
56+
digest="${{ steps.build.outputs.digest }}"
57+
touch "/tmp/digests/${digest#sha256:}"
58+
59+
- name: Upload digest
60+
uses: actions/upload-artifact@v4
61+
with:
62+
name: digests-${{ matrix.platform.llvm }}
63+
path: /tmp/digests/*
64+
if-no-files-found: error
65+
retention-days: 1
66+
67+
merge:
68+
runs-on: ubuntu-latest
69+
needs: [ build ]
70+
steps:
71+
- name: Download digests
72+
uses: actions/download-artifact@v4
73+
with:
74+
path: /tmp/digests
75+
pattern: digests-*
76+
merge-multiple: true
77+
78+
- name: Set up Docker Buildx
79+
uses: docker/setup-buildx-action@v3
80+
81+
- name: Log in to GitHub Container Registry
82+
uses: docker/login-action@v3
83+
with:
84+
registry: ghcr.io
85+
username: ${{ github.repository_owner }}
86+
password: ${{ secrets.GITHUB_TOKEN }}
87+
88+
- name: Create manifest list and push
89+
working-directory: /tmp/digests
90+
run: |
91+
docker buildx imagetools create --tag ${{ env.REGISTRY_IMAGE }}:latest --tag ${{ env.REGISTRY_IMAGE }}:git-${{ github.sha }} $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)
92+
4593
deploy:
46-
needs: [build]
94+
needs: [ merge ]
4795
runs-on: ubuntu-latest
4896
steps:
4997
- name: Correct env

Dockerfile

+14-18
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,28 @@
1-
FROM ghcr.io/randomairborne/asset-squisher:latest AS client-builder
2-
3-
COPY /assets/ /uncompressed-assets/
1+
ARG LLVMTARGETARCH
2+
FROM --platform=${BUILDPLATFORM} ghcr.io/randomairborne/cross-cargo-${LLVMTARGETARCH}:latest AS server-builder
43

5-
RUN asset-squisher /uncompressed-assets/ /assets/
6-
7-
FROM rust:alpine AS server-builder
4+
ARG LLVMTARGETARCH
85

96
WORKDIR /build
7+
108
COPY . .
119

12-
RUN apk add musl-dev
10+
RUN cargo build --release --target ${LLVMTARGETARCH}-unknown-linux-musl
1311

14-
RUN cargo version
12+
FROM ghcr.io/randomairborne/asset-squisher:latest AS client-builder
1513

16-
RUN \
17-
--mount=type=cache,target=/build/target/ \
18-
--mount=type=cache,target=/usr/local/cargo/registry/ \
19-
cargo build --release && cp /build/target/release/mcping /build/mcping
14+
COPY /assets/ /uncompressed-assets/
2015

21-
FROM alpine:latest
16+
RUN asset-squisher /uncompressed-assets/ /assets/
17+
18+
FROM scratch
19+
ARG LLVMTARGETARCH
2220

2321
WORKDIR /
2422

25-
COPY --from=server-builder /build/mcping /usr/bin/mcping
23+
COPY --from=server-builder /build/target/${LLVMTARGETARCH}-unknown-linux-musl/release/mcping /usr/bin/mcping
2624
COPY --from=client-builder /assets/ /var/www/mcping/
2725

28-
EXPOSE 8080
29-
ENV ASSET_DIR="/var/www/mcping/"
30-
31-
CMD ["/usr/bin/mcping"]
26+
COPY --from=builder /build/target/${LLVMTARGETARCH}-unknown-linux-musl/release/mcping /usr/bin/mcping
3227

28+
ENTRYPOINT ["/usr/bin/mcping"]

0 commit comments

Comments
 (0)