GitHub Actions is a great CI tool, and there are many great actions developed by third parties. I use Clojure in many of my personal and professional projects, and I frequently use setup-clojure in my workflows. However, some organizations have security rules configured that disallow actions that are not internal to the organization or verified on the GitHub Marketplace.

There are no verified Clojure setup actions at the time of writing, so you must take on the installation of Clojure yourself if you work in an organization with these security rules in place. Thankfully, it is a fairly straightforward process to install and cache the Clojure installation.

Following is a simple CI process that runs on pull requests. It caches a Clojure installation based on the version (defined as CLOJURE_VERSION) and will download and install Clojure only if necessary.

The cache action cannot create files and directories under /usr/local/, which is where Clojure is installed by default. The workflow will install Clojure in $HOME/bin/clojure which can be accessed by the cache action. The workflow will then make the action available on the path so that normal clojure commands may be used in subsequent steps.

name: CI
on:
  pull_request:

jobs:
  test:
    runs-on: ubuntu-latest
    env:
      CLOJURE_VERSION: 1.10.3.855

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Set up Java
        uses: actions/setup-java@v2
        with:
          distribution: adopt
          java-version: 11

      - name: Cache Clojure install
        id: cache-clojure
        uses: actions/cache@v2
        with:
          path: ~/bin/clojure
          key: ${{ env.CLOJURE_VERSION }}

      - name: Set up Clojure
        if: steps.cache-clojure.outputs.cache-hit != 'true'
        run: |
          curl -O https://download.clojure.org/install/linux-install-${CLOJURE_VERSION}.sh
          chmod +x linux-install-${CLOJURE_VERSION}.sh
          sudo ./linux-install-${CLOJURE_VERSION}.sh --prefix ~/bin/clojure

      - name: Add Clojure to path
        run: echo "$HOME/bin/clojure/bin" >> $GITHUB_PATH

      - name: Cache maven artifacts
        id: cache-maven
        uses: actions/cache@v2
        with:
          path: ~/.m2
          key: ${{ runner.os }}-${{ hashFiles('deps.edn') }}

      - name: Download dependencies
        if: steps.cache-maven.outputs.cache-hit != 'true'
        run: clojure -A:test -Stree

      - name: Run tests
        run: ./scripts/kaocha