From 0b05ebf41d2d4253425e4eba95ed1b278b0667f4 Mon Sep 17 00:00:00 2001 From: Adar Nimrod <nimrod@shore.co.il> Date: Sat, 15 Dec 2018 00:40:05 +0200 Subject: [PATCH] Added Kubernetes deployment and GitLab CI/CD. --- .gitlab-ci.yml | 50 +++++++++++++++++++++++++++++++++++++++++++ myapp-deployment.yaml | 37 ++++++++++++++++++++++++++++++++ myapp-migrate.yaml | 20 +++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 .gitlab-ci.yml create mode 100644 myapp-deployment.yaml create mode 100644 myapp-migrate.yaml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..375adf1 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,50 @@ +--- +image: adarnimrod/ci-images:docker + +stages: + - build + - test + - deploy + +variables: + AWS_DEFAULT_REGION: us-east-1 + AWS_ACCESS_KEY_ID: abc + #AWS_SECRET_ACCESS_KEY: Secret environment variable + POSTGRES_PASSWORD: password + POSTGRES_DB: myapp + +build: + stage: build + script: + - docker login -u gitlab-ci-token -p "$CI_JOB_TOKEN" registry.example.com + - docker pull registy.example.com/$CI_PROJECT_PATH:latest || true + - docker build --pull --cache-from "registy.example.com/$CI_PROJECT_PATH:latest" -t "registy.example.com/$CI_PROJECT_PATH:$CI_PIPELINE_ID" ./ + - docker push "registy.example.com/$CI_PROJECT_PATH:$CI_PIPELINE_ID" + - | + if [ "$CI_COMMIT_REF_NAME" = "master" ] + then + docker tag "registy.example.com/$CI_PROJECT_PATH:$CI_PIPELINE_ID" "registy.example.com/$CI_PROJECT_PATH:latest" + docker push "registy.example.com/$CI_PROJECT_PATH:latest" + fi + +test: + stage: test + image: + name: "registy.example.com/$CI_PROJECT_PATH:$CI_PIPELINE_ID" + services: + - name: postgres:alpine + script: + - python3 manage.py migrate + - python3 manage.py test + +staging: + stage: deploy + environment: + name: Staging + script: + - mkdir ~/.kube + - aws s3 cp s3://example-environments/$CI_ENVIRONMENT_SLUG/kube_config ~/.kube/config + - sed -i "s/latest/$CI_PIPELINE_ID/g" myapp-*.yaml + - kubectl apply -f myapp-migrate.yaml + - kubectl wait --for=condition=complete --timeout=120 job/myapp-migrate + - kubectl apply -f myapp-deployment.yaml diff --git a/myapp-deployment.yaml b/myapp-deployment.yaml new file mode 100644 index 0000000..bd7c9ad --- /dev/null +++ b/myapp-deployment.yaml @@ -0,0 +1,37 @@ +--- +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: myapp +spec: + replicas: 1 + strategy: {} + template: + metadata: + creationTimestamp: null + spec: + containers: + env: + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: postgres + image: registry.example.com/myapp:latest + name: myapp + ports: + - containerPort: 8000 + resources: {} + restartPolicy: Always +status: {} +--- +apiVersion: v1 +kind: Service +metadata: + name: myapp +spec: + ports: + - name: "8000" + port: 8000 + targetPort: 8000 +status: + loadBalancer: {} diff --git a/myapp-migrate.yaml b/myapp-migrate.yaml new file mode 100644 index 0000000..d6100fb --- /dev/null +++ b/myapp-migrate.yaml @@ -0,0 +1,20 @@ +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: myapp-migrate +spec: + template: + metadata: + name: myapp-migrate + spec: + containers: + - name: myapp-migrate + image: registry.example.com/myapp:latest + command: [ "python3", "manage.py", "migrate" ] + env: + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: postgres + restartPolicy: Never -- GitLab