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@v5As 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' || '' }} --pedanticAs 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 |
color |
Whether to force |
false |
true |
stack-arguments |
Additional arguments for all top-level |
false |
"" |
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.infoDoing 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.
To trigger a release (and update the @v{major} tag), merge a commit to main
that follows Conventional Commits. In short,
fix:to trigger a patch release,feat:for minor, andfeat!:and major
We don't enforce conventional commits generally (though you are free do so), it's only required if you want to trigger release.