diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..375adf19d9f0112d89c862d77a23bbd84c56de39
--- /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 0000000000000000000000000000000000000000..bd7c9ad2724aa26730d94a7edbcba5fe77ce6f27
--- /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 0000000000000000000000000000000000000000..d6100fb939f3a0aeb51a9cdbcea6dafefe076354
--- /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