From ec0f67209005ffef10bebd94f0341ba85386655b Mon Sep 17 00:00:00 2001
From: Pavel Kirilin <win10@list.ru>
Date: Sat, 7 Aug 2021 01:34:25 +0400
Subject: [PATCH] Updated CI.

Signed-off-by: Pavel Kirilin <win10@list.ru>
---
 .gitignore                                    |  1 +
 .gitlab-ci.yml                                | 86 ++++++++++---------
 deploy/{dockerfiles => }/Dockerfile           | 12 +--
 deploy/charts/lenocka/.helmignore             | 23 +++++
 deploy/charts/lenocka/Chart.yaml              |  8 ++
 deploy/charts/lenocka/templates/NOTES.txt     |  0
 deploy/charts/lenocka/templates/_helpers.tpl  | 62 +++++++++++++
 .../charts/lenocka/templates/deployment.yaml  | 47 ++++++++++
 deploy/charts/lenocka/values.yaml             | 11 +++
 deploy/docker-compose.test.yml                | 14 ---
 deploy/docker-compose.yml                     | 11 ---
 deploy/dockerfiles/test.Dockerfile            | 17 ----
 12 files changed, 202 insertions(+), 90 deletions(-)
 rename deploy/{dockerfiles => }/Dockerfile (65%)
 create mode 100644 deploy/charts/lenocka/.helmignore
 create mode 100644 deploy/charts/lenocka/Chart.yaml
 create mode 100644 deploy/charts/lenocka/templates/NOTES.txt
 create mode 100644 deploy/charts/lenocka/templates/_helpers.tpl
 create mode 100644 deploy/charts/lenocka/templates/deployment.yaml
 create mode 100644 deploy/charts/lenocka/values.yaml
 delete mode 100644 deploy/docker-compose.test.yml
 delete mode 100644 deploy/docker-compose.yml
 delete mode 100644 deploy/dockerfiles/test.Dockerfile

diff --git a/.gitignore b/.gitignore
index 9a158e3..3e606be 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
 # Byte-compiled / optimized / DLL files
 .vscode/
+.idea/
 .gen.env
 __pycache__/
 *.py[cod]
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 18b724d..92548c5 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,70 +1,78 @@
 stages:
-  - tools
   - test
-  - cleanup_tests
   - build
   - deploy
 
-build_test:
-  stage: tools
+variables:
+  APP_VERSION: ${CI_COMMIT_REF_SLUG}
+
+.test-template:
+  image: python:3.9-buster
+  stage: test
   tags:
-    - bots-deployer
-  script:
-    - make build-test
+    - kube
+  except:
+    - tags
+  before_script:
+    - echo "${DOCKER_REGISTRY}"
+    - pip install poetry==1.1.6
+    - poetry config virtualenvs.create false
+    - poetry install
 
 flake8:
   stage: test
-  tags:
-    - bots-deployer
+  extends:
+    - .test-template
   script:
-    - make flake8
+    - flake8 --count .
 
 pytest:
-  stage: test
-  tags:
-    - bots-deployer
+  extends:
+    - .test-template
   script:
-    - make pytest
+    - pytest -vv
 
 black:
-  stage: test
-  tags:
-    - bots-deployer
+  extends:
+    - .test-template
   script:
-    - make black
+    - black --check .
 
 mypy:
   stage: test
-  tags:
-    - bots-deployer
-  script:
-    - make mypy
-
-cleanup_tests:
-  stage: cleanup_tests
-  tags:
-    - bots-deployer
-  when: always
+  extends:
+    - .test-template
   script:
-    - make clear-test
+    - mypy .
 
-build:
+image-builder:
   stage: build
+  image:
+    name: gcr.io/kaniko-project/executor:v1.6.0-debug
+    entrypoint: [ "" ]
+  tags:
+    - kube
   only:
-    - master
     - tags
-  tags:
-    - bots-deployer
   script:
-    - make build push
+    - mkdir -p /kaniko/.docker
+    - echo "{\"auths\":{\"$DOCKER_REGISTRY\":{\"username\":\"$DOCKER_USER\",\"password\":\"$DOCKER_PASSWORD\"}}}" > /kaniko/.docker/config.json
+    - /kaniko/executor --context .
+      --dockerfile deploy/Dockerfile
+      --destination "$IMAGE_NAME:$APP_VERSION"
+      --force
 
 deploy:
   stage: deploy
