-
Notifications
You must be signed in to change notification settings - Fork 0
351 lines (316 loc) · 13.7 KB
/
packcheck.yml
File metadata and controls
351 lines (316 loc) · 13.7 KB
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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
# packcheck-0.7.1
# You can use any of the options supported by packcheck as environment
# variables here. See https://github.com/composewell/packcheck for all
# options and their explanation.
name: TEST
#-----------------------------------------------------------------------------
# Events on which the build should be triggered
#-----------------------------------------------------------------------------
on:
workflow_dispatch:
pull_request:
push:
branches:
- master
#-----------------------------------------------------------------------------
# Build matrix
#-----------------------------------------------------------------------------
jobs:
build:
name: >-
${{ matrix.runner }}
${{ matrix.command }}
${{ matrix.ghc_version }}
${{ matrix.name }}
env:
# ------------------------------------------------------------------------
# Common options
# ------------------------------------------------------------------------
CABAL_REINIT_CONFIG: y
LC_ALL: C.UTF-8
# ------------------------------------------------------------------------
# What to build
# ------------------------------------------------------------------------
# DISABLE_TEST: "y"
# DISABLE_BENCH: "y"
# DISABLE_DOCS: "y"
# DISABLE_SDIST_BUILD: "y"
# DISABLE_SDIST_GIT_CHECK: "y"
# DISABLE_DIST_CHECKS: "y"
# ------------------------------------------------------------------------
# Selecting tool versions
# ------------------------------------------------------------------------
# For updating see: https://downloads.haskell.org/~ghcup/
GHCUP_VERSION: 0.1.50.2
GHCVER: ${{ matrix.ghc_version }}
# ------------------------------------------------------------------------
# cabal options
# ------------------------------------------------------------------------
CABAL_CHECK_RELAX: y
# CABAL_BUILD_OPTIONS="-j1"
# Enable the above option if you:
# 1. want logs in serial order to be able to correlate them better.
#
# 2. run into memory issues due to Build paralellism. We need to
# have sufficient per CPU memory, if not we can use a lower -j
# option; cabal default is ncpus.
#
# Currently (2026-03-12) from packcheck output we see:
# Linux: 15GB, 4 cpus
# macOS: 7GB, 3 cpus
# Windows: 16GB, 4 cpus
# ------------------------------------------------------------------------
# stack options (if using stack builds)
# ------------------------------------------------------------------------
# Note requiring a specific version of stack using STACKVER may fail due to
# github API limit while checking and upgrading/downgrading to the specific
# version.
#STACKVER: "1.6.5"
#STACK_UPGRADE: "y"
STACK_YAML: "stack.yaml"
# ------------------------------------------------------------------------
# Location of packcheck.sh (the shell script invoked to perform CI tests ).
# ------------------------------------------------------------------------
# You can either commit the packcheck.sh script at this path in your repo or
# you can use it by specifying the PACKCHECK_REPO_URL option below in which
# case it will be automatically copied from the packcheck repo to this path
# during CI tests. In any case it is finally invoked from this path.
PACKCHECK: "./packcheck.sh"
# If you have not committed packcheck.sh in your repo at PACKCHECK
# then it is automatically pulled from this URL.
PACKCHECK_GITHUB_URL: "https://raw.githubusercontent.com/composewell/packcheck"
PACKCHECK_GITHUB_COMMIT: "3d3c94bf48f18a99271d509c1f1702d15824b1f0"
# ------------------------------------------------------------------------
# Final build variables
# ------------------------------------------------------------------------
PACKCHECK_COMMAND: ${{ matrix.command }} ${{ matrix.pack_options }}
# Subdir
SUBDIR: ${{ matrix.subdir }}
# ubuntu seems to have better support than debian on CI systems
runs-on: ${{ matrix.runner }}
#continue-on-error: ${{ matrix.ignore_error }}
strategy:
fail-fast: false
matrix:
# The order of jobs is important to optimize fail-fast.
# This section is to order the important jobs first especially for
# "fail-fast" so that these are the ones started first.
#name:
# - ci
# The name of the CI is built using the name and other info from CI,
# therefore, the "name" field can be same for all tests here.
#
# The reason we have an explicit "name" field here is to force
# an additional config instead of adding to an existing config
# while adding additional configs.
# Look at <https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions#jobsjob_idstrategymatrix>
# for more info about adding matrix elements.
# Adding any element to the list will increase the number of matrix
# elements proportional to the cross product.
include:
#- name: ci
# runner: ubuntu-latest
# command: cabal
# ghc_version: head
# # The URL may change, to find a working URL go to https://gitlab.haskell.org/ghc/ghc/-/jobs/
# # Find a debian10/11/12 job, click on a passed/failed status, at the
# # end of the output you will find the tar.xz name, put that tar
# # name after "raw/", and put the job name after "job=".
# # Also see https://github.com/mpickering/ghc-artefact-nix/blob/master/gitlab-artifact.nix
# #
# # May also use ghcup for installing ghc head version, use the
# # version "LatestNightly", and the following config:
# # ghcup config add-release-channel https://ghc.gitlab.haskell.org/ghcup-metadata/ghcup-nightlies-0.0.7.yaml
# # WARNING! cannot use # comments inside pack_options.
# pack_options: >-
# GHCUP_GHC_OPTIONS="-u https://gitlab.haskell.org/ghc/ghc/-/jobs/artifacts/master/raw/ghc-x86_64-linux-deb10-int_native-validate.tar.xz?job=x86_64-linux-deb10-int_native-validate"
# CABAL_PROJECT=cabal.project.ghc-head
# DISABLE_SDIST_BUILD="y"
- name: ci
runner: ubuntu-latest
command: cabal
ghc_version: 9.14.1
# WARNING! cannot use # comments inside pack_options.
pack_options: >-
CABAL_PROJECT=cabal.project.Werror
- name: ci
runner: macos-latest
command: cabal
ghc_version: 9.12.4
# WARNING! cannot use # comments inside pack_options.
#pack_options: >-
# CABAL_PROJECT=cabal.project
- name: ci
runner: ubuntu-latest
command: cabal
ghc_version: 9.10.3
# WARNING! cannot use # comments inside pack_options.
#pack_options: >-
# CABAL_PROJECT=cabal.project
#- name: ghc-9.10.3
# runner: ubuntu-latest
# command: stack
# # WARNING! cannot use # comments inside pack_options.
# pack_options: >-
# CABAL_PROJECT=cabal.project.user
# STACK_UPGRADE="y"
# DISABLE_SDIST_BUILD="y"
- name: ci
runner: ubuntu-latest
command: cabal
ghc_version: 9.8.4
# WARNING! cannot use # comments inside pack_options.
#pack_options: >-
# CABAL_PROJECT=cabal.project
- name: ci
runner: ubuntu-latest
command: cabal
ghc_version: 9.6.3
# WARNING! cannot use # comments inside pack_options.
#pack_options: >-
# CABAL_PROJECT=cabal.project
- name: ci
runner: windows-latest
command: cabal
ghc_version: 9.12.4
# WARNING! cannot use # comments inside pack_options.
#pack_options: >-
# CABAL_PROJECT=cabal.project
- name: ci
runner: ubuntu-latest
command: hlint
# WARNING! cannot use # comments inside pack_options.
pack_options: >-
HLINT_VERSION=3.6.1
HLINT_OPTIONS="lint"
HLINT_TARGETS="src"
#- name: docspec
# runner: ubuntu-latest
# command: cabal
# ghc_version: 9.12.4
# # WARNING! cannot use # comments inside pack_options.
# pack_options: >-
# ENABLE_DOCSPEC="y"
# DOCSPEC_URL=https://github.com/phadej/cabal-extras/releases/download/cabal-docspec-0.0.0.20210111/cabal-docspec-0.0.0.20210111.xz
# DOCSPEC_OPTIONS="--timeout 60"
# CABAL_PROJECT=cabal.project
#-----------------------------------------------------------------------------
# Usually you do need to change anything below, this is generic code for
# caching and running packcheck on Linux/Mac/Windows.
#-----------------------------------------------------------------------------
steps:
- uses: actions/checkout@v4
# This should happen before cache restore.
- name: Remove ~/.ghcup symlink (non-Windows)
if: runner.os != 'Windows'
run: |
rm -f ~/.ghcup
- name: Cache hackage package index (non-Windows)
uses: actions/cache@v4
if: runner.os != 'Windows'
with:
path: |
~/.cache/cabal/packages
# Bump the key version to clear the cache
key: cache-cabal-packages
# See the "cabal path" output in the CI logs to tweak the cache locations
# ghc is big but cheap to install, if cache size is a concern we can avoid
# caching it.
- name: Cache ghcup and ghc (non-Windows)
uses: actions/cache@v4
if: runner.os != 'Windows'
with:
path: |
~/.ghcup
key: ${{ matrix.runner }}-${{ matrix.ghc_version }}.${{ matrix.ghc_salt}}
# XXX If we want to invalidate the cache on resolver change we
# should use a separate cache for stack as it should be keyed on
# resolver as well. But that requires resolver as a matrix element
# and then copied to pack_options from there, needs some work. It
# should be fine as resolver minor version change can only increase
# the cache size.
- name: Cache build dependencies (non-Windows)
uses: actions/cache@v4
if: runner.os != 'Windows'
with:
# cabal: ~/.local/bin, ~/.local/state/cabal
# ~/.cache/cabal/packages can be cached, but will increase the
# cache size. But can save the "cabal update" time.
path: |
~/.local/bin
~/.local/state/cabal
~/.stack
# Bump the key version to clear the cache
key: ${{ matrix.runner }}-${{ matrix.command }}-${{ matrix.ghc_version }}-${{ matrix.name }}-v1
- name: Cache common directories (Windows)
uses: actions/cache@v4
if: runner.os == 'Windows'
with:
path: |
${{ env.APPDATA }}/local
C:/ghcup
C:/cabal
key: ${{ matrix.runner }}-${{ matrix.command }}-${{ matrix.ghc_version }}-${{ matrix.name }}-v1
- name: Download packcheck
# on windows-latest GitHub Actions defaults to PowerShell
shell: bash
run: |
if test ! -e "$PACKCHECK"
then
if test -z "$PACKCHECK_GITHUB_COMMIT"
then
die "PACKCHECK_GITHUB_COMMIT env var is not specified."
fi
PACKCHECK_URL=${PACKCHECK_GITHUB_URL}/${PACKCHECK_GITHUB_COMMIT}/packcheck.sh
curl --fail -sL -o "$PACKCHECK" $PACKCHECK_URL || exit 1
chmod +x $PACKCHECK
elif test ! -x "$PACKCHECK"
then
chmod +x $PACKCHECK
fi
- name: Run packcheck
# on windows-latest GitHub Actions defaults to PowerShell
shell: bash
run: |
if test -n "$SUBDIR"
then
mv "$PACKCHECK" "$SUBDIR/packcheck.sh"
# This is required otherwise dist-newstyle will be created in
# the top level directory as it is considered the working dir.
rm -f cabal.project
cd "$SUBDIR"
fi
# Commands like mount, sysctl for info require sbin
PATH_VAR=/bin:/usr/bin:/sbin:/usr/sbin
case "$(uname)" in
Linux)
# On Linux it defaults to /usr/local, during cache restore
# tar is unable to change permissions and restore fails.
export GHCUP_INSTALL_BASE_PREFIX=$HOME
;;
CYGWIN*|MINGW*|MSYS*)
PATH_VAR="$PATH_VAR:/c/Program Files/7-Zip:/mingw64/bin"
;;
esac
# Use "bash -c" instead of invoking directly to preserve quoted
# arguments in PACKCHECK_COMMAND e.g. DOCSPEC_OPTIONS="--timeout 60".
# Direct invocation would word-split on spaces inside quoted values.
echo "$PACKCHECK $PACKCHECK_COMMAND PATH=\"$PATH_VAR\""
bash -c "$PACKCHECK $PACKCHECK_COMMAND PATH=\"$PATH_VAR\""
- name: Check cache locations
if: runner.os != 'Windows'
run: |
# We want to see if it is a symlink; e.g. on github ~/.ghcup is a
# pre-existing symlink to /usr/local.
list="$HOME/.local/bin $HOME/.local/state/cabal $HOME/.ghcup $HOME/.stack"
for dir in $list; do
# macOS does not have --no-dereference option
if [ -L "$dir" ]; then
echo "$dir is a symlink -> $(readlink $dir)"
else
du -sh "$dir" 2>/dev/null || echo "$dir missing"
fi
done
echo
#ls -ld $list 2>/dev/null || true
ls -al $list 2>/dev/null || true