cache icon indicating copy to clipboard operation
cache copied to clipboard

cache restore on versions 3 and 4 not working

Open mark-jordanovic-lewis opened this issue 1 year ago • 28 comments

The functionality of the cache action seems to be completely broken.

Configurations attempted:

  • save/restore actions @v4
  • save/restore actions @v3
  • base cache action @v4
  • base cache action @v3

Experimental Workflow and Results

The cache is being accessed on the same branch, in the same workflow (and later, if the first set of jobs pass).

Screenshot 2024-03-19 at 17 07 18 Screenshot 2024-03-19 at 17 17 01 Screenshot 2024-03-19 at 17 20 47

These screenshots pertain to the run of base cache action @v3, they are consistent across all configurations.

Cache version 2 works as expected.

Would definitely prefer to use the most recent versions.

mark-jordanovic-lewis avatar Mar 19 '24 17:03 mark-jordanovic-lewis

~Cause of the above issue is a difference in the actions/checkout version. There must be a difference in the way they reference the branch.~

mark-jordanovic-lewis avatar Mar 20 '24 09:03 mark-jordanovic-lewis

Im currently getting:

Failed to save: Unable to reserve cache with key db09ccc890352b660ddd94bbcf7ce4b880b254099c5050c6059b00b0b4c5777e, another job may be creating this cache. More details: Cache already exists.

Not sure if its related but even deleting all caches it wont recreate them...

matthiasPOE avatar Mar 20 '24 10:03 matthiasPOE

Same issue here. Have been wracking my brain why this doesn't work and then wanted to eventually open an issue and found out there's one already. Trying v2 now as recommended above.

upd: v2 works as expected

serpro69 avatar Mar 22 '24 12:03 serpro69

@mark-jordanovic-lewis just to ensure, do you have exactly same value in the "path" parameter both in save and restore? I had different and restore failed too.

yrtimiD avatar Apr 07 '24 15:04 yrtimiD

Correct. Same parameters in each use of the action.

mark-jordanovic-lewis avatar Apr 07 '24 17:04 mark-jordanovic-lewis

We are seeing similar issues on v4 where the cache is not found despite clearly existing, only 1/5 runs are picked up correctly, is the cache action not reliable-ish?

SimonSchick avatar May 02 '24 21:05 SimonSchick

I encountered the same issue. Save v4 + restore v2 cannot work as well. Using save v2 + restore v2 can resolve the problem. However, it seems that Node.js 16 is going to be deprecated.

njzjz avatar May 14 '24 19:05 njzjz

I encountered the same issue. Save v4 + restore v2 cannot work as well. Using save v2 + restore v2 can resolve the problem. However, it seems that Node.js 16 is going to be deprecated.

I just found the reason: in v4, the path for restore and save must be the same. The error message doesn't give such information.

njzjz avatar May 24 '24 22:05 njzjz

@njzjz I'm encountering this problem too and the paths are the same for me

wmertens avatar May 26 '24 07:05 wmertens

#1

El dom, 26 de may. de 2024 19:55, Wout Mertens @.***> escribió:

@njzjz https://github.com/njzjz I'm encountering this problem too and the paths are the same for me

— Reply to this email directly, view it on GitHub https://github.com/actions/cache/issues/1361#issuecomment-2132119284, or unsubscribe https://github.com/notifications/unsubscribe-auth/BGG5ZMWZ5SQ7TVB3OGEP663ZEGINXAVCNFSM6AAAAABE574CB6VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDCMZSGEYTSMRYGQ . You are receiving this because you are subscribed to this thread.Message ID: @.***>

lsdm83114 avatar May 26 '24 15:05 lsdm83114

Facing the same issue, any fix anytime soon?

I encountered the same issue. Save v4 + restore v2 cannot work as well. Using save v2 + restore v2 can resolve the problem. However, it seems that Node.js 16 is going to be deprecated.

restore v2 does not exist. it's only cache v2

MostefaKamalLala avatar Jun 05 '24 14:06 MostefaKamalLala

I can also confirm that v2 works, but v4 is completely broken. I am running a job with a matrix and am consistently getting failures because it cannot save nor restore the cache correctly.

hammzj avatar Jun 06 '24 16:06 hammzj

