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 err := recipe.UpdateTag(image, upgradeTag); err != nil {
ok, err := recipe.UpdateTag(image, upgradeTag)
if err != nil {
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 {
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.
func UpdateTag(pattern, image, tag, recipeName string) error {
func UpdateTag(pattern, image, tag, recipeName string) (bool, error) {
composeFiles, err := filepath.Glob(pattern)
if err != nil {
return err
return false, err
}
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")
sampleEnv, err := config.ReadEnv(envSamplePath)
if err != nil {
return err
return false, err
}
compose, err := loader.LoadComposefile(opts, sampleEnv)
if err != nil {
return err
return false, err
}
for _, service := range compose.Services {
@ -45,24 +45,26 @@ func UpdateTag(pattern, image, tag, recipeName string) error {
img, _ := reference.ParseNormalizedNamed(service.Image)
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)
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)
if image == composeImage {
bytes, err := ioutil.ReadFile(composeFile)
if err != nil {
return err
return false, err
}
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)
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.

View File

@ -163,15 +163,17 @@ func (r Recipe) UpdateLabel(pattern, serviceName, label string) error {
}
// 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)
image = StripTagMeta(image)
if err := compose.UpdateTag(pattern, image, tag, r.Name); err != nil {
return err
ok, err := compose.UpdateTag(pattern, image, tag, r.Name)
if err != nil {
return false, err
}
return nil
return ok, nil
}
// Tags list the recipe tags