-
Notifications
You must be signed in to change notification settings - Fork 0
182 lines (155 loc) · 6.03 KB
/
build.yml
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
name: Build and Test
on:
push:
paths-ignore:
- '**.md'
# only one build per branch
concurrency:
group: build-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
name: GHC ${{ matrix.ghc }} on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
ghc: ['9.10.1']
cabal: ['3.10.3.0']
steps:
- uses: actions/checkout@v4
- name: Install system dependencies - Linux
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install libpcre3-dev
sudo apt-get install libmysqlclient-dev
sudo apt-get install libmysqlclient21
sudo ln -s /opt/hostedtoolcache/mysql/9.0.1/x64/lib/libmysqlclient.so.24 /usr/lib/libmysqlclient.so.24
- name: Install system dependencies - Windows
if: runner.os == 'Windows'
run: |
# ghcup should be installed on current GHA Windows runners. Let's use ghcup to run
# pacman, to install the necessary dependencies, ...
ghcup run --mingw-path -- pacman --noconfirm -S `
mingw-w64-x86_64-pkg-config `
mingw-w64-x86_64-pcre `
mingw-w64-x86_64-libsodium `
base-devel `
autoconf-wrapper `
autoconf `
automake `
libtool `
make
- name: Install system dependencies - MacOS
if: runner.os == 'macOS'
run: |
set -x
brew install pcre2
brew install pcre
brew install mysql-connector-c
export LDFLAGS="-L/opt/homebrew/opt/mysql-client/lib"
export CPPFLAGS="-I/opt/homebrew/opt/mysql-client/include"
ls -la /opt/homebrew/include
- name: Setup - PostgreSQL
id: postgres-setup
uses: ikalnytskyi/action-setup-postgres@v7
with:
postgres-version: "16"
database: 'postgres'
username: 'postgres'
password: 'postgres'
- name: Setup - MySQL
id: mysql-setup
uses: shogo82148/actions-setup-mysql@v1
with:
mysql-version: "9.0.1"
- name: Setup Haskell
if: runner.os == 'Windows'
run: |
ghcup install ghc --set ${{ matrix.ghc }}
ghcup install cabal --set 3.10.3.0
ghc --version
cabal --version
cabal update
- name: Setup - GHC ${{ matrix.ghc }}
if: runner.os != 'Windows'
uses: haskell-actions/setup@v2
id: setup
with:
ghc-version: ${{ matrix.ghc }}
# Defaults, added for clarity:
cabal-version: ${{ matrix.cabal }}
cabal-update: true
- name: Build - Configure
run: |
cabal configure --enable-tests --enable-benchmarks --disable-documentation
cabal build all --dry-run
# The last step generates dist-newstyle/cache/plan.json for the cache key.
- name: Build - 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: Build failing deps
# If we had an exact cache hit, the dependencies will be up to date.
if: steps.cache.outputs.cache-hit != 'true' && runner.os == 'macOS'
run: |
set -x
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/homebrew/include"
export LD_LIBRARY="$LD_LIBRARY:/opt/homebrew/include"
MYSQL_LIB=$(dirname $(dirname $LIBMYSQL_PLUGIN_DIR))
cat <<EOF >cabal.project.local
ignore-project: False
package pcre-light
extra-include-dirs: /opt/homebrew/include
extra-lib-dirs: /opt/homebrew/lib
extra-prog-path: /opt/homebrew/lib
package mysql
extra-include-dirs: $MYSQL_LIB/include
extra-lib-dirs: $MYSQL_LIB/lib
extra-prog-path: $MYSQL_LIB/lib
EOF
find /opt/homebrew/lib
cabal build pcre-light
cabal build mysql
- name: Build - Install dependencies - windows
shell: msys2 {0}
# If we had an exact cache hit, the dependencies will be up to date.
if: steps.cache.outputs.cache-hit != 'true' && runner.os == 'Windows'
run: cabal build all --only-dependencies --verbose --extra-include-dirs=/opt/homebrew/include
- name: Build - 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 --verbose --extra-include-dirs=/opt/homebrew/include
# Cache dependencies already here, so that we do not have to rebuild them should the subsequent steps fail.
- name: Build - Save dependencies to cache
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: LD_DEBUG=libs cabal build all --extra-include-dirs=/opt/homebrew/include
- name: Test
env:
PGSERVICE: ${{ steps.postgres-setup.outputs.service-name }}
MYSQL_STUFF: ${{ steps.mysql.outputs.base-dir }}
run: |
set -x
cat <<EOF >~/.my.cnf
[mysql]
socket=$(dirname $MYSQL_HOME)/tmp/mysql.sock
EOF
cabal run emulator-tests
# We run this only when a PR is merged so we can see how things are performing
# on the GH actions machines.
- name: Benchmark
if: github.ref == 'refs/heads/main'
run: cabal run emulator-tests