From b430ec2989b93f56fda28db137d00246499a224b Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Wed, 3 Jan 2024 18:19:34 -0600 Subject: [PATCH] Add option for user specified Julia depot (#83) * Add input user-depot * Only list restored depot directory size on cache-hit * Remove unnecessary quoting on inputs/outputs * Rename input to just depot * Include the depot path in the key * Documentation update * Allow JULIA_DEPOT_PATH to specify default depot * fixup! Allow JULIA_DEPOT_PATH to specify default depot --- .github/workflows/CI.yml | 4 +++ README.md | 13 +++++---- action.yml | 59 ++++++++++++++++++++++++++-------------- 3 files changed, 49 insertions(+), 27 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index ec51cb0..9edf5b5 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -39,6 +39,8 @@ jobs: os: [ubuntu-latest, windows-latest, macOS-latest] fail-fast: false runs-on: ${{ matrix.os }} + env: + JULIA_DEPOT_PATH: /tmp/julia-depot steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 - name: Save cache @@ -82,6 +84,8 @@ jobs: os: [ubuntu-latest, windows-latest, macOS-latest] fail-fast: false runs-on: ${{ matrix.os }} + env: + JULIA_DEPOT_PATH: /tmp/julia-depot steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 - name: Restore cache diff --git a/README.md b/README.md index 0efe541..f9e3d27 100644 --- a/README.md +++ b/README.md @@ -41,12 +41,13 @@ However note that caching the registries may mean that the registry will not be - `cache-name` - The cache key prefix. Defaults to `julia-cache-${{ github.workflow }}-${{ github.job }}`. The key body automatically includes matrix vars and the OS. Include any other parameters/details in this prefix to ensure one unique cache key per concurrent job type. - `include-matrix` - Whether to include the matrix values when constructing the cache key. Defaults to `true`. -- `cache-artifacts` - Whether to cache `~/.julia/artifacts/`. Defaults to `true`. -- `cache-packages` - Whether to cache `~/.julia/packages/`. Defaults to `true`. -- `cache-registries` - Whether to cache `~/.julia/registries/`. Defaults to `false`. Disabled to ensure CI gets latest versions. -- `cache-compiled` - Whether to cache `~/.julia/compiled/`. Defaults to `true`. -- `cache-scratchspaces` - Whether to cache `~/.julia/scratchspaces/`. Defaults to `true`. -- `cache-logs` - Whether to cache `~/.julia/logs/`. Defaults to `true`. Helps auto-`Pkg.gc()` keep the cache small. +- `depot` - Path to a Julia [depot](https://pkgdocs.julialang.org/v1/glossary/) directory where cached data will be saved to and restored from. Defaults to the first depot in [`JULIA_DEPOT_PATH`](https://docs.julialang.org/en/v1/manual/environment-variables/#JULIA_DEPOT_PATH) if specified. Otherwise, defaults to `~/.julia`. +- `cache-artifacts` - Whether to cache the depot's `artifacts` directory. Defaults to `true`. +- `cache-packages` - Whether to cache the depot's `packages` directory. Defaults to `true`. +- `cache-registries` - Whether to cache the depot's `registries` directory. Defaults to `false`. Disabled to ensure CI gets latest versions. +- `cache-compiled` - Whether to cache the depot's `compiled` directory. Defaults to `true`. +- `cache-scratchspaces` - Whether to cache the depot's `scratchspaces` directory. Defaults to `true`. +- `cache-logs` - Whether to cache the depot's `logs` directory. Defaults to `true`. Helps auto-`Pkg.gc()` keep the cache small. - `delete-old-caches` - Whether to delete old caches for the given key. Defaults to `true`. - `token` - A [GitHub PAT](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens). Defaults to `github.token`. Requires `repo` scope to enable the deletion of old caches. diff --git a/action.yml b/action.yml index 104a086..f2f1a1d 100644 --- a/action.yml +++ b/action.yml @@ -8,39 +8,44 @@ branding: inputs: cache-name: - description: 'The cache key prefix. Unless disabled the key body automatically includes matrix vars, and the OS. Include any other parameters/details in this prefix to ensure one unique cache key per concurrent job type.' - default: 'julia-cache-${{ github.workflow }}-${{ github.job }}' + description: >- + The cache key prefix. Unless disabled the key body automatically includes matrix vars, and the OS. + Include any other parameters/details in this prefix to ensure one unique cache key per concurrent job type. + default: julia-cache-${{ github.workflow }}-${{ github.job }} include-matrix: - description: 'Whether to include the matrix values when constructing the cache key.' + description: Whether to include the matrix values when constructing the cache key. default: 'true' + depot: + description: Path to a Julia depot directory where cached data will be saved to and restored from. + default: '' cache-artifacts: - description: 'Whether to cache ~/.julia/artifacts/.' + description: Whether to cache the depot's `artifacts` directory. default: 'true' cache-packages: - description: 'Whether to cache ~/.julia/packages/.' + description: Whether to cache the depot's `packages` directory. default: 'true' cache-registries: - description: 'Whether to cache ~/.julia/registries/. This is off by default to ensure CI gets latest versions.' + description: Whether to cache the depot's `registries` directory. This is off by default to ensure CI gets latest versions. default: 'false' cache-compiled: - description: 'Whether to cache ~/.julia/compiled/.' + description: Whether to cache the depot's `compiled` directory. default: 'true' cache-scratchspaces: - description: 'Whether to cache ~/.julia/scratchspaces/.' + description: Whether to cache the depot's `scratchspaces` directory. default: 'true' cache-logs: - description: 'Whether to cache ~/.julia/logs/. This helps automatic Pkg.gc() keep the cache size down.' + description: Whether to cache the depot's `logs` directory. This helps automatic `Pkg.gc()` keep the cache size down. default: 'true' delete-old-caches: - description: 'Whether to delete old caches for the given key.' + description: Whether to delete old caches for the given key. default: 'true' token: - description: 'A GitHub PAT. Requires `repo` scope to enable the deletion of old caches.' - default: '${{ github.token }}' + description: A GitHub PAT. Requires `repo` scope to enable the deletion of old caches. + default: ${{ github.token }} outputs: cache-hit: - description: 'A boolean value to indicate an exact match was found for the primary key. Returns \"\" when the key is new. Forwarded from actions/cache' + description: A boolean value to indicate an exact match was found for the primary key. Returns "" when the key is new. Forwarded from actions/cache. value: ${{ steps.hit.outputs.cache-hit }} runs: @@ -48,19 +53,30 @@ runs: steps: - id: paths run: | - [ "${{ inputs.cache-artifacts }}" = "true" ] && A_PATH="~/.julia/artifacts" + if [ -n "${{ inputs.depot }}" ]; then + depot="${{ inputs.depot }}" + elif [ -n "$JULIA_DEPOT_PATH" ]; then + # Use the first depot path + depot=$(echo $JULIA_DEPOT_PATH | cut -d$PATH_DELIMITER -f1) + else + depot="~/.julia" + fi + echo "depot=$depot" >> $GITHUB_OUTPUT + [ "${{ inputs.cache-artifacts }}" = "true" ] && A_PATH="${depot}/artifacts" echo "artifacts-path=$A_PATH" >> $GITHUB_OUTPUT - [ "${{ inputs.cache-packages }}" = "true" ] && P_PATH="~/.julia/packages" + [ "${{ inputs.cache-packages }}" = "true" ] && P_PATH="${depot}/packages" echo "packages-path=$P_PATH" >> $GITHUB_OUTPUT - [ "${{ inputs.cache-registries }}" = "true" ] && R_PATH="~/.julia/registries" + [ "${{ inputs.cache-registries }}" = "true" ] && R_PATH="${depot}/registries" echo "registries-path=$R_PATH" >> $GITHUB_OUTPUT - [ "${{ inputs.cache-compiled }}" = "true" ] && PCC_PATH="~/.julia/compiled" + [ "${{ inputs.cache-compiled }}" = "true" ] && PCC_PATH="${depot}/compiled" echo "compiled-path=$PCC_PATH" >> $GITHUB_OUTPUT - [ "${{ inputs.cache-scratchspaces }}" = "true" ] && S_PATH="~/.julia/scratchspaces" + [ "${{ inputs.cache-scratchspaces }}" = "true" ] && S_PATH="${depot}/scratchspaces" echo "scratchspaces-path=$S_PATH" >> $GITHUB_OUTPUT - [ "${{ inputs.cache-logs }}" = "true" ] && L_PATH="~/.julia/logs" + [ "${{ inputs.cache-logs }}" = "true" ] && L_PATH="${depot}/logs" echo "logs-path=$L_PATH" >> $GITHUB_OUTPUT shell: bash + env: + PATH_DELIMITER: ${{ runner.OS == 'Windows' && ';' || ':' }} # MATRIX_STRING is a join of all matrix variables that helps concurrent runs have a unique cache key. # The underscore at the end of the restore key demarks the end of the restore section. Without this @@ -70,7 +86,7 @@ runs: run: | [ "${{ inputs.include-matrix }}" == "true" ] && MATRIX_STRING="${{ join(matrix.*, '-') }}" [ -n "$MATRIX_STRING" ] && MATRIX_STRING="-${MATRIX_STRING}" - RESTORE_KEY="${{ inputs.cache-name }}-${{ runner.os }}${MATRIX_STRING}_" + RESTORE_KEY="${{ inputs.cache-name }}-${{ runner.os }}${MATRIX_STRING}-${{ steps.paths.outputs.depot }}_" echo "restore-key=${RESTORE_KEY}" >> $GITHUB_OUTPUT echo "key=${RESTORE_KEY}${{ github.run_id }}-${{ github.run_attempt }}" >> $GITHUB_OUTPUT shell: bash @@ -91,7 +107,8 @@ runs: enableCrossOsArchive: false - name: list restored depot directory sizes - run: du -shc ~/.julia/* || true + if: ${{ steps.cache.outputs.cache-hit == 'true' }} + run: du -shc ${{ steps.paths.outputs.depot }}/* || true shell: bash # github and actions/cache doesn't provide a way to update a cache at a given key, so we delete any