From 996540bee205426d81d03c0b3c4a0ac8e3d1ea23 Mon Sep 17 00:00:00 2001 From: Aditya Manthramurthy Date: Wed, 1 May 2024 12:35:37 -0700 Subject: [PATCH] CI: Add macos to build and update caching strategy (#194) --- .github/workflows/ci.yml | 109 +++++++++++++++++++++++++-------------- 1 file changed, 69 insertions(+), 40 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9f3bdff..cb005e2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,6 @@ env: MINIO_ACCESS_KEY: minio MINIO_SECRET_KEY: minio123 MINIO_LOCAL: 1 - MINIO_SECURE: 1 jobs: ormolu: @@ -35,12 +34,12 @@ jobs: - uses: actions/checkout@v4 - name: "Set up HLint" - uses: haskell/actions/hlint-setup@v2 + uses: haskell-actions/hlint-setup@v2 with: version: "3.5" - name: "Run HLint" - uses: haskell/actions/hlint-run@v2 + uses: haskell-actions/hlint-run@v2 with: path: '["src/", "test/", "examples"]' fail-on: warning @@ -51,7 +50,7 @@ jobs: needs: ormolu strategy: matrix: - os: [ubuntu-latest, windows-latest] # Removed macos-latest due to cert issues. + os: [ubuntu-latest, windows-latest, macos-latest] cabal: ["3.8", "latest"] ghc: - "9.6" @@ -59,49 +58,62 @@ jobs: - "9.2" - "9.0" - "8.10" - # exclude: - # - os: windows-latest - # ghc: "9.4" - # cabal: "3.6" + exclude: + - os: macos-latest + ghc: "8.10" + - os: macos-latest + ghc: "9.0" + # Cabal 3.8 supports GHC < 9.6 + - cabal: "3.8" + ghc: "9.6" steps: - uses: actions/checkout@v4 if: github.event.action == 'opened' || github.event.action == 'synchronize' || github.event.ref == 'refs/heads/master' - - uses: haskell/actions/setup@v2 - id: setup-haskell-cabal + - uses: haskell-actions/setup@v2 + id: setup name: Setup Haskell with: ghc-version: ${{ matrix.ghc }} cabal-version: ${{ matrix.cabal }} + cabal-update: true - name: Configure run: | - cabal configure --enable-tests --enable-benchmarks --test-show-details=direct -fexamples -fdev -flive-test + cabal configure --enable-tests --enable-benchmarks --test-show-details=direct -fexamples -fdev -flive-test + cabal build all --dry-run + # The last step generates dist-newstyle/cache/plan.json for the cache key. - - name: Freeze - run: | - cabal freeze - - - uses: actions/cache@v3 - name: Cache ~/.cabal/packages, ~/.cabal/store and dist-newstyle + - name: Restore cached dependencies + uses: actions/cache/restore@v4 + id: cache + env: + key: ${{ runner.os }}-ghc-${{ steps.setup.outputs.ghc-version }}-cabal-${{ steps.setup.outputs.cabal-version }} with: - path: | - ~/.cabal/packages - ~/.cabal/store - dist-newstyle - key: ${{ runner.os }}-${{ matrix.ghc }}-${{ hashFiles('**/*.cabal', '**/cabal.project', '**/cabal.project.freeze') }} - restore-keys: ${{ runner.os }}-${{ matrix.ghc }}- + path: ${{ steps.setup.outputs.cabal-store }} + key: ${{ env.key }}-plan-${{ hashFiles('**/plan.json') }} + restore-keys: ${{ env.key }}- - name: Install dependencies - run: | - cabal build --only-dependencies + # If we had an exact cache hit, the dependencies will be up to date. + if: steps.cache.outputs.cache-hit != 'true' + run: cabal build all --only-dependencies + + # Cache dependencies already here, so that we do not have to rebuild them should the subsequent steps fail. + - name: Save cached dependencies + uses: actions/cache/save@v4 + # If we had an exact cache hit, trying to save the cache would error because of key clash. + if: steps.cache.outputs.cache-hit != 'true' + with: + path: ${{ steps.setup.outputs.cabal-store }} + key: ${{ steps.cache.outputs.cache-primary-key }} - name: Build run: | - cabal build + cabal build all - - name: Setup MinIO for testing (Linux) + - name: Setup TLS certs for MinIO for testing (Linux) if: matrix.os == 'ubuntu-latest' run: | mkdir -p /tmp/minio /tmp/minio-config/certs @@ -110,13 +122,14 @@ jobs: sudo cp /tmp/minio-config/certs/public.crt /usr/local/share/ca-certificates/ sudo update-ca-certificates - - name: Setup MinIO for testing (MacOS) + ## Currently disable TLS setup for MacOS due to issues in trusting it on MacOS. + - name: Setup TLS certs for MinIO for testing (MacOS) if: matrix.os == 'macos-latest' run: | mkdir -p /tmp/minio /tmp/minio-config/certs cp test/cert/* /tmp/minio-config/certs/ (cd /tmp/minio; wget -q https://dl.min.io/server/minio/release/darwin-amd64/minio; chmod +x ./minio) - sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain /tmp/minio-config/certs/public.crt + # sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain /tmp/minio-config/certs/public.crt - name: Setup MinIO for testing (Windows) if: matrix.os == 'windows-latest' @@ -126,25 +139,42 @@ jobs: Invoke-WebRequest -Uri https://dl.minio.io/server/minio/release/windows-amd64/minio.exe -OutFile $HOME/minio.exe Import-Certificate -FilePath "$env:temp/minio-config/certs/public.crt" -CertStoreLocation Cert:\LocalMachine\Root - - name: Test (Non-Windows) - if: matrix.os != 'windows-latest' + - name: Test (Linux) + if: matrix.os == 'ubuntu-latest' + env: + MINIO_SECURE: 1 run: | /tmp/minio/minio server --quiet --certs-dir /tmp/minio-config/certs data1 data2 data3 data4 2>&1 > minio.log & ghc --version cabal --version - cabal test + cabal test all + + - name: Test (MacOS) + if: matrix.os == 'macos-latest' + # # Leave MINIO_SECURE unset to disable TLS in tests. + # env: + # MINIO_SECURE: 1 + run: | + /tmp/minio/minio server --quiet data1 data2 data3 data4 2>&1 > minio.log & + ghc --version + cabal --version + cabal test all - name: Test (Windows) if: matrix.os == 'windows-latest' + env: + MINIO_SECURE: 1 run: | Start-Process -NoNewWindow -FilePath "$HOME/minio.exe" -ArgumentList "--certs-dir", "$env:temp/minio-config/certs", "server", "$env:temp/data1", "$env:temp/data2", "$env:temp/data3", "$env:temp/data4" ghc --version cabal --version - cabal test + cabal test all stack: name: stack / ghc ${{ matrix.ghc }} runs-on: ${{ matrix.os }} + env: + MINIO_SECURE: 1 strategy: matrix: ghc: @@ -159,14 +189,13 @@ jobs: - uses: actions/checkout@v4 if: github.event.action == 'opened' || github.event.action == 'synchronize' || github.event.ref == 'refs/heads/master' - - name: Install Haskell Stack - run: | - if ! which stack - then - curl -sSL https://get.haskellstack.org/ | sh - fi + - uses: haskell-actions/setup@v2 + with: + ghc-version: ${{ matrix.ghc }} + enable-stack: true + stack-version: "latest" - - uses: actions/cache@v3 + - uses: actions/cache@v4 name: Cache ~/.stack with: path: ~/.stack