+  image: dtzar/helm-kubectl:3.6.3
+  tags:
+    - kube
   only:
-    - master
     - tags
-  when: manual
-  tags:
-    - bots-deployer
   script:
-    - make deploy-prod
+    - export KUBECONFIG=$KUBE_CONF
+    - env | grep "^LENOCHKA_" > .deploy-env
+    - kubectl delete configmap --namespace "$NAMESPACE" "$ENVCONF" || true
+    - kubectl create configmap --namespace "$NAMESPACE" "$ENVCONF" --from-env-file=.deploy-env
+    - envsubst < "$HELM_VALUES" > deploy-values.yml
+    - helm upgrade lenocka deploy/charts/lenocka/ -f deploy-values.yml --namespace "$NAMESPACE"
\ No newline at end of file
diff --git a/deploy/dockerfiles/Dockerfile b/deploy/Dockerfile
similarity index 65%
rename from deploy/dockerfiles/Dockerfile
rename to deploy/Dockerfile
index 86a3ce2..b41a18c 100644
--- a/deploy/dockerfiles/Dockerfile
+++ b/deploy/Dockerfile
@@ -1,16 +1,11 @@
-FROM python:3.9-alpine3.13
+FROM python:3.9.6-slim-buster
 
-RUN adduser --disabled-password lenochka
-
-RUN apk add --no-cache curl gcc musl-dev
-
-ENV POETRY_VERSION 1.1.6
+RUN useradd -m lenochka
 
 USER lenochka
-RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -
+RUN pip install poetry==1.1.6
 
 ENV PATH="${PATH}:/home/lenochka/.poetry/bin:/home/lenochka/.local/bin"
-RUN source "/home/lenochka/.poetry/env"
 
 # Installing requirements
 RUN poetry config virtualenvs.create false
@@ -31,7 +26,6 @@ USER root
 RUN rm -rf /home/lenochka/app/src
 RUN chown -R lenochka /home/lenochka
 RUN chmod -R 700 /home/lenochka
-RUN apk del curl gcc musl-dev
 USER lenochka
 
 CMD "lenochka_wake_up"
