Skip to content

Commit 5fb1512

Browse files
committed
Linux ARM64 build
Fix #35
1 parent 01f40ae commit 5fb1512

File tree

6 files changed

+129
-48
lines changed

6 files changed

+129
-48
lines changed

.github/workflows/build.yaml

+102-40
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ jobs:
1313
fail-fast: false
1414
matrix:
1515
os:
16-
- ubuntu-22.04
17-
- macos-12 # Intel
18-
- macos-13-xlarge # Apple silicon
16+
- ubuntu-24.04
17+
- macos-13 # Intel
18+
- macos-14 # Apple silicon
1919
- windows-2022
2020
ghc-version:
2121
- "8.8"
@@ -24,20 +24,22 @@ jobs:
2424
- "9.2"
2525
- "9.4"
2626
exclude:
27-
- os: macos-12
27+
- os: macos-13
2828
ghc-version: "8.10"
29-
- os: macos-12
29+
- os: macos-13
3030
ghc-version: "9.0"
31-
- os: macos-12
31+
- os: macos-13
3232
ghc-version: "9.2"
33-
- os: macos-13-xlarge
33+
- os: macos-14
3434
ghc-version: "8.8"
35-
- os: macos-13-xlarge
35+
- os: macos-14
3636
ghc-version: "8.10"
37-
- os: macos-13-xlarge
37+
- os: macos-14
3838
ghc-version: "9.0"
39-
- os: macos-13-xlarge
39+
- os: macos-14
4040
ghc-version: "9.2"
41+
- os: windows-2022
42+
ghc-version: "8.8"
4143
- os: windows-2022
4244
ghc-version: "8.10"
4345
- os: windows-2022
@@ -70,6 +72,10 @@ jobs:
7072
%APPDATA%\cabal\store
7173
%APPDATA%\stack
7274
key: stack-${{ matrix.os }}-ghc-${{ matrix.version }}
75+
- name: Install dependencies (Linux)
76+
if: "startsWith(matrix.os, 'ubuntu-')"
77+
run: |
78+
sudo apt install libbz2-dev
7379
- name: Install Haskell Stack (if not installed)
7480
shell: bash
7581
run: |
@@ -121,14 +127,8 @@ jobs:
121127
matrix.ghc-version == '9.2'
122128
shell: bash
123129
run: |
124-
curl -L -o /tmp/pandoc.deb \
125-
https://github.com/jgm/pandoc/releases/download/2.14.2/pandoc-2.14.2-1-amd64.deb
126-
sudo dpkg -i /tmp/pandoc.deb
127-
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys CC86BB64
128-
sudo add-apt-repository ppa:rmescandon/yq
129-
sudo apt update
130-
sudo apt-get install -y yq
131-
bash scripts/haddock-prologue/build.sh
130+
sudo apt-get install -y pandoc yq
131+
PATH="/usr/bin:$PATH" bash scripts/haddock-prologue/build.sh
132132
- name: Copy docs
133133
if: >-
134134
startsWith(matrix.os, 'ubuntu-') &&
@@ -178,9 +178,9 @@ jobs:
178178
fail-fast: false
179179
matrix:
180180
os:
181-
- ubuntu-22.04
182-
- macos-12 # Intel
183-
- macos-13-xlarge # Apple silicon
181+
- ubuntu-24.04
182+
- macos-13 # Intel
183+
- macos-14 # Apple silicon
184184
- windows-2022
185185
steps:
186186
- uses: actions/checkout@v4
@@ -266,12 +266,21 @@ jobs:
266266
267267
image:
268268
name: Docker image
269-
runs-on: ubuntu-22.04
269+
strategy:
270+
fail-fast: false
271+
matrix:
272+
os:
273+
- ubuntu-24.04
274+
- ubuntu-24.04-arm
275+
runs-on: ${{ matrix.os }}
270276
env:
271277
DOCKERHUB_IMAGE_NAME: seonbi
272278
outputs:
273279
image-ghcr: ghcr.io/${{ github.repository }}/bin@${{ steps.push-image.outputs.digest }}
274280
image-dockerhub: docker.io/${{ vars.DOCKERHUB_USERNAME }}/${{ env.DOCKERHUB_IMAGE_NAME }}@${{ steps.push-image.outputs.digest }}
281+
tag: ${{ steps.values.outputs.tag }}
282+
labels: ${{ steps.values.outputs.labels }}
283+
arch: ${{ steps.values.outputs.arch }}
275284
steps:
276285
- uses: actions/checkout@v4
277286
with:
@@ -303,6 +312,11 @@ jobs:
303312
else
304313
echo labels= >> "$GITHUB_OUTPUT"
305314
fi
315+
if [[ "$RUNNER_ARCH" = "ARM64" ]]; then
316+
echo arch=arm64 >> "$GITHUB_OUTPUT"
317+
else
318+
echo arch=amd64 >> "$GITHUB_OUTPUT"
319+
fi
306320
- id: push-image
307321
uses: docker/build-push-action@v6
308322
with:
@@ -313,19 +327,49 @@ jobs:
313327
org.opencontainers.image.url=${{ github.event.repository.html_url }}
314328
${{ steps.values.outputs.labels }}
315329
tags: |
316-
ghcr.io/${{ github.repository }}/bin:${{ steps.values.outputs.tag }}
317-
${{ vars.DOCKERHUB_USERNAME }}/${{ env.DOCKERHUB_IMAGE_NAME }}:${{ steps.values.outputs.tag }}
330+
ghcr.io/${{ github.repository }}/bin:${{ steps.values.outputs.tag }}-${{ steps.values.outputs.arch }}
331+
${{ vars.DOCKERHUB_USERNAME }}/${{ env.DOCKERHUB_IMAGE_NAME }}:${{ steps.values.outputs.tag }}-${{ steps.values.outputs.arch }}
318332
provenance: false # https://community.fly.io/t/deploying-to-fly-via-github-action-failing/10171/33
319333

