Skip to content

Commit 3b93fec

Browse files
authored
Merge pull request #22 from satackey/fix_layer_cache_not_found
Fix layer cache not found (#19)
2 parents a4aecb7 + 50cf92b commit 3b93fec

File tree

10 files changed

+156
-136
lines changed

10 files changed

+156
-136
lines changed

.github/workflows/release.yml

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,18 @@ jobs:
4545
script: |
4646
return {
4747
inspect_image: [
48-
'test_project_node',
49-
'amazon/aws-cli',
48+
'test_project_scratch',
49+
'hello-world',
5050
],
5151
include: [
5252
{
53-
inspect_image: 'test_project_node',
53+
inspect_image: 'test_project_scratch',
5454
prepare_command: 'docker-compose -f test_project/docker-compose.yml -p test_project pull',
5555
build_command: 'docker-compose -f test_project/docker-compose.yml -p test_project build',
5656
}, {
57-
inspect_image: 'amazon/aws-cli',
57+
inspect_image: 'hello-world',
5858
prepare_command: ':',
59-
build_command: 'docker pull amazon/aws-cli',
59+
build_command: 'docker pull hello-world',
6060
},
6161
],
6262
}
@@ -91,7 +91,6 @@ jobs:
9191
name: Run satackey/action-docker-layer-caching@${{ steps.extract.outputs.branch }}
9292
with:
9393
key: docker-layer-caching-${{ matrix.inspect_image }}-sha:${{ github.sha }}-{hash}
94-
restore-keys: docker-layer-caching-${{ matrix.inspect_image }}-sha:${{ github.sha }}-
9594

9695
- run: ${{ matrix.build_command }}
9796

@@ -119,7 +118,7 @@ jobs:
119118
- uses: ./action-dlc
120119
name: Run satackey/action-docker-layer-caching@${{ steps.extract.outputs.branch }}
121120
with:
122-
key: docker-layer-caching-${{ matrix.inspect_image }}-sha:${{ github.sha }}-{hash}
121+
key: never-restored-docker-layer-caching-${{ matrix.inspect_image }}-sha:${{ github.sha }}-{hash}
123122
restore-keys: docker-layer-caching-${{ matrix.inspect_image }}-sha:${{ github.sha }}-
124123
skip-save: 'true'
125124

main.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,21 @@ import { LayerCache } from './src/LayerCache'
44
import { ImageDetector } from './src/ImageDetector'
55

66
const main = async () => {
7-
// const repotag = core.getInput(`repotag`, { required: true })
87
const primaryKey = core.getInput(`key`, { required: true })
98
const restoreKeys = core.getInput(`restore-keys`, { required: false }).split(`\n`).filter(key => key !== ``)
109

11-
core.saveState(`already-existing-images`, JSON.stringify(await new ImageDetector().getExistingImages()))
10+
const imageDetector = new ImageDetector()
11+
12+
const alreadyExistingImages = await imageDetector.getExistingImages()
1213

1314
const layerCache = new LayerCache([])
1415
layerCache.concurrency = parseInt(core.getInput(`concurrency`, { required: true }), 10)
1516
const restoredKey = await layerCache.restore(primaryKey, restoreKeys)
1617
await layerCache.cleanUp()
1718

1819
core.saveState(`restored-key`, JSON.stringify(restoredKey !== undefined ? restoredKey : ''))
20+
core.saveState(`already-existing-images`, JSON.stringify(alreadyExistingImages))
21+
core.saveState(`restored-images`, JSON.stringify(await imageDetector.getImagesShouldSave(alreadyExistingImages)))
1922
}
2023

2124
main().catch(e => {

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
"dependencies": {
99
"@actions/cache": "^1.0.2",
1010
"@actions/core": "^1.2.4",
11+
"@types/recursive-readdir": "^2.2.0",
1112
"actions-exec-listener": "^0.0.2",
1213
"crypto": "^1.0.1",
1314
"native-promise-pool": "^3.13.0",
15+
"recursive-readdir": "^2.2.2",
1416
"string-format": "^2.0.0",
1517
"typescript-is": "^0.16.3"
1618
},

post.ts

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import * as core from '@actions/core'
2-
import exec from 'actions-exec-listener'
32

43
import { LayerCache } from './src/LayerCache'
54
import { ImageDetector } from './src/ImageDetector'
@@ -12,26 +11,24 @@ const main = async () => {
1211
}
1312

1413
const primaryKey = core.getInput('key', { required: true })
15-
const restoredKey = JSON.parse(core.getState(`restored-key`)) as string
1614

17-
const rawAlreadyExistingImages = core.getState(`already-existing-images`)
18-
assertType<string>(rawAlreadyExistingImages)
19-
const alreadyExistingImages = JSON.parse(rawAlreadyExistingImages)
15+
const restoredKey = JSON.parse(core.getState(`restored-key`))
16+
const alreadyExistingImages = JSON.parse(core.getState(`already-existing-images`))
17+
const restoredImages = JSON.parse(core.getState(`restored-images`))
18+
19+
assertType<string>(restoredKey)
2020
assertType<string[]>(alreadyExistingImages)
21+
assertType<string[]>(restoredImages)
2122

2223
const imageDetector = new ImageDetector()
23-
imageDetector.registerAlreadyExistedImages(alreadyExistingImages)
24-
await imageDetector.getExistingImages()
25-
core.debug(JSON.stringify({ imageIdsToSave: imageDetector.getImagesShouldSave() }))
26-
const layerCache = new LayerCache(imageDetector.getImagesShouldSave())
27-
layerCache.concurrency = parseInt(core.getInput(`concurrency`, { required: true }), 10)
28-
29-
layerCache.unformattedOrigianlKey = primaryKey
30-
core.debug(JSON.stringify({ restoredKey, formattedOriginalCacheKey: layerCache.getFormattedOriginalCacheKey()}))
31-
if (restoredKey !== `` && restoredKey === layerCache.getFormattedOriginalCacheKey()) {
32-
core.info(`Key ${restoredKey} already exists, skip storing.`)
24+
if (await imageDetector.checkIfImageHasAdded(restoredImages)) {
25+
core.info(`Key ${restoredKey} already exists, not saving cache.`)
3326
return
3427
}
28+
29+
const layerCache = new LayerCache(await imageDetector.getImagesShouldSave(alreadyExistingImages))
30+
layerCache.concurrency = parseInt(core.getInput(`concurrency`, { required: true }), 10)
31+
3532
await layerCache.store(primaryKey)
3633
await layerCache.cleanUp()
3734
}

src/ImageDetector.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,24 @@ import exec from 'actions-exec-listener'
22
import * as core from '@actions/core'
33

44
export class ImageDetector {
5-
alreadyExistedImages: Set<string> = new Set([])
6-
existingImages: Set<string> = new Set([])
7-
registerAlreadyExistedImages(images: string[]) {
8-
images.forEach(image => this.alreadyExistedImages.add(image))
9-
}
10-
115
async getExistingImages(): Promise<string[]> {
6+
const existingSet = new Set<string>([])
127
const ids = (await exec.exec(`docker image ls -q`, [], { silent: true })).stdoutStr.split(`\n`).filter(id => id !== ``)
138
const repotags = (await exec.exec(`sh -c "docker image ls --format '{{ .Repository }}:{{ .Tag }}' --filter 'dangling=false'"`, [], { silent: true })).stdoutStr.split(`\n`).filter(id => id !== ``);
149
core.debug(JSON.stringify({ log: "getExistingImages", ids, repotags }));
15-
([...ids, ...repotags]).forEach(image => this.existingImages.add(image))
16-
core.debug(JSON.stringify({ existingImages: this.existingImages }))
17-
return Array.from(this.existingImages)
10+
([...ids, ...repotags]).forEach(image => existingSet.add(image))
11+
core.debug(JSON.stringify({ existingSet }))
12+
return Array.from(existingSet)
1813
}
1914

20-
getImagesShouldSave(): string[] {
21-
const resultSet = new Set(this.existingImages.values())
22-
this.alreadyExistedImages.forEach(image => resultSet.delete(image))
15+
async getImagesShouldSave(alreadRegisteredImages: string[]): Promise<string[]> {
16+
const resultSet = new Set(await this.getExistingImages())
17+
alreadRegisteredImages.forEach(image => resultSet.delete(image))
2318
return Array.from(resultSet)
2419
}
20+
21+
async checkIfImageHasAdded(restoredImages: string[]): Promise<boolean> {
22+
const existing = await this.getExistingImages()
23+
return JSON.stringify(restoredImages) === JSON.stringify(existing)
24+
}
2525
}

0 commit comments

Comments
 (0)