mirror of
				https://github.com/actions/cache.git
				synced 2025-11-04 15:48:39 +08:00 
			
		
		
		
	Fix save-always/post-if with an output
This commit is contained in:
		
							parent
							
								
									0c45773b62
								
							
						
					
					
						commit
						7214f3c546
					
				| 
						 | 
					@ -173,8 +173,12 @@ test("restore with cache found for key", async () => {
 | 
				
			||||||
    expect(stateMock).toHaveBeenCalledWith("CACHE_RESULT", key);
 | 
					    expect(stateMock).toHaveBeenCalledWith("CACHE_RESULT", key);
 | 
				
			||||||
    expect(stateMock).toHaveBeenCalledTimes(2);
 | 
					    expect(stateMock).toHaveBeenCalledTimes(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1);
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(2);
 | 
				
			||||||
    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "true");
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "true");
 | 
				
			||||||
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledWith(
 | 
				
			||||||
 | 
					        "save-always-d18d746b9",
 | 
				
			||||||
 | 
					        ""
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(infoMock).toHaveBeenCalledWith(`Cache restored from key: ${key}`);
 | 
					    expect(infoMock).toHaveBeenCalledWith(`Cache restored from key: ${key}`);
 | 
				
			||||||
    expect(failedMock).toHaveBeenCalledTimes(0);
 | 
					    expect(failedMock).toHaveBeenCalledTimes(0);
 | 
				
			||||||
| 
						 | 
					@ -218,8 +222,12 @@ test("restore with cache found for restore key", async () => {
 | 
				
			||||||
    expect(stateMock).toHaveBeenCalledWith("CACHE_RESULT", restoreKey);
 | 
					    expect(stateMock).toHaveBeenCalledWith("CACHE_RESULT", restoreKey);
 | 
				
			||||||
    expect(stateMock).toHaveBeenCalledTimes(2);
 | 
					    expect(stateMock).toHaveBeenCalledTimes(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1);
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(2);
 | 
				
			||||||
    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "false");
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "false");
 | 
				
			||||||
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledWith(
 | 
				
			||||||
 | 
					        "save-always-d18d746b9",
 | 
				
			||||||
 | 
					        ""
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
    expect(infoMock).toHaveBeenCalledWith(
 | 
					    expect(infoMock).toHaveBeenCalledWith(
 | 
				
			||||||
        `Cache restored from key: ${restoreKey}`
 | 
					        `Cache restored from key: ${restoreKey}`
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
| 
						 | 
					@ -260,7 +268,11 @@ test("Fail restore when fail on cache miss is enabled and primary + restore keys
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key);
 | 
					    expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key);
 | 
				
			||||||
    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(0);
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1);
 | 
				
			||||||
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledWith(
 | 
				
			||||||
 | 
					        "save-always-d18d746b9",
 | 
				
			||||||
 | 
					        ""
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(failedMock).toHaveBeenCalledWith(
 | 
					    expect(failedMock).toHaveBeenCalledWith(
 | 
				
			||||||
        `Failed to restore cache entry. Exiting as fail-on-cache-miss is set. Input key: ${key}`
 | 
					        `Failed to restore cache entry. Exiting as fail-on-cache-miss is set. Input key: ${key}`
 | 
				
			||||||
| 
						 | 
					@ -306,8 +318,12 @@ test("restore when fail on cache miss is enabled and primary key doesn't match r
 | 
				
			||||||
    expect(stateMock).toHaveBeenCalledWith("CACHE_RESULT", restoreKey);
 | 
					    expect(stateMock).toHaveBeenCalledWith("CACHE_RESULT", restoreKey);
 | 
				
			||||||
    expect(stateMock).toHaveBeenCalledTimes(2);
 | 
					    expect(stateMock).toHaveBeenCalledTimes(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1);
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(2);
 | 
				
			||||||
    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "false");
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "false");
 | 
				
			||||||
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledWith(
 | 
				
			||||||
 | 
					        "save-always-d18d746b9",
 | 
				
			||||||
 | 
					        ""
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(infoMock).toHaveBeenCalledWith(
 | 
					    expect(infoMock).toHaveBeenCalledWith(
 | 
				
			||||||
        `Cache restored from key: ${restoreKey}`
 | 
					        `Cache restored from key: ${restoreKey}`
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -79,8 +79,12 @@ test("restore without AC available should no-op", async () => {
 | 
				
			||||||
    await restoreImpl(new StateProvider());
 | 
					    await restoreImpl(new StateProvider());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(restoreCacheMock).toHaveBeenCalledTimes(0);
 | 
					    expect(restoreCacheMock).toHaveBeenCalledTimes(0);
 | 
				
			||||||
    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1);
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(2);
 | 
				
			||||||
    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "false");
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "false");
 | 
				
			||||||
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledWith(
 | 
				
			||||||
 | 
					        "save-always-d18d746b9",
 | 
				
			||||||
 | 
					        ""
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test("restore on GHES without AC available should no-op", async () => {
 | 
					test("restore on GHES without AC available should no-op", async () => {
 | 
				
			||||||
| 
						 | 
					@ -95,8 +99,12 @@ test("restore on GHES without AC available should no-op", async () => {
 | 
				
			||||||
    await restoreImpl(new StateProvider());
 | 
					    await restoreImpl(new StateProvider());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(restoreCacheMock).toHaveBeenCalledTimes(0);
 | 
					    expect(restoreCacheMock).toHaveBeenCalledTimes(0);
 | 
				
			||||||
    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1);
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(2);
 | 
				
			||||||
    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "false");
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "false");
 | 
				
			||||||
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledWith(
 | 
				
			||||||
 | 
					        "save-always-d18d746b9",
 | 
				
			||||||
 | 
					        ""
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test("restore on GHES with AC available ", async () => {
 | 
					test("restore on GHES with AC available ", async () => {
 | 
				
			||||||
| 
						 | 
					@ -133,8 +141,12 @@ test("restore on GHES with AC available ", async () => {
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key);
 | 
					    expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key);
 | 
				
			||||||
    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1);
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(2);
 | 
				
			||||||
    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "true");
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "true");
 | 
				
			||||||
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledWith(
 | 
				
			||||||
 | 
					        "save-always-d18d746b9",
 | 
				
			||||||
 | 
					        ""
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(infoMock).toHaveBeenCalledWith(`Cache restored from key: ${key}`);
 | 
					    expect(infoMock).toHaveBeenCalledWith(`Cache restored from key: ${key}`);
 | 
				
			||||||
    expect(failedMock).toHaveBeenCalledTimes(0);
 | 
					    expect(failedMock).toHaveBeenCalledTimes(0);
 | 
				
			||||||
| 
						 | 
					@ -355,8 +367,12 @@ test("restore with cache found for key", async () => {
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key);
 | 
					    expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key);
 | 
				
			||||||
    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1);
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(2);
 | 
				
			||||||
    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "true");
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "true");
 | 
				
			||||||
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledWith(
 | 
				
			||||||
 | 
					        "save-always-d18d746b9",
 | 
				
			||||||
 | 
					        ""
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(infoMock).toHaveBeenCalledWith(`Cache restored from key: ${key}`);
 | 
					    expect(infoMock).toHaveBeenCalledWith(`Cache restored from key: ${key}`);
 | 
				
			||||||
    expect(failedMock).toHaveBeenCalledTimes(0);
 | 
					    expect(failedMock).toHaveBeenCalledTimes(0);
 | 
				
			||||||
| 
						 | 
					@ -397,8 +413,12 @@ test("restore with cache found for restore key", async () => {
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key);
 | 
					    expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key);
 | 
				
			||||||
    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1);
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(2);
 | 
				
			||||||
    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "false");
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "false");
 | 
				
			||||||
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledWith(
 | 
				
			||||||
 | 
					        "save-always-d18d746b9",
 | 
				
			||||||
 | 
					        ""
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
    expect(infoMock).toHaveBeenCalledWith(
 | 
					    expect(infoMock).toHaveBeenCalledWith(
 | 
				
			||||||
        `Cache restored from key: ${restoreKey}`
 | 
					        `Cache restored from key: ${restoreKey}`
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
| 
						 | 
					@ -441,8 +461,12 @@ test("restore with lookup-only set", async () => {
 | 
				
			||||||
    expect(stateMock).toHaveBeenCalledWith("CACHE_RESULT", key);
 | 
					    expect(stateMock).toHaveBeenCalledWith("CACHE_RESULT", key);
 | 
				
			||||||
    expect(stateMock).toHaveBeenCalledTimes(2);
 | 
					    expect(stateMock).toHaveBeenCalledTimes(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1);
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(2);
 | 
				
			||||||
    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "true");
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "true");
 | 
				
			||||||
 | 
					    expect(setCacheHitOutputMock).toHaveBeenCalledWith(
 | 
				
			||||||
 | 
					        "save-always-d18d746b9",
 | 
				
			||||||
 | 
					        ""
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(infoMock).toHaveBeenCalledWith(
 | 
					    expect(infoMock).toHaveBeenCalledWith(
 | 
				
			||||||
        `Cache found and can be restored from key: ${key}`
 | 
					        `Cache found and can be restored from key: ${key}`
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -86,7 +86,8 @@ test("restore with no cache found", async () => {
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(outputMock).toHaveBeenCalledWith("cache-primary-key", key);
 | 
					    expect(outputMock).toHaveBeenCalledWith("cache-primary-key", key);
 | 
				
			||||||
    expect(outputMock).toHaveBeenCalledTimes(1);
 | 
					    expect(outputMock).toHaveBeenCalledWith("save-always-d18d746b9", "");
 | 
				
			||||||
 | 
					    expect(outputMock).toHaveBeenCalledTimes(2);
 | 
				
			||||||
    expect(failedMock).toHaveBeenCalledTimes(0);
 | 
					    expect(failedMock).toHaveBeenCalledTimes(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(infoMock).toHaveBeenCalledWith(
 | 
					    expect(infoMock).toHaveBeenCalledWith(
 | 
				
			||||||
| 
						 | 
					@ -169,8 +170,9 @@ test("restore with cache found for key", async () => {
 | 
				
			||||||
    expect(outputMock).toHaveBeenCalledWith("cache-primary-key", key);
 | 
					    expect(outputMock).toHaveBeenCalledWith("cache-primary-key", key);
 | 
				
			||||||
    expect(outputMock).toHaveBeenCalledWith("cache-hit", "true");
 | 
					    expect(outputMock).toHaveBeenCalledWith("cache-hit", "true");
 | 
				
			||||||
    expect(outputMock).toHaveBeenCalledWith("cache-matched-key", key);
 | 
					    expect(outputMock).toHaveBeenCalledWith("cache-matched-key", key);
 | 
				
			||||||
 | 
					    expect(outputMock).toHaveBeenCalledWith("save-always-d18d746b9", "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(outputMock).toHaveBeenCalledTimes(3);
 | 
					    expect(outputMock).toHaveBeenCalledTimes(4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(infoMock).toHaveBeenCalledWith(`Cache restored from key: ${key}`);
 | 
					    expect(infoMock).toHaveBeenCalledWith(`Cache restored from key: ${key}`);
 | 
				
			||||||
    expect(failedMock).toHaveBeenCalledTimes(0);
 | 
					    expect(failedMock).toHaveBeenCalledTimes(0);
 | 
				
			||||||
| 
						 | 
					@ -212,8 +214,9 @@ test("restore with cache found for restore key", async () => {
 | 
				
			||||||
    expect(outputMock).toHaveBeenCalledWith("cache-primary-key", key);
 | 
					    expect(outputMock).toHaveBeenCalledWith("cache-primary-key", key);
 | 
				
			||||||
    expect(outputMock).toHaveBeenCalledWith("cache-hit", "false");
 | 
					    expect(outputMock).toHaveBeenCalledWith("cache-hit", "false");
 | 
				
			||||||
    expect(outputMock).toHaveBeenCalledWith("cache-matched-key", restoreKey);
 | 
					    expect(outputMock).toHaveBeenCalledWith("cache-matched-key", restoreKey);
 | 
				
			||||||
 | 
					    expect(outputMock).toHaveBeenCalledWith("save-always-d18d746b9", "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(outputMock).toHaveBeenCalledTimes(3);
 | 
					    expect(outputMock).toHaveBeenCalledTimes(4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(infoMock).toHaveBeenCalledWith(
 | 
					    expect(infoMock).toHaveBeenCalledWith(
 | 
				
			||||||
        `Cache restored from key: ${restoreKey}`
 | 
					        `Cache restored from key: ${restoreKey}`
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,11 +33,13 @@ inputs:
 | 
				
			||||||
outputs:
 | 
					outputs:
 | 
				
			||||||
  cache-hit:
 | 
					  cache-hit:
 | 
				
			||||||
    description: 'A boolean value to indicate an exact match was found for the primary key'
 | 
					    description: 'A boolean value to indicate an exact match was found for the primary key'
 | 
				
			||||||
 | 
					  save-always-d18d746b9:
 | 
				
			||||||
 | 
					    description: "Run the post step to save the cache even if another step before fails"
 | 
				
			||||||
runs:
 | 
					runs:
 | 
				
			||||||
  using: 'node20'
 | 
					  using: 'node20'
 | 
				
			||||||
  main: 'dist/restore/index.js'
 | 
					  main: 'dist/restore/index.js'
 | 
				
			||||||
  post: 'dist/save/index.js'
 | 
					  post: 'dist/save/index.js'
 | 
				
			||||||
  post-if: "success() || github.event.inputs.save-always"
 | 
					  post-if: "success() || (contains(steps.*.outputs.save-always-d18d746b9, 'true') && !contains(steps.*.outputs.save-always-d18d746b9, 'false'))"
 | 
				
			||||||
branding:
 | 
					branding:
 | 
				
			||||||
  icon: 'archive'
 | 
					  icon: 'archive'
 | 
				
			||||||
  color: 'gray-dark'
 | 
					  color: 'gray-dark'
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,13 +5,15 @@ export enum Inputs {
 | 
				
			||||||
    UploadChunkSize = "upload-chunk-size", // Input for cache, save action
 | 
					    UploadChunkSize = "upload-chunk-size", // Input for cache, save action
 | 
				
			||||||
    EnableCrossOsArchive = "enableCrossOsArchive", // Input for cache, restore, save action
 | 
					    EnableCrossOsArchive = "enableCrossOsArchive", // Input for cache, restore, save action
 | 
				
			||||||
    FailOnCacheMiss = "fail-on-cache-miss", // Input for cache, restore action
 | 
					    FailOnCacheMiss = "fail-on-cache-miss", // Input for cache, restore action
 | 
				
			||||||
    LookupOnly = "lookup-only" // Input for cache, restore action
 | 
					    LookupOnly = "lookup-only", // Input for cache, restore action
 | 
				
			||||||
 | 
					    SaveAlways = "save-always" // Input for cache action
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export enum Outputs {
 | 
					export enum Outputs {
 | 
				
			||||||
    CacheHit = "cache-hit", // Output from cache, restore action
 | 
					    CacheHit = "cache-hit", // Output from cache, restore action
 | 
				
			||||||
    CachePrimaryKey = "cache-primary-key", // Output from restore action
 | 
					    CachePrimaryKey = "cache-primary-key", // Output from restore action
 | 
				
			||||||
    CacheMatchedKey = "cache-matched-key" // Output from restore action
 | 
					    CacheMatchedKey = "cache-matched-key", // Output from restore action
 | 
				
			||||||
 | 
					    SaveAlways = "save-always-d18d746b9" // Output from cache action, with unique suffix for detection in post-if
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export enum State {
 | 
					export enum State {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,6 +13,8 @@ export async function restoreImpl(
 | 
				
			||||||
    stateProvider: IStateProvider,
 | 
					    stateProvider: IStateProvider,
 | 
				
			||||||
    earlyExit?: boolean | undefined
 | 
					    earlyExit?: boolean | undefined
 | 
				
			||||||
): Promise<string | undefined> {
 | 
					): Promise<string | undefined> {
 | 
				
			||||||
 | 
					    core.setOutput(Outputs.SaveAlways, core.getInput(Inputs.SaveAlways));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
        if (!utils.isCacheFeatureAvailable()) {
 | 
					        if (!utils.isCacheFeatureAvailable()) {
 | 
				
			||||||
            core.setOutput(Outputs.CacheHit, "false");
 | 
					            core.setOutput(Outputs.CacheHit, "false");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user