54 lines
2 KiB
Text
54 lines
2 KiB
Text
|
|
#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
|