From aef90e4d04c40886f28785e1b0bdc542f0601974 Mon Sep 17 00:00:00 2001 From: Xiaoxuan Wang <103478229+wangxiaoxuan273@users.noreply.github.com> Date: Mon, 20 May 2024 12:56:56 +0800 Subject: [PATCH] docs: document PackManifestOptions to make PackManifest reproducible (#749) Resolves #748 Signed-off-by: Xiaoxuan Wang --- example_pack_test.go | 8 ++++---- pack.go | 15 ++++++++++++--- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/example_pack_test.go b/example_pack_test.go index aff41d9b..9adf8fae 100644 --- a/example_pack_test.go +++ b/example_pack_test.go @@ -34,8 +34,8 @@ func ExamplePackManifest_imageV11() { // 1. Set optional parameters opts := oras.PackManifestOptions{ ManifestAnnotations: map[string]string{ - // this timestamp will be automatically generated if not specified - // use a fixed value here in order to test the output + // this time stamp will be automatically generated if not specified + // use a fixed value here to make the pack result reproducible ocispec.AnnotationCreated: "2000-01-01T00:00:00Z", }, } @@ -70,8 +70,8 @@ func ExamplePackManifest_imageV10() { // 1. Set optional parameters opts := oras.PackManifestOptions{ ManifestAnnotations: map[string]string{ - // this timestamp will be automatically generated if not specified - // use a fixed value here in order to test the output + // this time stamp will be automatically generated if not specified + // use a fixed value here to make the pack result reproducible ocispec.AnnotationCreated: "2000-01-01T00:00:00Z", }, } diff --git a/pack.go b/pack.go index 1b995612..d67388a7 100644 --- a/pack.go +++ b/pack.go @@ -48,8 +48,8 @@ const ( var ( // ErrInvalidDateTimeFormat is returned by [Pack] and [PackManifest] when - // AnnotationArtifactCreated or AnnotationCreated is provided, but its value - // is not in RFC 3339 format. + // "org.opencontainers.artifact.created" or "org.opencontainers.image.created" + // is provided, but its value is not in RFC 3339 format. // Reference: https://www.rfc-editor.org/rfc/rfc3339#section-5.6 ErrInvalidDateTimeFormat = errors.New("invalid date and time format") @@ -93,7 +93,10 @@ type PackManifestOptions struct { // Layers is the layers of the manifest. Layers []ocispec.Descriptor - // ManifestAnnotations is the annotation map of the manifest. + // ManifestAnnotations is the annotation map of the manifest. In order to + // make [PackManifest] reproducible, set the key ocispec.AnnotationCreated + // (i.e. "org.opencontainers.image.created") to a fixed value. The value + // must conform to RFC 3339. ManifestAnnotations map[string]string // ConfigDescriptor is a pointer to the descriptor of the config blob. @@ -126,6 +129,12 @@ var mediaTypeRegexp = regexp.MustCompile(`^[A-Za-z0-9][A-Za-z0-9!#$&-^_.+]{0,126 // // artifactType and opts.ConfigDescriptor.MediaType MUST comply with RFC 6838. // +// Each time when PackManifest is called, if a time stamp is not specified, a new time +// stamp is generated in the manifest annotations with the key ocispec.AnnotationCreated +// (i.e. "org.opencontainers.image.created"). To make [PackManifest] reproducible, +// set the key ocispec.AnnotationCreated to a fixed value in +// opts.ManifestAnnotations. The value MUST conform to RFC 3339. +// // If succeeded, returns a descriptor of the packed manifest. func PackManifest(ctx context.Context, pusher content.Pusher, packManifestVersion PackManifestVersion, artifactType string, opts PackManifestOptions) (ocispec.Descriptor, error) { switch packManifestVersion {