mirror of
https://github.com/docker/metadata-action.git
synced 2026-01-22 06:28:56 +08:00
Rework latest behavior and handle flavor
This commit is contained in:
parent
63a49e1ec3
commit
e2af761bf7
10 changed files with 366 additions and 87 deletions
|
|
@ -9,6 +9,7 @@ let _tmpDir: string;
|
|||
export interface Inputs {
|
||||
images: string[];
|
||||
tags: string[];
|
||||
flavor: string[];
|
||||
labels: string[];
|
||||
sepTags: string;
|
||||
sepLabels: string;
|
||||
|
|
@ -26,6 +27,7 @@ export function getInputs(): Inputs {
|
|||
return {
|
||||
images: getInputList('images'),
|
||||
tags: getInputList('tags', true),
|
||||
flavor: getInputList('flavor', true),
|
||||
labels: getInputList('labels', true),
|
||||
sepTags: core.getInput('sep-tags') || `\n`,
|
||||
sepLabels: core.getInput('sep-labels') || `\n`,
|
||||
|
|
|
|||
42
src/flavor.ts
Normal file
42
src/flavor.ts
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
export interface Flavor {
|
||||
latest: string;
|
||||
prefix: string;
|
||||
suffix: string;
|
||||
}
|
||||
|
||||
export function Transform(inputs: string[]): Flavor {
|
||||
const flavor: Flavor = {
|
||||
latest: 'auto',
|
||||
prefix: '',
|
||||
suffix: ''
|
||||
};
|
||||
|
||||
for (const input of inputs) {
|
||||
const parts = input.split('=', 2);
|
||||
if (parts.length == 1) {
|
||||
throw new Error(`Invalid entry: ${input}`);
|
||||
}
|
||||
switch (parts[0]) {
|
||||
case 'latest': {
|
||||
flavor.latest = parts[1];
|
||||
if (!['auto', 'true', 'false'].includes(flavor.latest)) {
|
||||
throw new Error(`Invalid latest flavor entry: ${input}`);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'prefix': {
|
||||
flavor.prefix = parts[1];
|
||||
break;
|
||||
}
|
||||
case 'suffix': {
|
||||
flavor.suffix = parts[1];
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
throw new Error(`Unknown entry: ${input}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return flavor;
|
||||
}
|
||||
25
src/meta.ts
25
src/meta.ts
|
|
@ -5,6 +5,7 @@ import moment from 'moment';
|
|||
import * as semver from 'semver';
|
||||
import {Inputs, tmpDir} from './context';
|
||||
import * as tcl from './tag';
|
||||
import * as fcl from './flavor';
|
||||
import * as core from '@actions/core';
|
||||
import {Context} from '@actions/github/lib/context';
|
||||
import {ReposGetResponseData} from '@octokit/types';
|
||||
|
|
@ -22,6 +23,7 @@ export class Meta {
|
|||
private readonly context: Context;
|
||||
private readonly repo: ReposGetResponseData;
|
||||
private readonly tags: tcl.Tag[];
|
||||
private readonly flavor: fcl.Flavor;
|
||||
private readonly date: Date;
|
||||
|
||||
constructor(inputs: Inputs, context: Context, repo: ReposGetResponseData) {
|
||||
|
|
@ -29,6 +31,7 @@ export class Meta {
|
|||
this.context = context;
|
||||
this.repo = repo;
|
||||
this.tags = tcl.Transform(inputs.tags);
|
||||
this.flavor = fcl.Transform(inputs.flavor);
|
||||
this.date = new Date();
|
||||
this.version = this.getVersion();
|
||||
}
|
||||
|
|
@ -99,7 +102,7 @@ export class Meta {
|
|||
version.partial.push(vraw);
|
||||
}
|
||||
if (version.latest == undefined) {
|
||||
version.latest = tag.attrs['latest'] == 'auto' ? false : tag.attrs['latest'] == 'true';
|
||||
version.latest = this.flavor.latest == 'auto' ? false : this.flavor.latest == 'true';
|
||||
}
|
||||
|
||||
return version;
|
||||
|
|
@ -136,7 +139,7 @@ export class Meta {
|
|||
latest = true;
|
||||
}
|
||||
if (version.latest == undefined) {
|
||||
version.latest = tag.attrs['latest'] == 'auto' ? latest : tag.attrs['latest'] == 'true';
|
||||
version.latest = this.flavor.latest == 'auto' ? latest : this.flavor.latest == 'true';
|
||||
}
|
||||
|
||||
return version;
|
||||
|
|
@ -167,7 +170,7 @@ export class Meta {
|
|||
version.partial.push(vraw);
|
||||
}
|
||||
if (version.latest == undefined) {
|
||||
version.latest = tag.attrs['latest'] == 'auto' ? latest : tag.attrs['latest'] == 'true';
|
||||
version.latest = this.flavor.latest == 'auto' ? latest : this.flavor.latest == 'true';
|
||||
}
|
||||
|
||||
return version;
|
||||
|
|
@ -196,7 +199,7 @@ export class Meta {
|
|||
version.partial.push(vraw);
|
||||
}
|
||||
if (version.latest == undefined) {
|
||||
version.latest = tag.attrs['latest'] == 'auto' ? false : tag.attrs['latest'] == 'true';
|
||||
version.latest = this.flavor.latest == 'auto' ? false : this.flavor.latest == 'true';
|
||||
}
|
||||
|
||||
return version;
|
||||
|
|
@ -214,7 +217,7 @@ export class Meta {
|
|||
version.partial.push(vraw);
|
||||
}
|
||||
if (version.latest == undefined) {
|
||||
version.latest = tag.attrs['latest'] == 'auto' ? true : tag.attrs['latest'] == 'true';
|
||||
version.latest = this.flavor.latest == 'auto' ? true : this.flavor.latest == 'true';
|
||||
}
|
||||
|
||||
return version;
|
||||
|
|
@ -232,7 +235,7 @@ export class Meta {
|
|||
version.partial.push(vraw);
|
||||
}
|
||||
if (version.latest == undefined) {
|
||||
version.latest = tag.attrs['latest'] == 'auto' ? false : tag.attrs['latest'] == 'true';
|
||||
version.latest = this.flavor.latest == 'auto' ? false : this.flavor.latest == 'true';
|
||||
}
|
||||
|
||||
return version;
|
||||
|
|
@ -258,7 +261,7 @@ export class Meta {
|
|||
version.partial.push(vraw);
|
||||
}
|
||||
if (version.latest == undefined) {
|
||||
version.latest = tag.attrs['latest'] == 'auto' ? false : tag.attrs['latest'] == 'true';
|
||||
version.latest = this.flavor.latest == 'auto' ? false : this.flavor.latest == 'true';
|
||||
}
|
||||
|
||||
return version;
|
||||
|
|
@ -272,7 +275,7 @@ export class Meta {
|
|||
version.partial.push(vraw);
|
||||
}
|
||||
if (version.latest == undefined) {
|
||||
version.latest = tag.attrs['latest'] == 'auto' ? false : tag.attrs['latest'] == 'true';
|
||||
version.latest = this.flavor.latest == 'auto' ? false : this.flavor.latest == 'true';
|
||||
}
|
||||
|
||||
return version;
|
||||
|
|
@ -290,7 +293,7 @@ export class Meta {
|
|||
version.partial.push(vraw);
|
||||
}
|
||||
if (version.latest == undefined) {
|
||||
version.latest = tag.attrs['latest'] == 'auto' ? false : tag.attrs['latest'] == 'true';
|
||||
version.latest = this.flavor.latest == 'auto' ? false : this.flavor.latest == 'true';
|
||||
}
|
||||
|
||||
return version;
|
||||
|
|
@ -299,9 +302,13 @@ export class Meta {
|
|||
private setFlavor(val: string, tag: tcl.Tag): string {
|
||||
if (tag.attrs['prefix'].length > 0) {
|
||||
val = `${tag.attrs['prefix']}${val}`;
|
||||
} else if (this.flavor.prefix.length > 0) {
|
||||
val = `${this.flavor.prefix}${val}`;
|
||||
}
|
||||
if (tag.attrs['suffix'].length > 0) {
|
||||
val = `${val}${tag.attrs['suffix']}`;
|
||||
} else if (this.flavor.suffix.length > 0) {
|
||||
val = `${this.flavor.suffix}${val}`;
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
|
|
|||
24
src/tag.ts
24
src/tag.ts
|
|
@ -1,27 +1,25 @@
|
|||
import csvparse from 'csv-parse/lib/sync';
|
||||
|
||||
export enum Type {
|
||||
Raw = 'raw',
|
||||
Schedule = 'schedule',
|
||||
Semver = 'semver',
|
||||
Match = 'match',
|
||||
Edge = 'edge',
|
||||
Ref = 'ref',
|
||||
Raw = 'raw',
|
||||
Sha = 'sha'
|
||||
}
|
||||
|
||||
export interface Tag {
|
||||
type: Type;
|
||||
attrs: Record<string, string>;
|
||||
}
|
||||
|
||||
export enum RefEvent {
|
||||
Branch = 'branch',
|
||||
Tag = 'tag',
|
||||
PR = 'pr'
|
||||
}
|
||||
|
||||
export const RefEvents = Object.keys(RefEvent).map(key => RefEvent[key]);
|
||||
export interface Tag {
|
||||
type: Type;
|
||||
attrs: Record<string, string>;
|
||||
}
|
||||
|
||||
export const DefaultPriorities: Record<Type, string> = {
|
||||
[Type.Schedule]: '1000',
|
||||
|
|
@ -132,7 +130,11 @@ export function Parse(s: string): Tag {
|
|||
if (!tag.attrs.hasOwnProperty('event')) {
|
||||
throw new Error(`Missing event attribute for ${s}`);
|
||||
}
|
||||
if (!RefEvents.includes(tag.attrs['event'])) {
|
||||
if (
|
||||
!Object.keys(RefEvent)
|
||||
.map(k => RefEvent[k])
|
||||
.includes(tag.attrs['event'])
|
||||
) {
|
||||
throw new Error(`Invalid event for ${s}`);
|
||||
}
|
||||
if (tag.attrs['event'] == RefEvent.PR && !tag.attrs.hasOwnProperty('prefix')) {
|
||||
|
|
@ -160,9 +162,6 @@ export function Parse(s: string): Tag {
|
|||
if (!tag.attrs.hasOwnProperty('priority')) {
|
||||
tag.attrs['priority'] = DefaultPriorities[tag.type];
|
||||
}
|
||||
if (!tag.attrs.hasOwnProperty('latest')) {
|
||||
tag.attrs['latest'] = 'auto';
|
||||
}
|
||||
if (!tag.attrs.hasOwnProperty('prefix')) {
|
||||
tag.attrs['prefix'] = '';
|
||||
}
|
||||
|
|
@ -172,9 +171,6 @@ export function Parse(s: string): Tag {
|
|||
if (!['true', 'false'].includes(tag.attrs['enable'])) {
|
||||
throw new Error(`Invalid value for enable attribute: ${tag.attrs['enable']}`);
|
||||
}
|
||||
if (!['auto', 'true', 'false'].includes(tag.attrs['latest'])) {
|
||||
throw new Error(`Invalid value for latest attribute: ${tag.attrs['latest']}`);
|
||||
}
|
||||
|
||||
return tag;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue