diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index 8be0faaf..530e9d4b 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -110,6 +110,14 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push (Alpine) + uses: docker/build-push-action@v3 + with: + context: ./docker/arm64v8/alpine + push: true + tags: hasufell/arm64v8-alpine-haskell:3.20 + platforms: linux/arm64 + - name: Build and push (debian buster) uses: docker/build-push-action@v3 with: diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index edc1e187..9c5afe0e 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -98,10 +98,17 @@ jobs: ARTIFACT: "armv7-linux-ghcup" GHC_VER: 9.2.8 ARCH: ARM + DISTRO: Debian - os: [self-hosted, Linux, ARM64, maerwald] ARTIFACT: "aarch64-linux-ghcup" GHC_VER: 9.6.6 ARCH: ARM64 + DISTRO: Debian + - os: [self-hosted, Linux, ARM64, maerwald] + ARTIFACT: "aarch64-linux-ghcup" + GHC_VER: 9.8.4 + ARCH: ARM64 + DISTRO: Alpine steps: - name: git config run: | @@ -122,13 +129,13 @@ jobs: ARTIFACT: ${{ matrix.ARTIFACT }} ARCH: ${{ matrix.ARCH }} GHC_VER: ${{ matrix.GHC_VER }} - DISTRO: Ubuntu + DISTRO: ${{ matrix.DISTRO }} AWS_SECRET_ACCESS_KEY: ${{ env.AWS_SECRET_ACCESS_KEY }} AWS_ACCESS_KEY_ID: ${{ env.AWS_ACCESS_KEY_ID }} S3_HOST: ${{ env.S3_HOST }} LD: ld.gold - - if: matrix.ARCH == 'ARM64' + - if: matrix.ARCH == 'ARM64' && matrix.DISTRO == 'Debian' uses: docker://hasufell/arm64v8-debian-haskell:10 name: Run build (aarch64 linux) with: @@ -137,7 +144,21 @@ jobs: ARTIFACT: ${{ matrix.ARTIFACT }} ARCH: ${{ matrix.ARCH }} GHC_VER: ${{ matrix.GHC_VER }} - DISTRO: Ubuntu + DISTRO: ${{ matrix.DISTRO }} + AWS_SECRET_ACCESS_KEY: ${{ env.AWS_SECRET_ACCESS_KEY }} + AWS_ACCESS_KEY_ID: ${{ env.AWS_ACCESS_KEY_ID }} + S3_HOST: ${{ env.S3_HOST }} + + - if: matrix.ARCH == 'ARM64' && matrix.DISTRO == 'Alpine' + uses: docker://hasufell/arm64v8-alpine-haskell:3.20 + name: Run build (aarch64 linux) + with: + args: sh .github/scripts/build.sh + env: + ARTIFACT: ${{ matrix.ARTIFACT }} + ARCH: ${{ matrix.ARCH }} + GHC_VER: ${{ matrix.GHC_VER }} + DISTRO: ${{ matrix.DISTRO }} AWS_SECRET_ACCESS_KEY: ${{ env.AWS_SECRET_ACCESS_KEY }} AWS_ACCESS_KEY_ID: ${{ env.AWS_ACCESS_KEY_ID }} S3_HOST: ${{ env.S3_HOST }} diff --git a/docker/arm64v8/alpine/Dockerfile b/docker/arm64v8/alpine/Dockerfile new file mode 100644 index 00000000..29944836 --- /dev/null +++ b/docker/arm64v8/alpine/Dockerfile @@ -0,0 +1,71 @@ +FROM alpine:3.20 + +ENV LANG C.UTF-8 + +RUN apk add --no-cache \ + curl \ + gcc \ + g++ \ + binutils \ + binutils-gold \ + coreutils \ + bsd-compat-headers \ + gmp-dev \ + ncurses-dev \ + libffi-dev \ + make \ + xz \ + tar \ + perl \ + bash \ + diffutils \ + git \ + gzip \ + gnupg && \ + apk add --no-cache \ + zlib \ + zlib-dev \ + zlib-static \ + bzip2 \ + bzip2-dev \ + bzip2-static \ + gmp \ + gmp-dev \ + openssl-dev \ + openssl-libs-static \ + xz \ + xz-dev \ + ncurses-static + +ARG GHCUP_VERSION=0.1.30.0 +ARG GPG_KEY="7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C FFEB7CE81E16A36B3E2DED6F2DE04D4E97DB64AD 88B57FCF7DB53B4DB3BFA4B1588764FBE22D19C4 EAF2A9A722C0C96F2B431CA511AAD8CEDEE0CAEF" + + +# install ghcup +RUN gpg --batch --keyserver keys.openpgp.org --recv-keys $GPG_KEY && \ + curl -sSfL -O https://downloads.haskell.org/~ghcup/$GHCUP_VERSION/aarch64-linux-static-ghcup-$GHCUP_VERSION && \ + curl -sSfL -O https://downloads.haskell.org/~ghcup/$GHCUP_VERSION/SHA256SUMS && \ + curl -sSfL -O https://downloads.haskell.org/~ghcup/$GHCUP_VERSION/SHA256SUMS.sig && \ + gpg --verify SHA256SUMS.sig SHA256SUMS && \ + sha256sum -c --ignore-missing SHA256SUMS && \ + mv aarch64-linux-static-ghcup-$GHCUP_VERSION /usr/bin/ghcup && \ + chmod +x /usr/bin/ghcup && \ + rm -rf SHA256SUMS SHA256SUMS.sig ~/.gnupg/public-keys.d/pubring.db.lock + +ARG GHC=9.8.4 +ARG CABAL_INSTALL=3.12.1.0 + +ENV GHCUP_CURL_OPTS="--silent" +ENV NO_COLOR=1 + +# install haskell toolchain +RUN ghcup config set gpg-setting GPGStrict && \ + ghcup --verbose install ghc --isolate=/usr --force ${GHC} && \ + ghcup --verbose install cabal --isolate=/usr/bin --force ${CABAL_INSTALL} && \ + find "/usr/lib/ghc-${GHC}/" \( -name "*_p.a" -o -name "*.p_hi" \) -type f -delete && \ + rm -rf "/usr/share/doc/ghc-${GHC}" && \ + rm -rf /tmp/ghcup* && \ + ghcup gc -p -s -c -t + +ENV PATH /root/.cabal/bin:/root/.ghcup:/root/.local/bin:$PATH +