Compare commits

...

68 Commits

Author SHA1 Message Date
Curtis Vogt
b02b27b5c2 Check if gh can stream logs 2025-01-24 11:15:16 -06:00
Curtis Vogt
69674bfc14 fixup! Add delay 2025-01-24 10:34:42 -06:00
Curtis Vogt
0a42a3633d fixup! Add delay 2025-01-24 10:31:40 -06:00
Curtis Vogt
9d9d37994b Add delay 2025-01-24 10:20:51 -06:00
Curtis Vogt
e49ff51323 Validate access isn't the problem 2025-01-24 10:13:55 -06:00
Curtis Vogt
5a04d111ea fixup! Experiment with access logs during execution 2025-01-24 10:10:02 -06:00
Curtis Vogt
b4c6d4b10c Experiment with access logs during execution 2025-01-24 10:08:35 -06:00
Curtis Vogt
46044e72ab fixup! Compare more context 2025-01-24 08:48:06 -06:00
Curtis Vogt
41be7ea14c fixup! Compare more context 2025-01-24 08:43:28 -06:00
Curtis Vogt
ef17b41963 Compare more context 2025-01-24 08:32:26 -06:00
Curtis Vogt
e81fae1916 fixup! Use upload for passing context 2025-01-24 08:24:39 -06:00
Curtis Vogt
1c132479c0 fixup! Use upload for passing context 2025-01-24 08:23:23 -06:00
Curtis Vogt
e7a9e0f340 fixup! Use upload for passing context 2025-01-24 08:22:26 -06:00
Curtis Vogt
7096dc43a1 fixup! Use upload for passing context 2025-01-24 08:20:50 -06:00
Curtis Vogt
cc7375cd98 Use upload for passing context 2025-01-24 08:17:26 -06:00
Curtis Vogt
0217e24a50 Encode to avoid GH checks 2025-01-23 15:56:51 -06:00
Curtis Vogt
66728dbe42 fixup! Check for differences in github context 2025-01-23 15:52:27 -06:00
Curtis Vogt
fd02edc686 fixup! Check for differences in github context 2025-01-23 15:51:36 -06:00
Curtis Vogt
a216f5035e fixup! Check for differences in github context 2025-01-23 15:46:17 -06:00
Curtis Vogt
f5316fefee fixup! Check for differences in github context 2025-01-23 15:43:05 -06:00
Curtis Vogt
11cd6b1ef0 fixup! Check for differences in github context 2025-01-23 15:40:09 -06:00
Curtis Vogt
69d3a9406a fixup! Check for differences in github context 2025-01-23 15:37:26 -06:00
Curtis Vogt
4818bbd194 fixup! Check for differences in github context 2025-01-23 15:35:19 -06:00
Curtis Vogt
d9466e9938 fixup! Check for differences in github context 2025-01-23 15:33:47 -06:00
Curtis Vogt
096c710202 Check for differences in github context 2025-01-23 15:30:05 -06:00
Curtis Vogt
3f52c6b71c Dig further 2025-01-23 13:47:27 -06:00
Curtis Vogt
19f527d7a8 Experiment with theoretical cache key conflict 2025-01-23 13:17:25 -06:00
Ian Butterworth
2b1bf4d8a1 fix slashes in windows depot path (#153) 2025-01-09 13:23:45 -06:00
dependabot[bot]
49fd7c4af0 Bump pyTooling/Actions from 1.0.5 to 3.1.1 (#157)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ian Butterworth <i.r.butterworth@gmail.com>
2025-01-09 13:06:18 -05:00
dependabot[bot]
d343189aad Bump actions/cache from 4.1.2 to 4.2.0 (#156)
Bumps [actions/cache](https://github.com/actions/cache) from 4.1.2 to 4.2.0.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](6849a64899...1bd1e32a3b)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-01 11:41:51 +01:00
dependabot[bot]
315c171d17 Bump actions/checkout from 4.1.7 to 4.2.2 (#150)
* Bump actions/checkout from 4.1.7 to 4.2.2

Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.7 to 4.2.2.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](692973e3d9...11bd71901b)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Apply suggestions from code review

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Mosè Giordano <765740+giordano@users.noreply.github.com>
2024-12-01 21:41:35 +00:00
dependabot[bot]
f4098e6050 Bump actions/cache from 4.0.2 to 4.1.2 (#151)
Bumps [actions/cache](https://github.com/actions/cache) from 4.0.2 to 4.1.2.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c45773b62...6849a64899)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-01 13:48:31 +00:00
dependabot[bot]
0c8892ce7f Bump dcarbone/install-jq-action from 2.1.0 to 3.0.1 (#155)
* Bump dcarbone/install-jq-action from 2.1.0 to 3.0.1

Bumps [dcarbone/install-jq-action](https://github.com/dcarbone/install-jq-action) from 2.1.0 to 3.0.1.
- [Release notes](https://github.com/dcarbone/install-jq-action/releases)
- [Commits](8867ddb478...e397bd8743)

---
updated-dependencies:
- dependency-name: dcarbone/install-jq-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update action.yml

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Mosè Giordano <765740+giordano@users.noreply.github.com>
2024-12-01 13:47:49 +00:00
Ian Butterworth
824243901f fix windows depot path expansion (#146) 2024-09-23 13:30:40 -04:00
Ian Butterworth
8608484607 Soft fail registry update (#143) 2024-08-31 13:35:05 +02:00
Curtis Vogt
e662c42397 Expand paths which use tilde (#141) 2024-08-30 13:54:55 +01:00
Ian Butterworth
e7913c2cb9 update any cached registries (#140)
* update any cached registries

* add comment

* handle really old julia versions

* Update action.yml

Co-authored-by: Curtis Vogt <curtis.vogt@gmail.com>

---------

Co-authored-by: Curtis Vogt <curtis.vogt@gmail.com>
2024-08-12 10:01:44 -04:00
dependabot[bot]
9ec3abbd64 Bump actions/checkout from 4.1.6 to 4.1.7 (#137) 2024-07-01 07:56:06 -04:00
Curtis Vogt
580d2b69d8 Fix issues with custom cache eviction (#135)
* Keep latest and default branch cache entries

* Record skipped cache IDs
2024-06-26 16:54:10 -05:00
Dilum Aluthge
e00c08a89a README: document that Bash is required (#132)
* README: document that Bash is required

* Apply suggestions from code review

Co-authored-by: Curtis Vogt <curtis.vogt@gmail.com>

* Update README.md

Co-authored-by: Dilum Aluthge <dilum@aluthge.com>

* Replace ordered list with unordered list

Co-authored-by: Curtis Vogt <curtis.vogt@gmail.com>

---------

Co-authored-by: Curtis Vogt <curtis.vogt@gmail.com>
2024-06-04 13:40:04 -04:00
Dilum Aluthge
bb4225b875 Devdocs: document the process for making a new release of this action (#128)
* Devdocs: document the process for making a new release of this action

* Apply suggestions from code review

Co-authored-by: Curtis Vogt <curtis.vogt@gmail.com>

* Add another note

* Fix a typo

* Recommend creating the lightweight tag locally first

---------

Co-authored-by: Curtis Vogt <curtis.vogt@gmail.com>
2024-05-22 23:57:30 -04:00
dependabot[bot]
8dfc57d68c Bump actions/checkout from 4.1.4 to 4.1.6 (#133)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.4 to 4.1.6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](0ad4b8fada...a5ac7e51b4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-22 21:39:06 -04:00
Rik Huijzer
3190fc83db Fix typo in cache-name note (#130)
* Fix typo in `cache-name` note

* Update README.md

* Update README.md

Co-authored-by: Ian Butterworth <i.r.butterworth@gmail.com>

---------

Co-authored-by: Ian Butterworth <i.r.butterworth@gmail.com>
2024-05-21 11:06:50 -04:00
Dilum Aluthge
2185d31b12 Update README to recommend julia-actions/cache@v2 (instead of @v1) (#129) 2024-05-16 11:30:59 -04:00
dependabot[bot]
d48542bb7b Bump actions/cache from 3.3.3 to 4.0.2 (#123)
Bumps [actions/cache](https://github.com/actions/cache) from 3.3.3 to 4.0.2.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](e12d46a63a...0c45773b62)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dilum Aluthge <dilum@aluthge.com>
2024-05-01 12:53:50 -04:00
dependabot[bot]
caa655642c Bump pyTooling/Actions from 1.0.1 to 1.0.5 (#127)
Bumps [pyTooling/Actions](https://github.com/pytooling/actions) from 1.0.1 to 1.0.5.
- [Release notes](https://github.com/pytooling/actions/releases)
- [Changelog](https://github.com/pyTooling/Actions/blob/main/doc/Releases.rst)
- [Commits](60281e01e2...e9d0dc3dba)

---
updated-dependencies:
- dependency-name: pyTooling/Actions
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dilum Aluthge <dilum@aluthge.com>
2024-05-01 12:38:23 -04:00
dependabot[bot]
1c20782198 Bump actions/checkout from 4.1.2 to 4.1.4 (#126)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.2 to 4.1.4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](9bb56186c3...0ad4b8fada)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-01 10:26:19 -04:00
Ian Butterworth
4b23ab708f update setup-julia to v2 in readme (#124) 2024-04-04 21:03:48 -04:00
dependabot[bot]
cc87ef305e Bump pyTooling/Actions from 0.4.6 to 1.0.1 (#117)
* Bump pyTooling/Actions from 0.4.6 to 1.0.1

Bumps [pyTooling/Actions](https://github.com/pytooling/actions) from 0.4.6 to 1.0.1.
- [Release notes](https://github.com/pytooling/actions/releases)
- [Changelog](https://github.com/pyTooling/Actions/blob/main/doc/Releases.rst)
- [Commits](adef08d3bd...60281e01e2)

---
updated-dependencies:
- dependency-name: pyTooling/Actions
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Apply suggestions from code review

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ian Butterworth <i.r.butterworth@gmail.com>
2024-04-04 20:56:26 -04:00
dependabot[bot]
c36389738b Bump actions/checkout from 4.1.1 to 4.1.2 (#118)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.1 to 4.1.2.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](b4ffde65f4...9bb56186c3)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-04 20:04:17 -04:00
dependabot[bot]
1b0706c0c7 Bump julia-actions/setup-julia from 1 to 2 (#116)
Bumps [julia-actions/setup-julia](https://github.com/julia-actions/setup-julia) from 1 to 2.
- [Release notes](https://github.com/julia-actions/setup-julia/releases)
- [Commits](https://github.com/julia-actions/setup-julia/compare/v1...v2)

---
updated-dependencies:
- dependency-name: julia-actions/setup-julia
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-04 19:47:11 -04:00
Ian Butterworth
8b63b4a15d Update actions/cache to v3.3.3 (#121) 2024-04-04 19:46:22 -04:00
Dilum Aluthge
0413f3b1ae Only run Dependabot once per month, but increase the PR limit (#115) 2024-04-03 11:00:28 -04:00
Mosè Giordano
e8521d4bd2 More accurate info about GitHub cache retion policy (#111) 2024-02-01 07:30:48 -05:00
Rik Huijzer
b1b004ffca Mention why the extra permissions are required (#108) 2024-01-20 11:35:32 -05:00
Sascha Mann
216aaef29a Pin third party action to hash (#106)
Third party actions should never not be pinned to a hash. Otherwise, in case the action repo is taken over by a malicious actor, they can change what runs in all of the workflows that julia-actions/cache is used in as well. Pinning to a hash prevents that.
2024-01-18 10:21:26 -05:00
nathan musoke
3e0649aaee fix: Attempt to install jq on all runners (#105) 2024-01-17 17:38:32 -05:00
Ian Butterworth
dc1a3cdeac make depot if not restored (#91) 2024-01-16 10:48:25 -05:00
Curtis Vogt
4491ed7a86 Pass cache-name between save/restore jobs (#103)
* Pass cache-name between save/restore

* Use save job name in cache-name

* Re-order test jobs

* Fix typo in registry warning
2024-01-16 09:40:31 -06:00
Curtis Vogt
b84ca24db8 Avoid corrupting existing cloned Julia registries (#102)
* Reproduce add-julia-registry issue

* Skip registries restore when already present

* Expand ~

* Refactor paths step to use bash array
2024-01-15 19:28:33 -06:00
Curtis Vogt
b3b34e3264 Test cache action against Julia 1.0 and nightly (#101)
* CI test action on Julia 1.0

* Avoid quoting Julia shell string

* Test against Julia nightly
2024-01-15 15:20:46 -06:00
Curtis Vogt
0c5d92d73a Delete cache entries only on the workflow branch (#97)
* Delete cache entries on the workflow branch

* Grant permissions for cache cleanup

* Add delete-old-caches required for testing purposes

* Revise help message

* Faster generate-key

* Use distinct cache-names for matrix/no-matrix jobs

* Remove redundant permissions

* Better fork detection logic
2024-01-15 10:15:36 -06:00
Curtis Vogt
fca1a91340 URL encode any invalid key characters (#93)
* URL encode any invalid key characters

* Test we handle invalid chars

* Job matrices must match

* Empty commit

* Empty commit
2024-01-09 16:50:08 -05:00
Curtis Vogt
207a5a0786 Unique cache-key for job matrix objects (#88)
* Unique cache-key for job matrix objects

* Update workflow to use object in job matrix

* Restore key should always match startswith

* fixup! Unique cache-key for job matrix objects

* Debug no-matrix

* Tests require overriding workflow/job

* Skip generating matrix_key when no matrix is used

* Install jq for self-hosted runners

* fixup! Install jq for self-hosted runners

* Skip install when not needed

* fixup! Skip install when not needed

* fixup! Skip install when not needed

* Improve `cache-name` description

Co-authored-by: Ian Butterworth <i.r.butterworth@gmail.com>

* Update  description in README

* Use actions/checkout@v4 in example

* add missing period

---------

Co-authored-by: Ian Butterworth <i.r.butterworth@gmail.com>
2024-01-04 20:29:52 -05:00
Ian Butterworth
fab7d6ae0a enable registries by default (#62) 2024-01-04 16:39:29 -05:00
Curtis Vogt
b430ec2989 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
2024-01-03 19:19:34 -05:00
Curtis Vogt
930a18227b Documentation consistency fixes (#84)
* Consistent use of periods

* Consistent casing of GitHub

* Use 2-space indentation for YAML example

* Add links to for further details
2024-01-02 21:59:12 -05:00
Christian Proud
ff08d7d467 Fix incorrect GitHub actions path on containers (#78)
Co-authored-by: Ian Butterworth <i.r.butterworth@gmail.com>
2023-11-28 11:06:28 -05:00
8 changed files with 609 additions and 175 deletions

View File

@@ -1,9 +1,10 @@
version: 2
updates:
# Keep dependencies for GitHub Actions up-to-date
- package-ecosystem: 'github-actions'
directory: '/'
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: 'daily'
interval: "monthly"
open-pull-requests-limit: 99
labels:
- "dependencies"
- "github-actions"

View File

@@ -20,120 +20,204 @@ permissions:
contents: read
jobs:
generate-key:
generate-prefix:
runs-on: ubuntu-latest
outputs:
cache-name: ${{ steps.name.outputs.cache-name }}
cache-prefix: ${{ steps.name.outputs.cache-prefix }}
steps:
- name: Generate random file
shell: 'julia --color=yes {0}'
run: 'write("random.txt", string(rand(10)))'
- name: Set cache-name as output
- name: Generate random cache-prefix
id: name
run: echo "cache-name=${{ hashFiles('random.txt') }}" >> $GITHUB_OUTPUT
run: |
cache_prefix=$(head -n 100 </dev/urandom | shasum -a 256 | cut -d ' ' -f 1)
echo "cache-prefix=$cache_prefix" >>"$GITHUB_OUTPUT"
test-save:
needs: generate-key
needs: generate-prefix
runs-on: ${{ matrix.os }}
outputs:
cache-name: ${{ steps.cache-name.outputs.cache-name }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macOS-latest]
nested:
- name: matrix
invalid-chars: "," # Use invalid characters in job matrix to ensure we escape them
version:
- "1.0"
- "1"
- "nightly"
os:
- ubuntu-latest
- windows-latest
- macOS-latest
exclude:
# Test Julia "1.0" on Linux only
- version: "1.0"
os: windows-latest
- version: "1.0"
os: macOS-latest
fail-fast: false
runs-on: ${{ matrix.os }}
env:
JULIA_DEPOT_PATH: /tmp/julia-depot
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Set cache-name
id: cache-name
shell: bash
run: |
echo "cache-name=${{ needs.generate-prefix.outputs.cache-prefix }}-${{ github.job }}" >>"$GITHUB_OUTPUT"
- uses: julia-actions/setup-julia@v2
with:
version: ${{ matrix.version }}
- name: Save cache
id: cache
uses: ./
with:
cache-name: ${{ needs.generate-key.outputs.cache-name }}
cache-name: ${{ steps.cache-name.outputs.cache-name }}
delete-old-caches: required
- name: Check no artifacts dir
shell: 'julia --color=yes {0}'
shell: julia --color=yes {0}
run: |
dir = joinpath(first(DEPOT_PATH), "artifacts")
@assert !isdir(dir)
- name: Install a small binary
shell: 'julia --color=yes {0}'
run: 'using Pkg; Pkg.add("pandoc_jll")'
shell: julia --color=yes {0}
run: |
using Pkg
if VERSION >= v"1.3"
Pkg.add(PackageSpec(name="pandoc_jll", version="3"))
else
Pkg.add(PackageSpec(name="Scratch", version="1"))
using Scratch
get_scratch!("test")
end
test-restore:
needs: test-save
runs-on: ${{ matrix.os }}
strategy:
matrix:
nested:
- name: matrix
invalid-chars: "," # Use invalid characters in job matrix to ensure we escape them
version:
- "1.0"
- "1"
- "nightly"
os:
- ubuntu-latest
- windows-latest
- macOS-latest
exclude:
# Test Julia "1.0" on Linux only
- version: "1.0"
os: windows-latest
- version: "1.0"
os: macOS-latest
fail-fast: false
env:
JULIA_DEPOT_PATH: /tmp/julia-depot
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: julia-actions/setup-julia@v2
with:
version: ${{ matrix.version }}
- name: Restore cache
id: cache
uses: ./
with:
cache-name: ${{ needs.test-save.outputs.cache-name }}
# Cannot require a successful cache delete on forked PRs as the permissions for actions is limited to read
delete-old-caches: ${{ github.event.pull_request.head.repo.fork && 'false' || 'required' }}
- name: Test cache-hit output
shell: julia --color=yes {0}
run: |
@show ENV["cache-hit"]
@assert ENV["cache-hit"] == "true"
env:
cache-hit: ${{ steps.cache.outputs.cache-hit }}
- name: Check existance or emptiness of affected dirs
shell: julia --color=yes {0}
run: |
# These dirs should exist as they've been cached
artifacts_dir = joinpath(first(DEPOT_PATH), "artifacts")
if VERSION >= v"1.3"
@assert !isempty(readdir(artifacts_dir))
else
@assert !isdir(artifacts_dir)
end
packages_dir = joinpath(first(DEPOT_PATH), "packages")
@assert !isempty(readdir(packages_dir))
compiled_dir = joinpath(first(DEPOT_PATH), "compiled")
@assert !isempty(readdir(compiled_dir))
scratchspaces_dir = joinpath(first(DEPOT_PATH), "scratchspaces")
@assert !isempty(readdir(scratchspaces_dir))
logs_dir = joinpath(first(DEPOT_PATH), "logs")
@assert !isempty(readdir(logs_dir))
# Do tests with no matrix also given the matrix is auto-included in cache key
test-save-nomatrix:
needs: generate-key
needs: generate-prefix
runs-on: ubuntu-latest
outputs:
cache-name: ${{ steps.cache-name.outputs.cache-name }}
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Set cache-name
id: cache-name
run: |
echo "cache-name=${{ needs.generate-prefix.outputs.cache-prefix }}-${{ github.job }}" >>"$GITHUB_OUTPUT"
- name: Save cache
id: cache
uses: ./
with:
cache-name: ${{ needs.generate-key.outputs.cache-name }}
cache-name: ${{ steps.cache-name.outputs.cache-name }}
delete-old-caches: required
- name: Check no artifacts dir
shell: 'julia --color=yes {0}'
shell: julia --color=yes {0}
run: |
dir = joinpath(first(DEPOT_PATH), "artifacts")
@assert !isdir(dir)
- name: Install a small binary
shell: 'julia --color=yes {0}'
run: 'using Pkg; Pkg.add("pandoc_jll")'
test-restore:
needs: [generate-key, test-save]
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macOS-latest]
fail-fast: false
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
- name: Restore cache
id: cache
uses: ./
with:
cache-name: ${{ needs.generate-key.outputs.cache-name }}
- name: Test cache-hit output
shell: 'julia --color=yes {0}'
shell: julia --color=yes {0}
run: |
@show ENV["cache-hit"]
@assert ENV["cache-hit"] == "true"
env:
cache-hit: ${{ steps.cache.outputs.cache-hit }}
- name: Check existance or emptiness of affected dirs
shell: 'julia --color=yes {0}'
run: |
# These dirs should exist as they've been cached
artifacts_dir = joinpath(first(DEPOT_PATH), "artifacts")
@assert !isempty(readdir(artifacts_dir))
packages_dir = joinpath(first(DEPOT_PATH), "packages")
@assert !isempty(readdir(packages_dir))
compiled_dir = joinpath(first(DEPOT_PATH), "compiled")
@assert !isempty(readdir(compiled_dir))
scratchspaces_dir = joinpath(first(DEPOT_PATH), "scratchspaces")
@assert !isempty(readdir(scratchspaces_dir))
logs_dir = joinpath(first(DEPOT_PATH), "logs")
@assert !isempty(readdir(logs_dir))
using Pkg
if VERSION >= v"1.3"
Pkg.add(PackageSpec(name="pandoc_jll", version="3"))
else
Pkg.add(PackageSpec(name="Scratch", version="1"))
using Scratch
get_scratch!("test")
end
test-restore-nomatrix:
needs: [generate-key, test-save-nomatrix]
needs: test-save-nomatrix
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Restore cache
id: cache
uses: ./
with:
cache-name: ${{ needs.generate-key.outputs.cache-name }}
cache-name: ${{ needs.test-save-nomatrix.outputs.cache-name }}
# Cannot require a successful cache delete on forked PRs as the permissions for actions is limited to read
delete-old-caches: ${{ github.event.pull_request.head.repo.fork && 'false' || 'required' }}
- name: Test cache-hit output
shell: 'julia --color=yes {0}'
shell: julia --color=yes {0}
run: |
@show ENV["cache-hit"]
@assert ENV["cache-hit"] == "true"
env:
cache-hit: ${{ steps.cache.outputs.cache-hit }}
- name: Check existance or emptiness of affected dirs
shell: 'julia --color=yes {0}'
shell: julia --color=yes {0}
run: |
# These dirs should exist as they've been cached
artifacts_dir = joinpath(first(DEPOT_PATH), "artifacts")
@assert !isempty(readdir(artifacts_dir))
if VERSION >= v"1.3"
@assert !isempty(readdir(artifacts_dir))
else
@assert !isdir(artifacts_dir)
end
packages_dir = joinpath(first(DEPOT_PATH), "packages")
@assert !isempty(readdir(packages_dir))
compiled_dir = joinpath(first(DEPOT_PATH), "compiled")
@@ -143,3 +227,54 @@ jobs:
logs_dir = joinpath(first(DEPOT_PATH), "logs")
@assert !isempty(readdir(logs_dir))
test-save-cloned-registry:
needs: generate-prefix
runs-on: ubuntu-latest
outputs:
cache-name: ${{ steps.cache-name.outputs.cache-name }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Set cache-name
id: cache-name
run: |
echo "cache-name=${{ needs.generate-prefix.outputs.cache-prefix }}-${{ github.job }}" >>"$GITHUB_OUTPUT"
- name: Save cache
uses: ./
with:
cache-name: ${{ steps.cache-name.outputs.cache-name }}
# Cannot require a successful cache delete on forked PRs as the permissions for actions is limited to read
delete-old-caches: ${{ github.event.pull_request.head.repo.fork && 'false' || 'required' }}
- name: Add General registry clone
shell: julia --color=yes {0}
run: |
using Pkg
Pkg.Registry.add("General")
env:
JULIA_PKG_SERVER: ""
# Set the registry worktree to an older state to simulate the cache storing an old version of the registry.
- name: Use outdated General worktree
run: git -C ~/.julia/registries/General reset --hard HEAD~20
test-restore-cloned-registry:
needs: test-save-cloned-registry
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Add General registry clone
shell: julia --color=yes {0}
run: |
using Pkg
Pkg.Registry.add("General")
env:
JULIA_PKG_SERVER: ""
- name: Restore cache
uses: ./
with:
cache-name: ${{ needs.test-save-cloned-registry.outputs.cache-name }}
# Cannot require a successful cache delete on forked PRs as the permissions for actions is limited to read
delete-old-caches: ${{ github.event.pull_request.head.repo.fork && 'false' || 'required' }}
- name: Test registry is not corrupt
shell: julia --color=yes {0}
run: |
using Pkg
Pkg.Registry.update()

79
.github/workflows/ReusableTest.yml vendored Normal file
View File

@@ -0,0 +1,79 @@
---
name: Reusable Test
on:
pull_request:
inputs: {}
jobs:
reusable:
uses: ./.github/workflows/ReusableWorkflow.yml
duplicate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: julia-actions/setup-julia@v2
with:
version: "1"
- name: Save cache
uses: ./
- name: Export Context
run: |
jq -c <<<"$github_json" >github.json
jq -c <<<"$env_json" >env.json
jq -c <<<"$job_json" >job.json
jq -c <<<"$steps_json" >steps.json
jq -c <<<"$runner_json" >runner.json
jq -c <<<"$inputs_json" >inputs.json
env:
github_json: ${{ toJSON(github) }}
env_json: ${{ toJSON(env) }}
job_json: ${{ toJSON(job) }}
steps_json: ${{ toJSON(steps) }}
runner_json: ${{ toJSON(runner) }}
inputs_json: ${{ toJSON(inputs) }}
- name: Export environmental variables
run: jq -n env >env_vars.json
- uses: actions/upload-artifact@v4
with:
name: trigger-context
path: "*.json"
compare:
needs:
- reusable
- duplicate
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v4
with:
name: trigger-context
path: trigger
- uses: actions/download-artifact@v4
with:
name: reusable-context
path: reusable
- run: |
find .
for p in trigger/*.json; do
context_file="$(basename "$p")"
echo "$context_file"
a="$(cat trigger/$context_file)"
b="$(cat reusable/$context_file)"
echo "::group::Raw A"
jq <<<"$a"
echo "::endgroup::"
echo "::group::Raw B"
jq <<<"$b"
echo "::endgroup::"
echo "::group::Diff"
same=0
diff <(jq <<<"$a") <(jq <<<"$b") || same=$?
echo "::endgroup::"
[[ $same -eq 0 ]] && echo "Same" || echo "Differ"
done

52
.github/workflows/ReusableWorkflow.yml vendored Normal file
View File

@@ -0,0 +1,52 @@
---
name: Reusable Workflow
on:
workflow_call:
inputs: {}
jobs:
duplicate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: julia-actions/setup-julia@v2
with:
version: "1"
- name: Save cache
uses: ./
- name: Export Context
run: |
jq -c <<<"$github_json" >github.json
jq -c <<<"$env_json" >env.json
jq -c <<<"$job_json" >job.json
jq -c <<<"$steps_json" >steps.json
jq -c <<<"$runner_json" >runner.json
jq -c <<<"$inputs_json" >inputs.json
env:
github_json: ${{ toJSON(github) }}
env_json: ${{ toJSON(env) }}
job_json: ${{ toJSON(job) }}
steps_json: ${{ toJSON(steps) }}
runner_json: ${{ toJSON(runner) }}
inputs_json: ${{ toJSON(inputs) }}
- name: Export environmental variables
run: jq -n env >env_vars.json
- uses: actions/upload-artifact@v4
with:
name: reusable-context
path: "*.json"
- run: |
set -x
uuid="$(cat /proc/sys/kernel/random/uuid)"
echo "$uuid"
# sleep 60
# https://docs.github.com/en/rest/actions/workflow-runs?apiVersion=2022-11-28#download-workflow-run-logs
# gh api "/repos/{owner}/{repo}/actions/runs/${run_id:?}/logs" >logs.zip
# unzip -- logs.zip "*.txt"
# find .
# grep -rnH ReusableWorkflow.yml .
# grep -rnH "$uuid" .
gh run view "${run_id:?}" --log
env:
GH_TOKEN: ${{ github.token }}
run_id: ${{ github.run_id }}

View File

@@ -20,35 +20,33 @@ jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: julia-actions/setup-julia@v1
- uses: julia-actions/cache@v1
- uses: actions/checkout@v4
- uses: julia-actions/setup-julia@v2
- uses: julia-actions/cache@v2
- uses: julia-actions/julia-buildpkg@v1
- uses: julia-actions/julia-runtest@v1
```
By default the majority of the depot is cached. To also cache `~/.julia/registries/`, use
By default all depot directories called out below are cached.
```yaml
- uses: julia-actions/cache@v1
with:
cache-registries: "true"
```
### Requirements
However note that caching the registries may mean that the registry will not be updated each run.
- `jq`: This action uses [`jq`](https://github.com/jqlang/jq) to parse JSON. For GitHub-hosted runners, `jq` is installed by default. On self-hosted runners and custom containers, if `jq` is not already available, this action will automatically use [`dcarbone/install-jq-action`](https://github.com/dcarbone/install-jq-action) to install `jq` (Note: `dcarbone/install-jq-action` requires that `curl` is installed; this may not always be the case in custom containers and self-hosted runners).
- `bash`: This action requires `bash`. For GitHub-hosted runners `bash` is installed by default. Self-hosted runners will need to ensure that `bash` is installed and available on the `PATH`.
### Optional Inputs
- `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.
- `cache-name` - The cache key prefix. Defaults to `julia-cache;workflow=${{ github.workflow }};job=${{ github.job }}`. The key body automatically includes the OS and, unless disabled with `include-matrix`, the matrix vars. 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.
- `delete-old-caches` - Whether to delete old caches for the given key. Defaults to `true`
- `token` - A github PAT. Defaults to `github.token`. Requires `repo` scope to enable the deletion of old caches.
- `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 `true`.
- `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.
### Outputs
@@ -62,6 +60,10 @@ This cached file is then restored upon the second run, and afterwards resaved un
The benefit of caching is that downloading one big file is quicker than downloading many different files from many different locations
and precompiling them.
By default, this action removes caches that were previously made by jobs on the same branch with the same restore key.
GitHub automatically removes old caches after a certain period or when the repository cache allocation is full.
It is, however, more efficient to explicitly remove old caches to improve caching for less frequently run jobs.
### Cache keys
The cache key that the cache will be saved as is based on:
@@ -72,8 +74,8 @@ The cache key that the cache will be saved as is based on:
- The run attempt number
> [!NOTE]
> If in your workflow if you do not use a matrix for concurrency you should make `cache-name` such that it is unique for
> concurrent jobs, otherwise caching may not be effective.
> If there is job concurrency that is not fully defined by a matrix you should ensure that `cache-name` is
> unique for each concurrent job, otherwise caching may not be effective.
### Cache Retention
@@ -82,16 +84,16 @@ This action automatically deletes old caches that match the first 4 fields of th
- All variables in the `matrix` (unless disabled via `include-matrix: 'false'`)
- The `runner.os` (may be in the matrix too, but included for safety)
Which means your caches files will not grow needlessly. Github also deletes cache files after
[90 days which can be increased in private repos to up to 400 days](https://docs.github.com/en/organizations/managing-organization-settings/configuring-the-retention-period-for-github-actions-artifacts-and-logs-in-your-organization)
Which means your caches files will not grow needlessly. GitHub also deletes cache files after
[7 days of not being accessed](https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows#usage-limits-and-eviction-policy), and there is a limit of 10 GB for the total size of cache files associated to each repository.
> [!NOTE]
> To allow deletion of caches you will likely need to grant the following to the default
> `GITHUB_TOKEN` by adding this to your yml:
> ```
> To allow deletion of caches you will likely need to [grant the following permissions](https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs)
> to the `GITHUB_TOKEN` by adding this to your GitHub actions workflow:
> ```yaml
> permissions:
> actions: write
> contents: read
> actions: write
> contents: read
> ```
> (Note this won't work for fork PRs but should once merged)
> Or provide a token with `repo` scope via the `token` input option.

View File

@@ -8,101 +8,190 @@ 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. The key body automatically includes the OS and, unless disabled, the matrix vars.
Include any other parameters/details in this prefix to ensure one unique cache key per concurrent job type.
default: julia-cache;workflow=${{ github.workflow }};job=${{ 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'
default: 'false'
description: Whether to cache the depot's `registries` directory.
default: 'true'
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:
using: 'composite'
steps:
- name: Install jq
uses: dcarbone/install-jq-action@e397bd87438d72198f81efd21f876461183d383a # v3.0.1
with:
force: false # Skip install when an existing `jq` is present
- id: paths
run: |
[ "${{ inputs.cache-artifacts }}" = "true" ] && A_PATH="~/.julia/artifacts"
echo "artifacts-path=$A_PATH" >> $GITHUB_OUTPUT
[ "${{ inputs.cache-packages }}" = "true" ] && P_PATH="~/.julia/packages"
echo "packages-path=$P_PATH" >> $GITHUB_OUTPUT
[ "${{ inputs.cache-registries }}" = "true" ] && R_PATH="~/.julia/registries"
echo "registries-path=$R_PATH" >> $GITHUB_OUTPUT
[ "${{ inputs.cache-compiled }}" = "true" ] && PCC_PATH="~/.julia/compiled"
echo "compiled-path=$PCC_PATH" >> $GITHUB_OUTPUT
[ "${{ inputs.cache-scratchspaces }}" = "true" ] && S_PATH="~/.julia/scratchspaces"
echo "scratchspaces-path=$S_PATH" >> $GITHUB_OUTPUT
[ "${{ inputs.cache-logs }}" = "true" ] && L_PATH="~/.julia/logs"
echo "logs-path=$L_PATH" >> $GITHUB_OUTPUT
shell: bash
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
if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then
depot="${depot/#\~/$USERPROFILE}" # Windows paths
depot="${depot//\\//}" # Replace backslashes with forward slashes
else
depot="${depot/#\~/$HOME}" # Unix-like paths
fi
echo "depot=$depot" | tee -a "$GITHUB_OUTPUT"
# 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
# a runner without a matrix has a restore key that will cause impropper clearing of caches from those
# with a matrix.
- id: keys
cache_paths=()
artifacts_path="${depot}/artifacts"
[ "${{ inputs.cache-artifacts }}" = "true" ] && cache_paths+=("$artifacts_path")
packages_path="${depot}/packages"
[ "${{ inputs.cache-packages }}" = "true" ] && cache_paths+=("$packages_path")
registries_path="${depot}/registries"
if [ "${{ inputs.cache-registries }}" = "true" ]; then
if [ ! -d "${registries_path}" ]; then
cache_paths+=("$registries_path")
else
echo "::warning::Julia depot registries already exist. Skipping restoring of cached registries to avoid potential merge conflicts when updating. Please ensure that \`julia-actions/cache\` precedes any workflow steps which add registries."
fi
fi
compiled_path="${depot}/compiled"
[ "${{ inputs.cache-compiled }}" = "true" ] && cache_paths+=("$compiled_path")
scratchspaces_path="${depot}/scratchspaces"
[ "${{ inputs.cache-scratchspaces }}" = "true" ] && cache_paths+=("$scratchspaces_path")
logs_path="${depot}/logs"
[ "${{ inputs.cache-logs }}" = "true" ] && cache_paths+=("$logs_path")
{
echo "cache-paths<<EOF"
printf "%s\n" "${cache_paths[@]}"
echo "EOF"
} | tee -a "$GITHUB_OUTPUT"
shell: bash
env:
PATH_DELIMITER: ${{ runner.OS == 'Windows' && ';' || ':' }}
- name: Generate Keys
id: keys
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}_"
echo "restore-key=${RESTORE_KEY}" >> $GITHUB_OUTPUT
echo "key=${RESTORE_KEY}${{ github.run_id }}-${{ github.run_attempt }}" >> $GITHUB_OUTPUT
# `matrix_key` joins all of matrix keys/values (including nested objects) to ensure that concurrent runs each use a unique cache key.
# When `matrix` isn't set for the job then `MATRIX_JSON=null`.
if [ "${{ inputs.include-matrix }}" == "true" ] && [ "$MATRIX_JSON" != "null" ]; then
matrix_key=$(echo "$MATRIX_JSON" | jq 'paths(type != "object") as $p | ($p | join("-")) + "=" + (getpath($p) | tostring)' | jq -rs 'join(";") | . + ";"')
fi
restore_key="${{ inputs.cache-name }};os=${{ runner.os }};${matrix_key}"
# URL encode any restricted characters:
# https://github.com/actions/toolkit/blob/5430c5d84832076372990c7c27f900878ff66dc9/packages/cache/src/cache.ts#L38-L43
restore_key=$(sed 's/,/%2C/g' <<<"${restore_key}")
key="${restore_key}run_id=${{ github.run_id }};run_attempt=${{ github.run_attempt }}"
echo "restore-key=${restore_key}" >> $GITHUB_OUTPUT
echo "key=${key}" >> $GITHUB_OUTPUT
shell: bash
env:
MATRIX_JSON: ${{ toJSON(matrix) }}
- uses: actions/cache@4d4ae6ae148a43d0fd1eda1800170683e9882738
- uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0
id: cache
with:
path: |
${{ steps.paths.outputs.artifacts-path }}
${{ steps.paths.outputs.packages-path }}
${{ steps.paths.outputs.registries-path }}
${{ steps.paths.outputs.scratchspaces-path }}
${{ steps.paths.outputs.compiled-path }}
${{ steps.paths.outputs.logs-path }}
${{ steps.paths.outputs.cache-paths }}
key: ${{ steps.keys.outputs.key }}
restore-keys: ${{ steps.keys.outputs.restore-key }}
enableCrossOsArchive: false
- name: list restored depot directory sizes
run: du -shc ~/.julia/* || true
# if it wasn't restored make the depot anyway as a signal that this action ran
# for other julia actions to check, like https://github.com/julia-actions/julia-buildpkg/pull/41
- name: make depot if not restored, then list depot directory sizes
run: |
mkdir -p ${{ steps.paths.outputs.depot }}
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
# that match the restore key just before saving the new cache
- uses: pyTooling/Actions/with-post-step@adef08d3bdef092282614f3b683897cefae82ee3
if: ${{ inputs.delete-old-caches == 'true' }}
# issue https://github.com/julia-actions/cache/issues/110
# Pkg may not run `Registry.update()` if a manifest exists, which may exist because of a
# `Pkg.dev` call or because one is added to the repo. So be safe and update cached registries here.
# Older (~v1.0) versions of julia that don't have `Pkg.Registry.update()` seem to always update registries in
# Pkg operations. So this is only necessary for newer julia versions.
- name: Update any cached registries
if: ${{ inputs.cache-registries == 'true' }}
continue-on-error: true
run: |
if [ -d "${{ steps.paths.outputs.depot }}/registries" ] && [ -n "$(ls -A "${{ steps.paths.outputs.depot }}/registries")" ]; then
echo "Registries directory exists and is non-empty. Updating any registries"
julia -e "import Pkg; isdefined(Pkg, :Registry) && Pkg.Registry.update();"
else
echo "Registries directory does not exist or is empty. Skipping registry update"
fi
shell: bash
# GitHub actions cache entries are immutable and cannot be updated. In order to have both the Julia
# depot cache be up-to-date and avoid storing redundant cache entries we'll manually cleanup old
# cache entries before the new cache is saved. However, we need to be careful with our manual
# cleanup as otherwise we can cause cache misses for jobs which would have normally had a cache hit.
# Some scenarios to keep in mind include:
#
# - Job failures result in the post-action for `actions/cache` being skipped. If we delete all cache
# entries for the branch we may have no cache entry available for the next run.
# - We should avoid deleting old cache entries for the default branch since these entries serve as
# the fallback if no earlier cache entry exists on a branch. We can rely on GitHub's default cache
# eviction policy here which will remove the oldest cache entry first.
#
# References:
# - https://github.com/actions/cache/blob/main/tips-and-workarounds.md#update-a-cache
# - https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows#usage-limits-and-eviction-policy
# Not windows
- uses: pyTooling/Actions/with-post-step@9ceefdbf5dceae8c441fc393ed82344c7ca8bbdb # v3.1.1
if: ${{ inputs.delete-old-caches != 'false' &&
github.ref != format('refs/heads/{0}', github.event.repository.default_branch) &&
runner.OS != 'Windows' }}
with:
# seems like there has to be a `main` step in this action. Could list caches for info if we wanted
# main: julia ${{ github.action_path }}/handle_caches.jl "${{ github.repository }}" "list"
main: echo ""
post: julia ${{ github.action_path }}/handle_caches.jl "${{ github.repository }}" "rm" "${{ steps.keys.outputs.restore-key }}"
post: julia $GITHUB_ACTION_PATH/handle_caches.jl rm "${{ github.repository }}" "${{ steps.keys.outputs.restore-key }}" "${{ github.ref }}" "${{ inputs.delete-old-caches != 'required' }}"
env:
GH_TOKEN: ${{ inputs.token }}
# Windows (because this action uses command prompt on windows)
- uses: pyTooling/Actions/with-post-step@9ceefdbf5dceae8c441fc393ed82344c7ca8bbdb # v3.1.1
if: ${{ inputs.delete-old-caches != 'false' &&
github.ref != format('refs/heads/{0}', github.event.repository.default_branch) &&
runner.OS == 'Windows' }}
with:
main: echo ""
post: cd %GITHUB_ACTION_PATH% && julia handle_caches.jl rm "${{ github.repository }}" "${{ steps.keys.outputs.restore-key }}" "${{ github.ref }}" "${{ inputs.delete-old-caches != 'required' }}"
env:
GH_TOKEN: ${{ inputs.token }}

View File

@@ -0,0 +1,56 @@
# Making a new release
In this guide, as an example, `v2.2.0` refers to the version number of the new release that you want to make.
## Part 1: Use the Git CLI to create and push the Git tags
Step 1: Create a new lightweight tag of the form `vMAJOR.MINOR.PATCH`.
```bash
git clone git@github.com:julia-actions/cache.git
cd cache
git fetch --all --tags
git checkout main
git --no-pager log -1
# Take note of the commit hash here.
# Now, create a new lightweight tag of the form `vMAJOR.MINOR.PATCH`.
#
# Replace `commit_hash` with the commit hash that you obtained from the
# `git log -1` step.
#
# Replace `v2.2.0` with the actual version number that you want to use.
git tag v2.2.0 commit_hash
```
Step 2: Once you've created the new release, you need to update the `v2` tag to point to the new release. For example, suppose that the previous release was `v2.1.0`, and suppose that you just created the new release `v2.2.0`. You need to update the `v2` tag so that it points to `v2.2.0`. Here are the commands:
```bash
# Create/update the new v2 tag locally, where the new v2 tag will point to the
# release that you created in the previous step.
#
# Make sure to change `v2.2.0` to the actual value for the tag that you just
# created in the previous step.
#
# The `-f` flag forcibly overwrites the old
# `v2` tag (if it exists).
git tag -f v2 v2.2.0
```
Step 3: Now you need to push the tags:
```bash
# Regular-push the new `v2.2.0` tag:
git push origin tag v2.2.0
# Force-push the new v2 tag:
git push origin tag v2 --force
```
## Part 2: Create the GitHub Release
Go to the [Releases](https://github.com/julia-actions/cache/releases) section of this repo and create a new release (using the GitHub web interface).
For the "choose a tag" drop-down field, select the `v2.2.0` tag that you created and pushed in Part 1 of this guide.

View File

@@ -1,58 +1,78 @@
using Pkg, Dates
function handle_caches()
repo = ARGS[1]
func = ARGS[2]
restore_key = get(ARGS, 3, "")
subcommand = ARGS[1]
if func == "list"
if subcommand == "list"
repo = ARGS[2]
println("Listing existing caches")
run(`gh cache list --limit 100 --repo $repo`)
elseif func == "rm"
caches = String[]
elseif subcommand == "rm"
repo, restore_key, ref = ARGS[2:4]
allow_failure = ARGS[5] == "true"
page = 1
per_page = 100
skipped = String[]
deleted = String[]
failed = String[]
for _ in 1:5 # limit to avoid accidental rate limiting
hits = split(strip(read(`gh cache list --limit 100 --repo $repo`, String)), keepempty=false)
search_again = length(hits) == 100
filter!(contains(restore_key), hits)
isempty(hits) && break
# We can delete everything that matches the restore key because the new cache is saved later.
for c in hits
while 1 <= page <= 5 # limit to avoid accidental rate limiting
# https://docs.github.com/en/rest/actions/cache?apiVersion=2022-11-28#list-github-actions-caches-for-a-repository
# Note: The `key` field matches on the full key or a prefix.
cmd = ```
gh api -X GET /repos/$repo/actions/caches
--field per_page=$per_page
--field page=$page
--field ref=$ref
--field key=$restore_key
--field sort=last_accessed_at
--field direction=desc
--jq '.actions_caches[].id'
```
ids = split(read(cmd, String); keepempty=false)
# Avoid deleting the latest used cache entry. This is particularly important for
# job failures where a new cache entry will not be saved after this.
page == 1 && !isempty(ids) && push!(skipped, popfirst!(ids))
for id in ids
try
run(`gh cache delete $(split(c)[1]) --repo $repo`)
push!(caches, c)
run(`gh cache delete $id --repo $repo`)
push!(deleted, id)
catch e
@error e
push!(failed, c)
push!(failed, id)
end
end
search_again || break
page = length(ids) == per_page ? page + 1 : -1
end
if isempty(failed) && isempty(caches)
println("No existing caches found for restore key `$restore_key`")
if isempty(skipped) && isempty(deleted) && isempty(failed)
println("No existing caches found on ref `$ref` matching restore key `$restore_key`")
else
if !isempty(failed)
println("Failed to delete $(length(failed)) existing caches for restore key `$restore_key`")
println("Failed to delete $(length(failed)) existing caches on ref `$ref` matching restore key `$restore_key`")
println.(failed)
@info """
To delete caches you need to grant the following to the default `GITHUB_TOKEN` by adding
this to your yml:
this to your workflow:
```
permissions:
actions: write
contents: read
actions: write
contents: read
```
(Note this won't work for fork PRs but should once merged)
Or provide a token with `repo` scope via the `token` input option.
See https://cli.github.com/manual/gh_cache_delete
"""
allow_failure || exit(1)
end
if !isempty(caches)
println("$(length(caches)) existing caches deleted that match restore key `$restore_key`:")
println.(caches)
if !isempty(deleted)
println("Deleted $(length(deleted)) caches on ref `$ref` matching restore key `$restore_key`")
println.(deleted)
end
end
else
throw(ArgumentError("Unexpected second argument: $func"))
throw(ArgumentError("Unexpected subcommand: $subcommand"))
end
end