quorate/services/project-delivery/k8s/workflows/controller/source.fsx

54 lines
2 KiB
Text
Raw Normal View History

#load "contract.fsx"
open System
open System.IO
open System.IO.Compression
open System.Net.Http
open System.Net.Http.Headers
open Contract
let repository = Environment.GetEnvironmentVariable "SOURCE_REPOSITORY"
let revision = Environment.GetEnvironmentVariable "SOURCE_REVISION"
let archive = "/source/tmp/source.tar.gz"
let incoming = "/source/archive"
let destination = "/source/repository"
require (repository = "https://forge.quorate.internal/quorate/cluster") "invalid source repository"
require (validRevision revision) "invalid source revision"
require (File.Exists "/source-auth/token") "source authentication unavailable"
require (Directory.EnumerateFileSystemEntries(destination) |> Seq.isEmpty) "source destination is not empty"
let token = File.ReadAllText("/source-auth/token").Trim()
require (not <| String.IsNullOrWhiteSpace token) "source authentication unavailable"
let download () =
use request =
new HttpRequestMessage(
HttpMethod.Get,
$"http://forgejo-http.forgejo.svc.cluster.local.:3000/api/v1/repos/quorate/cluster/archive/{revision}.tar.gz"
)
request.Headers.Authorization <- AuthenticationHeaderValue("token", token)
use client = new HttpClient(Timeout = TimeSpan.FromMinutes 10.0)
use reply =
client.Send(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken)
require reply.IsSuccessStatusCode $"source download failed: {int reply.StatusCode}"
use input = reply.Content.ReadAsStream(cancellationToken)
use output = File.Create archive
input.CopyTo output
download ()
extractGzip archive incoming
let root =
Directory.EnumerateFileSystemEntries incoming
|> Seq.tryExactlyOne
|> Option.defaultWith (fun () -> fail "source archive has an invalid root")
require (Directory.Exists root) "source archive root is not a directory"
Directory.Delete(destination)
Directory.Move(root, destination)
File.WriteAllText("/source/.ready", revision + "\n")
printfn "source=primary revision=%s" revision