diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml new file mode 100644 index 0000000..0fec246 --- /dev/null +++ b/.github/dependabot.yaml @@ -0,0 +1,12 @@ +{ + "updates": [ + { + "directory": "/", + "package-ecosystem": "github-actions", + "schedule": { + "interval": "weekly" + } + } + ], + "version": 2 +} diff --git a/.github/workflows/workflow.yaml b/.github/workflows/workflow.yaml new file mode 100644 index 0000000..b49432a --- /dev/null +++ b/.github/workflows/workflow.yaml @@ -0,0 +1,219 @@ +{ + "jobs": { + "build": { + "name": "Build on ${{ matrix.platform }} ${{ matrix.version }} with GHC ${{ matrix.ghc }}", + "runs-on": "${{ matrix.platform }}-${{ matrix.version }}", + "steps": [ + { + "uses": "actions/checkout@v4" + }, + { + "run": "mkdir artifact" + }, + { + "id": "haskell", + "uses": "haskell-actions/setup@v2", + "with": { + "ghc-version": "${{ matrix.ghc }}" + } + }, + { + "run": "cabal sdist --output-dir artifact" + }, + { + "run": "cabal configure --enable-optimization=2 --enable-tests --flags=pedantic --jobs" + }, + { + "run": "cat cabal.project.local" + }, + { + "run": "cp cabal.project.local artifact" + }, + { + "run": "cabal freeze" + }, + { + "run": "cat cabal.project.freeze" + }, + { + "run": "cp cabal.project.freeze artifact" + }, + { + "run": "cabal outdated --v2-freeze-file cabal.project.freeze" + }, + { + "uses": "actions/cache@v4", + "with": { + "key": "${{ matrix.platform }}-${{ matrix.version }}-${{ matrix.ghc }}-${{ hashFiles('cabal.project.freeze') }}", + "path": "${{ steps.haskell.outputs.cabal-store }}", + "restore-keys": "${{ matrix.platform }}-${{ matrix.version }}-${{ matrix.ghc }}-" + } + }, + { + "run": "cabal build --only-download" + }, + { + "run": "cabal build --only-dependencies" + }, + { + "run": "cabal build" + }, + { + "run": "tar --create --file artifact.tar --verbose artifact" + }, + { + "uses": "actions/upload-artifact@v4", + "with": { + "name": "imp-${{ github.sha }}-${{ matrix.platform }}-${{ matrix.version }}-${{ matrix.ghc }}", + "path": "artifact.tar" + } + } + ], + "strategy": { + "matrix": { + "include": [ + { + "ghc": "9.8", + "platform": "macos", + "version": 13 + }, + { + "ghc": "9.8", + "platform": "macos", + "version": 14 + }, + { + "ghc": "9.4", + "platform": "ubuntu", + "version": 22.04 + }, + { + "ghc": "9.6", + "platform": "ubuntu", + "version": 22.04 + }, + { + "ghc": "9.8", + "platform": "ubuntu", + "version": 22.04 + }, + { + "ghc": "9.8", + "platform": "windows", + "version": 2022 + } + ] + } + } + }, + "cabal": { + "name": "Cabal", + "runs-on": "ubuntu-22.04", + "steps": [ + { + "uses": "actions/checkout@v4" + }, + { + "run": "cabal check" + } + ] + }, + "gild": { + "name": "Gild", + "runs-on": "ubuntu-22.04", + "steps": [ + { + "uses": "actions/checkout@v4" + }, + { + "uses": "tfausak/cabal-gild-setup-action@v2", + "with": { + "version": "1.3.0.0" + } + }, + { + "run": "cabal-gild --input imp.cabal --mode check" + } + ] + }, + "hlint": { + "name": "HLint", + "runs-on": "ubuntu-22.04", + "steps": [ + { + "uses": "actions/checkout@v4" + }, + { + "uses": "haskell-actions/hlint-setup@v2", + "with": { + "version": 3.8 + } + }, + { + "uses": "haskell-actions/hlint-run@v2", + "with": { + "fail-on": "status" + } + } + ] + }, + "ormolu": { + "name": "Ormolu", + "runs-on": "ubuntu-22.04", + "steps": [ + { + "uses": "actions/checkout@v4" + }, + { + "uses": "haskell-actions/run-ormolu@v15", + "with": { + "version": "0.7.4.0" + } + } + ] + }, + "release": { + "env": { + "PREFIX": "imp-${{ github.event.release.tag_name }}" + }, + "if": "${{ github.event_name == 'release' }}", + "name": "Release", + "needs": "build", + "runs-on": "ubuntu-22.04", + "steps": [ + { + "uses": "actions/download-artifact@v4" + }, + { + "run": "sh -exc 'for d in *; do cd $d; tar --extract --file artifact.tar --verbose; cd ..; done'" + }, + { + "run": "cp imp-${{ github.sha }}-ubuntu-22.04-9.8/artifact/${{ env.PREFIX }}.tar.gz ." + }, + { + "uses": "softprops/action-gh-release@v1", + "with": { + "files": "${{ env.PREFIX }}*.tar.gz" + } + }, + { + "run": "cabal upload --publish --username '${{ secrets.HACKAGE_USERNAME }}' --password '${{ secrets.HACKAGE_PASSWORD }}' ${{ env.PREFIX }}.tar.gz" + } + ] + } + }, + "name": "Workflow", + "on": { + "push": null, + "release": { + "types": [ + "created" + ] + }, + "schedule": [ + { + "cron": "0 0 * * 1" + } + ] + } +}