fix: further fixes for gracefully handling missing tag
continuous-integration/drone/push Build is passing Details

Follows 1b37d2d5f5.
This commit is contained in:
decentral1se 2022-01-05 17:57:48 +01:00
parent d7e1b2947a
commit d7cf11b876
Signed by: decentral1se
GPG Key ID: 03789458B3D0C410
3 changed files with 28 additions and 21 deletions

View File

@ -241,10 +241,13 @@ You may invoke this command in "wizard" mode and be prompted for input:
} }
} }
if upgradeTag != "skip" { if upgradeTag != "skip" {
if err := recipe.UpdateTag(image, upgradeTag); err != nil { ok, err := recipe.UpdateTag(image, upgradeTag)
if err != nil {
logrus.Fatal(err) logrus.Fatal(err)
} }
logrus.Infof("tag upgraded from %s to %s for %s", tag.String(), upgradeTag, image) if ok {
logrus.Infof("tag upgraded from %s to %s for %s", tag.String(), upgradeTag, image)
}
} else { } else {
logrus.Warnf("not upgrading %s, skipping as requested", image) logrus.Warnf("not upgrading %s, skipping as requested", image)
} }

View File

@ -16,10 +16,10 @@ import (
) )
// UpdateTag updates an image tag in-place on file system local compose files. // UpdateTag updates an image tag in-place on file system local compose files.
func UpdateTag(pattern, image, tag, recipeName string) error { func UpdateTag(pattern, image, tag, recipeName string) (bool, error) {
composeFiles, err := filepath.Glob(pattern) composeFiles, err := filepath.Glob(pattern)
if err != nil { if err != nil {
return err return false, err
} }
logrus.Debugf("considering %s config(s) for tag update", strings.Join(composeFiles, ", ")) logrus.Debugf("considering %s config(s) for tag update", strings.Join(composeFiles, ", "))
@ -30,12 +30,12 @@ func UpdateTag(pattern, image, tag, recipeName string) error {
envSamplePath := path.Join(config.RECIPES_DIR, recipeName, ".env.sample") envSamplePath := path.Join(config.RECIPES_DIR, recipeName, ".env.sample")
sampleEnv, err := config.ReadEnv(envSamplePath) sampleEnv, err := config.ReadEnv(envSamplePath)
if err != nil { if err != nil {
return err return false, err
} }
compose, err := loader.LoadComposefile(opts, sampleEnv) compose, err := loader.LoadComposefile(opts, sampleEnv)
if err != nil { if err != nil {
return err return false, err
} }
for _, service := range compose.Services { for _, service := range compose.Services {
@ -45,24 +45,26 @@ func UpdateTag(pattern, image, tag, recipeName string) error {
img, _ := reference.ParseNormalizedNamed(service.Image) img, _ := reference.ParseNormalizedNamed(service.Image)
if err != nil { if err != nil {
return err return false, err
}
var composeTag string
switch img.(type) {
case reference.NamedTagged:
composeTag = img.(reference.NamedTagged).Tag()
default:
// unable to parse, typically image missing tag
return false, nil
} }
composeImage := reference.Path(img) composeImage := reference.Path(img)
if strings.Contains(composeImage, "library") {
// ParseNormalizedNamed prepends 'library' to images like nginx:<tag>,
// postgres:<tag>, i.e. images which do not have a username in the
// first position of the string
composeImage = strings.Split(composeImage, "/")[1]
}
composeTag := img.(reference.NamedTagged).Tag()
logrus.Debugf("parsed %s from %s", composeTag, service.Image) logrus.Debugf("parsed %s from %s", composeTag, service.Image)
if image == composeImage { if image == composeImage {
bytes, err := ioutil.ReadFile(composeFile) bytes, err := ioutil.ReadFile(composeFile)
if err != nil { if err != nil {
return err return false, err
} }
old := fmt.Sprintf("%s:%s", composeImage, composeTag) old := fmt.Sprintf("%s:%s", composeImage, composeTag)
@ -72,13 +74,13 @@ func UpdateTag(pattern, image, tag, recipeName string) error {
logrus.Debugf("updating %s to %s in %s", old, new, compose.Filename) logrus.Debugf("updating %s to %s in %s", old, new, compose.Filename)
if err := ioutil.WriteFile(compose.Filename, []byte(replacedBytes), 0764); err != nil { if err := ioutil.WriteFile(compose.Filename, []byte(replacedBytes), 0764); err != nil {
return err return true, err
} }
} }
} }
} }
return nil return false, nil
} }
// UpdateLabel updates a label in-place on file system local compose files. // UpdateLabel updates a label in-place on file system local compose files.

View File

@ -163,15 +163,17 @@ func (r Recipe) UpdateLabel(pattern, serviceName, label string) error {
} }
// UpdateTag updates a recipe tag // UpdateTag updates a recipe tag
func (r Recipe) UpdateTag(image, tag string) error { func (r Recipe) UpdateTag(image, tag string) (bool, error) {
pattern := fmt.Sprintf("%s/%s/compose**yml", config.RECIPES_DIR, r.Name) pattern := fmt.Sprintf("%s/%s/compose**yml", config.RECIPES_DIR, r.Name)
image = StripTagMeta(image) image = StripTagMeta(image)
if err := compose.UpdateTag(pattern, image, tag, r.Name); err != nil { ok, err := compose.UpdateTag(pattern, image, tag, r.Name)
return err if err != nil {
return false, err
} }
return nil
return ok, nil
} }
// Tags list the recipe tags // Tags list the recipe tags