name: CI # Trigger the workflow on push or pull request, but only for the master branch on: pull_request: branches: [master] push: branches: [master] # This ensures that previous jobs for the PR are canceled when the PR is # updated. concurrency: group: ${{ github.workflow }}-${{ github.head_ref }} cancel-in-progress: true # Env vars for tests env: MINIO_ACCESS_KEY: minio MINIO_SECRET_KEY: minio123 MINIO_LOCAL: 1 jobs: ormolu: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: haskell-actions/run-ormolu@v15 with: version: "0.5.0.1" hlint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: "Set up HLint" uses: haskell-actions/hlint-setup@v2 with: version: "3.5" - name: "Run HLint" uses: haskell-actions/hlint-run@v2 with: path: '["src/", "test/", "examples"]' fail-on: warning cabal: name: ${{ matrix.os }} / ghc-${{ matrix.ghc }} / cabal-${{ matrix.cabal }} runs-on: ${{ matrix.os }} needs: ormolu strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] cabal: ["3.8", "latest"] ghc: - "9.8" - "9.6" - "9.4" - "9.2" - "9.0" - "8.10" exclude: # macos llvm issue for versions less than 9.2 - 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" - cabal: "3.8" ghc: "9.8" 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 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 build all --dry-run # The last step generates dist-newstyle/cache/plan.json for the cache key. - 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: ${{ steps.setup.outputs.cabal-store }} key: ${{ env.key }}-plan-${{ hashFiles('**/plan.json') }} restore-keys: ${{ env.key }}- - name: Install 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 all - name: Setup TLS certs for MinIO for testing (Linux) if: matrix.os == 'ubuntu-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/linux-amd64/minio; chmod +x ./minio) sudo cp /tmp/minio-config/certs/public.crt /usr/local/share/ca-certificates/ sudo update-ca-certificates ## 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 - name: Setup MinIO for testing (Windows) if: matrix.os == 'windows-latest' run: | New-Item -ItemType Directory -Path "$env:temp/minio-config/certs/" Copy-Item -Path test\cert\* -Destination "$env:temp/minio-config/certs/" 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 (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 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 all stack: name: stack / ghc ${{ matrix.ghc }} runs-on: ${{ matrix.os }} env: MINIO_SECURE: 1 strategy: matrix: ghc: - "8.10.7" - "9.0.2" - "9.2.8" - "9.4.8" - "9.6.5" - "9.8.2" os: [ubuntu-latest] 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 with: ghc-version: ${{ matrix.ghc }} enable-stack: true stack-version: "latest" - uses: actions/cache@v4 name: Cache ~/.stack with: path: ~/.stack key: ${{ runner.os }}-stack-global-${{ hashFiles('stack.yaml') }}-${{ hashFiles('package.yaml') }} restore-keys: | ${{ runner.os }}-stack-global- - uses: actions/cache@v4 name: Cache .stack-work with: path: .stack-work key: ${{ runner.os }}-stack-work-${{ hashFiles('stack.yaml') }}-${{ hashFiles('package.yaml') }}-${{ hashFiles('**/*.hs') }} restore-keys: | ${{ runner.os }}-stack-work- - name: Install dependencies run: | stack --version stack build --system-ghc --test --bench --no-run-tests --no-run-benchmarks --only-dependencies - name: Build run: | stack build --system-ghc --test --bench --no-run-tests --no-run-benchmarks --flag minio-hs:examples --flag minio-hs:live-test --flag minio-hs:dev - name: Setup MinIO for testing (Linux) if: matrix.os == 'ubuntu-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/linux-amd64/minio; chmod +x ./minio) sudo cp /tmp/minio-config/certs/public.crt /usr/local/share/ca-certificates/ sudo update-ca-certificates - name: Setup 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 - name: Setup MinIO for testing (Windows) if: matrix.os == 'windows-latest' run: | New-Item -ItemType Directory -Path "$env:temp/minio-config/certs/" Copy-Item -Path test\cert\* -Destination "$env:temp/minio-config/certs/" 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' run: | /tmp/minio/minio server --quiet --certs-dir /tmp/minio-config/certs data1 data2 data3 data4 2>&1 > minio.log & ghc --version stack --version stack test --system-ghc --flag minio-hs:live-test --flag minio-hs:dev - name: Test (Windows) if: matrix.os == 'windows-latest' 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 stack test --system-ghc --flag minio-hs:live-test --flag minio-hs:dev