From 3b1e0ab50702674490c59f236021df0f39782aa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20G=C3=A9lineau?= Date: Sun, 27 Dec 2020 16:49:32 -0500 Subject: [PATCH] GitHub Actions --- .github/workflows/ci.yml | 119 ++++++++++++++++++ ...rted-lts.yaml => oldest-supported-lts.yaml | 0 2 files changed, 119 insertions(+) create mode 100644 .github/workflows/ci.yml rename stack-oldest-supported-lts.yaml => oldest-supported-lts.yaml (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..06a92f8 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,119 @@ +name: CI + +on: + # Build every pull request, to check for regressions. + pull_request: + + # Build when a PR is merged, to update the README's CI badge. + push: + branches: [main] + + # Build once a month, to detect missing upper bounds. + schedule: + - cron: '0 0 1 * *' + +jobs: + stack: + name: ${{ matrix.name }} + runs-on: ubuntu-latest + strategy: + matrix: + include: + # Check that the build passes with the recommended snapshot on every + # platform. + - name: stable + stack_yaml: "stack.yaml" + os: ubuntu-latest + - name: stable + stack_yaml: "stack.yaml" + os: macos-latest + - name: stable + stack_yaml: "stack.yaml" + os: windows-latest + + # Check that the lower bounds are still correct by building with the + # lowest-supported version of everything, including our dependencies. + - name: oldest + stack_yaml: "oldest-supported-lts.yaml" + os: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + if: github.event.action == 'opened' || github.event.action == 'synchronize' || github.event.ref == 'refs/heads/main' + + - uses: actions/cache@v2 + name: Cache Stack Artifacts + with: + path: | + ~/.stack + .stack-work + key: ${{ runner.os }}-stack-${{ hashFiles(matrix.stack_yaml) }} + + - uses: haskell/actions/setup@v1 + id: setup-haskell-stack + name: Setup Stack + with: + enable-stack: true + stack-setup-ghc: true + stack-no-global: true + ghc-version: ${{ matrix.ghc }} + + - name: Build + run: | + stack --stack-yaml=${{ matrix.stack_yaml }} build --test --bench --no-run-tests --no-run-benchmarks + + - name: Test + run: | + stack --stack-yaml=${{ matrix.stack_yaml }} test + + cabal: + name: ${{ matrix.name }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + include: + # Check that our upper bounds are correct by building with the latest + # version of everything. We use cabal because it uses the latest + # versions of our dependencies allowed by our upper bounds. + - name: newest + ghc: latest + os: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + if: github.event.action == 'opened' || github.event.action == 'synchronize' || github.event.ref == 'refs/heads/main' + + - uses: haskell/actions/setup@v1 + id: setup-haskell-cabal + name: Setup Cabal + with: + ghc-version: ${{ matrix.ghc }} + cabal-version: ${{ matrix.cabal }} + + # This freeze file is regenerated on every build, so we will always test + # with the most recent version of our dependencies allowed by our upper + # bounds. + - name: Freeze + run: | + cabal configure --enable-tests --enable-benchmarks --test-show-details=direct + cabal freeze + cabal v1-sandbox init + cabal v1-install happy + + # Only reuse the cached copy of our dependencies if our freeze file matches + # the cache's copy. + - uses: actions/cache@v2 + name: Cache Cabal Artifacts + with: + path: | + ${{ steps.setup-haskell-cabal.outputs.cabal-store }} + .cabal-sandbox + key: ${{ runner.os }}-cabal-${{ hashFiles('cabal.project.freeze') }} + + - name: Build + run: | + cabal v1-install --enable-tests + + - name: Test + run: | + cabal v1-test diff --git a/stack-oldest-supported-lts.yaml b/oldest-supported-lts.yaml similarity index 100% rename from stack-oldest-supported-lts.yaml rename to oldest-supported-lts.yaml