Skip to content

Commit faa9e60

Browse files
WIP
1 parent ae6b500 commit faa9e60

File tree

3 files changed

+45
-26
lines changed

3 files changed

+45
-26
lines changed

manifest/packager/packager.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010

1111
type Packager interface {
1212
//Pull(string) error
13-
Push(context.Context, string) (string, error)
13+
Push(context.Context, string) (*oci.PackageRefs, error)
1414
}
1515

1616
type DefaultPackager struct {
@@ -32,7 +32,7 @@ func NewDefaultPackager(client *oci.Client, destinationRef string, sourceEpochTi
3232
}
3333
}
3434

35-
func (r *DefaultPackager) Push(ctx context.Context, dir string) (string, error) {
35+
func (r *DefaultPackager) Push(ctx context.Context, dir string) (*oci.PackageRefs, error) {
3636
return r.Client.PushArtefact(ctx, r.destinationRef, dir,
3737
r.sourceEpochTimestamp, r.sourceAttestations...)
3838
}

oci/artefact.go

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,13 @@ type ArtefactInfo struct {
5757
Digest string
5858
}
5959

60+
type PackageRefs struct {
61+
Digest string
62+
Primary string
63+
Short string
64+
SemVer []string
65+
}
66+
6067
func (c *Client) Fetch(ctx context.Context, ref string, mediaTypes ...MediaType) ([]*ArtefactInfo, error) {
6168
imageIndex, indexManifest, image, err := c.GetIndexOrImage(ctx, ref)
6269
if err != nil {
@@ -220,18 +227,18 @@ func (c *Client) getImage(ctx context.Context, imageIndex ImageIndex, digest Has
220227
}
221228

222229
// based on https://github.com/fluxcd/pkg/blob/2a323d771e17af02dee2ccbbb9b445b78ab048e5/oci/client/push.go
223-
func (c *Client) PushArtefact(ctx context.Context, destinationRef, sourceDir string, timestamp *time.Time, sourceAttestations ...attestTypes.Statement) (string, error) {
230+
func (c *Client) PushArtefact(ctx context.Context, destinationRef, sourceDir string, timestamp *time.Time, sourceAttestations ...attestTypes.Statement) (*PackageRefs, error) {
224231
tmpDir, err := os.MkdirTemp("", "bpt-oci-artefact-*")
225232
if err != nil {
226-
return "", err
233+
return nil, err
227234
}
228235
defer os.RemoveAll(tmpDir)
229236

230237
tmpFile := filepath.Join(tmpDir, "artefact.tgz")
231238

232239
outputFile, err := os.OpenFile(tmpFile, os.O_RDWR|os.O_CREATE|os.O_EXCL, regularFileMode)
233240
if err != nil {
234-
return "", err
241+
return nil, err
235242
}
236243
defer outputFile.Close()
237244

@@ -240,25 +247,22 @@ func (c *Client) PushArtefact(ctx context.Context, destinationRef, sourceDir str
240247
output := io.MultiWriter(outputFile, c.hash)
241248

242249
if err := c.BuildArtefact(tmpFile, sourceDir, output); err != nil {
243-
return "", err
250+
return nil, err
244251
}
245252

246253
attestLayer, err := c.BuildAttestations(sourceAttestations)
247254
if err != nil {
248-
return "", fmt.Errorf("failed to serialise attestations: %w", err)
255+
return nil, fmt.Errorf("failed to serialise attestations: %w", err)
249256
}
250257

251258
repo, err := name.NewRepository(destinationRef)
252259
if err != nil {
253-
return "", fmt.Errorf("invalid URL: %w", err)
260+
return nil, fmt.Errorf("invalid URL: %w", err)
254261
}
255262
hash := hex.EncodeToString(c.hash.Sum(nil))
256263
tag := repo.Tag(manifestTypes.ConfigImageTagPrefix + hash)
257-
258-
tagAliases := append(
259-
SemVerTagsFromAttestations(ctx, tag, sourceAttestations...),
260-
tag.Context().Tag(manifestTypes.ConfigImageTagPrefix+hash[:7]),
261-
)
264+
shortTag := tag.Context().Tag(manifestTypes.ConfigImageTagPrefix + hash[:7])
265+
semVerTags := SemVerTagsFromAttestations(ctx, tag, sourceAttestations...)
262266

263267
if timestamp == nil {
264268
timestamp = new(time.Time)
@@ -295,12 +299,12 @@ func (c *Client) PushArtefact(ctx context.Context, destinationRef, sourceDir str
295299
tarball.WithCompressedCaching,
296300
)
297301
if err != nil {
298-
return "", fmt.Errorf("creating artefact content layer failed: %w", err)
302+
return nil, fmt.Errorf("creating artefact content layer failed: %w", err)
299303
}
300304

301305
config, err = mutate.Append(config, mutate.Addendum{Layer: configLayer})
302306
if err != nil {
303-
return "", fmt.Errorf("appeding content to artifact failed: %w", err)
307+
return nil, fmt.Errorf("appeding content to artifact failed: %w", err)
304308
}
305309

306310
index = mutate.AppendManifests(index,
@@ -315,7 +319,7 @@ func (c *Client) PushArtefact(ctx context.Context, destinationRef, sourceDir str
315319

316320
summary, err := (attestTypes.Statements)(sourceAttestations).MarshalSummaryAnnotation()
317321
if err != nil {
318-
return "", err
322+
return nil, err
319323
}
320324
attestAnnotations[AttestationsSummaryAnnotation] = summary
321325

@@ -329,7 +333,7 @@ func (c *Client) PushArtefact(ctx context.Context, destinationRef, sourceDir str
329333

330334
attest, err = mutate.Append(attest, mutate.Addendum{Layer: attestLayer})
331335
if err != nil {
332-
return "", fmt.Errorf("appeding attestations to artifact failed: %w", err)
336+
return nil, fmt.Errorf("appeding attestations to artifact failed: %w", err)
333337
}
334338

335339
index = mutate.AppendManifests(index,
@@ -342,22 +346,33 @@ func (c *Client) PushArtefact(ctx context.Context, destinationRef, sourceDir str
342346

343347
digest, err := index.Digest()
344348
if err != nil {
345-
return "", fmt.Errorf("parsing index digest failed: %w", err)
349+
return nil, fmt.Errorf("parsing index digest failed: %w", err)
346350
}
347351

348352
if err := remote.WriteIndex(tag, index, c.remoteWithContext(ctx)...); err != nil {
349-
return "", fmt.Errorf("pushing index failed: %w", err)
353+
return nil, fmt.Errorf("pushing index failed: %w", err)
354+
}
355+
356+
refs := &PackageRefs{
357+
Digest: digest.String(),
358+
Primary: tag.String(),
359+
Short: shortTag.String(),
360+
SemVer: make([]string, len(semVerTags)),
350361
}
351362

352-
for i := range tagAliases {
353-
if err := remote.Tag(tagAliases[i], index, c.remoteWithContext(ctx)...); err != nil {
354-
return "", fmt.Errorf("adding alias tagging failed: %w", err)
363+
for i, tagAlias := range append(semVerTags, shortTag) {
364+
if err := remote.Tag(tagAlias, index, c.remoteWithContext(ctx)...); err != nil {
365+
return nil, fmt.Errorf("adding alias tagging failed: %w", err)
366+
}
367+
if i < len(semVerTags) {
368+
refs.SemVer[i] = tagAlias.String() + "@" + digest.String()
355369
}
356370
}
357-
// TODO: reteurn tag and all of its aliases
358-
return tagAliases[0].String() + "@" + digest.String(), err
371+
return refs, nil
359372
}
360373

374+
func (p *PackageRefs) String() string { return p.Short + "@" + p.Digest }
375+
361376
func SemVerTagsFromAttestations(ctx context.Context, tag name.Tag, sourceAttestations ...attestTypes.Statement) []name.Tag {
362377
statements := attestTypes.FilterByPredicateType(manifest.ManifestDirPredicateType, sourceAttestations)
363378
if len(statements) != 1 {

tape/app/package.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,11 +182,15 @@ func (c *TapePackageCommand) Execute(args []string) error {
182182
path, sourceEpochTimestamp := loader.MostRecentlyModified()
183183
c.tape.log.Debugf("using source epoch timestamp %s from most recently modified manifest file %q", sourceEpochTimestamp, path)
184184
packager := packager.NewDefaultPackager(client, c.OutputImage, &sourceEpochTimestamp, attreg.GetStatements()...)
185-
packageRef, err := packager.Push(ctx, images.Dir())
185+
packageRefs, err := packager.Push(ctx, images.Dir())
186186
if err != nil {
187187
return fmt.Errorf("failed to create package: %w", err)
188188
}
189189

190-
c.tape.log.Infof("created package %q", packageRef)
190+
c.tape.log.Infof("created package %q", packageRefs[1])
191+
192+
if len(packageRefs) > 2 {
193+
c.tape.log.Infof("additional tags: %s", strings.Join(packageRefs[1:], ", "))
194+
}
191195
return nil
192196
}

0 commit comments

Comments
 (0)