Skip to content

Commit 9ec1b02

Browse files
authored
Fix canonical image ref resolution (#3434)
Previously in release scripts we were using `docker inspect` which seems to sort .RepoDigests and it makes selection of the correct digest difficult because platform-specific digest can appear at a different index depending on the digests in the list. Signed-off-by: Mikalai Radchuk <[email protected]>
1 parent da0f7da commit 9ec1b02

File tree

3 files changed

+94
-14
lines changed

3 files changed

+94
-14
lines changed

Makefile

+1-14
Original file line numberDiff line numberDiff line change
@@ -306,37 +306,24 @@ verify: vendor verify-codegen verify-mockgen verify-manifests #HELP Run all veri
306306

307307
#SECTION Release
308308

309-
.PHONY: pull-opm
310-
pull-opm:
311-
docker pull $(OPERATOR_REGISTRY_IMAGE)
312-
313309
.PHONY: package
314310
package: $(YQ) $(HELM) #HELP Package OLM for release
315-
package: OLM_RELEASE_IMG_REF=$(shell docker inspect --format='{{index .RepoDigests 0}}' $(IMAGE_REPO):$(RELEASE_VERSION))
316-
package: OPM_IMAGE_REF=$(shell docker inspect --format='{{index .RepoDigests 0}}' $(OPERATOR_REGISTRY_IMAGE))
317311
package:
318312
ifndef TARGET
319313
$(error TARGET is undefined)
320314
endif
321315
ifndef RELEASE_VERSION
322316
$(error RELEASE_VERSION is undefined)
323317
endif
324-
@echo "Getting operator registry image"
325-
docker pull $(OPERATOR_REGISTRY_IMAGE)
326-
$(YQ) w -i deploy/$(TARGET)/values.yaml olm.image.ref $(OLM_RELEASE_IMG_REF)
327-
$(YQ) w -i deploy/$(TARGET)/values.yaml catalog.image.ref $(OLM_RELEASE_IMG_REF)
328-
$(YQ) w -i deploy/$(TARGET)/values.yaml package.image.ref $(OLM_RELEASE_IMG_REF)
329-
$(YQ) w -i deploy/$(TARGET)/values.yaml -- catalog.opmImageArgs "--opmImage=$(OPM_IMAGE_REF)"
330318
./scripts/package_release.sh $(RELEASE_VERSION) deploy/$(TARGET)/manifests/$(RELEASE_VERSION) deploy/$(TARGET)/values.yaml
331319
ln -sfFn ./$(RELEASE_VERSION) deploy/$(TARGET)/manifests/latest
332320
ifeq ($(PACKAGE_QUICKSTART), true)
333321
./scripts/package_quickstart.sh deploy/$(TARGET)/manifests/$(RELEASE_VERSION) deploy/$(TARGET)/quickstart/olm.yaml deploy/$(TARGET)/quickstart/crds.yaml deploy/$(TARGET)/quickstart/install.sh
334322
endif
335323

336324
.PHONY: release
337-
release: pull-opm manifests # pull the opm image to get the digest
325+
release: manifests
338326
@echo "Generating the $(RELEASE_VERSION) release"
339-
docker pull $(IMAGE_REPO):$(RELEASE_VERSION)
340327
$(MAKE) TARGET=upstream RELEASE_VERSION=$(RELEASE_VERSION) PACKAGE_QUICKSTART=true package
341328

342329
.PHONY: FORCE

scripts/package_release.sh

+15
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
#!/usr/bin/env bash
22

3+
set -o errexit
4+
set -o nounset
5+
set -o pipefail
6+
37
if [[ ${#@} -lt 3 ]]; then
48
echo "Usage: $0 semver chart values"
59
echo "* semver: semver-formatted version for this package"
@@ -14,6 +18,17 @@ values=$3
1418

1519
source .bingo/variables.env
1620

21+
OLM_RELEASE_IMG_REF=$(go run util/image-canonical-ref/main.go ${IMAGE_REPO}:${version})
22+
OPM_IMAGE_REF=$(go run util/image-canonical-ref/main.go ${OPERATOR_REGISTRY_IMAGE})
23+
24+
echo "Using OPM image ${OPM_IMAGE_REF}"
25+
echo "Using OLM image ${OLM_RELEASE_IMG_REF}"
26+
27+
$YQ w -i $values olm.image.ref ${OLM_RELEASE_IMG_REF}
28+
$YQ w -i $values catalog.image.ref ${OLM_RELEASE_IMG_REF}
29+
$YQ w -i $values package.image.ref ${OLM_RELEASE_IMG_REF}
30+
$YQ w -i $values -- catalog.opmImageArgs "--opmImage=${OPM_IMAGE_REF}"
31+
1732
charttmpdir=$(mktemp -d 2>/dev/null || mktemp -d -t charttmpdir)
1833

1934
charttmpdir=${charttmpdir}/chart

util/image-canonical-ref/main.go

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"os"
7+
8+
"github.com/containers/image/v5/docker"
9+
"github.com/containers/image/v5/docker/reference"
10+
"github.com/containers/image/v5/manifest"
11+
"github.com/containers/image/v5/types"
12+
)
13+
14+
// This is a simple tool to resolve canonical reference of the image.
15+
// E.g. this resolves quay.io/operator-framework/olm:v0.28.0 to
16+
// quay.io/operator-framework/olm@sha256:40d0363f4aa684319cd721c2fcf3321785380fdc74de8ef821317cd25a10782a
17+
func main() {
18+
ctx := context.Background()
19+
20+
if len(os.Args) != 2 {
21+
fmt.Fprintf(os.Stderr, "usage: %s <image reference>\n", os.Args[0])
22+
os.Exit(1)
23+
}
24+
25+
ref := os.Args[1]
26+
27+
if err := run(ctx, ref); err != nil {
28+
fmt.Fprintf(os.Stderr, "error running the tool: %s\n", err)
29+
os.Exit(1)
30+
}
31+
}
32+
33+
func run(ctx context.Context, ref string) error {
34+
imgRef, err := reference.ParseNamed(ref)
35+
if err != nil {
36+
return fmt.Errorf("error parsing image reference %q: %w", ref, err)
37+
}
38+
39+
sysCtx := &types.SystemContext{}
40+
canonicalRef, err := resolveCanonicalRef(ctx, imgRef, sysCtx)
41+
if err != nil {
42+
return fmt.Errorf("error resolving canonical reference: %w", err)
43+
}
44+
45+
fmt.Println(canonicalRef.String())
46+
return nil
47+
}
48+
49+
func resolveCanonicalRef(ctx context.Context, imgRef reference.Named, sysCtx *types.SystemContext) (reference.Canonical, error) {
50+
if canonicalRef, ok := imgRef.(reference.Canonical); ok {
51+
return canonicalRef, nil
52+
}
53+
54+
srcRef, err := docker.NewReference(imgRef)
55+
if err != nil {
56+
return nil, fmt.Errorf("error creating reference: %w", err)
57+
}
58+
59+
imgSrc, err := srcRef.NewImageSource(ctx, sysCtx)
60+
if err != nil {
61+
return nil, fmt.Errorf("error creating image source: %w", err)
62+
}
63+
defer imgSrc.Close()
64+
65+
imgManifestData, _, err := imgSrc.GetManifest(ctx, nil)
66+
if err != nil {
67+
return nil, fmt.Errorf("error getting manifest: %w", err)
68+
}
69+
imgDigest, err := manifest.Digest(imgManifestData)
70+
if err != nil {
71+
return nil, fmt.Errorf("error getting digest of manifest: %w", err)
72+
}
73+
canonicalRef, err := reference.WithDigest(reference.TrimNamed(imgRef), imgDigest)
74+
if err != nil {
75+
return nil, fmt.Errorf("error creating canonical reference: %w", err)
76+
}
77+
return canonicalRef, nil
78+
}

0 commit comments

Comments
 (0)