Skip to content

Commit fa9f0c1

Browse files
committed
ImageDetector
1 parent 11b1f69 commit fa9f0c1

File tree

3 files changed

+36
-7
lines changed

3 files changed

+36
-7
lines changed

main.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import * as core from '@actions/core'
22
import exec from 'actions-exec-listener'
33
import { LayerCache } from './src/LayerCache'
4+
import { ImageDetector } from './src/ImageDetector'
45

56
const main = async () => {
67
// const repotag = core.getInput(`repotag`, { required: true })
78
const primaryKey = core.getInput(`key`, { required: true })
89
const restoreKeys = core.getInput(`restore-keys`, { required: false }).split(`\n`).filter(key => key !== ``)
910

10-
core.saveState(`already-existing-image-ids`, (await exec.exec(`docker image ls -q`)).stdoutStr.split(`\n`).filter(id => id !== ``))
11+
core.saveState(`already-existing-images`, JSON.stringify(await new ImageDetector().getExistingImages()))
1112

1213
const layerCache = new LayerCache([])
1314
const restoredKey = await layerCache.restore(primaryKey, restoreKeys)

post.ts

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

44
import { LayerCache } from './src/LayerCache'
5+
import { ImageDetector } from './src/ImageDetector'
6+
import { assertType } from 'typescript-is'
57
const main = async () => {
68
const primaryKey = core.getInput('key', { required: true })
79
const restoredKey = JSON.parse(core.getState(`restored-key`)) as string
8-
const alreadyExistingImageIds = JSON.parse(core.getState(`already-existing-image-ids`)) as string[]
9-
const currentImageIds = (await exec.exec(`docker image ls -q`)).stdoutStr.split(`\n`).filter(id => id !== ``)
10-
const imageIdsToSave = new Set([...currentImageIds])
11-
alreadyExistingImageIds.forEach(id => imageIdsToSave.delete(id))
1210

13-
core.debug(JSON.stringify({ imageIdsToSave }))
14-
const layerCache = new LayerCache(Array.from(imageIdsToSave))
11+
const rawAlreadyExistingImages = core.getState(`already-existing-images`)
12+
assertType<string>(rawAlreadyExistingImages)
13+
const alreadyExistingImages = JSON.parse(rawAlreadyExistingImages)
14+
assertType<string[]>(alreadyExistingImages)
15+
16+
const imageDetector = new ImageDetector()
17+
imageDetector.registerAlreadyExistedImages(alreadyExistingImages)
18+
imageDetector.getExistingImages()
19+
core.debug(JSON.stringify({ imageIdsToSave: imageDetector.getImagesShouldSave() }))
20+
const layerCache = new LayerCache(imageDetector.getImagesShouldSave())
1521

1622
core.debug(JSON.stringify({ restoredKey, formattedOriginalCacheKey: layerCache.getFormattedOriginalCacheKey()}))
1723
if (restoredKey !== `` && restoredKey === layerCache.getFormattedOriginalCacheKey()) {

src/ImageDetector.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import exec from 'actions-exec-listener'
2+
3+
export class ImageDetector {
4+
alreadyExistedImages: Set<string> = new Set()
5+
existingImages: Set<string> = new Set()
6+
registerAlreadyExistedImages(images: string[]) {
7+
images.forEach(this.alreadyExistedImages.add)
8+
}
9+
10+
async getExistingImages(): Promise<string[]> {
11+
const ids = (await exec.exec(`docker`, `image ls -q`.split(' '))).stdoutStr.split(`\n`).filter(id => id !== ``)
12+
const repotags = (await exec.exec(`docker`, `image ls --format '{{ .Repository }}:{{ .Tag }}'`.split(' '))).stdoutStr.split(`\n`).filter(id => id !== `` || !id.includes(`<node>`));
13+
([...ids, ...repotags]).forEach(this.existingImages.add)
14+
return Array.from(this.existingImages)
15+
}
16+
17+
getImagesShouldSave(): string[] {
18+
const resultSet = new Set(this.existingImages.values())
19+
this.alreadyExistedImages.forEach(resultSet.delete)
20+
return Array.from(resultSet)
21+
}
22+
}

0 commit comments

Comments
 (0)