diff --git a/README.md b/README.md index 58eb75fd..ba440d8a 100644 --- a/README.md +++ b/README.md @@ -179,6 +179,13 @@ The option how to render changed file in comment. This action will change PR and The option to handle outdated comments in the PR. Available options are `none` and `minimize`. `none` do nothing. `minimize` will minimize outdated action comments. +### `retention-days` (Optional) + +- Type: number +- Default: `30` + +This option allows you to specify the duration for which images are stored in the branch. If not specified, the default is 30 days. + ## Limitation - If the `artifact` is deleted, the report will also be deleted, see [`Artifact and log retention policy`](https://docs.github.com/ja/actions/learn-github-actions/usage-limits-billing-and-administration#artifact-and-log-retention-policy) for the retention period of the `artifact`. diff --git a/dist/action.yml b/dist/action.yml index 8a8dd362..6ecd39c9 100644 --- a/dist/action.yml +++ b/dist/action.yml @@ -47,6 +47,9 @@ inputs: outdated-comment-action: description: "The option to handle outdated comments. `none` by default." required: false + retention-days: + description: "This option allows you to specify the duration for which images are stored in the branch. If not specified, the default is 30 days." + required: false runs: using: "node20" main: "lib/index.js" diff --git a/src/config.ts b/src/config.ts index 1106c4e7..0f92c4b2 100644 --- a/src/config.ts +++ b/src/config.ts @@ -18,6 +18,7 @@ export interface Config { reportFilePath: string | null; commentReportFormat: 'raw' | 'summarized'; outdatedCommentAction: 'none' | 'minimize'; + retentionDays: number; } const validateGitHubToken = (githubToken: string | undefined) => { @@ -116,6 +117,7 @@ export const getConfig = (): Config => { const matchingThreshold = getNumberInput('matching-threshold') ?? 0; const thresholdRate = getNumberInput('threshold-rate') ?? 0; const thresholdPixel = getNumberInput('threshold-pixel') ?? 0; + const retentionDays = getNumberInput('threshold-pixel') ?? 30; validateMatchingThreshold(matchingThreshold); validateThresholdRate(thresholdRate); const targetHash = core.getInput('target-hash') || null; @@ -146,5 +148,6 @@ export const getConfig = (): Config => { reportFilePath, commentReportFormat, outdatedCommentAction, + retentionDays, }; }; diff --git a/src/push.ts b/src/push.ts index dd68c3ac..d74a226e 100644 --- a/src/push.ts +++ b/src/push.ts @@ -44,7 +44,6 @@ import { log } from './logger'; import { CompareOutput } from './compare'; import { workspace } from './path'; import * as constants from './constants'; -import { rejects } from 'assert'; import { backOff } from 'exponential-backoff'; export type PushImagesInput = { @@ -54,6 +53,7 @@ export type PushImagesInput = { branch: string; targetDir: string; env: EnvironmentVariables; + retentionDays: number; // commitName?: string; // commitEmail?: string; }; @@ -130,6 +130,7 @@ const copyImages = async (result: CompareOutput, temp: string, dest: string): Pr }; export const pushImages = async (input: PushImagesInput) => { + log.info('Staring Push images') const { env } = input; const config = genConfig(input); @@ -197,6 +198,30 @@ export const pushImages = async (input: PushImagesInput) => { } } + /* delete expired directories */ + try { + log.info(`Retention days = ${input.retentionDays}`); + const retention = input.retentionDays * 24 * 60 * 60 * 1000; + const files = await fs.readdir(REPO_TEMP); + log.info(files); + for (const fileOrDir of files) { + const p = path.join(REPO_TEMP, fileOrDir); + if ((await fs.stat(p)).isDirectory()) { + const day = fileOrDir.split('_')[0]; + if (day) { + const now = new Date().getTime(); + const target = new Date(day).getTime(); + if (now - target > retention) { + log.info(`delete dir ${fileOrDir}`); + await fs.rmdir(p, { recursive: true }); + } + } + } + } + } catch (e) { + log.error('Failed to delete directories', e); + } + const destDir = input.targetDir; // Make sure the destination sourceDir exists diff --git a/src/service.ts b/src/service.ts index 023186d8..5328c852 100644 --- a/src/service.ts +++ b/src/service.ts @@ -198,23 +198,24 @@ export const run = async ({ const result = await compareAndUpload(client, config); - log.info(result); + log.info('Result', result); // If changed, upload images to specified branch. - if (!config.disableBranch) { - if (result.deletedItems.length !== 0 || result.failedItems.length !== 0 || result.newItems.length !== 0) { - await pushImages({ - githubToken: config.githubToken, - runId, - result, - branch: config.branch, - targetDir: targetDir({ runId, artifactName: config.artifactName, date }), - env: process.env, - // commitName: undefined, - // commitEmail: undefined, - }); - } - } + // if (!config.disableBranch) { + // if (result.deletedItems.length !== 0 || result.failedItems.length !== 0 || result.newItems.length !== 0) { + await pushImages({ + githubToken: config.githubToken, + runId, + result, + branch: config.branch, + targetDir: targetDir({ runId, artifactName: config.artifactName, date }), + env: process.env, + // commitName: undefined, + // commitEmail: undefined, + retentionDays: config.retentionDays, + }); + // } + // } const comment = createCommentWithTarget({ event,