To be frank I'm surprised how a core action like "cache" is still broken and no (visible) steps are taken to fix it... At times github actions seem completely unreliable for anything beyond small open-source stuff that isn't mission-critical.

serpro69 avatar Jun 07 '24 05:06 serpro69

I hit this too. I was using actions/[email protected] to save a virtual env and some other things, specifying a literal path on that job, and then setting job outputs for the different things in the path (like outputs: venv-path: my-venv). Then in another job, I used actions/cache/[email protected] and referenced the same list of paths but via output variables (like paths: ${{ needs.setup-env.outputs.venv-path }}). As others have described, I could see the cache being created (and the setup-env job could pick up its own cache), but the downstream jobs say they can't find the cache. Changing both lists to be literal instead fixed the issue.

Variations of this issue seem to be reported in a number of other issues:

  • https://github.com/actions/cache/issues/1198
  • https://github.com/actions/cache/issues/1194
  • and possibly https://github.com/actions/cache/issues/1275

markfickett avatar Jun 18 '24 19:06 markfickett

@markfickett my paths are static and I'm experiencing this issue.

The problem is that it's intermittent.

wmertens avatar Jun 18 '24 19:06 wmertens

Also confirming v4 is broken. I’m using static paths as well. I downgraded to v2 and everything works now.

danielkorte avatar Jun 27 '24 21:06 danielkorte

@bethanyj28 @robherley @kotewar sorry about the pings but I cant believe this has been sitting here broken for so long

matthiasPOE avatar Jun 28 '24 05:06 matthiasPOE

I have some workflows in which v3 and v4 work consistently and some that fail consistently. I'm not seeing the intermittant success/fail but I do see inconsistenty across workflows.

mark-jordanovic-lewis avatar Jul 04 '24 11:07 mark-jordanovic-lewis

Cache Experiment Workflow

Amendmenent

Path in cache-container-file has a leading ./. Removal of this results in a cache hit in container-read-container-cache.

on:
  push:

jobs:
  # Cache files `cache-file-runner` and `cache-file-container`
  cache-file-runner:
    runs-on: ubuntu-22.04
    steps:
      - name: Create cache-file
        run: |
          touch cache-file-runner
          echo "I am in ubuntu-latest-runner cache" > cache-file-runner
      - uses: actions/cache/save@v4
        with:
          path: cache-file-runner
          key: ${{ github.sha }}-cache-file-runner
          enableCrossOsArchive: true

  cache-file-container:
    runs-on: ubuntu-22.04
    container:
      image: ubuntu:22.04
    steps:
      - name: Create cache-file
        run: |
          touch cache-file-container
          echo "I am in ubuntu-latest-container cache" > cache-file-container
      - uses: actions/cache/save@v4
        with:
          path: ./cache-file-container
          key: ${{ github.sha }}-cache-file-container
          enableCrossOsArchive: true

  # Read each of the cache files from the runner
  runner-read-runner-cache:
    runs-on: ubuntu-22.04
    needs: ["cache-file-runner", "cache-file-container"]
    steps:
      - uses: actions/cache/restore@v4
        with:
          path: cache-file-runner
          key: ${{ github.sha }}-cache-file-runner
      - name: Check cache-file
        run: |
          if [ -f "cache-file-runner" ]
          then
            echo "Found cached file"
          else
            echo "Cache not restored"
          fi

  runner-read-container-cache:
    runs-on: ubuntu-22.04
    needs: ["cache-file-runner", "cache-file-container"]
    steps:
      - uses: actions/cache/restore@v4
        with:
          path: cache-file-container
          key: ${{ github.sha }}-cache-file-container
      - name: Check cache-file
        run: |
          if [ -f "cache-file-container" ]
          then
            echo "Found cached file"
          else
            echo "Cache not restored"
          fi

  # Read each of the cache files from the container
  container-read-runner-cache:
    runs-on: ubuntu-22.04
    needs: ["cache-file-runner", "cache-file-container"]
    container:
      image: ubuntu:22.04
    steps:
      - uses: actions/cache/restore@v4
        with:
          path: cache-file-runner
          key: ${{ github.sha }}-cache-file-runner
      - name: Check cache-file
        run: |
          if [ -f "cache-file-runner" ]
          then
            echo "Found cached file"
          else
            echo "Cache not restored"
          fi

  container-read-container-cache:
    runs-on: ubuntu-22.04
    needs: ["cache-file-runner", "cache-file-container"]
    container:
      image: ubuntu:22.04
    steps:
      - uses: actions/cache/restore@v4
        with:
          path: cache-file-container
          key: ${{ github.sha }}-cache-file-container
      - name: Check cache-file
        run: |
          if [ -f "cache-file-container" ]
          then
            echo "Found cached file"
          else
            echo "Cache not restored"
          fi
          
  # CrossOs access
  runner-crossOS-read-container-cache:
    runs-on: ubuntu-22.04
    needs: ["cache-file-runner", "cache-file-container"]
    steps:
      - uses: actions/cache/restore@v4
        with:
          path: cache-file-container
          key: ${{ github.sha }}-cache-file-container
          enableCrossOsArchive: true
      - name: Check cache-file
        run: |
          if [ -f "cache-file-container" ]
          then
            echo "Found cached file"
          else
            echo "Cache not restored"
          fi

  container-crossOS-read-runner-cache:
    runs-on: ubuntu-22.04
    needs: ["cache-file-runner", "cache-file-container"]
    container:
      image: ubuntu:22.04
    steps:
      - uses: actions/cache/restore@v4
        with:
          path: cache-file-runner
          key: ${{ github.sha }}-cache-file-runner
          enableCrossOsArchive: true
      - name: Check cache-file
        run: |
          if [ -f "cache-file-runner" ]
          then
            echo "Found cached file"
          else
            echo "Cache not restored"
         fi

