diff --git a/main.go b/main.go index c76183b..a772db7 100644 --- a/main.go +++ b/main.go @@ -39,6 +39,7 @@ type configData struct { Debug bool `yaml:"debug"` PurgeTagsKeepDays int `yaml:"purge_tags_keep_days"` PurgeTagsKeepCount int `yaml:"purge_tags_keep_count"` + PurgeTagsKeepRegexp string `yaml:"purge_tags_keep_regexp"` PurgeTagsSchedule string `yaml:"purge_tags_schedule"` } @@ -351,5 +352,5 @@ func (a *apiClient) receiveEvents(c echo.Context) error { // purgeOldTags purges old tags. func (a *apiClient) purgeOldTags(dryRun bool) { - registry.PurgeOldTags(a.client, dryRun, a.config.PurgeTagsKeepDays, a.config.PurgeTagsKeepCount) + registry.PurgeOldTags(a.client, dryRun, a.config.PurgeTagsKeepDays, a.config.PurgeTagsKeepCount, a.config.PurgeTagsKeepRegexp) } diff --git a/registry/tasks.go b/registry/tasks.go index 1894fe1..28f26d2 100644 --- a/registry/tasks.go +++ b/registry/tasks.go @@ -2,6 +2,7 @@ package registry import ( "fmt" + "regexp" "sort" "time" @@ -32,7 +33,7 @@ func (p timeSlice) Swap(i, j int) { } // PurgeOldTags purge old tags. -func PurgeOldTags(client *Client, purgeDryRun bool, purgeTagsKeepDays, purgeTagsKeepCount int) { +func PurgeOldTags(client *Client, purgeDryRun bool, purgeTagsKeepDays, purgeTagsKeepCount int, purgeTagsKeepRegexp string) { logger := SetupLogging("registry.tasks.PurgeOldTags") dryRunText := "" if purgeDryRun { @@ -83,10 +84,11 @@ func PurgeOldTags(client *Client, purgeDryRun bool, purgeTagsKeepDays, purgeTags sort.Sort(sortedTags) repos[repo] = sortedTags - // Filter out tags by retention days. + // Filter out tags by retention days and regexp for _, tag := range repos[repo] { + regexpMatch, _ := regexp.MatchString(purgeTagsKeepRegexp, tag.name) delta := int(now.Sub(tag.created).Hours() / 24) - if delta > purgeTagsKeepDays { + if !regexpMatch && delta > purgeTagsKeepDays { purgeTags[repo] = append(purgeTags[repo], tag.name) } else { keepTags[repo] = append(keepTags[repo], tag.name)