Skip to content

Commit e5a43cf

Browse files
committed
ci: update CI setup
1 parent 9b614f4 commit e5a43cf

File tree

1 file changed

+112
-137
lines changed

1 file changed

+112
-137
lines changed

.github/workflows/ci.yml

Lines changed: 112 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -1,168 +1,143 @@
11
name: CI
22
on:
3-
- pull_request
43
- push
4+
- pull_request
5+
- release
6+
7+
env:
8+
GHC_FOR_RELEASE: "9.10"
9+
510
jobs:
6-
build_posix:
7-
name: ${{ matrix.os }} / ghc ${{ matrix.ghc }}
8-
runs-on: ${{ matrix.os }}
11+
build:
12+
name: GHC ${{ matrix.ghc-version }} on ${{ matrix.os }} ${{matrix.container}}
913
strategy:
14+
fail-fast: false
1015
matrix:
11-
ghc:
12-
- "9.12.1"
13-
- "9.10.1"
14-
- "9.8.4"
15-
- "9.6.6"
16-
- "9.4.8"
17-
- "9.2.8"
18-
- "9.0.2"
19-
- "8.10.7"
20-
- "8.8.4"
21-
cabal:
22-
- "3.12.1.0"
23-
os:
24-
- ubuntu-latest
16+
os: [ubuntu-latest]
17+
ghc-version: ['9.12', '9.10', '9.8', '9.6', '9.4', '9.2']
18+
container: ['']
19+
2520
include:
21+
- os: windows-latest
22+
ghc-version: '9.10'
2623
- os: macos-latest
27-
ghc: "9.12.1"
28-
cabal: "3.12.1.0"
29-
- os: macos-latest
30-
ghc: "9.10.1"
31-
cabal: "3.12.1.0"
32-
- os: macos-latest
33-
ghc: "9.8.2"
34-
cabal: "3.12.1.0"
35-
fail-fast: false
24+
ghc-version: '9.10'
25+
- os: ubuntu-latest
26+
ghc-version: '9.10'
27+
container: alpine:3.21
28+
29+
runs-on: ${{ matrix.os }}
30+
container: ${{ matrix.container }}
31+
3632
steps:
37-
- uses: actions/checkout@v2
38-
- name: Set up Haskell
39-
id: setup-haskell-cabal
40-
uses: haskell-actions/setup@v2
41-
with:
42-
ghc-version: ${{ matrix.ghc }}
43-
cabal-version: ${{ matrix.cabal }}
44-
- name: Cache cabal-store
45-
uses: actions/cache@v2
46-
with:
47-
path: ${{ steps.setup-haskell-cabal.outputs.cabal-store }}
48-
key: ${{ runner.os }}-${{ matrix.ghc }}-cabal
33+
- uses: actions/checkout@v4
34+
35+
- name: Install extra dependencies (only on alpine)
36+
if: ${{ startsWith(matrix.container, 'alpine') }}
37+
shell: sh
38+
run: |
39+
apk add bash curl sudo jq pkgconfig \
40+
zlib-dev zlib-static binutils curl \
41+
gcc g++ gmp-dev libc-dev libffi-dev make \
42+
musl-dev ncurses-dev perl tar xz
43+
4944
- name: Install system dependencies (Linux)
50-
if: runner.os == 'Linux'
45+
if: runner.os == 'Linux' && !startsWith(matrix.container, 'alpine')
5146
run: sudo apt-get update && sudo apt-get install libgtk2.0-dev
47+
5248
- name: Install system dependencies (macOS)
5349
if: runner.os == 'macOS'
5450
run: brew install cairo gtk+ pkg-config
51+
5552
- name: Set extra cabal build options (macOS)
5653
if: runner.os == 'macOS'
5754
run: echo "CABAL_BUILD_OPTIONS=--constraint='gtk +have-quartz-gtk'" >> $GITHUB_ENV
58-
- name: Build Haskell dependencies
55+
56+
57+
- name: Set up GHC ${{ matrix.ghc-version }}
58+
uses: haskell-actions/setup@v2
59+
id: setup
60+
with:
61+
ghc-version: ${{ matrix.ghc-version }}
62+
63+
- name: Enable static build (only on alpine)
64+
if: ${{ startsWith(matrix.container, 'alpine') }}
5965
run: |
60-
echo $CABAL_BUILD_OPTIONS
61-
eval cabal build $CABAL_BUILD_OPTIONS --enable-tests --enable-benchmarks --dep -j all
62-
eval cabal build $CABAL_BUILD_OPTIONS --disable-tests --disable-benchmarks --dep -j all
63-
- name: Build ThreadScope
66+
echo 'executable-static: true' >>cabal.project
67+
68+
- name: Configure the build
6469
run: |
65-
DISTDIR=$(mktemp -d /tmp/dist-test.XXXX)
66-
# Packaging...
67-
cabal v2-sdist all
68-
# Unpacking...
69-
mv dist-newstyle/sdist/*.tar.gz ${DISTDIR}/
70-
cd ${DISTDIR} || false
71-
find . -maxdepth 1 -type f -name '*.tar.gz' -exec tar -xvf '{}' \;
72-
find . -maxdepth 1 -type f -name '*.tar.gz' -exec rm '{}' \;
73-
PKGDIR_threadscope="$(find . -maxdepth 1 -type d -regex '.*/threadscope-[0-9.]*')"
74-
# Generate cabal.project
75-
rm -rf cabal.project cabal.project.local cabal.project.freeze
76-
touch cabal.project
77-
echo "packages: ${PKGDIR_threadscope}" >> cabal.project
78-
for pkg in $(ghc-pkg list --simple-output); do
79-
echo $pkg | sed 's/-[^-]*$//' | (grep -vE -- '^(threadscope)$' || true) | sed 's/^/constraints: /' | sed 's/$/ installed/' >> cabal.project.local;
80-
done
81-
cat cabal.project || true
82-
cat cabal.project.local || true
83-
# Building...
84-
# this builds all libraries and executables (without tests/benchmarks)
85-
eval cabal build $CABAL_BUILD_OPTIONS --disable-tests --disable-benchmarks all
86-
# Building with tests and benchmarks...
87-
# build & run tests, build benchmarks
88-
eval cabal build $CABAL_BUILD_OPTIONS --enable-tests --enable-benchmarks all
89-
# cabal check...
90-
(cd ${PKGDIR_threadscope} && cabal -vnormal check)
91-
# Building without installed constraints for packages in global-db...
92-
rm -f cabal.project.local
93-
eval cabal build $CABAL_BUILD_OPTIONS --disable-tests --disable-benchmarks all
94-
echo $(cabal v2-exec -v0 which threadscope)
95-
cp "$(cabal v2-exec -v0 which threadscope)" "$GITHUB_WORKSPACE/threadscope.$PLATFORM.ghc-$GHCVER"
96-
gzip -f "$GITHUB_WORKSPACE/threadscope.$PLATFORM.ghc-$GHCVER"
97-
env:
98-
GHCVER: ${{ matrix.ghc }}
99-
PLATFORM: ${{ matrix.os }}
100-
- name: Release
101-
uses: softprops/action-gh-release@v1
70+
cabal configure --enable-tests --enable-benchmarks --disable-documentation
71+
cabal build all --dry-run
72+
73+
74+
- name: Restore cached dependencies
75+
uses: actions/cache/restore@v4
76+
id: cache
10277
env:
103-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
104-
if: ${{ startsWith(github.ref, 'refs/tags/') && matrix.ghc == '9.2.2' }}
78+
key: ${{ runner.os }}${{ matrix.container && '-container-' }}${{matrix.container}}-ghc-${{ steps.setup.outputs.ghc-version }}-cabal-${{ steps.setup.outputs.cabal-version }}
10579
with:
106-
files: threadscope.${{ matrix.os }}.ghc-${{ matrix.ghc }}.gz
107-
draft: false
108-
prerelease: false
109-
build_windows:
110-
if: false # This workflow is currently broken due to C library issues. See: https://github.com/haskell/ThreadScope/issues/135
111-
name: ${{ matrix.os }} / ghc ${{ matrix.ghc }}
112-
runs-on: ${{ matrix.os }}
113-
strategy:
114-
matrix:
115-
ghc:
116-
- "9.8.2"
117-
- "9.6.4"
118-
- "9.4.8"
119-
- "9.2.2"
120-
- "9.0.2"
121-
- "8.10.7"
122-
- "8.8.4"
123-
cabal:
124-
- "3.12.1.0"
125-
os:
126-
- windows-latest
127-
fail-fast: false
128-
steps:
129-
- uses: actions/checkout@v2
130-
- name: Set up Haskell
131-
id: setup-haskell-cabal
132-
uses: haskell-actions/setup@v2
80+
path: ${{ steps.setup.outputs.cabal-store }}
81+
key: ${{ env.key }}-plan-${{ hashFiles('**/plan.json') }}
82+
restore-keys: ${{ env.key }}-
83+
84+
- name: Install dependencies
85+
# If we had an exact cache hit, the dependencies will be up to date.
86+
if: steps.cache.outputs.cache-hit != 'true'
87+
run: cabal build all --only-dependencies
88+
89+
# Cache dependencies already here, so that we do not have to rebuild them should the subsequent steps fail.
90+
- name: Save cached dependencies
91+
uses: actions/cache/save@v4
92+
# If we had an exact cache hit, trying to save the cache would error because of key clash.
93+
if: steps.cache.outputs.cache-hit != 'true'
13394
with:
134-
ghc-version: ${{ matrix.ghc }}
135-
cabal-version: ${{ matrix.cabal }}
136-
- name: Install system dependencies
95+
path: ${{ steps.setup.outputs.cabal-store }}
96+
key: ${{ steps.cache.outputs.cache-primary-key }}
97+
98+
- name: Install system dependencies (Windows)
99+
if: ${{ startsWith(matrix.os, 'windows') }}
137100
uses: msys2/setup-msys2@v2
138101
with:
139102
path-type: inherit
140103
install: >-
141104
mingw-w64-x86_64-pkg-config
142105
mingw-w64-x86_64-gtk2
143-
- name: Cache cabal-store
144-
uses: actions/cache@v2
145-
with:
146-
path: ${{ steps.setup-haskell-cabal.outputs.cabal-store }}
147-
key: ${{ runner.os }}-${{ matrix.ghc }}-cabal
148-
- name: Build Haskell dependencies
149-
run: cabal build -j all --dep
150-
shell: msys2 {0}
151-
- name: Build ThreadScope
106+
107+
- name: Build
108+
run: cabal build all
109+
110+
- name: Run tests
111+
run: cabal test all
112+
113+
- name: Check cabal file
114+
run: cabal check
115+
116+
- name: Build documentation
117+
run:
118+
cabal haddock all --disable-documentation
119+
# --disable-documentation disables building documentation for dependencies.
120+
# The package's own documentation is still built,
121+
# yet contains no links to the documentation of the dependencies.
122+
123+
- name: Create bindist
124+
shell: sh
152125
run: |
153-
cabal build -j all
154-
cp -v $(find -name threadscope.exe) ./threadscope.exe
155-
7z a threadscope.$PLATFORM.ghc-$GHCVER.zip threadscope.exe
156-
shell: msys2 {0}
157-
env:
158-
PLATFORM: ${{ matrix.os }}
159-
GHCVER: ${{ matrix.ghc }}
126+
cabal install --install-method=copy --installdir=dist
127+
BINDIST_NAME=hs-speedscope-ghc-${{matrix.ghc-version}}-${{ matrix.os }}${{ matrix.container && '-' }}${{matrix.container && 'alpine'}}
128+
echo "BINDIST_NAME=$BINDIST_NAME" >> $GITHUB_ENV
129+
tar -czf "$BINDIST_NAME.tar.xz" -C dist hs-speedscope
130+
echo bindist is $BINDIST_NAME.tar.xz
131+
132+
- name: Upload bindist to artifacts
133+
uses: actions/upload-artifact@v4
134+
if: ${{ matrix.ghc-version == env.GHC_FOR_RELEASE }}
135+
with:
136+
name: ${{ env.BINDIST_NAME }}
137+
path: ${{ env.BINDIST_NAME}}.tar.xz
138+
160139
- name: Release
161-
uses: softprops/action-gh-release@v1
162-
env:
163-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
164-
if: ${{ startsWith(github.ref, 'refs/tags/') && matrix.ghc == '9.2.2' }}
140+
uses: softprops/action-gh-release@v2
141+
if: ${{ startsWith(github.ref, 'refs/tags/') && matrix.ghc-version == env.GHC_FOR_RELEASE }}
165142
with:
166-
files: threadscope.${{ matrix.os }}.ghc-${{ matrix.ghc }}.zip
167-
draft: false
168-
prerelease: false
143+
files: ${{ env.BINDIST_NAME }}.tar.xz

0 commit comments

Comments
 (0)