mirror of
				https://github.com/actions/setup-node.git
				synced 2025-11-04 13:29:12 +08:00 
			
		
		
		
	Support caching for mono repos and repositories with complex structure
This commit is contained in:
		
							
								
								
									
										2
									
								
								.github/workflows/e2e-cache.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/e2e-cache.yml
									
									
									
									
										vendored
									
									
								
							@@ -101,6 +101,8 @@ jobs:
 | 
				
			|||||||
  node-yarn2-depencies-caching:
 | 
					  node-yarn2-depencies-caching:
 | 
				
			||||||
    name: Test yarn 2 (Node ${{ matrix.node-version}}, ${{ matrix.os }})
 | 
					    name: Test yarn 2 (Node ${{ matrix.node-version}}, ${{ matrix.os }})
 | 
				
			||||||
    runs-on: ${{ matrix.os }}
 | 
					    runs-on: ${{ matrix.os }}
 | 
				
			||||||
 | 
					    env:
 | 
				
			||||||
 | 
					      YARN_ENABLE_IMMUTABLE_INSTALLS: false
 | 
				
			||||||
    strategy:
 | 
					    strategy:
 | 
				
			||||||
      fail-fast: false
 | 
					      fail-fast: false
 | 
				
			||||||
      matrix:
 | 
					      matrix:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										13
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								README.md
									
									
									
									
									
								
							@@ -41,7 +41,7 @@ nvm lts syntax: `lts/erbium`, `lts/fermium`, `lts/*`
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
### Caching packages dependencies
 | 
					### Caching packages dependencies
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The action has a built-in functionality for caching and restoring npm/yarn dependencies. Supported package managers are `npm`, `yarn`, `pnpm`. The `cache` input is optional, and caching is turned off by default.
 | 
					The action has a built-in functionality for caching and restoring npm/yarn dependencies. Supported package managers are `npm`, `yarn`, `pnpm`. The `cache` input is optional, and caching is turned off by default. By default, the action searches for the dependency file in the project root and uses its hash as a part of cache key. Use `cache-dependency-path` to specify custom dependency file path. The field accepts wildcards or an array of files to be cached. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**Caching npm dependencies:**
 | 
					**Caching npm dependencies:**
 | 
				
			||||||
```yaml
 | 
					```yaml
 | 
				
			||||||
@@ -90,7 +90,7 @@ steps:
 | 
				
			|||||||
