@@ -36,6 +36,8 @@ import (
36
36
"oras.land/oras-go/v2/content/oci"
37
37
"oras.land/oras-go/v2/internal/spec"
38
38
"oras.land/oras-go/v2/registry/remote"
39
+ "oras.land/oras-go/v2/registry/remote/auth"
40
+ "oras.land/oras-go/v2/registry/remote/retry"
39
41
)
40
42
41
43
var exampleMemoryStore oras.Target
@@ -408,3 +410,57 @@ func Example_extendedCopyArtifactAndReferrersFromRepository() {
408
410
// Output:
409
411
// sha256:f396bc4d300934a39ca28ab0d5ac8a3573336d7d63c654d783a68cd1e2057662
410
412
}
413
+
414
+ // ExampleExtendedCopyArtifactAndReferrersToRepository is an example of pushing
415
+ // an artifact and its referrer to a remote repository.
416
+ func Example_extendedCopyArtifactAndReferrersToRepository () {
417
+ // 0. Assemble the referenced manifest in memory with tag "v1"
418
+ ctx := context .Background ()
419
+ src := memory .New ()
420
+ manifestDescriptor , err := oras .PackManifest (ctx , src , oras .PackManifestVersion1_1 , "application/vnd.example+type" , oras.PackManifestOptions {})
421
+ if err != nil {
422
+ panic (err )
423
+ }
424
+ fmt .Println ("created manifest: " , manifestDescriptor )
425
+
426
+ tag := "v1"
427
+ err = src .Tag (ctx , manifestDescriptor , tag )
428
+ if err != nil {
429
+ panic (err )
430
+ }
431
+ fmt .Println ("tagged manifest: " , manifestDescriptor .Digest )
432
+
433
+ // 1. Assemble the referrer manifest in memory
434
+ referrerPackOpts := oras.PackManifestOptions {
435
+ Subject : & manifestDescriptor ,
436
+ }
437
+ referrerDescriptor , err := oras .PackManifest (ctx , src , oras .PackManifestVersion1_1 , "sbom/example" , referrerPackOpts )
438
+ if err != nil {
439
+ panic (err )
440
+ }
441
+ fmt .Println ("created referrer: " , referrerDescriptor )
442
+
443
+ // 2. Connect to a remote repository with basic authentication
444
+ registry := "myregistry.example.com"
445
+ repository := "myrepo"
446
+ repo , err := remote .NewRepository (fmt .Sprintf ("%s/%s" , registry , repository ))
447
+ if err != nil {
448
+ panic (err )
449
+ }
450
+ // Note: The below code can be omitted if authentication is not required.
451
+ repo .Client = & auth.Client {
452
+ Client : retry .DefaultClient ,
453
+ Cache : auth .NewCache (),
454
+ Credential : auth .StaticCredential (registry , auth.Credential {
455
+ Username : "username" ,
456
+ Password : "password" ,
457
+ }),
458
+ }
459
+
460
+ // 3. Push the manifest and its referrer to the remote repository
461
+ desc , err := oras .ExtendedCopy (ctx , src , tag , repo , "" , oras .DefaultExtendedCopyOptions )
462
+ if err != nil {
463
+ panic (err )
464
+ }
465
+ fmt .Println ("pushed: " , desc .Digest )
466
+ }
0 commit comments