From 318ed244774116c9510020af1394524eb4d079cb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 20 Nov 2025 15:41:05 +0000 Subject: [PATCH 1/3] Initial plan From e7b6512a61d3266bb61394bbf257b5adf19d8df8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 20 Nov 2025 15:50:03 +0000 Subject: [PATCH 2/3] fix: disable caching when working directory is outside GITHUB_WORKSPACE Co-authored-by: neilime <314088+neilime@users.noreply.github.com> --- actions/get-package-manager/action.yml | 11 +++++++---- actions/setup-node/action.yml | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/actions/get-package-manager/action.yml b/actions/get-package-manager/action.yml index 35d09e0..7281885 100644 --- a/actions/get-package-manager/action.yml +++ b/actions/get-package-manager/action.yml @@ -91,23 +91,26 @@ runs: } let relativeWorkingDirectory = path.relative(process.env.GITHUB_WORKSPACE, workingDirectory) || '.'; + let isOutsideWorkspace = false; + if (relativeWorkingDirectory.startsWith('../')) { - relativeWorkingDirectory = path.resolve(workingDirectory); + core.warning(`Working directory "${workingDirectory}" is outside GITHUB_WORKSPACE. Caching will be disabled for setup-node.`); + isOutsideWorkspace = true; } const packageManagerConfig = { yarn: { - cacheDependencyPath: `${relativeWorkingDirectory}/**/yarn.lock`, + cacheDependencyPath: isOutsideWorkspace ? '' : `${relativeWorkingDirectory}/**/yarn.lock`, installCommand: 'yarn install --frozen-lockfile', runScriptCommand: 'yarn', }, pnpm: { - cacheDependencyPath: `${relativeWorkingDirectory}/**/pnpm-lock.yaml`, + cacheDependencyPath: isOutsideWorkspace ? '' : `${relativeWorkingDirectory}/**/pnpm-lock.yaml`, installCommand: 'pnpm install --frozen-lockfile', runScriptCommand: 'pnpm', }, npm: { - cacheDependencyPath: `${relativeWorkingDirectory}/**/package-lock.json`, + cacheDependencyPath: isOutsideWorkspace ? '' : `${relativeWorkingDirectory}/**/package-lock.json`, installCommand: 'npm ci', runScriptCommand: 'npm run', }, diff --git a/actions/setup-node/action.yml b/actions/setup-node/action.yml index 61caef8..8327671 100644 --- a/actions/setup-node/action.yml +++ b/actions/setup-node/action.yml @@ -138,7 +138,7 @@ runs: - uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version-file: ${{ steps.get-node-version-file.outputs.node-version-file }} - cache: ${{ steps.get-package-manager.outputs.package-manager }} + cache: ${{ steps.get-package-manager.outputs.cache-dependency-path != '' && steps.get-package-manager.outputs.package-manager || '' }} cache-dependency-path: ${{ steps.get-package-manager.outputs.cache-dependency-path }} - shell: bash From b65dbeb6401a9650c1b7849757a0d78f2b11c289 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 20 Nov 2025 16:07:25 +0000 Subject: [PATCH 3/3] feat: use symlink to maintain caching for external actions Co-authored-by: neilime <314088+neilime@users.noreply.github.com> --- actions/get-package-manager/action.yml | 29 ++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/actions/get-package-manager/action.yml b/actions/get-package-manager/action.yml index 7281885..3165a01 100644 --- a/actions/get-package-manager/action.yml +++ b/actions/get-package-manager/action.yml @@ -91,26 +91,43 @@ runs: } let relativeWorkingDirectory = path.relative(process.env.GITHUB_WORKSPACE, workingDirectory) || '.'; - let isOutsideWorkspace = false; + let cacheDependencyPathPrefix = relativeWorkingDirectory; if (relativeWorkingDirectory.startsWith('../')) { - core.warning(`Working directory "${workingDirectory}" is outside GITHUB_WORKSPACE. Caching will be disabled for setup-node.`); - isOutsideWorkspace = true; + // Working directory is outside GITHUB_WORKSPACE + // Create a symlink inside GITHUB_WORKSPACE to enable caching + const symlinkName = '.github-actions-cache'; + const symlinkPath = path.join(process.env.GITHUB_WORKSPACE, symlinkName); + + try { + // Remove existing symlink if it exists + if (fs.existsSync(symlinkPath)) { + fs.unlinkSync(symlinkPath); + } + + // Create symlink pointing to the working directory + fs.symlinkSync(workingDirectory, symlinkPath, 'dir'); + core.info(`Created symlink at "${symlinkPath}" pointing to "${workingDirectory}" to enable caching.`); + cacheDependencyPathPrefix = symlinkName; + } catch (error) { + core.warning(`Failed to create symlink for caching: ${error.message}. Caching will be disabled.`); + cacheDependencyPathPrefix = ''; + } } const packageManagerConfig = { yarn: { - cacheDependencyPath: isOutsideWorkspace ? '' : `${relativeWorkingDirectory}/**/yarn.lock`, + cacheDependencyPath: cacheDependencyPathPrefix ? `${cacheDependencyPathPrefix}/**/yarn.lock` : '', installCommand: 'yarn install --frozen-lockfile', runScriptCommand: 'yarn', }, pnpm: { - cacheDependencyPath: isOutsideWorkspace ? '' : `${relativeWorkingDirectory}/**/pnpm-lock.yaml`, + cacheDependencyPath: cacheDependencyPathPrefix ? `${cacheDependencyPathPrefix}/**/pnpm-lock.yaml` : '', installCommand: 'pnpm install --frozen-lockfile', runScriptCommand: 'pnpm', }, npm: { - cacheDependencyPath: isOutsideWorkspace ? '' : `${relativeWorkingDirectory}/**/package-lock.json`, + cacheDependencyPath: cacheDependencyPathPrefix ? `${cacheDependencyPathPrefix}/**/package-lock.json` : '', installCommand: 'npm ci', runScriptCommand: 'npm run', },