tools/version-tracker/pkg/ecrpublic/ecrpublic.go (54 lines of code) (raw):
package ecrpublic
import (
"encoding/json"
"fmt"
"os/exec"
"regexp"
"strings"
"github.com/aws/eks-anywhere-build-tooling/tools/version-tracker/pkg/constants"
"github.com/aws/eks-anywhere-build-tooling/tools/version-tracker/pkg/util/command"
"github.com/aws/eks-anywhere-build-tooling/tools/version-tracker/pkg/util/semver"
)
func GetLatestRevision(imageRepository, currentRevision, branchName string) (string, bool, error) {
var latestRevision string
var needsUpgrade bool
currentRevisionSemver, err := semver.New(currentRevision)
if err != nil {
return "", false, fmt.Errorf("getting semver for current version: %v", err)
}
skopeoListTagsCmd := exec.Command("skopeo", "list-tags", fmt.Sprintf("docker://%s", imageRepository))
listTagsOutput, err := command.ExecCommand(skopeoListTagsCmd)
if err != nil {
return "", false, fmt.Errorf("running Skopeo list-tags command: %v", err)
}
var tagsList interface{}
err = json.Unmarshal([]byte(listTagsOutput), &tagsList)
if err != nil {
return "", false, fmt.Errorf("unmarshalling output of Skopeo list-tags command: %v", err)
}
imageTags := tagsList.(map[string]interface{})["Tags"].([]interface{})
latestRevisionSemver := currentRevisionSemver
latestRevision = currentRevision
for _, tag := range imageTags {
tag := tag.(string)
if !strings.HasPrefix(tag, "v") {
continue
}
tagSemver, err := semver.New(tag)
if err != nil {
return "", false, fmt.Errorf("getting semver for %s tag [%s]: %v", imageRepository, tag, err)
}
if branchName != constants.MainBranchName {
tagRegex := regexp.MustCompile(fmt.Sprintf(`^v?%d(\.|_)%d(\.|_)\d+`, currentRevisionSemver.Major, currentRevisionSemver.Minor))
if !tagRegex.MatchString(tag) {
continue
}
}
if tagSemver.GreaterThan(latestRevisionSemver) {
latestRevisionSemver = tagSemver
latestRevision = tag
needsUpgrade = true
}
}
return latestRevision, needsUpgrade, nil
}