mirror of
https://github.com/docker/actions-toolkit.git
synced 2024-11-23 03:16:09 +08:00
Merge pull request #368 from crazy-max/summary-artifact-relative-link
github(summary): use relative path for artifact link and fix filename
This commit is contained in:
commit
6c6fdffd44
1
.github/workflows/test.yml
vendored
1
.github/workflows/test.yml
vendored
@ -149,6 +149,7 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
CTN_BUILDER_NAME: ${{ steps.builder.outputs.name }}
|
CTN_BUILDER_NAME: ${{ steps.builder.outputs.name }}
|
||||||
|
TEST_FOR_SUMMARY: ${{ secrets.TEST_FOR_SUMMARY }}
|
||||||
-
|
-
|
||||||
name: Check coverage
|
name: Check coverage
|
||||||
run: |
|
run: |
|
||||||
|
@ -353,6 +353,33 @@ describe('generateRandomString', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('stringToUnicodeEntities', () => {
|
||||||
|
it('should convert a string to Unicode entities', () => {
|
||||||
|
const input = 'Hello, World!';
|
||||||
|
const expected = 'Hello, World!';
|
||||||
|
const result = Util.stringToUnicodeEntities(input);
|
||||||
|
expect(result).toEqual(expected);
|
||||||
|
});
|
||||||
|
it('should handle an empty string', () => {
|
||||||
|
const input = '';
|
||||||
|
const expected = '';
|
||||||
|
const result = Util.stringToUnicodeEntities(input);
|
||||||
|
expect(result).toEqual(expected);
|
||||||
|
});
|
||||||
|
it('should handle special characters', () => {
|
||||||
|
const input = '@#^&*()';
|
||||||
|
const expected = '@#^&*()';
|
||||||
|
const result = Util.stringToUnicodeEntities(input);
|
||||||
|
expect(result).toEqual(expected);
|
||||||
|
});
|
||||||
|
it('should handle non-English characters', () => {
|
||||||
|
const input = 'こんにちは';
|
||||||
|
const expected = 'こんにちは';
|
||||||
|
const result = Util.stringToUnicodeEntities(input);
|
||||||
|
expect(result).toEqual(expected);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
// See: https://github.com/actions/toolkit/blob/a1b068ec31a042ff1e10a522d8fdf0b8869d53ca/packages/core/src/core.ts#L89
|
// See: https://github.com/actions/toolkit/blob/a1b068ec31a042ff1e10a522d8fdf0b8869d53ca/packages/core/src/core.ts#L89
|
||||||
function getInputName(name: string): string {
|
function getInputName(name: string): string {
|
||||||
return `INPUT_${name.replace(/ /g, '_').toUpperCase()}`;
|
return `INPUT_${name.replace(/ /g, '_').toUpperCase()}`;
|
||||||
|
@ -68,10 +68,18 @@ export class GitHub {
|
|||||||
return `${github.context.repo.owner}/${github.context.repo.repo}`;
|
return `${github.context.repo.owner}/${github.context.repo.repo}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static workflowRunURL(setAttempts?: boolean): string {
|
static get runId(): number {
|
||||||
|
return process.env.GITHUB_RUN_ID ? +process.env.GITHUB_RUN_ID : github.context.runId;
|
||||||
|
}
|
||||||
|
|
||||||
|
static get runAttempt(): number {
|
||||||
// TODO: runAttempt is not yet part of github.context but will be in a
|
// TODO: runAttempt is not yet part of github.context but will be in a
|
||||||
// future release of @actions/github package: https://github.com/actions/toolkit/commit/faa425440f86f9c16587a19dfb59491253a2c92a
|
// future release of @actions/github package: https://github.com/actions/toolkit/commit/faa425440f86f9c16587a19dfb59491253a2c92a
|
||||||
return `${GitHub.serverURL}/${GitHub.repository}/actions/runs/${github.context.runId}${setAttempts ? `/attempts/${process.env.GITHUB_RUN_ATTEMPT || 1}` : ''}`;
|
return process.env.GITHUB_RUN_ATTEMPT ? +process.env.GITHUB_RUN_ATTEMPT : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static workflowRunURL(setAttempts?: boolean): string {
|
||||||
|
return `${GitHub.serverURL}/${GitHub.repository}/actions/runs/${GitHub.runId}${setAttempts ? `/attempts/${GitHub.runAttempt}` : ''}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
static get actionsRuntimeToken(): GitHubActionsRuntimeToken | undefined {
|
static get actionsRuntimeToken(): GitHubActionsRuntimeToken | undefined {
|
||||||
@ -211,6 +219,14 @@ export class GitHub {
|
|||||||
|
|
||||||
const refsSize = Object.keys(opts.exportRes.refs).length;
|
const refsSize = Object.keys(opts.exportRes.refs).length;
|
||||||
|
|
||||||
|
// we just need the last two parts of the URL as they are always relative
|
||||||
|
// to the workflow run URL otherwise URL could be broken if GitHub
|
||||||
|
// repository name is part of a secret value used in the workflow. e.g.:
|
||||||
|
// artifact: https://github.com/docker/actions-toolkit/actions/runs/9552208295/artifacts/1609622746
|
||||||
|
// workflow: https://github.com/docker/actions-toolkit/actions/runs/9552208295
|
||||||
|
// https://github.com/docker/actions-toolkit/issues/367
|
||||||
|
const artifactRelativeURL = `./${GitHub.runId}/${opts.uploadRes.url.split('/').slice(-2).join('/')}`;
|
||||||
|
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
const sum = core.summary
|
const sum = core.summary
|
||||||
.addHeading('Docker Build summary', 1)
|
.addHeading('Docker Build summary', 1)
|
||||||
@ -221,7 +237,7 @@ export class GitHub {
|
|||||||
.addRaw(addLink('Learn more', 'https://docs.docker.com/go/build-summary/'))
|
.addRaw(addLink('Learn more', 'https://docs.docker.com/go/build-summary/'))
|
||||||
.addRaw('</p>')
|
.addRaw('</p>')
|
||||||
.addRaw(`<p>`)
|
.addRaw(`<p>`)
|
||||||
.addRaw(`:arrow_down: ${addLink(`<strong>${opts.uploadRes.filename}</strong>`, opts.uploadRes.url)} (${Util.formatFileSize(opts.uploadRes.size)})`)
|
.addRaw(`:arrow_down: ${addLink(`<strong>${Util.stringToUnicodeEntities(opts.uploadRes.filename)}</strong>`, artifactRelativeURL)} (${Util.formatFileSize(opts.uploadRes.size)})`)
|
||||||
.addBreak()
|
.addBreak()
|
||||||
.addRaw(`This file includes <strong>${refsSize} build record${refsSize > 1 ? 's' : ''}</strong>.`)
|
.addRaw(`This file includes <strong>${refsSize} build record${refsSize > 1 ? 's' : ''}</strong>.`)
|
||||||
.addRaw(`</p>`)
|
.addRaw(`</p>`)
|
||||||
@ -248,7 +264,7 @@ export class GitHub {
|
|||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
summaryTableData.push([
|
summaryTableData.push([
|
||||||
{data: `<code>${ref.substring(0, 6).toUpperCase()}</code>`},
|
{data: `<code>${ref.substring(0, 6).toUpperCase()}</code>`},
|
||||||
{data: `<strong>${summary.name}</strong>`},
|
{data: `<strong>${Util.stringToUnicodeEntities(summary.name)}</strong>`},
|
||||||
{data: `${summary.status === 'completed' ? ':white_check_mark:' : summary.status === 'canceled' ? ':no_entry_sign:' : ':x:'} ${summary.status}`},
|
{data: `${summary.status === 'completed' ? ':white_check_mark:' : summary.status === 'canceled' ? ':no_entry_sign:' : ':x:'} ${summary.status}`},
|
||||||
{data: `${summary.numCachedSteps > 0 ? Math.round((summary.numCachedSteps / summary.numTotalSteps) * 100) : 0}%`},
|
{data: `${summary.numCachedSteps > 0 ? Math.round((summary.numCachedSteps / summary.numTotalSteps) * 100) : 0}%`},
|
||||||
{data: summary.duration}
|
{data: summary.duration}
|
||||||
|
@ -179,4 +179,10 @@ export class Util {
|
|||||||
const bytes = crypto.randomBytes(Math.ceil(length / 2));
|
const bytes = crypto.randomBytes(Math.ceil(length / 2));
|
||||||
return bytes.toString('hex').slice(0, length);
|
return bytes.toString('hex').slice(0, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static stringToUnicodeEntities(str: string) {
|
||||||
|
return Array.from(str)
|
||||||
|
.map(char => `&#x${char.charCodeAt(0).toString(16)};`)
|
||||||
|
.join('');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user