Browse Source

Initial commit of kubernetes deployment (#616)

ddorgan 6 years ago
parent
commit
535232457f
3 changed files with 232 additions and 12 deletions
  1. 146 0
      .gitlab-ci.yml
  2. 26 12
      Dockerfile
  3. 60 0
      deployment.template.yml

+ 146 - 0
.gitlab-ci.yml

@@ -0,0 +1,146 @@
+image: roffe/kubectl:latest
+variables:
+  CI_REGISTRY: parity.azurecr.io
+  CI_REGISTRY_USER: parity
+  AUTO_DEVOPS_DOMAIN: poc-3.polkadot.io
+
+.kubernetes: &kubernetes
+  tags:
+    - kubernetes
+
+stages:
+  - dockerize
+  - test
+  - review
+  - staging
+  - production
+  - cleanup
+
+dockerize:
+  stage: dockerize
+  <<: *kubernetes
+  image: docker:git
+  services:
+    - docker:dind
+  variables:
+    DOCKER_DRIVER: overlay2
+    DOCKER_HOST: tcp://localhost:2375
+  script:
+    - build
+  only:
+    - branches
+
+review:
+  stage: review
+  <<: *kubernetes
+  script:
+    - setup_kubernetes
+    - deploy
+  environment:
+    name: review/$CI_COMMIT_REF_NAME
+    url: https://$CI_ENVIRONMENT_SLUG.$AUTO_DEVOPS_DOMAIN
+    on_stop: stop_review
+  only:
+    refs:
+      - branches
+    kubernetes: active
+  except:
+    - master
+
+stop_review:
+  stage: cleanup
+  <<: *kubernetes
+  variables:
+    GIT_STRATEGY: none
+  script:
+    - setup_kubernetes
+    - delete
+  environment:
+    name: review/$CI_COMMIT_REF_NAME
+    action: stop
+  when: manual
+  allow_failure: true
+  only:
+    refs:
+      - branches
+    kubernetes: active
+  except:
+    - master
+
+staging:
+  stage: staging
+  <<: *kubernetes
+  script:
+    - setup_kubernetes
+    - deploy
+  environment:
+    name: staging
+    url: https://staging.$AUTO_DEVOPS_DOMAIN
+  only:
+    refs:
+      - master
+    kubernetes: active
+
+production:
+  stage: production
+  <<: *kubernetes
+  script:
+    - setup_kubernetes
+    - deploy
+  environment:
+    name: production
+    url: https://$AUTO_DEVOPS_DOMAIN
+  when: manual
+  only:
+    refs:
+      - master
+    kubernetes: active
+
+# ---------------------------------------------------------------------------
+.auto_devops: &auto_devops |
+  # Auto DevOps variables and functions
+  [[ "$TRACE" ]] && set -x
+  export DOCKER_IMAGE=$CI_REGISTRY/$CI_PROJECT_PATH_SLUG
+  export DOCKER_TAG=$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHA
+  export DOCKER_IMAGE_FULL_NAME=$DOCKER_IMAGE:$DOCKER_TAG
+
+  export AUTODEVOPS_HOST=$(echo $CI_ENVIRONMENT_URL | awk -F/ '{print $3}')
+
+  function build() {
+    if [[ -n "$CI_REGISTRY_USER" ]]; then
+      echo "Logging to GitLab Container Registry with CI credentials..."
+      docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
+      echo ""
+    fi
+
+    echo "Building Dockerfile-based application..."
+    docker build -t "$DOCKER_IMAGE_FULL_NAME" .
+
+    echo "Pushing to GitLab Container Registry..."
+    docker push "$DOCKER_IMAGE_FULL_NAME"
+    echo ""
+  }
+
+  function setup_kubernetes() {
+    kubectl describe namespace "$KUBE_NAMESPACE" || kubectl create namespace "$KUBE_NAMESPACE"
+    kubectl create secret -n "$KUBE_NAMESPACE" \
+      docker-registry gitlab-registry \
+      --docker-server="$CI_REGISTRY" \
+      --docker-username="$CI_REGISTRY_USER" \
+      --docker-password="$CI_REGISTRY_PASSWORD" \
+      --docker-email="$GITLAB_USER_EMAIL" \
+      -o yaml --dry-run | kubectl replace -n "$KUBE_NAMESPACE" --force -f -
+  }
+
+  function deploy() {
+    cat ./deployment.template.yml | envsubst | kubectl apply -n "$KUBE_NAMESPACE" -f -
+  }
+
+  function delete() {
+    kubectl -n "$KUBE_NAMESPACE" delete "deploy/$CI_ENVIRONMENT_SLUG-backend"
+    kubectl -n "$KUBE_NAMESPACE" delete "svc/$CI_ENVIRONMENT_SLUG-service"
+    kubectl -n "$KUBE_NAMESPACE" delete "ing/$CI_ENVIRONMENT_SLUG-ingress"
+  }
+
+before_script:
+  - *auto_devops

+ 26 - 12
Dockerfile

@@ -1,12 +1,26 @@
-FROM node:10 as builder
-MAINTAINER "chevdor@gmail.com"
-WORKDIR /polkadot
-COPY . .
-RUN yarn && \
-    yarn build
-
-FROM nginx:alpine
-# RUN apk --no-cache add ca-certificates
-# WORKDIR /app
-COPY --from=builder /polkadot/packages/apps/build /usr/share/nginx/html
-# CMD ["./app"]
+FROM ubuntu:18.04 as builder
+
+# Install any needed packages
+RUN apt-get update && apt-get install -y curl git gnupg
+
+# install nodejs
+RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -
+RUN apt-get install -y nodejs
+
+WORKDIR /app
+RUN git clone https://github.com/polkadot-js/apps
+
+WORKDIR /app/apps
+RUN npm install yarn -g
+RUN yarn
+RUN NODE_ENV=production yarn build
+
+FROM ubuntu:18.04
+
+RUN apt-get update && apt-get -y install nginx
+
+COPY --from=builder /app/apps/packages/apps/build /var/www/html
+
+EXPOSE 80
+
+CMD ["nginx", "-g", "daemon off;"]

+ 60 - 0
deployment.template.yml

@@ -0,0 +1,60 @@
+---
+apiVersion: v1
+data:
+# AZURE_DOCKER_REGISTRY_CONFIG is base64 of this:
+# {"auths":{"parity.azurecr.io":{"username":"parity","password":"<password>","email":"admin@parity.io","auth":"<base64 of user+passwoed>"}}}
+  .dockerconfigjson: $AZURE_DOCKER_REGISTRY_CONFIG
+kind: Secret
+metadata:
+  name: azure-docker-registry-key
+type: kubernetes.io/dockerconfigjson
+---
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: $CI_ENVIRONMENT_SLUG-backend
+spec:
+  replicas: $REPLICAS
+  template:
+    metadata:
+      labels:
+        app: $CI_ENVIRONMENT_SLUG
+        component: backend
+    spec:
+      containers:
+        - name: $CI_ENVIRONMENT_SLUG-backend
+          image: $DOCKER_IMAGE_FULL_NAME
+          imagePullPolicy: Always
+          ports:
+          - containerPort: 80
+      imagePullSecrets:
+        - name: azure-docker-registry-key
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: $CI_ENVIRONMENT_SLUG-service
+spec:
+  selector:
+    app: $CI_ENVIRONMENT_SLUG
+  ports:
+    - name: http
+      port: 80
+      targetPort: 80
+      protocol: TCP
+---
+apiVersion: extensions/v1beta1
+kind: Ingress
+metadata:
+  name: $CI_ENVIRONMENT_SLUG-ingress
+  annotations:
+    kubernetes.io/ingress.class: traefik
+    traefik.frontend.entryPoints: "https,http"
+spec:
+  rules:
+  - host: $AUTODEVOPS_HOST
+    http:
+      paths:
+      - backend:
+          serviceName: $CI_ENVIRONMENT_SLUG-service
+          servicePort: 80