Add Nix package & devshell caching #685
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | ||
| # Trigger the workflow on all pull requests and pushes/merges to main branch | ||
| on: | ||
| pull_request: | ||
| push: | ||
| # branches: [main] | ||
| # workflow_dispatch: | ||
| concurrency: | ||
| group: ${{ github.head_ref || github.run_id }} | ||
| cancel-in-progress: true | ||
| jobs: | ||
| stack: | ||
| name: Stack tests | ||
| runs-on: self-hosted | ||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@v4 | ||
| - name: Setup Stack / GHC | ||
| uses: haskell-actions/setup@v2 | ||
| id: setup-haskell | ||
| with: | ||
| ghc-version: '9.8.4' | ||
| cabal-version: '3.14.1.1' | ||
| enable-stack: true | ||
| stack-version: 'latest' | ||
| # Ask Stack to use system GHC instead of installing its own copy | ||
| - name: Use system GHC | ||
| run: | | ||
| stack config set system-ghc --global true | ||
| - name: Cache dependencies | ||
| uses: actions/cache@v4 | ||
| id: cache | ||
| with: | ||
| path: ${{ steps.setup-haskell.outputs.stack-root }} | ||
| key: stack-${{ runner.os }}-${{ steps.setup-haskell.outputs.stack-version }}-${{ hashFiles('stack.yaml', '**/*.cabal') }} | ||
| - name: Install dependencies | ||
| run: stack build --test --only-dependencies | ||
| - name: Test with Stack | ||
| run: | | ||
| .ci/test_stack.sh | ||
| cabal: | ||
| name: Cabal tests - ghc ${{ matrix.ghc }} / clash ${{ matrix.clash }} / doc ${{ matrix.check_haddock }} | ||
| runs-on: ${{ matrix.os }} | ||
| strategy: | ||
| fail-fast: false | ||
| matrix: | ||
| os: [ubuntu-latest] | ||
| clash: | ||
| - "1.8.2" | ||
| cabal: | ||
| - "3.14.1.1" | ||
| ghc: | ||
| - "9.2.8" | ||
| - "9.4.8" | ||
| - "9.8.4" | ||
| - "9.10.1" | ||
| include: | ||
| - check_haddock: "False" | ||
| - ghc: "9.6.6" | ||
| check_haddock: "True" | ||
| os: "ubuntu-latest" | ||
| clash: "1.8.2" | ||
| cabal: "3.14.1.1" | ||
| env: | ||
| check_haddock: ${{ matrix.check_haddock }} | ||
| clash_version: ${{ matrix.clash }} | ||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@v4 | ||
| - name: Setup Haskell | ||
| uses: haskell-actions/setup@v2 | ||
| id: setup-haskell | ||
| with: | ||
| ghc-version: ${{ matrix.ghc }} | ||
| cabal-version: ${{ matrix.cabal }} | ||
| - name: Use CI specific settings | ||
| run: | | ||
| .ci/apply_settings.sh | ||
| - name: Setup CI | ||
| run: | | ||
| cabal v2-freeze | ||
| mv cabal.project.freeze frozen | ||
| - name: Restore cached dependencies | ||
| uses: actions/cache@v4 | ||
| id: cache | ||
| with: | ||
| path: ${{ steps.setup-haskell.outputs.cabal-store }} | ||
| key: ${{ runner.os }}-ghc-${{ matrix.ghc }}-${{ steps.setup-haskell.outputs.cabal-version }}-${{ hashFiles('frozen') }} | ||
| - name: Install dependencies | ||
| run: cabal v2-build all --enable-tests --only-dependencies | ||
| - name: Build | ||
| run: | | ||
| cabal v2-build all --enable-tests | ||
| - name: Test | ||
| run: | | ||
| .ci/test_cabal.sh | ||
| - name: Documentation | ||
| if: ${{ matrix.check_haddock == 'True' }} | ||
| run: | | ||
| .ci/build_docs.sh | ||
| fourmolu: | ||
| runs-on: self-hosted | ||
| steps: | ||
| # Note that you must checkout your code before running haskell-actions/run-fourmolu | ||
| - uses: actions/checkout@v3 | ||
| - uses: haskell-actions/run-fourmolu@v9 | ||
| with: | ||
| version: "0.16.2.0" | ||
| pattern: | | ||
| **/*.hs | ||
| !clash-protocols-base/src/Protocols/Plugin/Cpp.hs | ||
| linting: | ||
| name: Source code linting | ||
| runs-on: self-hosted | ||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@v4 | ||
| - name: Whitespace | ||
| run: | | ||
| .ci/test_whitespace.sh | ||
| packages: | ||
| name: Push package to local cache | ||
| runs-on: self-hosted | ||
| strategy: | ||
| matrix: | ||
| ghc-version: [ "ghc9101", "ghc982", "ghc964" ] | ||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@v4 | ||
| - name: Build & test | ||
| run: | | ||
| # The -L flag outputs build logs to stderr | ||
| nix build -L .#${{ matrix.ghc-version }}.clash-protocols-base | ||
| nix build -L .#${{ matrix.ghc-version }}.clash-protocols | ||
| - name: Push package to cache | ||
| env: | ||
| ATTIC_AUTH_TOKEN: ${{ secrets.ATTIC_SECRET }} | ||
| run: | | ||
| .ci/attic-auth.sh | ||
| attic push public $(nix path-info .#${{ matrix.ghc-version }}.clash-protocols-base) | ||
| attic push public $(nix path-info .#${{ matrix.ghc-version }}.clash-protocols) | ||
| - name: Push package to cachix | ||
| if: github.ref == 'refs/heads/main' | ||
| env: | ||
| # Having the variable be named `CACHIX_AUTH_TOKEN` authenticates cachix | ||
| # https://docs.cachix.org/getting-started#authenticating | ||
| CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_SECRET }} | ||
| run: | | ||
| nix path-info .#${{ matrix.ghc-version }}.clash-protocols-base | cachix push clash-lang | ||
| nix path-info .#${{ matrix.ghc-version }}.clash-protocols | cachix push clash-lang | ||
| devshells: | ||
| name: Push Nix developer shell to local cache | ||
| runs-on: self-hosted | ||
| strategy: | ||
| matrix: | ||
| ghc-version: [ "ghc9101", "ghc982", "ghc964" ] | ||
| steps: | ||
| # There's no need to configure Nix, the dockerfile handling the GHA has it done for us! | ||
| # If a dependencies are already cached, we can simply re-use them! | ||
| - name: Checkout | ||
| uses: actions/checkout@v4 | ||
| - name: Build devshell | ||
| run: | | ||
| # Since the server is x86_64-linux, we can only build the devshell | ||
| # for that | ||
| nix build -L .#devShells.x86_64-linux.${{ matrix.ghc-version }}-full | ||
| # Pushes the binaries to the local network | ||
| # url: http://192.168.102.136:9200/public | ||
| # public key: public:PGGlJMx1gGmU069blMqve8tS1ndzBuriUAwGBHGOo4g= | ||
| - name: Push devshell to cache | ||
| env: | ||
| ATTIC_AUTH_TOKEN: ${{ secrets.ATTIC_SECRET }} | ||
| run: | | ||
| .ci/attic-auth.sh | ||
| attic push public $(nix path-info .#devShells.x86_64-linux.${{ matrix.ghc-version }}-full) | ||
| # Pushes the binaries to Cachix | ||
| - name: Push devshell to cachix | ||
| if: github.ref == 'refs/heads/main' | ||
| env: | ||
| # Having the variable be named `CACHIX_AUTH_TOKEN` authenticates cachix | ||
| # https://docs.cachix.org/getting-started#authenticating | ||
| CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_SECRET }} | ||
| run: | | ||
| nix path-info .#devShells.x86_64-linux.${{ matrix.ghc-version }}-full | cachix push clash-lang | ||
| # Mandatory check on GitHub | ||
| all: | ||
| name: All jobs finished | ||
| if: always() | ||
| needs: [ | ||
| nix, | ||
| fourmolu, | ||
| linting, | ||
| stack, | ||
| devshells, | ||
| ] | ||
| runs-on: self-hosted | ||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@v4 | ||
| - name: Check dependencies for failures | ||
| run: | | ||
| # Test all dependencies for success/failure | ||
| set -x | ||
| success="${{ contains(needs.*.result, 'success') }}" | ||
| fail="${{ contains(needs.*.result, 'failure') }}" | ||
| set +x | ||
| # Test whether success/fail variables contain sane values | ||
| if [[ "${success}" != "true" && "${success}" != "false" ]]; then exit 1; fi | ||
| if [[ "${fail}" != "true" && "${fail}" != "false" ]]; then exit 1; fi | ||
| # We want to fail if one or more dependencies fail. For safety, we introduce | ||
| # a second check: if no dependencies succeeded something weird is going on. | ||
| if [[ "${fail}" == "true" || "${success}" == "false" ]]; then | ||
| echo "One or more dependency failed, or no dependency succeeded." | ||
| exit 1 | ||
| fi | ||
| - name: Install dependencies | ||
| run: | | ||
| sudo apt-get update | ||
| sudo apt-get -y install python3-yaml | ||
| - name: Check that the 'all' job depends on all other jobs | ||
| run: | | ||
| .github/scripts/all_check.py | ||