334+
image-manifest:
335+
name: Create and push manifest images
336+
if: github.event_name != 'pull_request'
337+
needs:
338+
- image
339+
runs-on: ubuntu-24.04
340+
env:
341+
DOCKERHUB_IMAGE_NAME: seonbi
342+
steps:
343+
- uses: docker/login-action@v3
344+
with:
345+
registry: ghcr.io
346+
username: ${{ github.repository_owner }}
347+
password: ${{ github.token }}
348+
- uses: docker/login-action@v3
349+
with:
350+
username: ${{ vars.DOCKERHUB_USERNAME }}
351+
password: ${{ secrets.DOCKERHUB_TOKEN }}
352+
- uses: Noelware/[email protected]
353+
with:
354+
inputs: ghcr.io/${{ github.repository }}/bin:${{ needs.image.outputs.tag }}
355+
images: ghcr.io/${{ github.repository }}/bin:${{ needs.image.outputs.tag }}-amd64,ghcr.io/${{ github.repository }}/bin:${{ needs.image.outputs.tag }}-arm64
356+
push: true
357+
- uses: Noelware/[email protected]
358+
with:
359+
inputs: docker.io/${{ vars.DOCKERHUB_USERNAME }}/${{ env.DOCKERHUB_IMAGE_NAME }}:${{ needs.image.outputs.tag }}
360+
images: docker.io/${{ vars.DOCKERHUB_USERNAME }}/${{ env.DOCKERHUB_IMAGE_NAME }}:${{ needs.image.outputs.tag }}-amd64,docker.io/${{ vars.DOCKERHUB_USERNAME }}/${{ env.DOCKERHUB_IMAGE_NAME }}:${{ needs.image.outputs.tag }}-arm64
361+
push: true
362+
320363
fly:
321364
name: Deploy seonbi-api to Fly.io
322365
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
323366
needs:
324367
- image
368+
- image-manifest
325369
env:
326370
FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
327371
IMAGE: ${{ needs.image.outputs.image-ghcr }}
328-
runs-on: ubuntu-22.04
372+
runs-on: ubuntu-24.04
329373
steps:
330374
- uses: actions/checkout@v4
331375
- uses: superfly/flyctl-actions/setup-flyctl@master
@@ -345,36 +389,54 @@ jobs:
345389
needs:
346390
- build
347391
- image
348-
runs-on: ubuntu-22.04
392+
runs-on: ubuntu-24.04
349393
steps:
350394
- uses: actions/checkout@v4
351395
- uses: actions/download-artifact@v4
352396
with:
353-
name: binaries-macos-13-xlarge-ghc-9.4
397+
name: binaries-macos-14-ghc-9.4
354398
path: /tmp/binaries-macos-arm64
355399
- uses: actions/download-artifact@v4
356400
with:
357-
name: binaries-macos-12-ghc-9.4
401+
name: binaries-macos-13-ghc-9.4
358402
path: /tmp/binaries-macos-x86_64
359403
- uses: actions/download-artifact@v4
360404
with:
361405
name: binaries-windows-2022-ghc-9.2
362406
path: /tmp/binaries-windows
407+
- uses: docker/setup-qemu-action
408+
with:
409+
platforms: arm64
410+
- uses: docker/setup-buildx-action@v3
363411
- run: |
364412
set -e
365413
mkdir -p /tmp/dists
366-
# Linux
367-
docker pull "$IMAGE"
368-
mkdir -p /tmp/binaries-linux
369-
docker run -i "$IMAGE" cat /usr/local/bin/seonbi \
370-
> /tmp/binaries-linux/seonbi
371-
docker run -i "$IMAGE" cat /usr/local/bin/seonbi-api \
372-
> /tmp/binaries-linux/seonbi-api
373-
pushd /tmp/binaries-linux
414+
# Linux (amd64)
415+
docker pull "$IMAGE-amd64"
416+
mkdir -p /tmp/binaries-linux-amd64
417+
docker run -i "$IMAGE-amd64" cat /usr/local/bin/seonbi \
418+
> /tmp/binaries-linux-amd64/seonbi
419+
docker run -i "$IMAGE-amd64" cat /usr/local/bin/seonbi-api \
420+
> /tmp/binaries-linux-amd64/seonbi-api
421+
pushd /tmp/binaries-linux-amd64
374422
chmod +x *
375423
cp "$GITHUB_WORKSPACE/"{LICENSE,README.md,CHANGES.md} ./
376424
tar cvfj /tmp/dists/seonbi.linux-x86_64.tar.bz2 *
377425
popd
426+
# Linux (arm64)
427+
docker pull "$IMAGE-arm64"
428+
mkdir -p /tmp/binaries-linux-arm64
429+
docker run -i "$IMAGE-arm64" --platform linux/arm64 \
430+
cat /usr/local/bin/seonbi \
431+
> /tmp/binaries-linux-arm64/seonbi
432+
docker run -i "$IMAGE-arm64" --platform linux/arm64 \
433+
cat /usr/local/bin/seonbi-api \
434+
> /tmp/binaries-linux-arm64/seonbi-api
435+
pushd /tmp/binaries-linux-arm64
436+
chmod +x *
437+
cp "$GITHUB_WORKSPACE/"{LICENSE,README.md,CHANGES.md} ./
438+
tar cvfj /tmp/dists/seonbi.linux-arm64.tar.bz2 *
439+
popd
378440
# macOS (Apple silicon)
379441
pushd /tmp/binaries-macos-arm64
380442
chmod +x *
@@ -393,7 +455,7 @@ jobs:
393455
zip /tmp/dists/seonbi.win64.zip *
394456
popd
395457
env:
396-
IMAGE: ${{ needs.image.outputs.image-ghcr }}
458+
IMAGE: ghcr.io/${{ github.repository }}/bin:${{ needs.image.outputs.tag }}
397459
- uses: actions/upload-artifact@v4
398460
with:
399461
name: dists-untagged
@@ -404,12 +466,12 @@ jobs:
404466
needs:
405467
- build
406468
- binaries
407-
runs-on: ubuntu-22.04
469+
runs-on: ubuntu-24.04
408470
steps:
409471
- uses: actions/checkout@v4
410472
- uses: actions/download-artifact@v4
411473
with:
412-
name: sdist-ubuntu-22.04-ghc-9.4
474+
name: sdist-ubuntu-24.04-ghc-9.4
413475
path: /tmp/sdist
414476
- uses: actions/download-artifact@v4
415477
with:
@@ -458,7 +520,7 @@ jobs:
458520
if: >-
459521
github.event_name != 'pull_request' &&
460522
github.ref == 'refs/heads/main'
461-
runs-on: ubuntu-22.04
523+
runs-on: ubuntu-24.04
462524
steps:
463525
- uses: actions/checkout@v4
464526
- uses: actions/download-artifact@v4

