Skip to content

Commit

Permalink
switch to using policies
Browse files Browse the repository at this point in the history
  • Loading branch information
0x4c6565 committed Nov 3, 2020
1 parent 2a8a68e commit 9170ca4
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 41 deletions.
20 changes: 14 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,26 +44,34 @@ Application config is specified with a yaml configuration file, with an example
```yaml
access_token: myaccesstoken
url: https://gitlab.privateinstance.com
repositories:
- project: 123
image: myproject/somerepository
policies:
- name: nonsemverpolicy
filter:
include: .*
exclude: ^v.+
keep: 5
age: 30
repositories:
- project: 123
image: myproject/somerepository
policies:
- nonsemverpolicy
```
* `access_token`: Private access token with `api` read/write scope
* `url`: Gitlab instance URL
* `repositories` __array__
* `project`: Project ID to target
* `image`: Path of repository/image
* `policies`: __array__
* `name`: Name of policy
* `filter`: __object__
* `include`: Regex specifying image tags to include - no tags will be matched if this isn't specified
* `exclude`: (Optional) Regex specifying image tags to exclude
* `keep`: (Optional) Specifies amount of tags to keep
* `age`: (Optional) Specifies amount of days to keep tags
* `repositories` __array__
* `project`: Project ID to target
* `image`: Path of repository/image
* `policies` __array__
* Name of policies

## Docker

Expand Down
83 changes: 55 additions & 28 deletions cmd/execute.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,30 +39,7 @@ func executeCleanup(cmd *cobra.Command, args []string) error {
return fmt.Errorf("Failed initialising Gitlab client: %s", err)
}

for _, repositoryCfg := range cfg.Repositories {
log.WithFields(log.Fields{
"include": repositoryCfg.Filter.Include,
"exclude": repositoryCfg.Filter.Exclude,
"keep": repositoryCfg.Filter.Keep,
"age": repositoryCfg.Filter.Age,
}).Infof("Processing repository %s", repositoryCfg.Image)
repositories, err := getAllRepositories(client, repositoryCfg)
if err != nil {
return fmt.Errorf("Error retrieving all Gitlab registry repositories for project %d: %s", repositoryCfg.Project, err)
}

for _, repository := range repositories {
if repositoryCfg.Image == repository.Path {
err := processRepository(cmd, client, repository, repositoryCfg)
if err != nil {
return fmt.Errorf("Failed processing repository %s: %s", repositoryCfg.Image, err)
}
}
}
log.Infof("Finished processing repository %s", repositoryCfg.Image)
}

return nil
return processRepositories(cmd, client, cfg)
}

func getAllRepositories(client *gitlab.Client, repositoryCfg config.RepositoryConfig) ([]*gitlab.RegistryRepository, error) {
Expand Down Expand Up @@ -105,7 +82,52 @@ func getAllTags(client *gitlab.Client, repository *gitlab.RegistryRepository, re
return allTags, nil
}

func processRepository(cmd *cobra.Command, client *gitlab.Client, repository *gitlab.RegistryRepository, repositoryCfg config.RepositoryConfig) error {
func processRepositories(cmd *cobra.Command, client *gitlab.Client, cfg *config.Config) error {
for _, repositoryCfg := range cfg.Repositories {
log.WithFields(log.Fields{
"project_id": repositoryCfg.Project,
"image": repositoryCfg.Image,
}).Infof("Processing repository %s", repositoryCfg.Image)

repositories, err := getAllRepositories(client, repositoryCfg)
if err != nil {
return fmt.Errorf("Error retrieving all Gitlab registry repositories for project %d: %s", repositoryCfg.Project, err)
}

for _, repository := range repositories {
if repositoryCfg.Image == repository.Path {
err := processRepository(cmd, client, cfg, repository, repositoryCfg)
if err != nil {
return err
}
}
}
log.Infof("Finished processing repository %s", repositoryCfg.Image)
}

return nil
}

func processRepository(cmd *cobra.Command, client *gitlab.Client, cfg *config.Config, repository *gitlab.RegistryRepository, repositoryCfg config.RepositoryConfig) error {
for _, policyName := range repositoryCfg.Policies {
log.Infof("Processing repository policy %s", policyName)
policyCfg, err := cfg.GetPolicyConfig(policyName)
if err != nil {
return err
}

err = processRepositoryPolicy(cmd, client, repository, repositoryCfg, policyCfg)
if err != nil {
return err
}

log.Infof("Finished processing repository policy %s", policyName)
}

return nil
}

func processRepositoryPolicy(cmd *cobra.Command, client *gitlab.Client, repository *gitlab.RegistryRepository, repositoryCfg config.RepositoryConfig, policyCfg config.PolicyConfig) error {
log.Debug("Retrieving tag metadata")
tagsMeta, err := getAllTags(client, repository, repositoryCfg)
if err != nil {
Expand All @@ -131,9 +153,14 @@ func processRepository(cmd *cobra.Command, client *gitlab.Client, repository *gi
}
bar.Finish()

log.Debug("Executing filters")
log.WithFields(log.Fields{
"include": policyCfg.Filter.Include,
"exclude": policyCfg.Filter.Exclude,
"keep": policyCfg.Filter.Keep,
"age": policyCfg.Filter.Age,
}).Debug("Executing filter pipeline")

f := filter.NewFilterPipeline(tags, repositoryCfg.Filter)
f := filter.NewFilterPipeline(tags, policyCfg.Filter)
filteredTags, err := f.Execute(
filter.ExcludeLatestFilter,
filter.IncludeFilter,
Expand All @@ -143,7 +170,7 @@ func processRepository(cmd *cobra.Command, client *gitlab.Client, repository *gi
filter.ExcludeFilter,
)
if err != nil {
return fmt.Errorf("Failed to execute filters: %w", err)
return fmt.Errorf("Failed to execute filter pipeline: %w", err)
}

log.Infof("Found %d tags for removal", len(filteredTags))
Expand Down
12 changes: 8 additions & 4 deletions config.example.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,15 @@

access_token: myaccesstoken
url: https://gitlab.privateinstance.com
repositories:
- project: 123
image: myproject/somerepository
policies:
- name: nonsemverpolicy
filter:
include: .*
exclude: ^v.+
keep: 5
age: 30
age: 30
repositories:
- project: 123
image: myproject/somerepository
policies:
- nonsemverpolicy
22 changes: 19 additions & 3 deletions pkg/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,29 @@ import (
type Config struct {
AccessToken string `yaml:"access_token"`
URL string `yaml:"url"`
Policies []PolicyConfig `yaml:"policies"`
Repositories []RepositoryConfig `yaml:"repositories"`
}

func (c *Config) GetPolicyConfig(name string) (PolicyConfig, error) {
for _, cfg := range c.Policies {
if cfg.Name == name {
return cfg, nil
}
}

return PolicyConfig{}, fmt.Errorf("Cannot find policy %s", name)
}

type PolicyConfig struct {
Name string `yaml:"name"`
Filter FilterConfig `yaml:"filter"`
}

type RepositoryConfig struct {
Project int `yaml:"project"`
Image string `yaml:"image"`
Filter FilterConfig `yaml:"filter"`
Project int `yaml:"project"`
Image string `yaml:"image"`
Policies []string `yaml:"policies"`
}

type FilterConfig struct {
Expand Down

0 comments on commit 9170ca4

Please sign in to comment.