From 7e8b2223eb661b69e5abf66344858546dadf0044 Mon Sep 17 00:00:00 2001 From: Igor Egrorov Date: Mon, 22 May 2023 08:57:17 +0000 Subject: [PATCH] Feature/cicd --- .dockerignore | 3 +- .gitlab-ci.yml | 118 ++++++++++++++++++++++++++++++++------------- Dockerfile | 8 +-- deploy/front.yaml | 74 ++++++++++++++++++++++++++++ nginx/default.conf | 46 ++++++++++++++++++ 5 files changed, 211 insertions(+), 38 deletions(-) create mode 100644 deploy/front.yaml create mode 100644 nginx/default.conf diff --git a/.dockerignore b/.dockerignore index 64ede06..1b8f17c 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,5 @@ .gitignore .gitlab-ci.yml README.md -.git/* \ No newline at end of file +.git +docker-compose.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ec91104..ce4ddfb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,48 +1,98 @@ +--- variables: - APP_NAME: postamates_front - IMAGE_NAME: $CI_REGISTRY_IMAGE + DOCKER_IMAGE_TAG: ${YC_CONTAINER_REGISTRY}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_SLUG}.${CI_COMMIT_SHORT_SHA} + RELEASE_DOCKER_IMAGE_TAG: ${YC_CONTAINER_REGISTRY}/${CI_PROJECT_NAME}:${CI_COMMIT_TAG} + DEPLOY_KUBER_NAMESPACE: spatial stages: - build - deploy -.build: &build-common +build-docker: stage: build - before_script: - - sudo docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY - script: - - sudo docker pull $IMAGE_NAME:builder || true - - sudo docker pull $IMAGE_NAME:$CI_COMMIT_SHORT_SHA || true - - sudo docker build --cache-from $IMAGE_NAME:builder --memory=2000m --memory-swap=3000m --target builder --tag $IMAGE_NAME:builder . - - sudo docker push $IMAGE_NAME:builder - - sudo docker build --cache-from $IMAGE_NAME:builder --memory=2000m --memory-swap=3000m --tag $IMAGE_NAME:$IMAGE_TAG --build-arg REACT_APP_DOMAIN_URL=$REACT_APP_DOMAIN_URL --build-arg BUILDKIT_INLINE_CACHE=1 . - - sudo docker push $IMAGE_NAME:$IMAGE_TAG tags: - - deploy-remote + - shell + script: + - > + docker build + --build-arg YC_CONTAINER_REGISTRY=${YC_CONTAINER_REGISTRY} + --build-arg VITE_API_URL="https://postnet.dev.selftech.ru" + -t ${DOCKER_IMAGE_TAG} . + - docker push ${DOCKER_IMAGE_TAG} -build-test-job: - <<: *build-common - variables: - IMAGE_TAG: $CI_COMMIT_SHORT_SHA - REACT_APP_DOMAIN_URL: https://$DOMAIN/ - rules: - - if: $CI_COMMIT_BRANCH == "sst_main" +deploy-dev-kuber: + extends: .deploy_base_kuber + variables: + INGRESS_HOST: "postnet.dev.selftech.ru" + tags: + - docker + environment: + name: dev -.deploy: &deploy-common +.deploy_base_kuber: + image: ${YC_CONTAINER_REGISTRY}/public/helm-kubectl-git:1.0.0 stage: deploy before_script: - - sudo docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY - - sudo docker pull $IMAGE_NAME:$IMAGE_TAG + - KUBE_CONFIG=`echo ${CI_ENVIRONMENT_NAME}_kubeconfig` + - mkdir -p ${HOME}/.kube + - 'cat ${!KUBE_CONFIG} > ${HOME}/.kube/config' + - chmod -R 700 ${HOME}/.kube script: - - id=$(sudo docker create $IMAGE_NAME:$IMAGE_TAG) - - sudo docker cp $id:/dist/. /home/toren332/sst_postamates_frontend/dist - - sudo docker rm -v $id - tags: - - deploy-remote + - sed -i "s|DEPLOY_IMAGE_TAG|${DOCKER_IMAGE_TAG}|g" ./deploy/front.yaml + - sed -i "s|ADDRESS_INGRESS_HOST|${INGRESS_HOST}|g" ./deploy/front.yaml + - kubectl apply -f ./deploy/front.yaml + dependencies: [] + artifacts: + paths: + - ./deploy/front.yaml + expire_in: 1 week + when: manual -deploy-test-job: - <<: *deploy-common - variables: - IMAGE_TAG: $CI_COMMIT_SHORT_SHA - rules: - - if: $CI_COMMIT_BRANCH == "sst_main" +# variables: +# APP_NAME: postamates_front +# IMAGE_NAME: $CI_REGISTRY_IMAGE + +# stages: +# - build +# - deploy + +# .build: &build-common +# stage: build +# before_script: +# - sudo docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY +# script: +# - sudo docker pull $IMAGE_NAME:builder || true +# - sudo docker pull $IMAGE_NAME:$CI_COMMIT_SHORT_SHA || true +# - sudo docker build --cache-from $IMAGE_NAME:builder --memory=2000m --memory-swap=3000m --target builder --tag $IMAGE_NAME:builder . +# - sudo docker push $IMAGE_NAME:builder +# - sudo docker build --cache-from $IMAGE_NAME:builder --memory=2000m --memory-swap=3000m --tag $IMAGE_NAME:$IMAGE_TAG --build-arg REACT_APP_DOMAIN_URL=$REACT_APP_DOMAIN_URL --build-arg BUILDKIT_INLINE_CACHE=1 . +# - sudo docker push $IMAGE_NAME:$IMAGE_TAG +# tags: +# - deploy-remote + +# build-test-job: +# <<: *build-common +# variables: +# IMAGE_TAG: $CI_COMMIT_SHORT_SHA +# REACT_APP_DOMAIN_URL: https://$DOMAIN/ +# rules: +# - if: $CI_COMMIT_BRANCH == "sst_main" + +# .deploy: &deploy-common +# stage: deploy +# before_script: +# - sudo docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY +# - sudo docker pull $IMAGE_NAME:$IMAGE_TAG +# script: +# - id=$(sudo docker create $IMAGE_NAME:$IMAGE_TAG) +# - sudo docker cp $id:/dist/. /home/toren332/sst_postamates_frontend/dist +# - sudo docker rm -v $id +# tags: +# - deploy-remote + +# deploy-test-job: +# <<: *deploy-common +# variables: +# IMAGE_TAG: $CI_COMMIT_SHORT_SHA +# rules: +# - if: $CI_COMMIT_BRANCH == "sst_main" diff --git a/Dockerfile b/Dockerfile index 7539e1e..3df4a69 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,5 @@ -FROM node:16 as builder +ARG YC_CONTAINER_REGISTRY +FROM ${YC_CONTAINER_REGISTRY}/public/node:16 as builder WORKDIR /usr/src/postamates_frontend ENV NODE_OPTIONS=--max_old_space_size=4096 COPY package*.json ./ @@ -8,5 +9,6 @@ COPY . . ARG REACT_APP_DOMAIN_URL=https://${DOMAIN}/ RUN yarn build -FROM nginx:1.23-alpine -COPY --from=builder /usr/src/postamates_frontend/dist /dist +FROM ${YC_CONTAINER_REGISTRY}/public/nginx:1.23-alpine +COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf +COPY --from=builder /usr/src/postamates_frontend/dist /usr/share/nginx/html diff --git a/deploy/front.yaml b/deploy/front.yaml new file mode 100644 index 0000000..f14f74b --- /dev/null +++ b/deploy/front.yaml @@ -0,0 +1,74 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: postamates-frontend + namespace: spatial + labels: + app.kubernetes.io/name: postamates-frontend +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: postamates-frontend + template: + metadata: + labels: + app.kubernetes.io/name: postamates-frontend + spec: + containers: + - name: nginx + image: DEPLOY_IMAGE_TAG + ports: + - containerPort: 80 + resources: + requests: + memory: "64Mi" + cpu: "20m" + limits: + memory: "64Mi" + cpu: "20m" + readinessProbe: + httpGet: + path: /nginx-health + port: 8888 + initialDelaySeconds: 3 + periodSeconds: 3 + livenessProbe: + httpGet: + path: /nginx-health + port: 8888 + initialDelaySeconds: 3 + periodSeconds: 3 +--- +apiVersion: v1 +kind: Service +metadata: + name: postamates-frontend + namespace: spatial +spec: + selector: + app.kubernetes.io/name: postamates-frontend + ports: + - protocol: TCP + port: 80 + targetPort: 80 +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: postamates-frontend + namespace: spatial +spec: + ingressClassName: nginx-internal + rules: + - host: ADDRESS_INGRESS_HOST + http: + paths: + - backend: + service: + name: postamates-frontend + port: + number: 80 + path: / + pathType: ImplementationSpecific diff --git a/nginx/default.conf b/nginx/default.conf new file mode 100644 index 0000000..15c4afe --- /dev/null +++ b/nginx/default.conf @@ -0,0 +1,46 @@ +server { + listen 80; + server_name _; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + # error_page 500 502 503 504 /50x.html; + # location = /50x.html { + # root /usr/share/nginx/html; + # } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} +} + +server { + listen 8888; + server_name _; + location /nginx-health { + return 200 "healthy\n"; + access_log off; + } +}