Attempt to build review apps for dev/* branches
This commit is contained in:
parent
a81956359b
commit
de17d506a4
2 changed files with 303 additions and 14 deletions
|
@ -1,5 +1,10 @@
|
||||||
|
variables:
|
||||||
|
2019_CONTAINER_IMAGE=asia.gcr.io/linuxconfsydney/symposion_app_2019
|
||||||
|
DOCKER_DRIVER: overlay2
|
||||||
|
|
||||||
build_image:
|
build_image:
|
||||||
image: docker:git
|
image: docker:git
|
||||||
|
stage: build
|
||||||
services:
|
services:
|
||||||
- docker:dind
|
- docker:dind
|
||||||
script:
|
script:
|
||||||
|
@ -30,21 +35,36 @@ k8s-prod-deploy:
|
||||||
only:
|
only:
|
||||||
- master
|
- master
|
||||||
environment:
|
environment:
|
||||||
name: prod
|
name: 2019/prod
|
||||||
url: https://rego.linux.conf.au
|
url: https://rego.linux.conf.au
|
||||||
|
|
||||||
|
build_review_deployment:
|
||||||
|
image: sparkprime/jsonnet
|
||||||
|
services:
|
||||||
|
- docker:dind
|
||||||
|
stage: build
|
||||||
|
script:
|
||||||
|
- docker run -v ${PWD}/k8s:/src sparkprime/jsonnet /src/deployment_template.jsonnet --tla-str slug="${CI_COMMIT_REF_SLUG}" > ${CI_COMMIT_REF_SLUG}.json
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- ${CI_COMMIT_REF_SLUG}.json
|
||||||
|
|
||||||
build_2019_dev_image:
|
build_2019_dev_image:
|
||||||
image: docker:git
|
image: docker:git
|
||||||
|
stage: build
|
||||||
services:
|
services:
|
||||||
- docker:dind
|
- docker:dind
|
||||||
script:
|
script:
|
||||||
- docker build -f docker/Dockerfile -t asia.gcr.io/linuxconfsydney/symposion_app_2019:$CI_COMMIT_SHA .
|
|
||||||
- docker build --build-arg CI_COMMIT_SHA=$CI_COMMIT_SHA -f docker/Dockerfile.dev -t asia.gcr.io/linuxconfsydney/symposion_app_2019_dev:$CI_COMMIT_SHA .
|
|
||||||
- docker login -u _json_key -p "$GOOGLE_KEY" https://asia.gcr.io
|
- docker login -u _json_key -p "$GOOGLE_KEY" https://asia.gcr.io
|
||||||
- docker push asia.gcr.io/linuxconfsydney/symposion_app_2019:$CI_COMMIT_SHA
|
- docker pull "${2019_CONTAINER_IMAGE}"_dev:latest || true
|
||||||
- docker push asia.gcr.io/linuxconfsydney/symposion_app_2019_dev:$CI_COMMIT_SHA
|
- docker build --cache-from "${2019_CONTAINER_IMAGE}"_dev:latest -f docker/Dockerfile -t "${2019_CONTAINER_IMAGE}":$CI_COMMIT_SHA .
|
||||||
- docker tag asia.gcr.io/linuxconfsydney/symposion_app_2019_dev:$CI_COMMIT_SHA asia.gcr.io/linuxconfsydney/symposion_app_2019_dev:latest
|
- docker build --build-arg CI_COMMIT_SHA=$CI_COMMIT_SHA -f docker/Dockerfile.dev -t "${2019_CONTAINER_IMAGE}"_dev:$CI_COMMIT_SHA .
|
||||||
- docker push asia.gcr.io/linuxconfsydney/symposion_app_2019_dev:latest
|
- docker push "${2019_CONTAINER_IMAGE}":$CI_COMMIT_SHA
|
||||||
|
- docker push "${2019_CONTAINER_IMAGE}"_dev:$CI_COMMIT_SHA
|
||||||
|
- docker tag "${2019_CONTAINER_IMAGE}"_dev:$CI_COMMIT_SHA "${2019_CONTAINER_IMAGE}"_dev:latest
|
||||||
|
- docker tag "${2019_CONTAINER_IMAGE}"_dev:$CI_COMMIT_SHA "${2019_CONTAINER_IMAGE}"_dev:$CI_COMMIT_REF_SLUG
|
||||||
|
- docker push "${2019_CONTAINER_IMAGE}"_dev:latest
|
||||||
|
- docker push "${2019_CONTAINER_IMAGE}"_dev:${CI_COMMIT_REF_SLUG}
|
||||||
except:
|
except:
|
||||||
- master
|
- master
|
||||||
|
|
||||||
|
@ -56,14 +76,46 @@ k8s-2019_dev-deploy:
|
||||||
- kubectl config set-cluster cluster --server="${KUBE_SERVER}" --embed-certs=true --certificate-authority=cert.crt
|
- kubectl config set-cluster cluster --server="${KUBE_SERVER}" --embed-certs=true --certificate-authority=cert.crt
|
||||||
- kubectl config set-context cluster --cluster=cluster --namespace=rego-dev --user=gitlab-sa
|
- kubectl config set-context cluster --cluster=cluster --namespace=rego-dev --user=gitlab-sa
|
||||||
- kubectl config use-context cluster
|
- kubectl config use-context cluster
|
||||||
- kubectl --token "${GL_KUBE_TOKEN}" set image deployment/symposion-app symposion-app=asia.gcr.io/linuxconfsydney/symposion_app_2019_dev:$CI_COMMIT_SHA
|
- kubectl --token "${GL_KUBE_TOKEN}" set image deployment/symposion-app symposion-app="${2019_CONTAINER_IMAGE}"_dev:$CI_COMMIT_SHA
|
||||||
only:
|
only:
|
||||||
- dev/2019
|
- dev/2019
|
||||||
- dev/*
|
|
||||||
environment:
|
environment:
|
||||||
name: dev_2019
|
name: 2019/dev
|
||||||
url: https://dev.lca2019.org
|
url: https://dev.lca2019.org
|
||||||
|
|
||||||
|
k8s-2019_dev_review-deploy:
|
||||||
|
image: google/cloud-sdk
|
||||||
|
stage: deploy
|
||||||
|
script:
|
||||||
|
- echo "${CA_CERT}" > cert.crt
|
||||||
|
- kubectl config set-cluster cluster --server="${KUBE_SERVER}" --embed-certs=true --certificate-authority=cert.crt
|
||||||
|
- kubectl config set-context cluster --cluster=cluster --namespace=rego-dev --user=gitlab-sa
|
||||||
|
- kubectl config use-context cluster
|
||||||
|
- kubectl --token "${GL_KUBE_TOKEN}" apply -f ${CI_COMMIT_REF_SLUG}.json
|
||||||
|
only:
|
||||||
|
- /^dev\/.*$/
|
||||||
|
environment:
|
||||||
|
name: 2019/dev/${CI_COMMIT_REF_SLUG}
|
||||||
|
url: https://${CI_COMMIT_REF_SLUG}.dev.lca2019.org
|
||||||
|
on_stop: k8s-2019_dev_review-stop-deploy
|
||||||
|
|
||||||
|
k8s-2019_dev_review-stop-deploy:
|
||||||
|
image: google/cloud-sdk
|
||||||
|
stage: deploy
|
||||||
|
script:
|
||||||
|
- echo "${CA_CERT}" > cert.crt
|
||||||
|
- kubectl config set-cluster cluster --server="${KUBE_SERVER}" --embed-certs=true --certificate-authority=cert.crt
|
||||||
|
- kubectl config set-context cluster --cluster=cluster --namespace=rego-dev --user=gitlab-sa
|
||||||
|
- kubectl config use-context cluster
|
||||||
|
- kubectl --token "${GL_KUBE_TOKEN}" delete -f ${CI_COMMIT_REF_SLUG}.json
|
||||||
|
only:
|
||||||
|
- /^dev\/.*$/
|
||||||
|
when: manual
|
||||||
|
environment:
|
||||||
|
name: 2019/dev/${CI_COMMIT_REF_SLUG}
|
||||||
|
url: https://${CI_COMMIT_REF_SLUG}.dev.lca2019.org
|
||||||
|
action: stop
|
||||||
|
|
||||||
k8s-2019_staging-deploy:
|
k8s-2019_staging-deploy:
|
||||||
image: google/cloud-sdk
|
image: google/cloud-sdk
|
||||||
stage: deploy
|
stage: deploy
|
||||||
|
@ -72,12 +124,12 @@ k8s-2019_staging-deploy:
|
||||||
- kubectl config set-cluster cluster --server="${KUBE_SERVER}" --embed-certs=true --certificate-authority=cert.crt
|
- kubectl config set-cluster cluster --server="${KUBE_SERVER}" --embed-certs=true --certificate-authority=cert.crt
|
||||||
- kubectl config set-context cluster --cluster=cluster --namespace=lca2019-staging --user=gitlab-ci
|
- kubectl config set-context cluster --cluster=cluster --namespace=lca2019-staging --user=gitlab-ci
|
||||||
- kubectl config use-context cluster
|
- kubectl config use-context cluster
|
||||||
- kubectl --token "${GL_KUBE_TOKEN}" set image deployment/symposion-app symposion-app=asia.gcr.io/linuxconfsydney/symposion_app_2019_dev:$CI_COMMIT_SHA
|
- kubectl --token "${GL_KUBE_TOKEN}" set image deployment/symposion-app symposion-app="${2019_CONTAINER_IMAGE}"_dev:$CI_COMMIT_SHA
|
||||||
when: manual
|
when: manual
|
||||||
only:
|
only:
|
||||||
- dev/2019
|
- dev/2019
|
||||||
environment:
|
environment:
|
||||||
name: staging
|
name: 2019/staging
|
||||||
url: https://staging.lca2019.org
|
url: https://staging.lca2019.org
|
||||||
|
|
||||||
.docs_template: &sphinx
|
.docs_template: &sphinx
|
||||||
|
@ -101,6 +153,6 @@ pages:
|
||||||
name: docs
|
name: docs
|
||||||
url: https://laconfdev.gitlab.io/symposion_app/
|
url: https://laconfdev.gitlab.io/symposion_app/
|
||||||
|
|
||||||
test_sphinx:
|
build_sphinx:
|
||||||
<<: *sphinx
|
<<: *sphinx
|
||||||
stage: test
|
stage: build
|
||||||
|
|
237
k8s/deployment_template.jsonnet
Normal file
237
k8s/deployment_template.jsonnet
Normal file
|
@ -0,0 +1,237 @@
|
||||||
|
function (slug) {
|
||||||
|
|
||||||
|
local namespace = slug + "-rego-dev",
|
||||||
|
local domain = slug + ".dev.lca2019.org",
|
||||||
|
local tls_certname = slug + "-dev-lca2019-org",
|
||||||
|
local tls_secret = tls_certname + "-tls",
|
||||||
|
|
||||||
|
"apiVersion": "v1",
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"apiVersion": "v1",
|
||||||
|
"kind": "Namespace",
|
||||||
|
"metadata": {
|
||||||
|
"name": namespace,
|
||||||
|
"namespace": "",
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"finalizers": [
|
||||||
|
"kubernetes"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"apiVersion": "certmanager.k8s.io/v1alpha1",
|
||||||
|
"kind": "Certificate",
|
||||||
|
"metadata": {
|
||||||
|
"name": tls_certname,
|
||||||
|
"namespace": namespace
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"acme": {
|
||||||
|
"config": [
|
||||||
|
{
|
||||||
|
"domains": [
|
||||||
|
domain
|
||||||
|
],
|
||||||
|
"http01": {
|
||||||
|
"ingress": "",
|
||||||
|
"ingressClass": "nginx"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"commonName": domain,
|
||||||
|
"issuerRef": {
|
||||||
|
"kind": "ClusterIssuer",
|
||||||
|
"name": "letsencrypt-prod"
|
||||||
|
},
|
||||||
|
"secretName": tls_secret
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"apiVersion": "extensions/v1beta1",
|
||||||
|
"kind": "Ingress",
|
||||||
|
"metadata": {
|
||||||
|
"name": "symposion-app-ingress",
|
||||||
|
"namespace": namespace
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"backend": {
|
||||||
|
"serviceName": "symposion-app",
|
||||||
|
"servicePort": 80
|
||||||
|
},
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"host": domain,
|
||||||
|
"http": {
|
||||||
|
"paths": [
|
||||||
|
{
|
||||||
|
"backend": {
|
||||||
|
"serviceName": "symposion-app",
|
||||||
|
"servicePort": 8000
|
||||||
|
},
|
||||||
|
"path": "/"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tls": [
|
||||||
|
{
|
||||||
|
"hosts": [
|
||||||
|
domain
|
||||||
|
],
|
||||||
|
"secretName": tls_secret
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"loadBalancer": {
|
||||||
|
"ingress": [
|
||||||
|
{
|
||||||
|
"ip": "127.0.0.1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"apiVersion": "v1",
|
||||||
|
"kind": "Service",
|
||||||
|
"metadata": {
|
||||||
|
"labels": {
|
||||||
|
"app": "symposion-app"
|
||||||
|
},
|
||||||
|
"name": "symposion-app",
|
||||||
|
"namespace": namespace
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"ports": [
|
||||||
|
{
|
||||||
|
"port": 8000,
|
||||||
|
"protocol": "TCP",
|
||||||
|
"targetPort": 8000
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"selector": {
|
||||||
|
"app": "symposion-app"
|
||||||
|
},
|
||||||
|
"sessionAffinity": "None",
|
||||||
|
"type": "ClusterIP"
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"loadBalancer": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"apiVersion": "extensions/v1beta1",
|
||||||
|
"kind": "Deployment",
|
||||||
|
"metadata": {
|
||||||
|
"labels": {
|
||||||
|
"app": "symposion-app"
|
||||||
|
},
|
||||||
|
"name": "symposion-app",
|
||||||
|
"namespace": namespace
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"replicas": 1,
|
||||||
|
"revisionHistoryLimit": 1,
|
||||||
|
"selector": {
|
||||||
|
"matchLabels": {
|
||||||
|
"app": "symposion-app"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"strategy": {
|
||||||
|
"rollingUpdate": {
|
||||||
|
"maxSurge": 1,
|
||||||
|
"maxUnavailable": 1
|
||||||
|
},
|
||||||
|
"type": "RollingUpdate"
|
||||||
|
},
|
||||||
|
"template": {
|
||||||
|
"metadata": {
|
||||||
|
"labels": {
|
||||||
|
"app": "symposion-app"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"containers": [
|
||||||
|
{
|
||||||
|
"env": [
|
||||||
|
{
|
||||||
|
"name": "SYMPOSION_APP_DEBUG",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "DJANGO_SECRET_KEY",
|
||||||
|
"value": "paGhahQuain5ohYoh0moorai"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "DATABASE_URL",
|
||||||
|
"value": "sqlite:////tmp/symposion.sqlite"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "GCS_BUCKET",
|
||||||
|
"value": "CEA51A5-A613-4AEF-A9FB-D0A57D77C13B"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "GOOGLE_APPLICATION_CREDENTIALS",
|
||||||
|
"value": "/dev/null"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "STRIPE_PUBLIC_KEY",
|
||||||
|
"value": "5CEA51A5-A613-4AEF-A9FB-D0A57D77C13B"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "STRIPE_SECRET_KEY",
|
||||||
|
"value": "5CEA51A5-A613-4AEF-A9FB-D0A57D77C13B"
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"image": "asia.gcr.io/linuxconfsydney/symposion_app_2019_dev:" + slug,
|
||||||
|
"imagePullPolicy": "Always",
|
||||||
|
"livenessProbe": {
|
||||||
|
"failureThreshold": 3,
|
||||||
|
"httpGet": {
|
||||||
|
"path": "/admin/login/",
|
||||||
|
"port": 8000,
|
||||||
|
"scheme": "HTTP"
|
||||||
|
},
|
||||||
|
"initialDelaySeconds": 120,
|
||||||
|
"periodSeconds": 10,
|
||||||
|
"successThreshold": 1,
|
||||||
|
"timeoutSeconds": 2
|
||||||
|
},
|
||||||
|
"name": "symposion-app",
|
||||||
|
"ports": [
|
||||||
|
{
|
||||||
|
"containerPort": 8000,
|
||||||
|
"protocol": "TCP"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"resources": {},
|
||||||
|
"terminationMessagePath": "/dev/termination-log",
|
||||||
|
"terminationMessagePolicy": "File"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dnsPolicy": "ClusterFirst",
|
||||||
|
"restartPolicy": "Always",
|
||||||
|
"schedulerName": "default-scheduler",
|
||||||
|
"securityContext": {},
|
||||||
|
"terminationGracePeriodSeconds": 30,
|
||||||
|
"volumes": [
|
||||||
|
{
|
||||||
|
"hostPath": {
|
||||||
|
"path": "/etc/ssl/certs",
|
||||||
|
"type": ""
|
||||||
|
},
|
||||||
|
"name": "ssl-certs"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"kind": "List"
|
||||||
|
}
|
Loading…
Reference in a new issue