-
Notifications
You must be signed in to change notification settings - Fork 3
145 lines (130 loc) · 5.96 KB
/
ci.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
name: CI
on:
push: { branches: [main] }
pull_request: { branches: [main] }
create: { tags: [v*] }
defaults:
run:
shell: bash
jobs:
cancel:
name: Cancel redundant actions already in progress
runs-on: ubuntu-latest
steps:
- name: Cancel actions in progress of same workflow and same branch
uses: styfle/cancel-workflow-action@0.9.0
with:
access_token: ${{ github.token }}
# Check that Haskell code is formatted.
code-formatter:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: mrkkrp/ormolu-action@v2
build:
name: Build StrongPath
runs-on: ${{ matrix.os }}
needs: code-formatter
strategy:
matrix:
os:
- ubuntu-latest
- macos-latest
- windows-latest
stack-resolver:
- from-stack-yaml
include:
- os: ubuntu-latest
# NOTE: This version of resolver is aligned with the lower version bounds defined in package.yaml.
# If you change it, make sure to adjust lower bounds there to reflect the change.
# Also, make sure to adjust tested-with field in package.yaml so that it contains
# corresponding GHC version.
stack-resolver: lts-18.21
steps:
- name: Checkout the repo
uses: actions/checkout@v2
- name: Cache (Unix)
uses: actions/cache@v2
if: runner.os == 'Linux' || runner.os == 'macOS'
with:
path: |
# TODO: To reduce the cache size significantly, we might want to look into ensuring that
# GHC is not cached, since it is big and can be installed in couple of minutes.
# To do that, we will probably want to cache only ~/.stack/snapshots.
~/.stack
# TODO: Right now, actions/cache updates cache only if cache was not fetched.
# This is not ideal for us, because we would ideally update cache even if it
# was fetched, because we want to cache any newly installed packages.
# This was working normally on Travis and Appveyor.
# There is an issue for this, and for now we are using proposed "fix" from it,
# https://github.com/actions/cache/issues/342#issuecomment-673371329,
# which mitigates the problem by creating new cache for each job and then using
# the feature of restore-keys which makes sure that next cache picked is the
# latest one. However, this keeps creating new cache each time which is not
# ideal because caches keep getting evicted, so for example if Win job
# fails multiple times while others don't, its cache will likely get evicted,
# making it even slower to test and fix (uffff).
# When they fix this, we should remove ${{ github.run_id }} from the end of the key
# and also remove restore-keys.
key: haskell-${{ runner.os }}-${{ hashFiles('stack.yaml') }}-${{ github.run_id }}
restore-keys: |
haskell-${{ runner.os }}-${{ hashFiles('stack.yaml') }}-
- name: Cache (Windows)
uses: actions/cache@v2
if: runner.os == 'Windows'
with:
# C\:sr is where stack installs compiled dependencies.
# Caching this path reduces build time by 20 minutes while occupying only ~50mbs of cache space.
# To shave off 3 more minutes, we could add C:\Users\runneradmin\AppData\Local\Programs\stack
# to the cache -> this is where stack installs GHC. However, this adds ~900mb to the cache size!
path: |
C:\sr
# TODO: Check TODO in caching for Unix above.
key: haskell-${{ runner.os }}-${{ hashFiles('stack.yaml') }}-${{ github.run_id }}
restore-keys: |
haskell-${{ runner.os }}-${{ hashFiles('stack.yaml') }}-
# TODO: Remove this step once https://github.com/actions/cache/issues/445 is resolved.
- name: Fix MacOS problem with corrupt cached executable
if: runner.os == 'macOS'
run: rm -rf ~/.stack/setup-exe-cache
# We are setting up haskell via ghcup instead of using haskell/actions/setup
# because the mentioned gh action can be months late with the latest versions
# of Stack.
- name: Set up Haskell (Stack) via ghcup (Unix)
if: runner.os == 'Linux' || runner.os == 'macOS'
run: |
export BOOTSTRAP_HASKELL_NONINTERACTIVE=1
export BOOTSTRAP_HASKELL_INSTALL_STACK=1
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
- name: Set up Haskell (Stack) via ghcup (Win)
if: runner.os == 'Windows'
run: |
Set-ExecutionPolicy Bypass -Scope Process -Force
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
Invoke-Command -ScriptBlock ([ScriptBlock]::Create(".{$(Invoke-WebRequest https://www.haskell.org/ghcup/sh/bootstrap-haskell.ps1 -UseBasicParsing)} -InstallStack"))
shell: powershell
# NOTE: I commented out this in favor of manual setup above, since with this action we
# couldn't get the latest version of Stack.
# - name: Set up Haskell (Stack)
# uses: haskell/actions/setup@v1
# with:
# ghc-version: latest
# enable-stack: true
# stack-version: latest
- name: Set Stack resolver
if: matrix.stack-resolver != 'from-stack-yaml'
env:
STACK_RESOLVER: ${{ matrix.stack-resolver }}
run: stack config set resolver $STACK_RESOLVER
- name: Verify Haskell setup
run: |
stack --numeric-version
stack path --stack-root
stack ghc -- --version
ghc --version
- name: Build dependencies
run: stack --install-ghc test --only-dependencies
- name: Build StrongPath & Run tests
run: stack test
- name: Build docs
run: stack haddock