From 19a2bbcdfb3cbf2459df58a110806c82a28b175d Mon Sep 17 00:00:00 2001 From: Alexey Kuleshevich <alexey@kuleshevi.ch> Date: Sat, 14 Dec 2024 08:18:44 -0700 Subject: [PATCH] WIP CI --- .github/workflows/haskell.yml | 212 ++++++++++++------ stack-extra-deps.yaml => stack.ghc-8.4.4.yaml | 2 +- stack.ghc-8.6.5.yaml | 15 ++ stack.ghc-8.8.4.yaml | 15 ++ 4 files changed, 176 insertions(+), 68 deletions(-) rename stack-extra-deps.yaml => stack.ghc-8.4.4.yaml (98%) create mode 100644 stack.ghc-8.6.5.yaml create mode 100644 stack.ghc-8.8.4.yaml diff --git a/.github/workflows/haskell.yml b/.github/workflows/haskell.yml index 914fff4..9e275f2 100644 --- a/.github/workflows/haskell.yml +++ b/.github/workflows/haskell.yml @@ -1,119 +1,197 @@ -name: Color-CI +name: CI on: push: - branches: [ '*' ] + branches: [ "master", "release/**" ] pull_request: - branches: [ master ] + branches: [ "**" ] + schedule: + - cron: "0 5 * * 5" defaults: { run: { shell: bash } } +# Cancel running workflows when a new workflow on the same PR or branch is started, +# but put scheduled workflows into their own group +concurrency: + group: ${{ + format('{0}-{1}{2}', + github.workflow, + github.event.pull_request.number || github.ref, + github.event_name == 'schedule' && '-scheduled' || '')}} + cancel-in-progress: true + jobs: - build: - name: CI + test-with-stack: + name: Stack runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: - os: [ubuntu-latest] - # resolver: [nightly -- disabled for now, some issue with installing ghc - resolver: [lts-20, lts-19, lts-18, lts-16, lts-14, lts-12] + os: [ubuntu-latest, macOS-latest, windows-latest] + resolver: [lts-12, lts-14, lts-16, lts-18, lts-19, lts-20, lts-21, lts-22, nightly] include: - - resolver: lts-12 + - resolver: lts-14 ghc: 8.4.4 - stack-yaml: stack-extra-deps.yaml - resolver: lts-14 - stack-yaml: stack-coveralls.yaml + ghc: 8.6.5 - resolver: lts-16 ghc: 8.8.4 - resolver: lts-18 - - # Latest stable for MacOS: ghc-8.8.4 - - resolver: lts-16 - os: macos-latest + ghc: 8.10.7 - resolver: lts-19 - os: macos-latest + ghc: 9.0.2 - resolver: lts-20 - os: macos-latest - # Latest stable for Windows: ghc-8.6.4 + ghc: 9.2.8 + - resolver: lts-21 + ghc: 9.4.8 + stack-yaml: stack-coveralls.yaml + - resolver: lts-22 + ghc: 9.6.6 + - resolver: nightly + ghc: 9.8.2 + stack-yaml: stack.yaml + exclude: + # Newer MacOS does not support older GHC: - resolver: lts-14 - os: windows-latest + os: macOS-latest + - resolver: lts-16 + os: macOS-latest + - resolver: lts-18 + os: macOS-latest - resolver: lts-19 - os: windows-latest - - resolver: lts-20 - os: windows-latest + os: macOS-latest env: - STACK_YAML: stack.yaml - STACK_ARGS: '--resolver ${{ matrix.resolver }}' - cache-version: v5 # bump up this version to invalidate currently stored cache + STACK_YAML: ${{ matrix.stack-yaml || matrix.ghc != '' && format('stack.ghc-{0}.yaml', matrix.ghc) || 'stack.yaml' }} + STACK_ARGS: '--resolver ${{ matrix.resolver }} --system-ghc' + cache-version: v0 # bump up this version to invalidate currently stored cache steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 + + - uses: haskell-actions/setup@v2 + id: setup-haskell-cabal + name: Setup Haskell + with: + ghc-version: ${{ matrix.ghc }} + enable-stack: true + stack-version: 'latest' + cabal-version: 'latest' - name: Cache id: cache - uses: actions/cache@v2 - if: matrix.os != 'macos-latest' + uses: actions/cache@v4 with: path: | - ~/.stack + ${{ steps.setup-haskell-cabal.outputs.stack-root }} .stack-work - Color/.stack-work key: ${{ runner.os }}-${{ matrix.resolver }}-${{ env.cache-version }} restore-keys: | ${{ runner.os }}-${{ matrix.resolver }}-${{ env.cache-version }} - - name: Cache - id: cache-macos - uses: actions/cache@v2 - if: matrix.os == 'macos-latest' - with: - path: | - ~/.stack - key: ${{ runner.os }}-${{ matrix.resolver }}-${{ env.cache-version }} - restore-keys: | - ${{ runner.os }}-${{ matrix.resolver }}-${{ env.cache-version }} - - name: Workaround setup-exe-cache failure on macos - if: steps.cache-macos.outputs.cache-hit == 'true' && matrix.os == 'macos-latest' - run: | - rm -r ~/.stack/setup-exe-cache - name: Windows Cache id: cache-windows - uses: actions/cache@v2 + uses: actions/cache@v4 if: matrix.os == 'windows-latest' with: path: | - C:\\Users\\RUNNER~1\\AppData\\Roaming\\stack C:\\Users\\RUNNER~1\\AppData\\Local\\Programs\\stack key: ${{ runner.os }}-${{ matrix.resolver }}-programs-${{ env.cache-version }} restore-keys: | ${{ runner.os }}-${{ matrix.resolver }}-programs-${{ env.cache-version }} - - - name: Ubuntu install GHC - if: matrix.ghc != '' && matrix.os == 'ubuntu-latest' + - name: Reset modtime run: | - sudo add-apt-repository ppa:hvr/ghc -y - sudo apt-get update - sudo apt-get install ghc-${{ matrix.ghc }} - - name: Install Stack and local GHC + set -ex + curl -sSL https://raw.githubusercontent.com/lehins/utils/master/haskell/git-modtime/git-modtime.hs -o git-modtime.hs + runhaskell -- git-modtime.hs -f .stack-work-root/tree-contents.txt + - name: Build run: | set -ex - curl -sSL https://get.haskellstack.org/ | sh -s - -f - curl -sSL https://raw.githubusercontent.com/lehins/utils/786c3fe7e9e1345d7b403019f52e344627224edf/haskell/git-modtime/git-modtime.hs -o git-modtime.hs - [ -n "${{ matrix.ghc }}" ] && [ "${{ matrix.os }}" == "ubuntu-latest" ] && STACK_ARGS="$STACK_ARGS --system-ghc" - [ -n "${{ matrix.stack-yaml }}" ] && STACK_YAML=${{ matrix.stack-yaml }} - stack $STACK_ARGS runghc git-modtime.hs - - name: Tests + stack $STACK_ARGS test --no-run-tests --haddock --no-haddock-deps + - name: Test env: - COVERALLS_TOKEN: ${{ secrets.COVERALLS_TOKEN }} + COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} run: | set -ex - [ -n "${{ matrix.ghc }}" ] && [ "${{ matrix.os }}" == "ubuntu-latest" ] && STACK_ARGS="$STACK_ARGS --system-ghc" - [ -n "${{ matrix.stack-yaml }}" ] && STACK_YAML=${{ matrix.stack-yaml }} - if [ "${{ matrix.os }}.${{ matrix.resolver }}" == "ubuntu-latest.lts-14" ] && [ -n "${COVERALLS_TOKEN}" ]; then - stack $STACK_ARGS test Color:tests --coverage --haddock --no-haddock-deps + if [ "${{ matrix.os }}.${{ matrix.resolver }}" == "ubuntu-latest.lts-21" ] && [ -n "${COVERALLS_REPO_TOKEN}" ]; then + stack $STACK_ARGS test --coverage stack $STACK_ARGS hpc report --all - curl -L https://github.com/rubik/stack-hpc-coveralls/releases/download/v0.0.6.1/shc-linux-x64-8.8.4.tar.bz2 | tar xj shc - ./shc --repo-token="$COVERALLS_TOKEN" --partial-coverage --fetch-coverage combined custom + curl -L https://github.com/rubik/stack-hpc-coveralls/releases/download/v0.0.7.0/shc-Linux-X64.tar.bz2 | tar xj shc + ./shc --repo-token="$COVERALLS_REPO_TOKEN" --partial-coverage --fetch-coverage combined custom else - stack $STACK_ARGS test Color:tests Color:doctests --bench --no-run-benchmarks --haddock --no-haddock-deps + stack $STACK_ARGS test fi + + test-with-cabal: + name: Cabal + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - { cabal: "3.12", os: ubuntu-latest, ghc: "8.0.2" } + - { cabal: "3.12", os: ubuntu-latest, ghc: "8.2.2" } + - { cabal: "3.12", os: ubuntu-latest, ghc: "8.4.4" } + - { cabal: "3.12", os: ubuntu-latest, ghc: "8.6.5" } + - { cabal: "3.12", os: ubuntu-latest, ghc: "8.8.4" } + - { cabal: "3.12", os: ubuntu-latest, ghc: "8.10.7" } + - { cabal: "3.12", os: ubuntu-latest, ghc: "9.0.2" } + - { cabal: "3.12", os: ubuntu-latest, ghc: "9.2.8" } + - { cabal: "3.12", os: ubuntu-latest, ghc: "9.4.8" } + - { cabal: "3.12", os: ubuntu-latest, ghc: "9.6.6" } + - { cabal: "3.12", os: ubuntu-latest, ghc: "9.8.2" } + - { cabal: "3.12", os: ubuntu-latest, ghc: "9.10.1" } + - { cabal: "3.12", os: windows-latest, ghc: "9.0.2" } + - { cabal: "3.12", os: windows-latest, ghc: "9.2.8" } + - { cabal: "3.12", os: windows-latest, ghc: "9.4.8" } + - { cabal: "3.12", os: windows-latest, ghc: "9.6.6" } + - { cabal: "3.12", os: windows-latest, ghc: "9.8.2" } + - { cabal: "3.12", os: windows-latest, ghc: "9.10.1" } + - { cabal: "3.12", os: macOS-13, ghc: "9.0.2" } + - { cabal: "3.12", os: macOS-latest, ghc: "9.2.8" } + - { cabal: "3.12", os: macOS-latest, ghc: "9.4.8" } + - { cabal: "3.12", os: macOS-latest, ghc: "9.6.6" } + - { cabal: "3.12", os: macOS-latest, ghc: "9.8.2" } + - { cabal: "3.12", os: macOS-latest, ghc: "9.10.1" } + + env: + cache-version: v0 # bump up this version to invalidate currently stored cache + steps: + - uses: actions/checkout@v4 + - uses: haskell-actions/setup@v2 + id: setup-haskell-cabal + name: Setup Haskell + with: + ghc-version: ${{ matrix.ghc }} + cabal-version: ${{ matrix.cabal }} + + - name: Cache Cabal Store + id: cache + uses: actions/cache@v4 + with: + path: | + ${{ steps.setup-haskell-cabal.outputs.cabal-store }} + dist-newstyle + key: cabal-${{ runner.os }}-${{ matrix.ghc }}-${{ env.cache-version }} + restore-keys: | + cabal-${{ runner.os }}-${{ matrix.ghc }}-${{ env.cache-version }} + - name: Build + run: | + set -ex + cabal configure --haddock-all --enable-tests --enable-benchmarks + cabal build all --write-ghc-environment-files=always + - name: Test + run: | + set -ex + cabal test all + - name: Doctest + # older ghc versions do not like some haddock examples + # linker on MacOS-13 complains too + # windows as always results in non-deterministic nonsense, so it will likely get disabled soon too. + # if: contains(fromJSON('["8.6.5", "8.8.4", "8.10.7", "9.0.2"]'), matrix.ghc) != true && matrix.os != 'macOS-13' + run: | + set -ex + cabal install doctest --ignore-project --overwrite-policy=always + cabal repl --build-depends=QuickCheck --with-compiler=doctest --repl-options='-w -Wdefault' + - name: Check Cabal Files + run: | + set -ex + cabal -vnormal check diff --git a/stack-extra-deps.yaml b/stack.ghc-8.4.4.yaml similarity index 98% rename from stack-extra-deps.yaml rename to stack.ghc-8.4.4.yaml index d68fce7..5f1cb8d 100644 --- a/stack-extra-deps.yaml +++ b/stack.ghc-8.4.4.yaml @@ -1,4 +1,4 @@ -resolver: lts-13.30 +resolver: lts-12.26 packages: - Color extra-deps: diff --git a/stack.ghc-8.6.5.yaml b/stack.ghc-8.6.5.yaml new file mode 100644 index 0000000..5f1cb8d --- /dev/null +++ b/stack.ghc-8.6.5.yaml @@ -0,0 +1,15 @@ +resolver: lts-12.26 +packages: +- Color +extra-deps: +- JuicyPixels-3.3.5@sha256:5c67dc066d67f5045221a8202f701f4c77eab8220f44414c00fadcdc3e4f872b,3911 +- QuickCheck-2.13.2@sha256:ad4e5adbd1c9dc0221a44307b992cb040c515f31095182e47aa7e974bc461df1,6952 +- splitmix-0.0.3@sha256:455de9326ae5bbe5492cbb140fefb04cf988501e25b204dabaf755ab67400d9d,4835 +- cabal-doctest-1.0.8@sha256:34dff6369d417df2699af4e15f06bc181d495eca9c51efde173deae2053c197c,1491 +- doctest-0.16.2@sha256:2f96e9bbe9aee11b47453c82c24b3dc76cdbb8a2a7c984dfd60b4906d08adf68,6942 +- hspec-core-2.7.1@sha256:2696420050bafb1b690366b2c0ca8595a27c4597811df036f0c35cf19f46862b,4583 +- hspec-2.7.1@sha256:0aa48928ce80a34f8ff8c5ef114bb6807edfb8d884bcd7211eceed710e7fb7a8,1769 +- hspec-discover-2.7.1@sha256:e8ce36741c06b41de58069814a7d3b7314bdeaab35ae573e3c924739011e0c29,2243 +- massiv-test-0.1.2@sha256:93df921acadb56f81b35d3117e020e485b3b26c28a99e2053544878c92de2fcb,3859 +- massiv-0.4.5.0@sha256:a0e16ef4503c642cff1bbf686f1c89e87ac3bb6755f4d975ff8b5b8fc27b61db,4611 +- scheduler-1.4.2.1@sha256:26fb16ccf5f41ee9144f8c77a5228163968543ae5cc8242c761e69ff8f579e07,2863 diff --git a/stack.ghc-8.8.4.yaml b/stack.ghc-8.8.4.yaml new file mode 100644 index 0000000..5f1cb8d --- /dev/null +++ b/stack.ghc-8.8.4.yaml @@ -0,0 +1,15 @@ +resolver: lts-12.26 +packages: +- Color +extra-deps: +- JuicyPixels-3.3.5@sha256:5c67dc066d67f5045221a8202f701f4c77eab8220f44414c00fadcdc3e4f872b,3911 +- QuickCheck-2.13.2@sha256:ad4e5adbd1c9dc0221a44307b992cb040c515f31095182e47aa7e974bc461df1,6952 +- splitmix-0.0.3@sha256:455de9326ae5bbe5492cbb140fefb04cf988501e25b204dabaf755ab67400d9d,4835 +- cabal-doctest-1.0.8@sha256:34dff6369d417df2699af4e15f06bc181d495eca9c51efde173deae2053c197c,1491 +- doctest-0.16.2@sha256:2f96e9bbe9aee11b47453c82c24b3dc76cdbb8a2a7c984dfd60b4906d08adf68,6942 +- hspec-core-2.7.1@sha256:2696420050bafb1b690366b2c0ca8595a27c4597811df036f0c35cf19f46862b,4583 +- hspec-2.7.1@sha256:0aa48928ce80a34f8ff8c5ef114bb6807edfb8d884bcd7211eceed710e7fb7a8,1769 +- hspec-discover-2.7.1@sha256:e8ce36741c06b41de58069814a7d3b7314bdeaab35ae573e3c924739011e0c29,2243 +- massiv-test-0.1.2@sha256:93df921acadb56f81b35d3117e020e485b3b26c28a99e2053544878c92de2fcb,3859 +- massiv-0.4.5.0@sha256:a0e16ef4503c642cff1bbf686f1c89e87ac3bb6755f4d975ff8b5b8fc27b61db,4611 +- scheduler-1.4.2.1@sha256:26fb16ccf5f41ee9144f8c77a5228163968543ae5cc8242c761e69ff8f579e07,2863