diff --git a/.cirrus.yml b/.cirrus.yml index a1653bf..b047aa7 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -1,8 +1,7 @@ freebsd_instance: image_family: freebsd-13-1 -build_task: - name: build +task: env: GHC_VER: 9.2.4 CABAL_VER: 3.6.2.0 @@ -16,11 +15,8 @@ build_task: AWS_ACCESS_KEY_ID: ENCRYPTED[3e99c4ac040871f213abd616ec66952d954dc289cdd97772f88e58a74d08a2250133437780fe98b7aedf7ef1fb32f5eb] AWS_SECRET_ACCESS_KEY: ENCRYPTED[5910cfd77a922ff7fc06eeb6a6b9f79d4867863e541f06eb2c4cfecae0613650e3e0588373fa8d9249d295d76cf9cb3b] S3_HOST: ENCRYPTED[ce961780a33159f7d1d8046956b5ac6ebc3bfc8149428e5f538576cda51d9f3d0c35b79cdd1e325793639ff6e31f889d] - install_script: pkg install -y ghc hs-cabal-install git bash misc/compat10x misc/compat11x misc/compat12x gmake llvm14 + install_script: pkg install -y ghc hs-cabal-install git bash misc/compat10x misc/compat11x misc/compat12x gmake script: - - tzsetup Etc/GMT - - adjkerntz -a - - bash .github/scripts/build.sh - - bash .github/scripts/test.sh + - bash .github/scripts/cabal-cache.sh binaries_artifacts: path: "out/*" diff --git a/.github/scripts/cabal-cache.sh b/.github/scripts/cabal-cache.sh new file mode 100644 index 0000000..c1334be --- /dev/null +++ b/.github/scripts/cabal-cache.sh @@ -0,0 +1,34 @@ +#!/bin/sh + +set -eux + +. .github/scripts/prereq.sh +. .github/scripts/common.sh + + +# ensure ghcup +if ! command -v ghcup ; then + install_ghcup +fi + + +# ensure ghc +ghcup install ghc --set 8.10.7 +ghcup install cabal --set recommended + +ghc --version +cabal --version + +cabal update + +git clone --single-branch --branch main https://github.com/hasufell/cabal-cache.git +cd cabal-cache + +cabal build +binary=$(cabal list-bin cabal-cache) +cd .. + +mkdir -p out +strip_binary "${binary}" +cp "${binary}" "out/${ARTIFACT}" + diff --git a/.github/workflows/cabal-cache.yaml b/.github/workflows/cabal-cache.yaml new file mode 100644 index 0000000..ecbf6a3 --- /dev/null +++ b/.github/workflows/cabal-cache.yaml @@ -0,0 +1,199 @@ +name: Cabal cache + +on: + push: + branches: + - master + pull_request: + branches: + - master + +jobs: + build-linux: + name: Build linux binary + runs-on: ${{ matrix.os }} + env: + CABAL_VER: 3.6.2.0 + JSON_VERSION: "0.0.7" + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + S3_HOST: ${{ secrets.S3_HOST }} + strategy: + fail-fast: true + matrix: + include: + - os: ubuntu-latest + ARTIFACT: "i386-linux-cabal-cache" + GHC_VER: 8.10.7 + ARCH: 32 + - os: ubuntu-latest + ARTIFACT: "x86_64-linux-cabal-cache" + GHC_VER: 8.10.7 + ARCH: 64 + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + submodules: 'true' + + - if: matrix.ARCH == '32' + name: Run build (32 bit linux) + uses: docker://hasufell/i386-alpine-haskell:3.12 + with: + args: sh .github/scripts/cabal-cache.sh + env: + ARTIFACT: ${{ matrix.ARTIFACT }} + ARCH: ${{ matrix.ARCH }} + GHC_VER: ${{ matrix.GHC_VER }} + DISTRO: Alpine + 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 == '64' + name: Run build (64 bit linux) + uses: docker://hasufell/alpine-haskell:3.12 + with: + args: sh .github/scripts/cabal-cache.sh + env: + ARTIFACT: ${{ matrix.ARTIFACT }} + ARCH: ${{ matrix.ARCH }} + GHC_VER: ${{ matrix.GHC_VER }} + DISTRO: Alpine + AWS_SECRET_ACCESS_KEY: ${{ env.AWS_SECRET_ACCESS_KEY }} + AWS_ACCESS_KEY_ID: ${{ env.AWS_ACCESS_KEY_ID }} + S3_HOST: ${{ env.S3_HOST }} + + - if: always() + name: Upload artifact + uses: actions/upload-artifact@v3 + with: + name: artifacts + path: | + ./out/* + + + build-arm: + name: Build ARM binary + runs-on: ${{ matrix.os }} + env: + CABAL_VER: 3.6.2.0 + JSON_VERSION: "0.0.7" + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + S3_HOST: ${{ secrets.S3_HOST }} + strategy: + fail-fast: true + matrix: + include: + - os: [self-hosted, Linux, aarch64] + ARTIFACT: "armv7-linux-cabal-cache" + GHC_VER: 8.10.7 + ARCH: ARM + - os: [self-hosted, Linux, aarch64] + ARTIFACT: "aarch64-linux-cabal-cache" + GHC_VER: 8.10.7 + ARCH: ARM64 + steps: + - uses: docker://arm64v8/ubuntu:focal + name: Cleanup (aarch64 linux) + with: + args: rm -rf .ghcup/ cabal/ dist-newstyle/ out/ cabal-cache + + - name: git config + run: | + git config --global --get-all safe.directory | grep '^\*$' || git config --global --add safe.directory "*" + shell: bash + + - name: Checkout code + uses: actions/checkout@v3 + with: + submodules: 'true' + + - if: matrix.ARCH == 'ARM' + uses: docker://hasufell/arm32v7-ubuntu-haskell:focal + name: Run build (armv7 linux) + with: + args: sh .github/scripts/cabal-cache.sh + env: + ARTIFACT: ${{ matrix.ARTIFACT }} + ARCH: ${{ matrix.ARCH }} + GHC_VER: ${{ matrix.GHC_VER }} + DISTRO: Ubuntu + 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' + uses: docker://hasufell/arm64v8-ubuntu-haskell:focal + name: Run build (aarch64 linux) + with: + args: sh .github/scripts/cabal-cache.sh + env: + ARTIFACT: ${{ matrix.ARTIFACT }} + ARCH: ${{ matrix.ARCH }} + GHC_VER: ${{ matrix.GHC_VER }} + DISTRO: Ubuntu + AWS_SECRET_ACCESS_KEY: ${{ env.AWS_SECRET_ACCESS_KEY }} + AWS_ACCESS_KEY_ID: ${{ env.AWS_ACCESS_KEY_ID }} + S3_HOST: ${{ env.S3_HOST }} + + - if: always() + name: Upload artifact + uses: actions/upload-artifact@v3 + with: + name: artifacts + path: | + ./out/* + + build-macwin: + name: Build binary (Mac/Win) + runs-on: ${{ matrix.os }} + env: + CABAL_VER: 3.6.2.0 + MACOSX_DEPLOYMENT_TARGET: 10.13 + JSON_VERSION: "0.0.7" + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + S3_HOST: ${{ secrets.S3_HOST }} + strategy: + fail-fast: false + matrix: + include: + - os: [self-hosted, macOS, aarch64] + ARTIFACT: "aarch64-apple-darwin-cabal-cache" + GHC_VER: 9.2.5 + ARCH: ARM64 + - os: macOS-10.15 + ARTIFACT: "x86_64-apple-darwin-cabal-cache" + GHC_VER: 9.2.5 + ARCH: 64 + - os: windows-latest + ARTIFACT: "x86_64-mingw64-cabal-cache" + GHC_VER: 8.10.7 + ARCH: 64 + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + submodules: 'true' + + - name: Run build (windows/mac) + run: bash .github/scripts/cabal-cache.sh + env: + ARTIFACT: ${{ matrix.ARTIFACT }} + ARCH: ${{ matrix.ARCH }} + GHC_VER: ${{ matrix.GHC_VER }} + DISTRO: na + AWS_SECRET_ACCESS_KEY: ${{ env.AWS_SECRET_ACCESS_KEY }} + AWS_ACCESS_KEY_ID: ${{ env.AWS_ACCESS_KEY_ID }} + S3_HOST: ${{ env.S3_HOST }} + HOMEBREW_CHANGE_ARCH_TO_ARM: 1 + + - if: always() + name: Upload artifact + uses: actions/upload-artifact@v3 + with: + name: artifacts + path: | + ./out/*