Skip to content

Commit a31fd9a

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

File tree

1 file changed

+110
-138
lines changed

1 file changed

+110
-138
lines changed

.github/workflows/ci.yml

Lines changed: 110 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -1,168 +1,140 @@
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+
# The windows build is currently broken
22+
# See #135
23+
#- os: windows-latest
24+
# ghc-version: '9.10'
2625
- 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
26+
ghc-version: '9.10'
27+
- os: ubuntu-latest
28+
ghc-version: '9.10'
29+
container: alpine:3.21
30+
31+
runs-on: ${{ matrix.os }}
32+
container: ${{ matrix.container }}
33+
3634
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
49-
- name: Install system dependencies (Linux)
50-
if: runner.os == 'Linux'
35+
- uses: actions/checkout@v4
36+
37+
- name: Install system dependencies (Alpine)
38+
if: ${{ startsWith(matrix.container, 'alpine') }}
39+
shell: sh
40+
run: |
41+
apk add bash curl sudo jq pkgconfig \
42+
zlib-dev zlib-static binutils curl \
43+
gcc g++ gmp-dev libc-dev libffi-dev make \
44+
musl-dev ncurses-dev perl tar xz \
45+
gtk+2.0-dev
46+
47+
- name: Install system dependencies (Ubuntu)
48+
if: runner.os == 'Linux' && !startsWith(matrix.container, 'alpine')
5149
run: sudo apt-get update && sudo apt-get install libgtk2.0-dev
50+
5251
- name: Install system dependencies (macOS)
5352
if: runner.os == 'macOS'
5453
run: brew install cairo gtk+ pkg-config
54+
5555
- name: Set extra cabal build options (macOS)
5656
if: runner.os == 'macOS'
5757
run: echo "CABAL_BUILD_OPTIONS=--constraint='gtk +have-quartz-gtk'" >> $GITHUB_ENV
58-
- name: Build Haskell dependencies
58+
59+
60+
- name: Set up GHC ${{ matrix.ghc-version }}
61+
uses: haskell-actions/setup@v2
62+
id: setup
63+
with:
64+
ghc-version: ${{ matrix.ghc-version }}
65+
66+
- name: Enable static build (only on alpine)
67+
if: ${{ startsWith(matrix.container, 'alpine') }}
5968
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
69+
echo 'executable-static: true' >>cabal.project
70+
echo 'cc-options: -D_Noreturn=' >>cabal.project
71+
72+
- name: Configure the build
6473
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
74+
cabal configure --enable-tests --enable-benchmarks --disable-documentation
75+
cabal build all --dry-run
76+
77+
78+
- name: Restore cached dependencies
79+
uses: actions/cache/restore@v4
80+
id: cache
10281
env:
103-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
104-
if: ${{ startsWith(github.ref, 'refs/tags/') && matrix.ghc == '9.2.2' }}
82+
key: ${{ runner.os }}${{ matrix.container && '-container-' }}${{matrix.container}}-ghc-${{ steps.setup.outputs.ghc-version }}-cabal-${{ steps.setup.outputs.cabal-version }}
10583
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
84+
path: ${{ steps.setup.outputs.cabal-store }}
85+
key: ${{ env.key }}-plan-${{ hashFiles('**/plan.json') }}
86+
restore-keys: ${{ env.key }}-
87+
88+
- name: Install dependencies
89+
# If we had an exact cache hit, the dependencies will be up to date.
90+
if: steps.cache.outputs.cache-hit != 'true'
91+
run: cabal build all --only-dependencies
92+
93+
# Cache dependencies already here, so that we do not have to rebuild them should the subsequent steps fail.
94+
- name: Save cached dependencies
95+
uses: actions/cache/save@v4
96+
# If we had an exact cache hit, trying to save the cache would error because of key clash.
97+
if: steps.cache.outputs.cache-hit != 'true'
13398
with:
134-
ghc-version: ${{ matrix.ghc }}
135-
cabal-version: ${{ matrix.cabal }}
136-
- name: Install system dependencies
99+
path: ${{ steps.setup.outputs.cabal-store }}
100+
key: ${{ steps.cache.outputs.cache-primary-key }}
101+
102+
- name: Install system dependencies (Windows)
103+
if: ${{ startsWith(matrix.os, 'windows') }}
137104
uses: msys2/setup-msys2@v2
138105
with:
139106
path-type: inherit
140107
install: >-
141108
mingw-w64-x86_64-pkg-config
142109
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
110+
111+
- name: Build
112+
run: cabal build all
113+
114+
- name: Run tests
115+
run: cabal test all
116+
117+
- name: Check cabal file
118+
run: cabal check
119+
120+
- name: Create bindist
121+
shell: sh
152122
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 }}
123+
cabal install --install-method=copy --installdir=dist
124+
BINDIST_NAME=threadscope-ghc-${{matrix.ghc-version}}-${{ matrix.os }}${{ matrix.container && '-' }}${{matrix.container && 'alpine'}}
125+
echo "BINDIST_NAME=$BINDIST_NAME" >> $GITHUB_ENV
126+
tar -czf "$BINDIST_NAME.tar.xz" -C dist threadscope
127+
echo bindist is $BINDIST_NAME.tar.xz
128+
129+
- name: Upload bindist to artifacts
130+
uses: actions/upload-artifact@v4
131+
if: ${{ matrix.ghc-version == env.GHC_FOR_RELEASE }}
132+
with:
133+
name: ${{ env.BINDIST_NAME }}
134+
path: ${{ env.BINDIST_NAME}}.tar.xz
135+
160136
- 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' }}
137+
uses: softprops/action-gh-release@v2
138+
if: ${{ startsWith(github.ref, 'refs/tags/') && matrix.ghc-version == env.GHC_FOR_RELEASE }}
165139
with:
166-
files: threadscope.${{ matrix.os }}.ghc-${{ matrix.ghc }}.zip
167-
draft: false
168-
prerelease: false
140+
files: ${{ env.BINDIST_NAME }}.tar.xz

0 commit comments

Comments
 (0)