fix: support registry login details
continuous-integration/drone/push Build is passing Details

This commit is contained in:
decentral1se 2021-12-12 01:52:28 +01:00
parent ae6adace50
commit f3e55e5023
Signed by: decentral1se
GPG Key ID: 03789458B3D0C410
2 changed files with 36 additions and 13 deletions

View File

@ -540,6 +540,11 @@ func GetRecipeVersions(recipeName string) (RecipeVersions, error) {
return err
}
cl, err := client.New("default") // only required for docker.io registry calls
if err != nil {
logrus.Fatal(err)
}
versionMeta := make(map[string]ServiceMeta)
for _, service := range recipe.Config.Services {
@ -564,7 +569,7 @@ func GetRecipeVersions(recipeName string) (RecipeVersions, error) {
logrus.Debugf("looking up image: '%s' from '%s'", img, path)
digest, err := client.GetTagDigest(img)
digest, err := client.GetTagDigest(cl, img)
if err != nil {
logrus.Warn(err)
continue
@ -589,7 +594,7 @@ func GetRecipeVersions(recipeName string) (RecipeVersions, error) {
branch := "master"
if _, err := repo.Branch("master"); err != nil {
if _, err := repo.Branch("main"); err != nil {
logrus.Debugf("failed to select branch in '%s'", recipeDir)
logrus.Debugf("failed to select branch in %s", recipeDir)
logrus.Fatal(err)
}
branch = "main"
@ -602,12 +607,12 @@ func GetRecipeVersions(recipeName string) (RecipeVersions, error) {
Branch: plumbing.ReferenceName(refName),
}
if err := worktree.Checkout(checkOutOpts); err != nil {
logrus.Debugf("failed to check out '%s' in '%s'", branch, recipeDir)
logrus.Debugf("failed to check out %s in %s", branch, recipeDir)
logrus.Fatal(err)
}
logrus.Debugf("switched back to '%s' in '%s'", branch, recipeDir)
logrus.Debugf("collected '%s' for '%s'", versions, recipeName)
logrus.Debugf("switched back to %s in %s", branch, recipeDir)
logrus.Debugf("collected %s for %s", versions, recipeName)
return versions, nil
}

View File

@ -5,11 +5,14 @@ import (
"fmt"
"io/ioutil"
"net/http"
"os"
"strings"
"coopcloud.tech/abra/pkg/web"
"github.com/docker/distribution/reference"
"github.com/docker/docker/client"
"github.com/hashicorp/go-retryablehttp"
"github.com/sirupsen/logrus"
)
type RawTag struct {
@ -33,10 +36,20 @@ func GetRegistryTags(image string) (RawTags, error) {
}
// getRegv2Token retrieves a registry v2 authentication token.
func getRegv2Token(image reference.Named) (string, error) {
func getRegv2Token(cl *client.Client, image reference.Named) (string, error) {
img := reference.Path(image)
authTokenURL := fmt.Sprintf("https://auth.docker.io/token?service=registry.docker.io&scope=repository:%s:pull", img)
req, err := retryablehttp.NewRequest("GET", authTokenURL, nil)
tokenURL := "https://auth.docker.io/token"
values := fmt.Sprintf("service=registry.docker.io&scope=repository:%s:pull", img)
username, userOk := os.LookupEnv("DOCKER_USERNAME")
password, passOk := os.LookupEnv("DOCKER_PASSWORD")
if userOk && passOk {
logrus.Debugf("using docker log in credentials for registry token request")
values = fmt.Sprintf("%s&grant_type=password&client_id=coopcloud.tech&username=%s&password=%s", values, username, password)
}
fullURL := fmt.Sprintf("%s?%s", tokenURL, values)
req, err := retryablehttp.NewRequest("GET", fullURL, nil)
if err != nil {
return "", err
}
@ -61,9 +74,10 @@ func getRegv2Token(image reference.Named) (string, error) {
}
tokenRes := struct {
Token string
Expiry string
Issued string
AccessToken string `json:"access_token"`
Expiry int `json:"expires_in"`
Issued string `json:"issued_at"`
Token string `json:"token"`
}{}
if err := json.Unmarshal(body, &tokenRes); err != nil {
@ -74,7 +88,7 @@ func getRegv2Token(image reference.Named) (string, error) {
}
// GetTagDigest retrieves an image digest from a v2 registry
func GetTagDigest(image reference.Named) (string, error) {
func GetTagDigest(cl *client.Client, image reference.Named) (string, error) {
img := reference.Path(image)
tag := image.(reference.NamedTagged).Tag()
manifestURL := fmt.Sprintf("https://index.docker.io/v2/%s/manifests/%s", img, tag)
@ -84,11 +98,15 @@ func GetTagDigest(image reference.Named) (string, error) {
return "", err
}
token, err := getRegv2Token(image)
token, err := getRegv2Token(cl, image)
if err != nil {
return "", err
}
if token == "" {
logrus.Fatal("unable to retrieve registry token?")
}
req.Header = http.Header{
"Accept": []string{
"application/vnd.docker.distribution.manifest.v2+json",