k8s
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
This commit is contained in:
parent
b23fbb2957
commit
0326661b9a
|
@ -1,7 +1,10 @@
|
||||||
FROM xena/dhall-yaml AS dyaml
|
FROM xena/dhall-yaml AS dyaml
|
||||||
|
|
||||||
FROM xena/alpine AS drone
|
FROM xena/alpine
|
||||||
COPY --from=dyaml /bin/dhall-to-yaml-ng /usr/local/bin/dhall-to-yaml
|
COPY --from=dyaml /bin/dhall-to-yaml-ng /usr/local/bin/dhall-to-yaml
|
||||||
WORKDIR /drone
|
WORKDIR /drone
|
||||||
COPY ./drone .
|
COPY ./drone .
|
||||||
RUN dhall-to-yaml --file pipeline.dhall
|
RUN dhall-to-yaml --file pipeline.dhall
|
||||||
|
WORKDIR /k8s
|
||||||
|
COPY ./k8s .
|
||||||
|
RUN cd apps && dhall-to-yaml --file hlang.dhall
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
https://prelude.dhall-lang.org/package.dhall sha256:4aa8581954f7734d09b7b21fddbf5d8df901a44b54b4ef26ea71db92de0b1a12
|
|
@ -0,0 +1,19 @@
|
||||||
|
let kubernetes = ../kubernetes.dhall
|
||||||
|
|
||||||
|
in { Type =
|
||||||
|
{ name : Text
|
||||||
|
, appPort : Natural
|
||||||
|
, image : Text
|
||||||
|
, domain : Text
|
||||||
|
, leIssuer : Text
|
||||||
|
, envVars : List kubernetes.EnvVar.Type
|
||||||
|
}
|
||||||
|
, default =
|
||||||
|
{ name = ""
|
||||||
|
, appPort = 5000
|
||||||
|
, image = ""
|
||||||
|
, domain = ""
|
||||||
|
, leIssuer = "staging"
|
||||||
|
, envVars = [] : List kubernetes.EnvVar.Type
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
let typesUnion = ../typesUnion.dhall
|
||||||
|
|
||||||
|
in { Type = { apiVersion : Text, kind : Text, items : List typesUnion }
|
||||||
|
, default =
|
||||||
|
{ apiVersion = "v1", kind = "List", items = [] : List typesUnion }
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
let Prelude = ../Prelude.dhall
|
||||||
|
|
||||||
|
let kubernetes = ../kubernetes.dhall
|
||||||
|
|
||||||
|
let typesUnion = ../typesUnion.dhall
|
||||||
|
|
||||||
|
let deployment = ../http/deployment.dhall
|
||||||
|
|
||||||
|
let ingress = ../http/ingress.dhall
|
||||||
|
|
||||||
|
let service = ../http/service.dhall
|
||||||
|
|
||||||
|
let Config = ../app/config.dhall
|
||||||
|
|
||||||
|
let K8sList = ../app/list.dhall
|
||||||
|
|
||||||
|
let buildService =
|
||||||
|
λ(config : Config.Type)
|
||||||
|
→ let myService = service config
|
||||||
|
|
||||||
|
let myDeployment = deployment config
|
||||||
|
|
||||||
|
let myIngress = ingress config
|
||||||
|
|
||||||
|
in K8sList::{
|
||||||
|
, items =
|
||||||
|
[ typesUnion.Service myService
|
||||||
|
, typesUnion.Deployment myDeployment
|
||||||
|
, typesUnion.Ingress myIngress
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
in buildService
|
|
@ -0,0 +1,14 @@
|
||||||
|
let makeApp = ../app/make.dhall
|
||||||
|
|
||||||
|
let Config = ../app/config.dhall
|
||||||
|
|
||||||
|
let cfg =
|
||||||
|
Config::{
|
||||||
|
, name = "hlang"
|
||||||
|
, appPort = 5000
|
||||||
|
, image = "xena/hlang:latest"
|
||||||
|
, domain = "h.christine.website"
|
||||||
|
, leIssuer = "prod"
|
||||||
|
}
|
||||||
|
|
||||||
|
in makeApp cfg
|
|
@ -0,0 +1,51 @@
|
||||||
|
let Prelude = ../Prelude.dhall
|
||||||
|
|
||||||
|
let kubernetes = ../kubernetes.dhall
|
||||||
|
|
||||||
|
let kv = Prelude.JSON.keyText
|
||||||
|
|
||||||
|
let Config = ../app/config.dhall
|
||||||
|
|
||||||
|
let selector = ./selector.dhall
|
||||||
|
|
||||||
|
let podSpec
|
||||||
|
: Config.Type → kubernetes.PodSpec.Type
|
||||||
|
= λ(config : Config.Type)
|
||||||
|
→ kubernetes.PodSpec::{
|
||||||
|
, containers =
|
||||||
|
[ kubernetes.Container::{
|
||||||
|
, name = "web"
|
||||||
|
, env = config.envVars
|
||||||
|
, image = Some config.image
|
||||||
|
, imagePullPolicy = Some "Always"
|
||||||
|
, ports =
|
||||||
|
[ kubernetes.ContainerPort::{ containerPort = config.appPort } ]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
, imagePullSecrets =
|
||||||
|
[ kubernetes.LocalObjectReference::{ name = Some "regcred" } ]
|
||||||
|
}
|
||||||
|
|
||||||
|
let spec =
|
||||||
|
λ(config : Config.Type)
|
||||||
|
→ kubernetes.DeploymentSpec::{
|
||||||
|
, selector = kubernetes.LabelSelector::{
|
||||||
|
, matchLabels = selector config.name
|
||||||
|
}
|
||||||
|
, template = kubernetes.PodTemplateSpec::{
|
||||||
|
, metadata = kubernetes.ObjectMeta::{
|
||||||
|
, name = config.name
|
||||||
|
, labels = selector config.name
|
||||||
|
}
|
||||||
|
, spec = Some (podSpec config)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let deployment =
|
||||||
|
λ(config : Config.Type)
|
||||||
|
→ kubernetes.Deployment::{
|
||||||
|
, metadata = kubernetes.ObjectMeta::{ name = config.name }
|
||||||
|
, spec = Some (spec config)
|
||||||
|
}
|
||||||
|
|
||||||
|
in deployment
|
|
@ -0,0 +1,63 @@
|
||||||
|
let Prelude = ../Prelude.dhall
|
||||||
|
|
||||||
|
let kubernetes = ../kubernetes.dhall
|
||||||
|
|
||||||
|
let kv = Prelude.JSON.keyText
|
||||||
|
|
||||||
|
let Config = ../app/config.dhall
|
||||||
|
|
||||||
|
let annotations
|
||||||
|
: Config.Type → List { mapKey : Text, mapValue : Text }
|
||||||
|
= λ(config : Config.Type)
|
||||||
|
→ [ kv "kubernetes.io/ingress.class" "nginx"
|
||||||
|
, kv
|
||||||
|
"certmanager.k8s.io/cluster-issuer"
|
||||||
|
"letsencrypt-${config.leIssuer}"
|
||||||
|
]
|
||||||
|
|
||||||
|
let metadata
|
||||||
|
: Config.Type → kubernetes.ObjectMeta.Type
|
||||||
|
= λ(config : Config.Type)
|
||||||
|
→ kubernetes.ObjectMeta::{
|
||||||
|
, name = config.name
|
||||||
|
, labels = [ kv "app" config.name ]
|
||||||
|
, annotations = annotations config
|
||||||
|
}
|
||||||
|
|
||||||
|
let tls
|
||||||
|
: Config.Type → kubernetes.IngressTLS.Type
|
||||||
|
= λ(config : Config.Type)
|
||||||
|
→ kubernetes.IngressTLS::{
|
||||||
|
, hosts = [ config.domain ]
|
||||||
|
, secretName = Some "${config.leIssuer}-certs-${config.name}"
|
||||||
|
}
|
||||||
|
|
||||||
|
let rule
|
||||||
|
: Config.Type → kubernetes.IngressRule.Type
|
||||||
|
= λ(config : Config.Type)
|
||||||
|
→ kubernetes.IngressRule::{
|
||||||
|
, host = Some config.domain
|
||||||
|
, http = Some kubernetes.HTTPIngressRuleValue::{
|
||||||
|
, paths =
|
||||||
|
[ kubernetes.HTTPIngressPath::{
|
||||||
|
, backend = kubernetes.IngressBackend::{
|
||||||
|
, serviceName = config.name
|
||||||
|
, servicePort = kubernetes.IntOrString.Int config.appPort
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let ingress
|
||||||
|
: Config.Type → kubernetes.Ingress.Type
|
||||||
|
= λ(config : Config.Type)
|
||||||
|
→ kubernetes.Ingress::{
|
||||||
|
, metadata = metadata config
|
||||||
|
, spec = Some kubernetes.IngressSpec::{
|
||||||
|
, tls = [ tls config ]
|
||||||
|
, rules = [ rule config ]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
in ingress
|
|
@ -0,0 +1,9 @@
|
||||||
|
let Prelude = ../Prelude.dhall
|
||||||
|
|
||||||
|
let kv = Prelude.JSON.keyText
|
||||||
|
|
||||||
|
let selector
|
||||||
|
: Text → List { mapKey : Text, mapValue : Text }
|
||||||
|
= λ(appName : Text) → [ kv "app" appName ]
|
||||||
|
|
||||||
|
in selector
|
|
@ -0,0 +1,45 @@
|
||||||
|
let Prelude = ../Prelude.dhall
|
||||||
|
|
||||||
|
let Config = ../app/config.dhall
|
||||||
|
|
||||||
|
let kubernetes = ../kubernetes.dhall
|
||||||
|
|
||||||
|
let kv = Prelude.JSON.keyText
|
||||||
|
|
||||||
|
let annotations
|
||||||
|
: Config.Type → List { mapKey : Text, mapValue : Text }
|
||||||
|
= λ(config : Config.Type)
|
||||||
|
→ [ kv "external-dns.alpha.kubernetes.io/hostname" config.domain
|
||||||
|
, kv "external-dns.alpha.kubernetes.io/ttl" "120"
|
||||||
|
, kv "external-dns.alpha.kubernetes.io/cloudflare-proxied" "false"
|
||||||
|
]
|
||||||
|
|
||||||
|
let selector = ./selector.dhall
|
||||||
|
|
||||||
|
let spec
|
||||||
|
: Config.Type → kubernetes.ServiceSpec.Type
|
||||||
|
= λ(config : Config.Type)
|
||||||
|
→ kubernetes.ServiceSpec::{
|
||||||
|
, selector = selector config.name
|
||||||
|
, type = Some "ClusterIP"
|
||||||
|
, ports =
|
||||||
|
[ kubernetes.ServicePort::{
|
||||||
|
, targetPort = Some (kubernetes.IntOrString.Int config.appPort)
|
||||||
|
, port = config.appPort
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
let service
|
||||||
|
: Config.Type → kubernetes.Service.Type
|
||||||
|
= λ(config : Config.Type)
|
||||||
|
→ kubernetes.Service::{
|
||||||
|
, metadata = kubernetes.ObjectMeta::{
|
||||||
|
, name = config.name
|
||||||
|
, labels = [ kv "app" config.name ]
|
||||||
|
, annotations = annotations config
|
||||||
|
}
|
||||||
|
, spec = Some (spec config)
|
||||||
|
}
|
||||||
|
|
||||||
|
in service
|
|
@ -0,0 +1 @@
|
||||||
|
https://raw.githubusercontent.com/dhall-lang/dhall-kubernetes/master/1.15/package.dhall sha256:4bd5939adb0a5fc83d76e0d69aa3c5a30bc1a5af8f9df515f44b6fc59a0a4815
|
|
@ -0,0 +1,42 @@
|
||||||
|
let Prelude =
|
||||||
|
https://prelude.dhall-lang.org/package.dhall sha256:4aa8581954f7734d09b7b21fddbf5d8df901a44b54b4ef26ea71db92de0b1a12
|
||||||
|
|
||||||
|
let kubernetes = ./kubernetes.dhall
|
||||||
|
|
||||||
|
let kv = Prelude.JSON.keyText
|
||||||
|
|
||||||
|
let appName = env:APP_NAME as Text ? "nginx"
|
||||||
|
|
||||||
|
let imageName = env:IMAGE_NAME as Text ? "nginx"
|
||||||
|
|
||||||
|
let imageTag = env:IMAGE_TAG as Text ? "latest"
|
||||||
|
|
||||||
|
let deployment =
|
||||||
|
kubernetes.Deployment::{
|
||||||
|
, metadata = kubernetes.ObjectMeta::{ name = appName }
|
||||||
|
, spec = Some kubernetes.DeploymentSpec::{
|
||||||
|
, replicas = Some 2
|
||||||
|
, revisionHistoryLimit = Some 10
|
||||||
|
, selector = kubernetes.LabelSelector::{
|
||||||
|
, matchLabels = [ kv "app" appName ]
|
||||||
|
}
|
||||||
|
, template = kubernetes.PodTemplateSpec::{
|
||||||
|
, metadata = kubernetes.ObjectMeta::{
|
||||||
|
, name = "nginx"
|
||||||
|
, labels = [ kv "app" appName ]
|
||||||
|
}
|
||||||
|
, spec = Some kubernetes.PodSpec::{
|
||||||
|
, containers =
|
||||||
|
[ kubernetes.Container::{
|
||||||
|
, name = "web"
|
||||||
|
, image = Some "${imageName}:${imageTag}"
|
||||||
|
, imagePullPolicy = Some "Always"
|
||||||
|
, ports = [ kubernetes.ContainerPort::{ containerPort = 80 } ]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
in deployment
|
|
@ -0,0 +1 @@
|
||||||
|
https://raw.githubusercontent.com/dhall-lang/dhall-kubernetes/master/1.15/typesUnion.dhall sha256:930a34021bd380209b6763d4a98fb16e1f5608fe5e8d1403d0ec03f6c4a08f00
|
Loading…
Reference in New Issue