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

78 lines
2.2 KiB
Text
Raw Normal View History

#load "plan.fsx"
open System
open System.Diagnostics
open System.IO
open System.Runtime.InteropServices
open Contract
open Plan
let plan = read ()
let root = "/toolchain"
let ready = Path.Combine(root, ".ready")
let baseImage = Path.Combine(root, "image-base")
let environment =
[ "GOCACHE", Path.Combine(root, "download-cache")
"GOENV", "off"
"GOMODCACHE", Path.Combine(root, "modules")
"GOPATH", Path.Combine(root, "gopath")
"GOPROXY", "https://proxy.golang.org"
"GOROOT", Path.Combine(root, "usr/lib/go")
"GOSUMDB", "sum.golang.org"
"HOME", Path.Combine(root, "home") ]
match plan.Toolchain.Origin with
| "cache" ->
let elapsed = Stopwatch.StartNew()
while not (File.Exists ready) && elapsed.Elapsed < TimeSpan.FromMinutes 15.0 do
sleep 100
require (File.Exists ready && File.Exists(Path.Combine(baseImage, "index.json"))) "cached toolchain unavailable"
printfn "toolchain=cache"
| "primary" ->
require (RuntimeInformation.ProcessArchitecture = Architecture.X64) "unsupported toolchain architecture"
requireSuccess
"/sbin/apk"
[ "add"
"--root"
root
"--arch"
"x86_64"
"--initdb"
"--no-scripts"
"--keys-dir"
"/etc/apk/keys"
"--repository"
"https://packages.wolfi.dev/os"
"ca-certificates-bundle=20261020-r0"
"go-1.27=1.27.3-r0"
"wolfi-baselayout=20230201-r30" ]
None
[]
|> ignore
let go = Path.Combine(root, "usr/lib/go/bin/go")
let source = "/source/repository/services/project-delivery/controller"
directory (Path.Combine(root, "modules")) |> ignore
requireSuccess go [ "mod"; "download" ] (Some source) environment |> ignore
directory baseImage |> ignore
requireSuccess
"/usr/bin/apko"
[ "build"
"--arch"
"x86_64,arm64"
"--sbom=false"
"/orchestration/controller.apko.yaml"
"controller:base"
baseImage ]
None
environment
|> ignore
File.WriteAllText(ready, plan.SourceRevision + "\n")
printfn "toolchain=primary"
| _ -> fail "invalid toolchain origin"