CHANGES.md

+7
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ Version 0.5.0
66

77
To be released.
88

9+
- Added prebuilt executable binaries for Linux ARM64 (linux-arm64).
10+
11+
- The official Docker images are now multi-platform (linux/amd64 and
12+
linux/arm64). [[#35]]
13+
14+
[#35]: https://github.com/dahlia/seonbi/issues/35
15+
916

1017
Version 0.4.0
1118
-------------

Dockerfile

+10-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# To correctly make a statically-linked binary, we use Alpine Linux.
22
# The distro entirely uses musl instead of glibc which is unfriendly to be
33
# statically linked.
4-
FROM docker.io/amd64/alpine:3.19 AS build
4+
FROM docker.io/alpine:3.19 AS build
55

66
LABEL "org.opencontainers.image.title"="Seonbi"
77
LABEL "org.opencontainers.image.licenses"="LGPL-2.1"
@@ -11,9 +11,13 @@ RUN apk add --no-cache \
1111
bzip2-dev=1.0.8-r6 \
1212
ghc=9.4.7-r1 \
1313
libbz2=1.0.8-r6 \
14+
xz=5.4.5-r0 \
1415
zlib-dev=1.3.1-r0 \
1516
zlib-static=1.3.1-r0
16-
RUN wget -qO- https://get.haskellstack.org/ | sh
17+
18+
RUN wget -q "https://github.com/commercialhaskell/stack/releases/download/v3.3.1/stack-3.3.1-linux-$(uname -m)-bin" \
19+
&& mv "stack-3.3.1-linux-$(uname -m)-bin" /usr/bin/stack \
20+
&& chmod +x /usr/bin/stack
1721

1822
RUN stack config set system-ghc --global true
1923

@@ -26,8 +30,9 @@ WORKDIR /src/seonbi
2630
# Docker will cache this command as a layer, freeing us up to
2731
# modify source code without re-installing dependencies
2832
# (unless the .cabal file changes!)
29-
RUN stack setup
33+
RUN stack setup --system-ghc
3034
RUN stack build \
35+
--system-ghc \
3136
--only-snapshot \
3237
--flag seonbi:iconv \
3338
--flag seonbi:static
@@ -36,11 +41,12 @@ COPY . /src/seonbi
3641
RUN cp /src/seonbi/stack-ghc-9.4.yaml /src/seonbi/stack.yaml
3742

3843
RUN stack build \
44+
--system-ghc \
3945
--flag seonbi:iconv \
4046
--flag seonbi:static \
4147
--copy-bins
4248

43-
FROM docker.io/amd64/alpine:3.14
49+
FROM docker.io/alpine:3.19
4450

4551
COPY --from=build /root/.local/bin/seonbi* /usr/local/bin/
4652
ENV LANG=en_US.UTF-8

scripts/deno/mod.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@ const STABLE_DOWNLOAD_URLS: DownloadUrls = {
143143
linux: {
144144
x86_64:
145145
"https://github.com/dahlia/seonbi/releases/download/0.5.0/seonbi-0.5.0.linux-x86_64.tar.bz2",
146-
aarch64: undefined,
146+
aarch64:
147+
"https://github.com/dahlia/seonbi/releases/download/0.5.0/seonbi-0.5.0.linux-arm64.tar.bz2",
147148
},
148149
darwin: {
149150
x86_64:
@@ -162,7 +163,8 @@ const NIGHTLY_DOWNLOAD_URLS: DownloadUrls = {
162163
linux: {
163164
x86_64:
164165
"https://dahlia.github.io/seonbi/dists/latest/seonbi.linux-x86_64.tar.bz2",
165-
aarch64: undefined,
166+
aarch64:
167+
"https://dahlia.github.io/seonbi/dists/latest/seonbi.linux-arm64.tar.bz2",
166168
},
167169
darwin: {
168170
x86_64:

scripts/haddock-prologue/build.sh

+5-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@ cp "$package" "$backup"
1515
cwd="$(pwd)"
1616
exit_code=1
1717
{
18-
yq write --inplace "$package" description "$description"
18+
yq \
19+
-y \
20+
--arg description "$description" \
21+
'.description = $description' \
22+
"$backup" > "$package"
1923
cd "$root"
2024
stack haddock --no-haddock-deps
2125
cd "$(stack path --dist-dir)/doc/html/"

stack-ghc-9.4.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
resolver: lts-21.25
1+
resolver: lts-21.21
22
packages:
33
- .
44
extra-deps:

0 commit comments

Comments
 (0)