Skip to content

Commit

Permalink
Fix authorization
Browse files Browse the repository at this point in the history
Fixed authorization by setting keychain for the pack client.
This is required since recently we set pull policy to "always".

Signed-off-by: Matej Vašek <[email protected]>
  • Loading branch information
matejvasek committed Dec 18, 2024
1 parent d5dc82c commit 71f8f7f
Showing 1 changed file with 55 additions and 22 deletions.
77 changes: 55 additions & 22 deletions hack/update-builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,6 @@ func buildBuilderImage(ctx context.Context, variant, arch string) (string, error
}
newBuilderImage := "ghcr.io/knative/builder-jammy-" + variant
newBuilderImageTagged := newBuilderImage + ":" + *release.Name + "-" + arch
dockerUser := "gh-action"
dockerPassword := os.Getenv("GITHUB_TOKEN")

ref, err := name.ParseReference(newBuilderImageTagged)
if err != nil {
Expand Down Expand Up @@ -131,8 +129,7 @@ func buildBuilderImage(ctx context.Context, variant, arch string) (string, error
return "", fmt.Errorf("cannot patch java buildpacks: %w", err)
}
addGoAndRustBuildpacks(&builderConfig)

packClient, err := pack.NewClient()
packClient, err := pack.NewClient(pack.WithKeychain(ghKeychain{}))
if err != nil {
return "", fmt.Errorf("cannot create pack client: %w", err)
}
Expand Down Expand Up @@ -168,21 +165,17 @@ func buildBuilderImage(ctx context.Context, variant, arch string) (string, error
return "", fmt.Errorf("cannot create docker client")
}

authConfig := registry.AuthConfig{
Username: dockerUser,
Password: dockerPassword,
}
bs, err := json.Marshal(&authConfig)
if err != nil {
return "", fmt.Errorf("cannot marshal credentials: %w", err)
}
imagePushOptions := image.PushOptions{
All: false,
RegistryAuth: base64.StdEncoding.EncodeToString(bs),
}
pushImage := func(img string) (string, error) {
regAuth, err := dockerDaemonAuthStr(img)
if err != nil {
return "", fmt.Errorf("cannot get credentials: %w", err)
}
imagePushOptions := image.PushOptions{
All: false,
RegistryAuth: regAuth,
}

pushImage := func(image string) (string, error) {
rc, err := dockerClient.ImagePush(ctx, image, imagePushOptions)
rc, err := dockerClient.ImagePush(ctx, img, imagePushOptions)
if err != nil {
return "", fmt.Errorf("cannot initialize image push: %w", err)
}
Expand Down Expand Up @@ -265,10 +258,7 @@ func buildBuilderImageMultiArch(ctx context.Context, variant string) error {
}

remoteOpts := []remote.Option{
remote.WithAuth(authn.FromConfig(authn.AuthConfig{
Username: "gh-action",
Password: os.Getenv("GITHUB_TOKEN"),
})),
remote.WithAuthFromKeychain(DefaultKeychain),
}

idx := mutate.IndexMediaType(empty.Index, types.DockerManifestList)
Expand Down Expand Up @@ -745,3 +735,46 @@ func newGHClient(ctx context.Context) *github.Client {
AccessToken: os.Getenv("GITHUB_TOKEN"),
})))
}

var DefaultKeychain = authn.NewMultiKeychain(ghKeychain{}, authn.DefaultKeychain)

type ghKeychain struct{}

func (g ghKeychain) Resolve(resource authn.Resource) (authn.Authenticator, error) {
if resource.RegistryStr() != "ghcr.io" {
return authn.Anonymous, nil
}
return &authn.Basic{
Username: "gh-action",
Password: os.Getenv("GITHUB_TOKEN"),
}, nil
}

func dockerDaemonAuthStr(img string) (string, error) {
ref, err := name.ParseReference(img)
if err != nil {
return "", err
}

a, err := DefaultKeychain.Resolve(ref.Context())
if err != nil {
return "", err
}

ac, err := a.Authorization()
if err != nil {
return "", err
}

authConfig := registry.AuthConfig{
Username: ac.Username,
Password: ac.Password,
}

bs, err := json.Marshal(&authConfig)
if err != nil {
return "", err
}

return base64.StdEncoding.EncodeToString(bs), nil
}

0 comments on commit 71f8f7f

Please sign in to comment.