From 75f87439e203f938d4bc304e6ffb58f749ff829c Mon Sep 17 00:00:00 2001 From: Simon Michael Date: Mon, 25 Apr 2022 00:16:44 -1000 Subject: [PATCH] ci: replace push, pull workflows with main --- .github/workflows/{pull.yml => main.yml} | 148 +++++++------- .github/workflows/push.yml | 241 ----------------------- 2 files changed, 77 insertions(+), 312 deletions(-) rename .github/workflows/{pull.yml => main.yml} (74%) delete mode 100644 .github/workflows/push.yml diff --git a/.github/workflows/pull.yml b/.github/workflows/main.yml similarity index 74% rename from .github/workflows/pull.yml rename to .github/workflows/main.yml index fcba84c41..7036c9f25 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/main.yml @@ -1,46 +1,49 @@ -# Runs after notable pushes to pull requests against master. -# master is configured to require one or more status checks corresponding to -# enabled matrix plans below (shown in github UI as "build (810, ..."). -# So those must pass before the pull request can be merged. -# -# Runs unit/doc/functional/haddock/bench tests and produces optimised dynamic x64 linux binaries, +# The main hledger integration test workflow. +# Builds warning free and runs unit/doc/functional/haddock/bench tests, # using the GHC version(s) enabled below. -# -# This was our first github workflow, and may have the most detailed notes. +# Merging to master requires that this workflow's jobs ("86" at least) have passed. -name: pull request CI +name: main CI +# This workflow runs... on: - # Scheduled workflows run on the latest commit on the default or base branch. (master) + # on master, when manually triggered + workflow_dispatch: + + # on master, on this schedule: # schedule: # - cron: "0 07 * * 0" # sunday midnight pacific + # on these dev branches, when pushed + push: + branches: [ simon, simon2 ] + + # on pull request branches against these branches, when pushed pull_request: branches: [ master ] - paths: - - '.github/workflows/linux.yml' - - 'stack*.yaml' - - 'hledger-lib/**' - - 'hledger/**' - - 'hledger-ui/**' - - 'hledger-web/**' - - 'bin/*.hs' - # ignore changes to example files, though currently some func tests depend on them - - 'examples/**' - - '!**.journal' - - '!**.j' - - '!**.ledger' - - '!**.csv' - # ignore changes to doc source files - - '!**.m4' - - '!**.md' - - '!**.1' - - '!**.5' - - '!**.info' - - '!**.txt' - - # also allow this workflow to be triggered manually - workflow_dispatch: + # Uncomment to run it only for changes to these paths: (but that could prevent merging) + # paths: + # - '.github/workflows/pushpull.yml' + # - 'stack*.yaml' + # - 'hledger-lib/**' + # - 'hledger/**' + # - 'hledger-ui/**' + # - 'hledger-web/**' + # - 'bin/*.hs' + # - 'examples/**' + # Or to ignore certain paths: + # # examples + # - '!**.journal' + # - '!**.j' + # - '!**.ledger' + # - '!**.csv' + # # docs + # - '!**.m4' + # - '!**.md' + # - '!**.1' + # - '!**.5' + # - '!**.info' + # - '!**.txt' jobs: build: @@ -49,11 +52,11 @@ jobs: fail-fast: false matrix: plan: # at least the check(s) required by master should be enabled - - { ghc: "86" , stack: "stack --stack-yaml=stack8.6.yaml" } + - { ghc: "86" , stack: "stack --stack-yaml=stack8.6.yaml" } # oldest supported ghc # - { ghc: "88" , stack: "stack --stack-yaml=stack8.8.yaml" } # - { ghc: "810", stack: "stack --stack-yaml=stack8.10.yaml" } # - { ghc: "90" , stack: "stack --stack-yaml=stack.yaml" } - # - { ghc: "92" , stack: "stack --stack-yaml=stack9.2.yaml" } + # - { ghc: "92" , stack: "stack --stack-yaml=stack9.2.yaml" } # newest supported ghc steps: @@ -61,14 +64,13 @@ jobs: uses: actions/checkout@v2 # have to fetch everything for git describe for --version with: - fetch-depth: 0 + fetch-depth: 0 - name: Print debug output env: GITHUB_CONTEXT: ${{ toJson(github) }} run: | echo $GITHUB_CONTEXT - # echo "$GITHUB_SHA" # echo "$GITHUB_REF" # echo "$GITHUB_HEAD_REF" @@ -124,6 +126,9 @@ jobs: uses: actions/cache@v2 with: path: ~/.stack + # XXX if stack.yaml is a symlink, this fails with + # Error: The template is not valid. .github/workflows/push.yml (Line: 103, Col: 14): hashFiles('**.yaml') failed. + # Fail to hash files under directory '/home/runner/work/hledger/hledger' key: ${{ runner.os }}-stack-global-${{ matrix.plan.ghc }}-${{ hashFiles('**.yaml') }} restore-keys: | ${{ runner.os }}-stack-global-${{ matrix.plan.ghc }} @@ -199,9 +204,7 @@ jobs: env: stack: ${{ matrix.plan.stack }} run: | - df -h $stack setup --install-ghc - df -h if: env.CONTINUE - name: Install haskell deps @@ -209,17 +212,24 @@ jobs: stack: ${{ matrix.plan.stack }} run: | $stack build --test --bench --only-dependencies - # --no-terminal if: env.CONTINUE - - name: Build all hledger modules warning free, optimised and minimised, run unit/doc/bench tests + # - name: Build all hledger modules warning free, optimised and minimised, run unit/doc/bench tests + # env: + # stack: ${{ matrix.plan.stack }} + # run: | + # $stack install --test --bench --force-dirty --ghc-options=-fforce-recomp --ghc-options=-Werror --ghc-options=-split-sections --no-terminal + # # build quicker when tweaking ci: $stack install --ghc-options=-Werror --ghc-options=-split-sections --no-terminal + # # -split-sections shrinks binaries by 30% on average here + # # --pedantic --no-run-benchmarks + # if: env.CONTINUE + + - name: Build all hledger modules fast, warning free, run unit/doc/bench tests env: stack: ${{ matrix.plan.stack }} run: | - $stack install --test --bench --force-dirty --ghc-options=-fforce-recomp --ghc-options=-Werror --ghc-options=-split-sections --no-terminal - # build quicker when tweaking ci: $stack install --ghc-options=-Werror --ghc-options=-split-sections --no-terminal - # -split-sections shrinks binaries by 30% on average here - # --pedantic --no-run-benchmarks + $stack install --fast --force-dirty --ghc-options=-fforce-recomp --ghc-options=-Werror --test --bench + # --ghc-options=-split-sections --no-terminal if: env.CONTINUE - name: Install shelltestrunner @@ -249,32 +259,28 @@ jobs: # --no-print-missing-docs is 600% quieter if: env.CONTINUE - # artifacts: - # XXX unreliable, and we don't need this for every PR; disable for now + # - name: Gather executables + # id: exes + # run: | + # mkdir tmp + # cd tmp + # mkdir hledger + # cd hledger + # cp ~/.local/bin/hledger . + # cp ~/.local/bin/hledger-ui . + # cp ~/.local/bin/hledger-web . + # # how to set a context variable, and an attempt to make a nice artifact version suffix: + # # echo "::set-output name=version::$(git branch --show-current | sed 's/-.*//')-$(git rev-parse --short HEAD)" + # if: env.CONTINUE - - name: Gather executables - id: exes - run: | - mkdir tmp - cd tmp - mkdir hledger - cd hledger - cp ~/.local/bin/hledger . - cp ~/.local/bin/hledger-ui . - cp ~/.local/bin/hledger-web . - # example of setting a context variable, and an attempt to make a nice artifact version suffix. - # But a constant name is easier in some ways. - # echo "::set-output name=version::$(git branch --show-current | sed 's/-.*//')-$(git rev-parse --short HEAD)" - if: env.CONTINUE - - # XXX intermittent upload failures - - name: Upload executables artifact - uses: actions/upload-artifact@v2 - with: - # name: hledger-ubuntu-${{ steps.exes.outputs.version }} - name: hledger-ubuntu - path: tmp/hledger - if: env.CONTINUE + # # XXX intermittent upload failures + # - name: Upload executables artifact + # uses: actions/upload-artifact@v2 + # with: + # # name: hledger-ubuntu-${{ steps.exes.outputs.version }} + # name: hledger-ubuntu + # path: tmp/hledger + # if: env.CONTINUE diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml deleted file mode 100644 index 5d27af671..000000000 --- a/.github/workflows/push.yml +++ /dev/null @@ -1,241 +0,0 @@ -# Runs after notable pushes to the branches listed below. -# master is configured to require one or more status checks corresponding to -# enabled matrix plans below (shown in github UI as "build (810, ..."). -# So the push process is: -# 1. push new commits to a personal test branch listed below (simon) -# 2. this workflow runs, wait for it to succeed, then -# 3. push the same commits to master, which will now allow it. -# -# Builds unoptimised on x64 linux and runs functional tests, -# using the GHC version(s) enabled below. - -name: push CI - -on: - push: - branches: [ simon, simon2 ] - # Run this workflow for changes to any file, even trivial doc fixes - # (since merging to master requires a successful run). - # Ideally caching will keep it relatively cheap; avoid over-pushing. - - # Run this workflow only for changes to these files (to avoid waste): - # paths: - # - '.github/workflows/push.yml' - # - 'stack*.yaml' - # - 'hledger-lib/**' - # - 'hledger/**' - # - 'hledger-ui/**' - # - 'hledger-web/**' - # - 'bin/*.hs' - # - 'examples/**' - # # and ignore these files: (XXX it would still be nice to check the commit messages) - # # examples - # - '!**.journal' - # - '!**.j' - # - '!**.ledger' - # - '!**.csv' - # # docs - # - '!**.m4' - # - '!**.md' - # - '!**.1' - # - '!**.5' - # - '!**.info' - # - '!**.txt' - - # also allow this workflow to be triggered manually - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - plan: # at least the check(s) required by master should be enabled - - { ghc: "86" , stack: "stack --stack-yaml=stack8.6.yaml" } - # - { ghc: "88" , stack: "stack --stack-yaml=stack8.8.yaml" } - # - { ghc: "810", stack: "stack --stack-yaml=stack8.10.yaml" } - # - { ghc: "90" , stack: "stack --stack-yaml=stack.yaml" } - # - { ghc: "92" , stack: "stack --stack-yaml=stack9.2.yaml" } - - steps: - - - name: Check out - uses: actions/checkout@v2 - # have to fetch everything for git describe for --version - with: - fetch-depth: 0 - - # - name: Print debug output - # env: - # GITHUB_CONTEXT: ${{ toJson(github) }} - # run: | - # echo - - # echo "$GITHUB_SHA" - # echo "$GITHUB_REF" - # echo "$GITHUB_HEAD_REF" - # echo "$GITHUB_BASE_REF" - # git log "$GITHUB_BASE_REF".. - # tools/commitlint "$GITHUB_BASE_REF".. - - # keep synced in all workflows which do this - - name: Check commit messages - # For a PR, the range will be: master..origin/$GITHUB_HEAD_REF - # For a push it will be: $BEFORE.. - # For a force push, BEFORE is the previous HEAD, and on github (though not locally) this is an "invalid revision range". - # In this and any case where the range is invalid, we'll just skip the check, to avoid false positives - # related: https://stackoverflow.com/questions/64708371/how-to-run-github-workflow-on-every-commit-of-a-push - env: - BEFORE: ${{ github.event.before }} - # NUM: 5 - shell: bash - run: | - RANGE=${BEFORE:-origin/master}..${GITHUB_HEAD_REF:-} - - echo "debug: last 10 commits:" - echo "$(git log --format='%h -%d %s (%an, %ci)' -10)" - echo "debug: origin/master:" - echo "$(git log --format='%h -%d %s (%an, %ci)' -1 origin/master)" - echo "debug: BEFORE=$BEFORE" - echo "$(git log --format='%h -%d %s (%an, %ci)' -1 $BEFORE)" - echo "debug: GITHUB_HEAD_REF=$GITHUB_HEAD_REF" - echo "$(git log --format='%h -%d %s (%an, %ci)' -1 $GITHUB_HEAD_REF)" - echo "debug: RANGE=$RANGE" - echo "debug: commits to check:" - echo "$(git log --format='%h -%d %s (%an, %ci)' --abbrev-commit --date=relative --date-order $RANGE)" - - if git rev-list --quiet $RANGE - then tools/commitlint $RANGE - else echo "could not identify commits, not checking them" - fi - - - name: Skip remaining steps if last commit message begins with ; - shell: bash - run: | - echo "git log -1 --pretty='%s' ${GITHUB_HEAD_REF:+origin/$GITHUB_HEAD_REF} >> $$.gitlog" - (git log -1 --pretty='%s' ${GITHUB_HEAD_REF:+origin/$GITHUB_HEAD_REF} >> $$.gitlog \ - && (grep -qE '^ *;' $$.gitlog || echo "CONTINUE=true" >> $GITHUB_ENV)) \ - || ( echo "could not identify commit range, continuing CI steps"; echo "CONTINUE=true" >> $GITHUB_ENV ) - - # things to be cached/restored: - - - name: Cache stack global package db - id: stack-global - uses: actions/cache@v2 - with: - path: ~/.stack - # XXX if stack.yaml is a symlink, this fails with - # Error: The template is not valid. .github/workflows/push.yml (Line: 103, Col: 14): hashFiles('**.yaml') failed. - # Fail to hash files under directory '/home/runner/work/hledger/hledger' - key: ${{ runner.os }}-stack-global-${{ matrix.plan.ghc }}-${{ hashFiles('**.yaml') }} - restore-keys: | - ${{ runner.os }}-stack-global-${{ matrix.plan.ghc }} - if: env.CONTINUE - - - name: Cache stack-installed programs in ~/.local/bin - id: stack-programs - uses: actions/cache@v2 - with: - path: ~/.local/bin - key: ${{ runner.os }}-stack-programs-${{ matrix.plan.ghc }}-${{ hashFiles('**.yaml') }} - restore-keys: | - ${{ runner.os }}-stack-programs-${{ matrix.plan.ghc }} - if: env.CONTINUE - - - name: Cache .stack-work - uses: actions/cache@v2 - with: - path: .stack-work - key: ${{ runner.os }}-stack-work-${{ matrix.plan.ghc }}-${{ hashFiles('**.yaml') }} - restore-keys: | - ${{ runner.os }}-stack-work-${{ matrix.plan.ghc }} - if: env.CONTINUE - - - name: Cache hledger-lib/.stack-work - uses: actions/cache@v2 - with: - path: hledger-lib/.stack-work - key: ${{ runner.os }}-hledger-lib-stack-work-${{ matrix.plan.ghc }}-${{ hashFiles('hledger-lib/package.yaml') }} - restore-keys: | - ${{ runner.os }}-hledger-lib-stack-work-${{ matrix.plan.ghc }} - if: env.CONTINUE - - - name: Cache hledger/.stack-work - uses: actions/cache@v2 - with: - path: hledger/.stack-work - key: ${{ runner.os }}-hledger-stack-work-${{ matrix.plan.ghc }}-${{ hashFiles('hledger/package.yaml') }} - restore-keys: | - ${{ runner.os }}-hledger-stack-work-${{ matrix.plan.ghc }} - if: env.CONTINUE - - - name: Cache hledger-ui/.stack-work - uses: actions/cache@v2 - with: - path: hledger-ui/.stack-work - key: ${{ runner.os }}-hledger-ui-stack-work-${{ matrix.plan.ghc }}-${{ hashFiles('hledger-ui/package.yaml') }} - restore-keys: | - ${{ runner.os }}-hledger-ui-stack-work-${{ matrix.plan.ghc }} - if: env.CONTINUE - - - name: Cache hledger-web/.stack-work - uses: actions/cache@v2 - with: - path: hledger-web/.stack-work - key: ${{ runner.os }}-hledger-web-stack-work-${{ matrix.plan.ghc }}-${{ hashFiles('hledger-web/package.yaml') }} - restore-keys: | - ${{ runner.os }}-hledger-web-stack-work-${{ matrix.plan.ghc }} - if: env.CONTINUE - - # actions: - - - name: Install stack - run: | - mkdir -p ~/.local/bin - export PATH=~/.local/bin:$PATH - # curl -sL https://get.haskellstack.org/stable/linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C ~/.local/bin '*/stack'; chmod a+x ~/.local/bin/stack - if [[ ! -x ~/.local/bin/stack ]]; then curl -sL https://get.haskellstack.org/stable/linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C ~/.local/bin '*/stack'; chmod a+x ~/.local/bin/stack; fi - stack --version - if: env.CONTINUE - - - name: Install GHC - env: - stack: ${{ matrix.plan.stack }} - run: | - $stack setup --install-ghc - if: env.CONTINUE - - - name: Install haskell deps - env: - stack: ${{ matrix.plan.stack }} - run: | - $stack build --only-dependencies - if: env.CONTINUE - - - name: Build hledger fast - env: - stack: ${{ matrix.plan.stack }} - run: | - $stack build --fast --ghc-options=-Werror --force-dirty - # --ghc-options=-fforce-recomp # needed occasionally to clear out stale compiled modules - # --pedantic - if: env.CONTINUE - - - name: Install shelltestrunner - env: - stack: ${{ matrix.plan.stack }} - run: | - export PATH=~/.local/bin:$PATH - if [[ ! -x ~/.local/bin/shelltest ]]; then $stack install shelltestrunner-1.9; fi - shelltest --version - if: env.CONTINUE - - - name: Test functional tests (excluding addons) - env: - stack: ${{ matrix.plan.stack }} - run: | - export PATH=~/.local/bin:$PATH - COLUMNS=80 $stack exec -- shelltest --execdir -j16 hledger/test -x /_ -x /addons # bin - # XXX func tests in bin are run only with GHC 8.2 for now - if: env.CONTINUE