GitHub Action to build and test a stack-based Haskell project.
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: freckle/stack-action@v5
As of version 5, the single stack-arguments
input has been broken up into
various, distinct stack-[*-]arguments[-*]
inputs that are used in more
specific ways. See the Inputs section, or action.yml
for documentation of
the new options.
The fast
and pedantic
inputs were removed. Use a ternary operator (see
Operators)
to pass a flag conditionally. Example:
stack-build-arguments: ${{ github.ref_name != 'main' && '--fast' || '' }} --pedantic
As of version 4, this action automatically handles caching. You do not need to
use a separate stack-cache-action
step any more.
Previous versions of this Action ran HLint and Weeder for you. We recommend
doing that as separate actions now, so, as of v3
, those options have been
removed.
Here is an example of running separate Actions:
jobs:
test:
# ...
steps:
- uses: actions/checkout@v4
- id: stack
uses: freckle/stack-action@v5
# Weeder requires running in the same Job (to access .hie artifacts)
- uses: freckle/weeder-action@v2
with:
ghc-version: ${{ steps.stack.outputs.compiler-version }}
# HLint can be a distinct Job, possibly limited to changed files
hlint:
# ...
steps:
- uses: actions/checkout@v4
- uses: haskell-actions/hlint-setup@v1
- uses: haskell-actions/hlint-run@v2
name | description | required | default |
---|---|---|---|
working-directory |
Working directory for run commands |
false |
"" |
test |
Whether to run tests |
false |
true |
stack-arguments |
Additional arguments for all top-level |
false |
--no-terminal |
stack-query-arguments |
Additional arguments in |
false |
"" |
stack-path-arguments |
Additional arguments in |
false |
"" |
stack-setup-arguments |
Additional arguments in |
false |
"" |
stack-build-arguments |
Additional arguments for all |
false |
--fast --pedantic |
stack-build-arguments-dependencies |
Additional arguments passed after |
false |
"" |
stack-build-arguments-build |
Additional arguments passed after |
false |
"" |
stack-build-arguments-test |
Additional arguments passed after |
false |
"" |
cache-prefix |
Prefix applied to all cache keys. This can be any value you like, but teams often use |
false |
"" |
cache-save-always |
Save artifacts to the cache even if the build fails. This may speed up builds in subsequent runs at the expense of slightly-longer builds when a full cache-hit occurs. Since |
false |
false |
on-dirty-files |
What to do if we find changes to the cabal or lock file after a build. Value can be |
false |
warn |
install-stack |
Install stack, if necessary |
false |
true |
upgrade-stack |
Upgrade stack |
false |
true |
compiler-tools |
A list of packages to install as compiler tools, one per line. This is useful to do here rather than separate |
false |
"" |
stack-yaml |
Deprecated use |
false |
"" |
name | description |
---|---|
compiler |
|
compiler-version |
The GHC version part of compiler |
snapshot-doc-root |
|
local-doc-root |
|
local-hoogle-root |
|
stack-root |
|
project-root |
|
config-location |
|
bin-path |
|
programs |
|
compiler-exe |
|
compiler-bin |
|
compiler-tools-bin |
|
local-bin |
|
extra-include-dirs |
|
extra-library-dirs |
|
snapshot-pkg-db |
|
local-pkg-db |
|
global-pkg-db |
|
ghc-package-path |
|
snapshot-install-root |
|
local-install-root |
|
dist-dir |
|
local-hpc-root |
|
The compiler-tools
input can be used to install packages (with
--copy-compiler-tool
) as part of the Dependencies step. The installed tools
can be used by other parts of the build via stack exec
, such as to reformat
and upload coverage:
- id: stack
uses: freckle/stack-action@v5
with:
compiler-tools: hpc-lcov
stack-build-arguments: --coverage
- run: stack --no-terminal exec -- hpc-lcov --file "$HPC_ROOT"/combined/all/all.tix
env:
HPC_ROOT: ${{ steps.stack.outputs.local-hpc-root }}
- uses: codecov/codecov-action@v2
with:
files: ./lcov.info
Doing it this way, vs a separate run: stack install...
, means the building of
these tools will be included in the dependencies cache.
The following automatically discovers all files matching stack*.yaml
and runs
this action with each of them:
jobs:
generate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- id: generate
uses: freckle/stack-action/generate-matrix@v5
outputs:
stack-yamls: ${{ steps.generate.outputs.stack-yamls }}
test:
needs: generate
strategy:
matrix:
stack-yaml: ${{ fromJSON(needs.generate.outputs.stack-yamls) }}
fail-fast: false
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: freckle/stack-action@v5
with:
stack-arguments: --stack-yaml ${{ matrix.stack-yaml }}
See generate-matrix/action.yml for more details. This has been available since version 4 of this action.