name: Build on: workflow_call: secrets: CACHIX_AUTH_TOKEN: required: false pull_request: branches: - main - v[0-9]+ paths: - .github/workflows/build.yaml - .github/actions/setup-nix/** - .github/scripts/** - .github/* - '*.nix' - nix/** - .cirrus.yml - cabal.project* - postgrest.cabal - stack.yaml* - '**.hs' - '!**.md' concurrency: # Terminate all previous runs of the same workflow for pull requests group: build-${{ github.head_ref || github.run_id }} cancel-in-progress: true jobs: static: name: Nix - Linux static runs-on: ubuntu-latest steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Setup Nix Environment uses: ./.github/actions/setup-nix with: authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' - name: Build static executable run: nix-build -A postgrestStatic - name: Save built executable as artifact uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: postgrest-linux-static-x64 path: result/bin/postgrest if-no-files-found: error - name: Build Docker image run: nix-build -A docker.image --out-link postgrest-docker.tar.gz - name: Save built Docker image as artifact uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: postgrest-docker-x64 path: postgrest-docker.tar.gz if-no-files-found: error macos: name: Nix - MacOS runs-on: macos-latest steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Setup Nix Environment uses: ./.github/actions/setup-nix with: authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' - name: Install gnu sed run: brew install gnu-sed - name: Build everything run: | # The --dry-run will give us a list of derivations to download from cachix and # derivations to build. We only take those that would have to be built and then build # those explicitly. This has the advantage that pure verification will not include # a download anymore, making it much faster. If something needs to be built, only # the dependencies required to do so will be downloaded, but not everything. nix-build --dry-run 2>&1 \ | gsed -e '1,/derivations will be built:$/d' -e '/paths will be fetched/Q' \ | xargs nix-build stack: strategy: fail-fast: false matrix: include: - name: Linux runs-on: ubuntu-latest cache: | ~/.stack .stack-work # no artifact for Linux, because we use the static build - name: MacOS runs-on: macos-latest cache: | ~/.stack .stack-work artifact: postgrest-macos-x64 - name: Windows runs-on: windows-latest cache: | ~\AppData\Roaming\stack ~\AppData\Local\Programs\stack .stack-work deps: Add-Content $env:GITHUB_PATH $env:PGBIN artifact: postgrest-windows-x64 name: Stack - ${{ matrix.name }} runs-on: ${{ matrix.runs-on }} steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Stack working files cache uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: ${{ matrix.cache }} key: stack-${{ runner.os }}-${{ hashFiles('stack.yaml.lock') }} restore-keys: | stack-${{ runner.os }}- - name: Install dependencies if: matrix.deps run: ${{ matrix.deps }} - name: Build with Stack run: stack build --lock-file error-on-write --local-bin-path result --copy-bins - name: Strip Executable run: strip result/postgrest* - name: Save built executable as artifact if: matrix.artifact uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: ${{ matrix.artifact }} path: | result/postgrest result/postgrest.exe if-no-files-found: error freebsd: name: Stack - FreeBSD from CirrusCI runs-on: ubuntu-latest steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Get FreeBSD executable from CirrusCI env: # GITHUB_SHA does weird things for pull request, so we roll our own: GITHUB_COMMIT: ${{ github.event.pull_request.head.sha || github.sha }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: .github/get_cirrusci_freebsd - name: Save executable as artifact uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: postgrest-freebsd-x64 path: postgrest if-no-files-found: error cabal: strategy: matrix: ghc: ['9.6.4', '9.8.2'] fail-fast: false name: Cabal - Linux GHC ${{ matrix.ghc }} runs-on: ubuntu-latest steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: ghcup run: | # GHC 9.8.2 is not available in regular release channel, yet. ghcup config add-release-channel https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-vanilla-0.0.8.yaml ghcup install ghc ${{ matrix.ghc }} ghcup set ghc ${{ matrix.ghc }} - name: Fix caching run: | mkdir ~/.cabal - name: Cache uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: | ~/.cabal/packages ~/.cabal/store dist-newstyle key: cabal-${{ runner.os }}-${{ matrix.ghc }}-${{ hashFiles('postgrest.cabal', 'cabal.project', 'cabal.project.freeze') }} restore-keys: | cabal-${{ runner.os }}-${{ matrix.ghc }}- - name: Install dependencies run: | cabal update cabal build --only-dependencies --enable-tests --enable-benchmarks - name: Build run: cabal build --enable-tests --enable-benchmarks all