52 lines
1.5 KiB
FSharp
52 lines
1.5 KiB
FSharp
#r "/opt/fsi/packages/Oci.dll"
|
|
#load "contract.fsx"
|
|
|
|
open System
|
|
open System.IO
|
|
open System.Text.Json
|
|
open Contract
|
|
open Quorate.Oci
|
|
|
|
let revision = Environment.GetEnvironmentVariable "SOURCE_REVISION"
|
|
let targets = Environment.GetEnvironmentVariable "TARGETS" |> decode<Target array>
|
|
let repository = "quorate/project-delivery-controller"
|
|
let layout = "/handoff/layout"
|
|
let digest = File.ReadAllText("/handoff/image-digest").Trim()
|
|
|
|
require (validRevision revision) "invalid source revision"
|
|
require (validDigest digest) "invalid image digest"
|
|
|
|
require
|
|
(targets.Length = 1
|
|
&& targets[0].Kind = "QuayOCI"
|
|
&& targets[0].Repository = repository)
|
|
"invalid delivery target"
|
|
|
|
let publish () =
|
|
let auth = RegistryAuth.Load("/auth/.dockerconfigjson", "registry.quorate.internal")
|
|
use root = Registry.LoadRoot "/registry-ca/ca.crt"
|
|
use registry = new Registry(Uri("https://registry.quorate.internal"), auth, root)
|
|
|
|
registry
|
|
.PushAsync(repository, layout, "delivery", $"delivery-{revision}", cancellationToken)
|
|
.GetAwaiter()
|
|
.GetResult()
|
|
|
|
let published = publish ()
|
|
|
|
require (published = digest) "published digest mismatch"
|
|
directory "/result" |> ignore
|
|
|
|
File.WriteAllText(
|
|
"/result/delivery-result",
|
|
JsonSerializer.Serialize(
|
|
{ SourceRevision = revision
|
|
Targets =
|
|
[| { Kind = "QuayOCI"
|
|
Repository = repository
|
|
Reference = $"registry.quorate.internal/{repository}@{digest}" } |] },
|
|
json
|
|
)
|
|
)
|
|
|
|
printfn "publish=%s digest=%s" repository digest
|