Results

Screenshot 2024-07-05 at 09 02 39 Screenshot 2024-07-05 at 09 03 03 Screenshot 2024-07-05 at 09 03 33 Screenshot 2024-07-05 at 09 03 55 Screenshot 2024-07-05 at 09 04 12 Screenshot 2024-07-05 at 09 04 29

Cache code

I don't really see much in the cache restore code that would lead to this behavior other than how the cache path in Azure is calculated. I think this uses the below function to create a path on the fly? Couldn't see the encodeURI function in the code so can't comment on that.

function createTempDirectory() {
    return __awaiter(this, void 0, void 0, function* () {
        const IS_WINDOWS = process.platform === 'win32';
        let tempDirectory = process.env['RUNNER_TEMP'] || '';
        if (!tempDirectory) {
            let baseLocation;
            if (IS_WINDOWS) {
                // On Windows use the USERPROFILE env variable
                baseLocation = process.env['USERPROFILE'] || 'C:\\';
            }
            else {
                if (process.platform === 'darwin') {
                    baseLocation = '/Users';
                }
                else {
                    baseLocation = '/home';
                }
            }
            tempDirectory = path.join(baseLocation, 'actions', 'temp');
        }
        const dest = path.join(tempDirectory, (0, uuid_1.v4)()); <<< uuid_1.v4 call???
        yield io.mkdirP(dest);
        return dest;
    });
}
exp

but my JS is not good enough to really debug this.

mark-jordanovic-lewis avatar Jul 05 '24 08:07 mark-jordanovic-lewis

@mark-jordanovic-lewis I am not sure about other jobs, but for container-read-container-cache, you just need to change path: cache-file-container to path: ./cache-file-container to match the path in cache-file-container.

njzjz avatar Jul 10 '24 00:07 njzjz

@mark-jordanovic-lewis I am not sure about other jobs, but for container-read-container-cache, you just need to change path: cache-file-container to path: ./cache-file-container to match the path in cache-file-container.

Correct. Thanks @njzjz.

mark-jordanovic-lewis avatar Jul 10 '24 04:07 mark-jordanovic-lewis

I just realized I had a trailing slash in one of the places and not the others. Now I made sure all the path strings are exactly the same and it seems to work without issues.

wmertens avatar Jul 18 '24 20:07 wmertens

I confirm that caching works after:

  • Prefixing each path of the path: value with ./;
  • Having the exact same path: value for save and restore (I had wildcards in the save action path).

mdeweerd avatar Aug 21 '24 08:08 mdeweerd