Skip to content

Commit bff5d7e

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

File tree

1 file changed

+114
-138
lines changed

1 file changed

+114
-138
lines changed

.github/workflows/ci.yml

Lines changed: 114 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -1,168 +1,144 @@
11
name: CI
22
on:
3-
- pull_request
43
- push
4+
- branches:
5+
- master
6+
- tags:
7+
- v*
8+
- pull_request
9+
- release
10+
11+
env:
12+
GHC_FOR_RELEASE: "9.10"
13+
514
jobs:
6-
build_posix:
7-
name: ${{ matrix.os }} / ghc ${{ matrix.ghc }}
8-
runs-on: ${{ matrix.os }}
15+
build:
16+
name: GHC ${{ matrix.ghc-version }} on ${{ matrix.os }} ${{matrix.container}}
917
strategy:
18+
fail-fast: false
1019
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
20+
os: [ubuntu-latest]
21+
ghc-version: ['9.12', '9.10', '9.8', '9.6', '9.4', '9.2']
22+
container: ['']
23+
2524
include:
25+
# The windows build is currently broken
26+
# See #135
27+
#- os: windows-latest
28+
# ghc-version: '9.10'
2629
- 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
30+
ghc-version: '9.10'
31+
- os: ubuntu-latest
32+
ghc-version: '9.10'
33+
container: alpine:3.21
34+
35+
runs-on: ${{ matrix.os }}
36+
container: ${{ matrix.container }}
37+
3638
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'
39+
- uses: actions/checkout@v4
40+
41+
- name: Install system dependencies (Alpine)
42+
if: ${{ startsWith(matrix.container, 'alpine') }}
43+
shell: sh
44+
run: |
45+
apk add bash curl sudo jq pkgconfig \
46+
zlib-dev zlib-static binutils curl \
47+
gcc g++ gmp-dev libc-dev libffi-dev make \
48+
musl-dev ncurses-dev perl tar xz \
49+
gtk+2.0-dev
50+
51+
- name: Install system dependencies (Ubuntu)
52+
if: runner.os == 'Linux' && !startsWith(matrix.container, 'alpine')
5153
run: sudo apt-get update && sudo apt-get install libgtk2.0-dev
54+
5255
- name: Install system dependencies (macOS)
5356
if: runner.os == 'macOS'
5457
run: brew install cairo gtk+ pkg-config
58+
5559
- name: Set extra cabal build options (macOS)
5660
if: runner.os == 'macOS'
5761
run: echo "CABAL_BUILD_OPTIONS=--constraint='gtk +have-quartz-gtk'" >> $GITHUB_ENV
58-
- name: Build Haskell dependencies
62+
63+
64+
- name: Set up GHC ${{ matrix.ghc-version }}
65+
uses: haskell-actions/setup@v2
66+
id: setup
67+
with:
68+
ghc-version: ${{ matrix.ghc-version }}
69+
70+
- name: Enable static build (only on alpine)
71+
if: ${{ startsWith(matrix.container, 'alpine') }}
5972
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
73+
echo 'executable-static: true' >>cabal.project
74+
echo 'cc-options: -D_Noreturn=' >>cabal.project
75+
76+
- name: Configure the build
6477
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
78+
cabal configure --enable-tests --enable-benchmarks --disable-documentation
79+
cabal build all --dry-run
80+
81+
82+
- name: Restore cached dependencies
83+
uses: actions/cache/restore@v4
84+
id: cache
10285
env:
103-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
104-
if: ${{ startsWith(github.ref, 'refs/tags/') && matrix.ghc == '9.2.2' }}
86+
key: ${{ runner.os }}${{ matrix.container && '-container-' }}${{matrix.container}}-ghc-${{ steps.setup.outputs.ghc-version }}-cabal-${{ steps.setup.outputs.cabal-version }}
10587
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
88+
path: ${{ steps.setup.outputs.cabal-store }}
89+
key: ${{ env.key }}-plan-${{ hashFiles('**/plan.json') }}
90+
restore-keys: ${{ env.key }}-
91+
92+
- name: Install dependencies
93+
# If we had an exact cache hit, the dependencies will be up to date.
94+
if: steps.cache.outputs.cache-hit != 'true'
95+
run: cabal build all --only-dependencies
96+
97+
# Cache dependencies already here, so that we do not have to rebuild them should the subsequent steps fail.
98+
- name: Save cached dependencies
99+
uses: actions/cache/save@v4
100+
# If we had an exact cache hit, trying to save the cache would error because of key clash.
101+
if: steps.cache.outputs.cache-hit != 'true'
133102
with:
134-
ghc-version: ${{ matrix.ghc }}
135-
cabal-version: ${{ matrix.cabal }}
136-
- name: Install system dependencies
103+
path: ${{ steps.setup.outputs.cabal-store }}
104+
key: ${{ steps.cache.outputs.cache-primary-key }}
105+
106+
- name: Install system dependencies (Windows)
107+
if: ${{ startsWith(matrix.os, 'windows') }}
137108
uses: msys2/setup-msys2@v2
138109
with:
139110
path-type: inherit
140111
install: >-
141112
mingw-w64-x86_64-pkg-config
142113
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
114+
115+
- name: Build
116+
run: cabal build all
117+
118+
- name: Run tests
119+
run: cabal test all
120+
121+
- name: Check cabal file
122+
run: cabal check
123+
124+
- name: Create bindist
125+
shell: sh
152126
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 }}
127+
cabal install --install-method=copy --installdir=dist
128+
BINDIST_NAME=threadscope-ghc-${{matrix.ghc-version}}-${{ matrix.os }}${{ matrix.container && '-' }}${{matrix.container && 'alpine'}}
129+
echo "BINDIST_NAME=$BINDIST_NAME" >> $GITHUB_ENV
130+
tar -czf "$BINDIST_NAME.tar.xz" -C dist threadscope
131+
echo bindist is $BINDIST_NAME.tar.xz
132+
133+
- name: Upload bindist to artifacts
134+
uses: actions/upload-artifact@v4
135+
if: ${{ matrix.ghc-version == env.GHC_FOR_RELEASE }}
136+
with:
137+
name: ${{ env.BINDIST_NAME }}
138+
path: ${{ env.BINDIST_NAME}}.tar.xz
139+
160140
- 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' }}
141+
uses: softprops/action-gh-release@v2
142+
if: ${{ startsWith(github.ref, 'refs/tags/') && matrix.ghc-version == env.GHC_FOR_RELEASE }}
165143
with:
166-
files: threadscope.${{ matrix.os }}.ghc-${{ matrix.ghc }}.zip
167-
draft: false
168-
prerelease: false
144+
files: ${{ env.BINDIST_NAME }}.tar.xz

0 commit comments

Comments
 (0)