- run: pnpm test
 | 
					- run: pnpm test
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
> At the moment, only `lock` files in the project root are supported.
 | 
					For more examlpes of caching, please see the [Advanced usage](docs/advanced-usage.md#caching-packages-dependencies) guide.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Matrix Testing:
 | 
					### Matrix Testing:
 | 
				
			||||||
```yaml
 | 
					```yaml
 | 
				
			||||||
@@ -114,10 +114,11 @@ jobs:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
1. [Check latest version](docs/advanced-usage.md#check-latest-version)
 | 
					1. [Check latest version](docs/advanced-usage.md#check-latest-version)
 | 
				
			||||||
2. [Using different architectures](docs/advanced-usage.md#architecture)
 | 
					2. [Using different architectures](docs/advanced-usage.md#architecture)
 | 
				
			||||||
3. [Using multiple operating systems and architectures](docs/advanced-usage.md#multiple-operating-systems-and-architectures)
 | 
					3. [Caching packages dependencies](docs/advanced-usage.md#caching-packages-dependencies)
 | 
				
			||||||
4. [Publishing to npmjs and GPR with npm](docs/advanced-usage.md#publish-to-npmjs-and-gpr-with-npm)
 | 
					4. [Using multiple operating systems and architectures](docs/advanced-usage.md#multiple-operating-systems-and-architectures)
 | 
				
			||||||
5. [Publishing to npmjs and GPR with yarn](docs/advanced-usage.md#publish-to-npmjs-and-gpr-with-yarn)
 | 
					5. [Publishing to npmjs and GPR with npm](docs/advanced-usage.md#publish-to-npmjs-and-gpr-with-npm)
 | 
				
			||||||
6. [Using private packages](docs/advanced-usage.md#use-private-packages)
 | 
					6. [Publishing to npmjs and GPR with yarn](docs/advanced-usage.md#publish-to-npmjs-and-gpr-with-yarn)
 | 
				
			||||||
 | 
					7. [Using private packages](docs/advanced-usage.md#use-private-packages)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# License
 | 
					# License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,6 +21,8 @@ inputs:
 | 
				
			|||||||
    default: ${{ github.token }}
 | 
					    default: ${{ github.token }}
 | 
				
			||||||
  cache:
 | 
					  cache:
 | 
				
			||||||
    description: 'Used to specify a package manager for caching in the default directory. Supported values: npm, yarn, pnpm'
 | 
					    description: 'Used to specify a package manager for caching in the default directory. Supported values: npm, yarn, pnpm'
 | 
				
			||||||
 | 
					  cache-dependency-path:
 | 
				
			||||||
 | 
					    description: 'Used to specify path to a dependencies file: package-lock.json, yarn.lock, etc. Supports wildcards or an array of file names.'
 | 
				
			||||||
# TODO: add input to control forcing to pull from cloud or dist. 
 | 
					# TODO: add input to control forcing to pull from cloud or dist. 
 | 
				
			||||||
#       escape valve for someone having issues or needing the absolute latest which isn't cached yet
 | 
					#       escape valve for someone having issues or needing the absolute latest which isn't cached yet
 | 
				
			||||||
# Deprecated option, do not use. Will not be supported after October 1, 2019
 | 
					# Deprecated option, do not use. Will not be supported after October 1, 2019
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1324
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1324
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,6 +1,6 @@
 | 
				
			|||||||
# Advanced usage
 | 
					# Advanced usage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Check latest version:
 | 
					### Check latest version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The `check-latest` flag defaults to `false`. When set to `false`, the action will first check the local cache for a semver match. If unable to find a specific version in the cache, the action will attempt to download a version of Node.js. It will pull LTS versions from [node-versions releases](https://github.com/actions/node-versions/releases) and on miss or failure will fall back to the previous behavior of downloading directly from [node dist](https://nodejs.org/dist/). Use the default or set `check-latest` to `false` if you prefer stability and if you want to ensure a specific version of Node.js is always used.
 | 
					The `check-latest` flag defaults to `false`. When set to `false`, the action will first check the local cache for a semver match. If unable to find a specific version in the cache, the action will attempt to download a version of Node.js. It will pull LTS versions from [node-versions releases](https://github.com/actions/node-versions/releases) and on miss or failure will fall back to the previous behavior of downloading directly from [node dist](https://nodejs.org/dist/). Use the default or set `check-latest` to `false` if you prefer stability and if you want to ensure a specific version of Node.js is always used.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -19,7 +19,7 @@ steps:
 | 
				
			|||||||
- run: npm test
 | 
					- run: npm test
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Architecture:
 | 
					### Architecture
 | 
				
			||||||
 | 
					
 | 
				
			||||||
You can use any of the [supported operating systems](https://docs.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners), and the compatible `architecture` can be selected using `architecture`. Values are `x86`, `x64`, `arm64`, `armv6l`, `armv7l`, `ppc64le`, `s390x` (not all of the architectures are available on all platforms).
 | 
					You can use any of the [supported operating systems](https://docs.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners), and the compatible `architecture` can be selected using `architecture`. Values are `x86`, `x64`, `arm64`, `armv6l`, `armv7l`, `ppc64le`, `s390x` (not all of the architectures are available on all platforms).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -39,7 +39,37 @@ jobs:
 | 
				
			|||||||
      - run: npm test
 | 
					      - run: npm test
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Multiple Operating Systems and Architectures:
 | 
					### Caching packages dependencies
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**Using wildcard patterns to cache dependencies**
 | 
				
			||||||
 | 
					```yaml
 | 
				
			||||||
 | 
					steps:
 | 
				
			||||||
 | 
					- uses: actions/checkout@v2
 | 
				
			||||||
 | 
					- uses: actions/setup-node@v2
 | 
				
			||||||
 | 
					  with:
 | 
				
			||||||
 | 
					    node-version: '14'
 | 
				
			||||||
 | 
					    cache: 'npm'
 | 
				
			||||||
 | 
					    cache-dependency-path: '**/package-lock.json'
 | 
				
			||||||
 | 
					- run: npm install
 | 
				
			||||||
 | 
					- run: npm test
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**Using a list of file paths to cache dependencies**
 | 
				
			||||||
 | 
					```yaml
 | 
				
			||||||
 | 
					steps:
 | 
				
			||||||
 | 
					- uses: actions/checkout@v2
 | 
				
			||||||
 | 
					- uses: actions/setup-node@v2
 | 
				
			||||||
 | 
					  with:
 | 
				
			||||||
 | 
					    node-version: '14'
 | 
				
			||||||
 | 
					    cache: 'npm'
 | 
				
			||||||
 | 
					    cache-dependency-path: |
 | 
				
			||||||
 | 
					      server/app/package-lock.json
 | 
				
			||||||
 | 
					      frontend/app/package-lock.json
 | 
				
			||||||
 | 
					- run: npm install
 | 
				
			||||||
 | 
					- run: npm test
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Multiple Operating Systems and Architectures
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```yaml
 | 
					```yaml
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
@@ -74,7 +104,7 @@ jobs:
 | 
				
			|||||||
      - run: npm test
 | 
					      - run: npm test
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Publish to npmjs and GPR with npm:
 | 
					### Publish to npmjs and GPR with npm
 | 
				
			||||||
```yaml
 | 
					```yaml
 | 
				
			||||||
steps:
 | 
					steps:
 | 
				
			||||||
- uses: actions/checkout@v2
 | 
					- uses: actions/checkout@v2
 | 
				
			||||||
@@ -94,7 +124,7 @@ steps:
 | 
				
			|||||||
    NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
					    NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Publish to npmjs and GPR with yarn:
 | 
					### Publish to npmjs and GPR with yarn
 | 
				
			||||||
```yaml
 | 
					```yaml
 | 
				
			||||||
steps:
 | 
					steps:
 | 
				
			||||||
- uses: actions/checkout@v2
 | 
					- uses: actions/checkout@v2
 | 
				
			||||||
@@ -114,7 +144,7 @@ steps:
 | 
				
			|||||||
    NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
					    NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Use private packages:
 | 
					### Use private packages
 | 
				
			||||||
```yaml
 | 
					```yaml
 | 
				
			||||||
steps:
 | 
					steps:
 | 
				
			||||||
- uses: actions/checkout@v2
 | 
					- uses: actions/checkout@v2
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,7 +11,10 @@ import {
 | 
				
			|||||||
  PackageManagerInfo
 | 
					  PackageManagerInfo
 | 
				
			||||||
} from './cache-utils';
 | 
					} from './cache-utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const restoreCache = async (packageManager: string) => {
 | 
					export const restoreCache = async (
 | 
				
			||||||
 | 
					  packageManager: string,
 | 
				
			||||||
 | 
					  cacheDependencyPath?: string
 | 
				
			||||||
 | 
					) => {
 | 
				
			||||||
  const packageManagerInfo = await getPackageManagerInfo(packageManager);
 | 
					  const packageManagerInfo = await getPackageManagerInfo(packageManager);
 | 
				
			||||||
  if (!packageManagerInfo) {
 | 
					  if (!packageManagerInfo) {
 | 
				
			||||||
    throw new Error(`Caching for '${packageManager}' is not supported`);
 | 
					    throw new Error(`Caching for '${packageManager}' is not supported`);
 | 
				
			||||||
@@ -22,9 +25,17 @@ export const restoreCache = async (packageManager: string) => {
 | 
				
			|||||||
    packageManagerInfo,
 | 
					    packageManagerInfo,
 | 
				
			||||||
    packageManager
 | 
					    packageManager
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
  const lockFilePath = findLockFile(packageManagerInfo);
 | 
					  const lockFilePath = cacheDependencyPath
 | 
				
			||||||
 | 
					    ? cacheDependencyPath
 | 
				
			||||||
 | 
					    : findLockFile(packageManagerInfo);
 | 
				
			||||||
  const fileHash = await glob.hashFiles(lockFilePath);
 | 
					  const fileHash = await glob.hashFiles(lockFilePath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!fileHash) {
 | 
				
			||||||
 | 
					    throw new Error(
 | 
				
			||||||
 | 
					      'Some specified paths were not resolved, unable to cache dependencies.'
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const primaryKey = `node-cache-${platform}-${packageManager}-${fileHash}`;
 | 
					  const primaryKey = `node-cache-${platform}-${packageManager}-${fileHash}`;
 | 
				
			||||||
  core.debug(`primary key is ${primaryKey}`);
 | 
					  core.debug(`primary key is ${primaryKey}`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,7 +51,8 @@ export async function run() {
 | 
				
			|||||||
      if (isGhes()) {
 | 
					      if (isGhes()) {
 | 
				
			||||||
        throw new Error('Caching is not supported on GHES');
 | 
					        throw new Error('Caching is not supported on GHES');
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      await restoreCache(cache);
 | 
					      const cacheDependencyPath = core.getInput('cache-dependency-path');
 | 
				
			||||||
 | 
					      await restoreCache(cache, cacheDependencyPath);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const matchersPath = path.join(__dirname, '../..', '.github');
 | 
					    const matchersPath = path.join(__dirname, '../..', '.github');
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user