-
Notifications
You must be signed in to change notification settings - Fork 20
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
163 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,163 @@ | ||
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. | ||
- name: stable | ||
stack_yaml: "stack.yaml" | ||
os: ubuntu-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 | ||
# 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 }} | ||
dist-newstyle | ||
key: ${{ runner.os }}-cabal-${{ hashFiles('cabal.project.freeze') }} | ||
|
||
- name: Build | ||
run: | | ||
cabal build all | ||
- name: Test | ||
run: | | ||
cabal test all | ||
# a separate job just to check the error messages, because that requires | ||
# building several failing projects and so the test framework is more complex. | ||
error-messages: | ||
name: Error Messages | ||
runs-on: ${{ matrix.os }} | ||
strategy: | ||
matrix: | ||
include: | ||
- ghc: "8.10" | ||
os: ubuntu-latest | ||
|
||
steps: | ||
- uses: actions/checkout@v2 | ||
if: github.event.action == 'opened' || github.event.action == 'synchronize' || github.event.ref == 'refs/heads/main' | ||
|
||
# ./test/error-messages/Test.hs is a cabal script, so we need Cabal. | ||
- uses: haskell/actions/setup@v1 | ||
id: setup-haskell-cabal | ||
name: Setup Cabal | ||
with: | ||
ghc-version: ${{ matrix.ghc }} | ||
enable-stack: false | ||
|
||
# ./test/error-messages/Test.hs runs some stack projects, so we also need stack. | ||
- uses: haskell/actions/setup@v1 | ||
id: setup-haskell-stack | ||
name: Setup Stack | ||
with: | ||
ghc-version: ${{ matrix.ghc }} | ||
enable-stack: true | ||
|
||
- uses: actions/cache@v2 | ||
id: cache-stack-and-cabal | ||
name: Cache Stack and Cabal Artifacts | ||
with: | ||
# store the whole ~/.cabal, not just ~/.cabal/store, so we don't have to re-run 'cabal update'. | ||
path: | | ||
~/.cabal | ||
dist-newstyle | ||
~/.stack | ||
**/.stack-work | ||
key: ${{ runner.os }}-${{ matrix.ghc }}-error-messages-${{ hashFiles('stack.yaml') }} | ||
|
||
# For some reason setup-haskell-cabal sometimes doesn't run 'cabal update'. | ||
- name: Initialize Cabal | ||
if: steps.cache-stack-and-cabal.outputs.cache-hit != 'true' | ||
run: | | ||
cabal update | ||
- name: Test Error Messages | ||
run: | | ||
./test/error-messages/Test.hs `pwd` |
File renamed without changes.