diff --git a/deploy/charts/lenocka/.helmignore b/deploy/charts/lenocka/.helmignore
new file mode 100644
index 0000000..0e8a0eb
--- /dev/null
+++ b/deploy/charts/lenocka/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/deploy/charts/lenocka/Chart.yaml b/deploy/charts/lenocka/Chart.yaml
new file mode 100644
index 0000000..e27ae98
--- /dev/null
+++ b/deploy/charts/lenocka/Chart.yaml
@@ -0,0 +1,8 @@
+apiVersion: v2
+name: lenocka
+description: A Helm chart for Kubernetes
+
+type: application
+
+version: "0.1.0"
+appVersion: "0.1.0"
\ No newline at end of file
diff --git a/deploy/charts/lenocka/templates/NOTES.txt b/deploy/charts/lenocka/templates/NOTES.txt
new file mode 100644
index 0000000..e69de29
diff --git a/deploy/charts/lenocka/templates/_helpers.tpl b/deploy/charts/lenocka/templates/_helpers.tpl
new file mode 100644
index 0000000..ca3747e
--- /dev/null
+++ b/deploy/charts/lenocka/templates/_helpers.tpl
@@ -0,0 +1,62 @@
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "lenocka.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "lenocka.fullname" -}}
+{{- if .Values.fullnameOverride }}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- $name := default .Chart.Name .Values.nameOverride }}
+{{- if contains $name .Release.Name }}
+{{- .Release.Name | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "lenocka.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Common labels
+*/}}
+{{- define "lenocka.labels" -}}
+helm.sh/chart: {{ include "lenocka.chart" . }}
+{{ include "lenocka.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end }}
+
+{{/*
+Selector labels
+*/}}
+{{- define "lenocka.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "lenocka.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end }}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "lenocka.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create }}
+{{- default (include "lenocka.fullname" .) .Values.serviceAccount.name }}
+{{- else }}
+{{- default "default" .Values.serviceAccount.name }}
+{{- end }}
+{{- end }}
diff --git a/deploy/charts/lenocka/templates/deployment.yaml b/deploy/charts/lenocka/templates/deployment.yaml
new file mode 100644
index 0000000..ab42ffd
--- /dev/null
+++ b/deploy/charts/lenocka/templates/deployment.yaml
@@ -0,0 +1,47 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ include "lenocka.fullname" . }}
+  namespace: {{ .Release.Namespace }}
+  labels:
+  {{- include "lenocka.labels" . | nindent 4 }}
+spec:
+  replicas: {{ .Values.replicaCount }}
+  selector:
+    matchLabels:
+  {{- include "lenocka.selectorLabels" . | nindent 6 }}
+  template:
+    metadata:
+      namespace: {{ .Release.Namespace }}
+      {{- with .Values.podAnnotations }}
+      annotations:
+      {{- toYaml . | nindent 8 }}
+      {{- end }}
+      labels:
+    {{- include "lenocka.selectorLabels" . | nindent 8 }}
+    spec:
+      {{- with .Values.imagePullSecrets }}
+      imagePullSecrets:
+      {{- toYaml . | nindent 8 }}
+      {{- end }}
+      containers:
+        - name: {{ .Chart.Name }}
+          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+          imagePullPolicy: Always
+          envFrom:
+            - configMapRef:
+                name: {{ .Values.image.envConfig }}
+          resources:
+      {{- toYaml .Values.resources | nindent 12 }}
+      {{- with .Values.nodeSelector }}
+      nodeSelector:
+      {{- toYaml . | nindent 8 }}
+      {{- end }}
+      {{- with .Values.affinity }}
+      affinity:
+      {{- toYaml . | nindent 8 }}
+      {{- end }}
+      {{- with .Values.tolerations }}
+      tolerations:
+  {{- toYaml . | nindent 8 }}
+  {{- end }}
diff --git a/deploy/charts/lenocka/values.yaml b/deploy/charts/lenocka/values.yaml
new file mode 100644
index 0000000..4557ea8
--- /dev/null
+++ b/deploy/charts/lenocka/values.yaml
@@ -0,0 +1,11 @@
+replicaCount: 1
+
+image:
+  repository: repo
+  tag: tag
+  envConfig: config
+
+resources:
+  limits:
+    cpu: 100m
+    memory: 100Mi
diff --git a/deploy/docker-compose.test.yml b/deploy/docker-compose.test.yml
deleted file mode 100644
index 2270002..0000000
--- a/deploy/docker-compose.test.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-version: '3.7'
-
-services:
-    test_lenochka:
-        container_name: the_test_lenochka
-        build:
-            dockerfile: ./deploy/dockerfiles/test.Dockerfile
-            context: .
-        networks:
-          - lenochka_test_network
-
-networks:
-  lenochka_test_network:
-    name: lenochka_test_network
diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml
deleted file mode 100644
index 5051abb..0000000
--- a/deploy/docker-compose.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-version: '3.7'
-
-services:
-    lenochka:
-        container_name: the_lenochka
-        build:
-            dockerfile: ./deploy/dockerfiles/Dockerfile
-            context: .
-        image: docker.le-memese.com/bots/lenochka-bot:${CI_COMMIT_REF_SLUG:-latest}
-        env_file:
-            - .gen.env
diff --git a/deploy/dockerfiles/test.Dockerfile b/deploy/dockerfiles/test.Dockerfile
deleted file mode 100644
index c0b27c0..0000000
--- a/deploy/dockerfiles/test.Dockerfile
+++ /dev/null
@@ -1,17 +0,0 @@
-FROM python:3.9-alpine3.13
-
-RUN apk add --no-cache curl gcc musl-dev
-ENV POETRY_VERSION 1.1.6
-
-RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -
-
-ENV PATH="${PATH}:/root/.local/bin:/root/.poetry/bin"
-RUN source "/root/.poetry/env"
-
-# Installing requirements
-RUN poetry config virtualenvs.create false
-
-COPY . /app/
-WORKDIR /app/
-
-RUN poetry install
-- 
GitLab