Skip to content

Bump fourmolu/fourmolu-action from 10 to 11 (#35) #67

Bump fourmolu/fourmolu-action from 10 to 11 (#35)

Bump fourmolu/fourmolu-action from 10 to 11 (#35) #67

Workflow file for this run

name: Release Pipeline
on:
push:
branches: ['main']
tags:
- "v*"
jobs:
generate-matrix:
if: startsWith(github.ref, 'refs/tags/v')
name: 'Generate matrix from cabal'
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
runs-on: ubuntu-latest
steps:
- name: Extract the tested GHC versions
id: set-matrix
uses: kleidukos/[email protected]
with:
cabal-file: print-api.cabal
ubuntu-version: 'latest'
macos-version: 'latest'
version: 0.1.7.1
generate-alpine-matrix:
if: startsWith(github.ref, 'refs/tags/v')
name: 'Generate Alpine matrix from cabal'
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
runs-on: ubuntu-latest
steps:
- name: Extract the tested GHC versions
id: set-matrix
uses: kleidukos/[email protected]
with:
cabal-file: print-api.cabal
version: 0.1.7.1
ubuntu-version: 'latest'
tests:
name: ${{ matrix.ghc }} on ${{ matrix.os }}
needs: generate-matrix
runs-on: ${{ matrix.os }}
strategy:
matrix: ${{ fromJSON(needs.generate-matrix.outputs.matrix) }}
steps:
- name: "Install tools"
if: ${{ matrix.os == 'ubuntu-latest' }}
run: |
sudo apt install upx-ucl
- name: Checkout base repo
uses: actions/checkout@v4
- name: Set up Haskell
id: setup-haskell
uses: haskell-actions/setup@v2
with:
ghc-version: ${{ matrix.ghc }}
cabal-version: 'latest'
- name: Configure
run: |
ARCHITECTURE=$(uname -m)
echo "ARCH=$ARCHITECTURE" >> $GITHUB_ENV
echo ${{ env.ARCH }}
cabal configure --enable-tests
- name: Freeze
run: cabal freeze --project-file=cabal.release.project
- name: Cache
uses: actions/[email protected]
with:
path: ${{ steps.setup-haskell.outputs.cabal-store }}
key: ${{ runner.os }}-ghc-${{ matrix.ghc }}-${{ hashFiles('**/plan.json') }}
restore-keys: ${{ runner.os }}-ghc-${{ matrix.ghc }}-
- name: Build
run: cabal build --project-file=cabal.release.project
- name: Install
run: |
mkdir distribution
for executable in 'print-api' 'print-api-${{ matrix.ghc }}'; do
path=$(cabal -v0 --project-file=cabal.release.project list-bin "print-api:exe:${executable}")
cp "${path}" distribution
done
echo "$GITHUB_WORKSPACE/distribution" >> "$GITHUB_PATH"
- name: Test
run: cabal test --project-file=cabal.release.project --test-options "--xml=../print-api/report.xml" all
- name: Publish Test Report
uses: mikepenz/action-junit-report@v5
if: success() || failure() # always run even if the previous step fails
with:
report_paths: "report.xml"
- name: Test
run: cabal test --project-file=cabal.static.project --test-options "--xml=../print-api/report.xml" all
- name: Publish Test Report
uses: mikepenz/action-junit-report@v5
if: success() || failure() # always run even if the previous step fails
with:
report_paths: "report.xml"
- name: File type
run: file distribution/*
- name: Post-process executables
if: ${{ matrix.os == 'ubuntu-latest' }}
run: |
for executable in distribution/*; do
strip "${executable}"
upx -9 "${executable}"
done
- name: Package the executables
run: |
executables=( $(ls distribution) )
version=$(./distribution/print-api --version)
archive="print-api-${version}-${{ runner.os }}-${{ env.ARCH }}-ghc-${{ matrix.ghc }}.tar.gz"
tar -czvf "${archive}" -C distribution "${executables[@]}"
echo "PRINTAPI_EXEC_TAR=${archive}" >> $GITHUB_ENV
- name: Upload the executables archive
uses: actions/upload-artifact@v3
with:
name: artifact
path: ${{ env.PRINTAPI_EXEC_TAR }}
build-alpine:
name: ${{ matrix.ghc }} on alpine-3.20
needs: generate-alpine-matrix
runs-on: ${{ matrix.os }}
strategy:
matrix: ${{ fromJSON(needs.generate-alpine-matrix.outputs.matrix) }}
container: 'alpine:3.20'
steps:
- name: Install extra dependencies
shell: sh
run: |
apk add bash binutils-gold curl \
curl file g++ gcc git gmp-dev \
jq libc-dev libffi-dev make \
musl-dev ncurses-dev perl pkgconfig \
sudo tar upx xz zlib-dev zlib-static
- uses: actions/checkout@v4
- uses: haskell-actions/setup@v2
id: setup-haskell
with:
ghc-version: ${{ matrix.ghc }}
cabal-version: 'latest'
- name: Configure
run: |
ARCHITECTURE=$(uname -m)
echo "ARCH=$ARCHITECTURE" >> $GITHUB_ENV
echo ${{ env.ARCH }}
cabal configure --enable-tests
- name: Freeze
run: cabal freeze --project-file=cabal.static.project
- uses: actions/cache@v4
with:
path: ${{ steps.setup-haskell.outputs.cabal-store }}
key: ${{ runner.os }}-ghc-${{ steps.setup.outputs.ghc-version }}-${{ hashFiles('**/plan.json') }}
restore-keys: ${{ runner.os }}-${{ steps.setup.outputs.ghc-version }}-
- name: Build
run: cabal build --project-file=cabal.static.project
- name: Install
run: |
mkdir distribution
for executable in 'print-api' 'print-api-${{ matrix.ghc }}'; do
path=$(cabal -v0 --project-file=cabal.static.project list-bin "print-api:exe:${executable}")
cp "${path}" distribution
done
echo "$GITHUB_WORKSPACE/distribution" >> "$GITHUB_PATH"
- name: Test
run: cabal test --project-file=cabal.static.project --test-options "--xml=../print-api/report.xml" all
- name: Publish Test Report
uses: mikepenz/action-junit-report@v5
if: success() || failure() # always run even if the previous step fails
with:
report_paths: "report.xml"
- name: Test
run: cabal test --project-file=cabal.static.project --test-options "--xml=../print-api/report.xml" all
- name: Publish Test Report
uses: mikepenz/action-junit-report@v5
if: success() || failure() # always run even if the previous step fails
with:
report_paths: "report.xml"
- name: File type
run: file distribution/*
- name: Post-process executables
if: ${{ matrix.os == 'ubuntu-latest' }}
run: |
for executable in distribution/*; do
strip "${executable}"
upx -9 "${executable}"
done
- name: Package the executables
shell: bash
run: |
executables=( $(ls distribution) )
version=$(./distribution/print-api --version)
archive="print-api-${version}-${{ runner.os }}-${{ env.ARCH }}-static-ghc-${{ matrix.ghc }}.tar.gz"
tar -czvf "${archive}" -C distribution "${executables[@]}"
echo "PRINTAPI_EXEC_TAR=${archive}" >> $GITHUB_ENV
- name: Upload the executables archive
uses: actions/upload-artifact@v3
with:
name: artifact
path: ${{ env.PRINTAPI_EXEC_TAR }}
# NOTE: We run upx on the executables in every linux job to compress them.
# That means, the assets that are linked dynamically _appear_ to be statically
# linked after that, despite not being compiled statically in Alpine with
# musl. They are still dynamically-linked once they are decompresed.
# See: https://stackoverflow.com/questions/20740625/does-upx-magically-transform-binaries-from-dynamically-linked-into-statically-li
release:
name: Create a GitHub Release with the binary artifacts
runs-on: ubuntu-latest
needs: ['tests', 'build-alpine']
steps:
- uses: actions/download-artifact@v3
with:
name: artifact
path: ./artifacts
- name: Prepare release
shell: bash
run: |
create-tarball() {
local name="${1}"
local pattern="${2}"
echo "::group::Creating release tarball ${name}.tar.gz"
mkdir "${name}"
find artifacts -type f -name "${pattern}" -exec tar -x -z -f {} -C "${name}" \;
local files=( $(find "${name}" -type f -printf '%P\n') )
if [[ ${#files[@]} > 0 ]]; then
echo "Packaging ${#files[@]} files"
tar -c -z -v -f "release/${name}.tar.gz" -C "${name}" "${files[@]}"
else
echo "No files to package"
fi
echo '::endgroup::'
}
mkdir release
for base in $(ls artifacts | cut -d - -f -5 | sort --uniq); do
create-tarball "${base}" "${base}-ghc-*.tar.gz"
create-tarball "${base}-static" "${base}-static-ghc-*.tar.gz"
done
- name: Release
uses: softprops/action-gh-release@v2
with:
prerelease: true
draft: true
files: ./release/*