From 4fcfd56664ab9fb0a7744fb545fd3d37a5ffe7fd Mon Sep 17 00:00:00 2001 From: cristi8 Date: Mon, 15 Mar 2021 11:47:24 +0200 Subject: [PATCH 1/7] CI test for separate fe and be builds --- .circleci/build-and-deploy.sh | 37 ++++++++++++++++++++++++++++++ .circleci/config.yml | 26 +++++++++++++++++++++ .dockerignore | 3 ++- .gitignore | 1 + packages/frontend/Dockerfile | 26 +++++++++++++++++++++ packages/frontend/nginx/nginx.conf | 14 +++++++++++ packages/server/Dockerfile | 16 +++++++++++++ 7 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 .circleci/build-and-deploy.sh create mode 100644 packages/frontend/Dockerfile create mode 100644 packages/frontend/nginx/nginx.conf create mode 100644 packages/server/Dockerfile diff --git a/.circleci/build-and-deploy.sh b/.circleci/build-and-deploy.sh new file mode 100644 index 0000000000..b3abc7a991 --- /dev/null +++ b/.circleci/build-and-deploy.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +set -e + +TARGET_SPECKLE_DEPLOYMENT=$SPECKLE_K8S_DEPLOYMENT-$SPECKLE_SERVER_PACKAGE +IMAGE_VERSION_TAG=$CIRCLE_SHA1 + +DOCKER_IMAGE_TAG=$DOCKER_IMAGE_TAG-$SPECKLE_SERVER_PACKAGE + +if [[ "$CIRCLE_TAG" =~ ^v.* ]]; then + TARGET_SPECKLE_DEPLOYMENT=$SPECKLE_K8S_DEPLOYMENT_PROD-$SPECKLE_SERVER_PACKAGE + IMAGE_VERSION_TAG=$CIRCLE_TAG +fi + +docker build -t $DOCKER_IMAGE_TAG:latest . -f packages/$SPECKLE_SERVER_PACKAGE/Dockerfile +docker tag $DOCKER_IMAGE_TAG:latest $DOCKER_IMAGE_TAG:$IMAGE_VERSION_TAG + +echo "$DOCKER_REG_PASS" | docker login -u "$DOCKER_REG_USER" --password-stdin $DOCKER_REG_URL +docker push $DOCKER_IMAGE_TAG:latest +docker push $DOCKER_IMAGE_TAG:$IMAGE_VERSION_TAG + +# echo "$K8S_CLUSTER_CERTIFICATE" | base64 --decode > k8s_cert.crt + + +#./kubectl \ +# --kubeconfig=/dev/null \ +# --server=$K8S_SERVER \ +# --certificate-authority=k8s_cert.crt \ +# --token=$K8S_TOKEN \ +# set image deployment/$TARGET_SPECKLE_DEPLOYMENT main=$DOCKER_IMAGE_TAG:$IMAGE_VERSION_TAG + +#./kubectl \ +# --kubeconfig=/dev/null \ +# --server=$K8S_SERVER \ +# --certificate-authority=k8s_cert.crt \ +# --token=$K8S_TOKEN \ +# rollout status -w deployment/$TARGET_SPECKLE_DEPLOYMENT --timeout=1m diff --git a/.circleci/config.yml b/.circleci/config.yml index 91e06350ab..19214ad1de 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -27,6 +27,13 @@ workflows: only: /^v.*/ branches: ignore: /.*/ + test-separation: + jobs: + - test_sep_build: + context: main-builds + filters: + branches: + only: cristi/fe-be-separation jobs: test_server: @@ -76,3 +83,22 @@ jobs: name: Create and Deploy Docker image no_output_timeout: 30m command: ./.circleci/ci-build-and-deploy.sh + + test_sep_build: + docker: + - image: circleci/golang:1.15 + steps: + - checkout + - setup_remote_docker: + docker_layer_caching: true + - run: + name: Install kubectl + command: | + curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl + chmod u+x ./kubectl + - run: + name: Build and Deploy Frontend + command: env SPECKLE_SERVER_PACKAGE=frontend ./.circleci/build-and-deploy.sh + - run: + name: Build and Deploy Server + command: env SPECKLE_SERVER_PACKAGE=server ./.circleci/build-and-deploy.sh diff --git a/.dockerignore b/.dockerignore index aef45340d7..76d0834a9c 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,5 @@ .circleci +.git **/node_modules **/dist test-queries @@ -10,4 +11,4 @@ lerna.json .env.example .eslintrc.json .mocharc.js -readme.md \ No newline at end of file +readme.md diff --git a/.gitignore b/.gitignore index ef1a1498a1..202867ac6b 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ packages/viewer/dist .nyc_output coverage/ .vscode +.idea test-queries **/.DS_Store diff --git a/packages/frontend/Dockerfile b/packages/frontend/Dockerfile new file mode 100644 index 0000000000..03662f382e --- /dev/null +++ b/packages/frontend/Dockerfile @@ -0,0 +1,26 @@ +# NOTE: Docker context should be set to git root directory, to include the viewer + +# build stage +FROM node:14.16-buster-slim as build-stage + +WORKDIR /opt/viewer +COPY packages/viewer/package*.json ./ +RUN npm install +COPY packages/viewer . +RUN npm run build + +WORKDIR /opt/frontend +COPY packages/frontend/package*.json ./ +RUN npm install ../viewer +RUN npm ci +COPY packages/frontend . +RUN npm run build + + +# production stage +FROM nginx:stable-alpine as production-stage +COPY --from=build-stage /opt/frontend/dist /usr/share/nginx/html +RUN rm /etc/nginx/conf.d/default.conf +COPY packages/frontend/nginx/nginx.conf /etc/nginx/conf.d +EXPOSE 80 +CMD ["nginx", "-g", "daemon off;"] diff --git a/packages/frontend/nginx/nginx.conf b/packages/frontend/nginx/nginx.conf new file mode 100644 index 0000000000..1bab0adef0 --- /dev/null +++ b/packages/frontend/nginx/nginx.conf @@ -0,0 +1,14 @@ +server { + listen 80; + + location / { + root /usr/share/nginx/html; + try_files $uri $uri/ /app.html; + } + + error_page 500 502 503 504 /50x.html; + + location = /50x.html { + root /usr/share/nginx/html; + } +} diff --git a/packages/server/Dockerfile b/packages/server/Dockerfile new file mode 100644 index 0000000000..ea54af8de3 --- /dev/null +++ b/packages/server/Dockerfile @@ -0,0 +1,16 @@ +FROM node:14.16.0-buster-slim as node + +RUN apt-get update && apt-get install -y \ + tini \ + && rm -rf /var/lib/apt/lists/* + +ENV NODE_ENV=production +WORKDIR /app + +COPY packages/server/package*.json . +RUN npm ci + +COPY packages/server . + +ENTRYPOINT [ "tini", "--" ] +CMD ["node", "bin/www"] From 6b440f1546d4f4e7df7ff624f523f0ca0410beb0 Mon Sep 17 00:00:00 2001 From: cristi8 Date: Mon, 15 Mar 2021 11:56:55 +0200 Subject: [PATCH 2/7] [ci test] fixed permissions, removed testing from ci test branch --- .circleci/build-and-deploy.sh | 0 .circleci/config.yml | 5 ++++- 2 files changed, 4 insertions(+), 1 deletion(-) mode change 100644 => 100755 .circleci/build-and-deploy.sh diff --git a/.circleci/build-and-deploy.sh b/.circleci/build-and-deploy.sh old mode 100644 new mode 100755 diff --git a/.circleci/config.yml b/.circleci/config.yml index 19214ad1de..0dd8f5deb2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -10,7 +10,10 @@ workflows: version: 2.1 test: jobs: - - test_server + - test_server: + filters: + branches: + ignore: cristi/fe-be-separation deploy-latest: jobs: - docker_build_and_deploy: From e5594b7bc507d3e2e2284b74de6e15637ce318b0 Mon Sep 17 00:00:00 2001 From: cristi8 Date: Mon, 15 Mar 2021 12:03:36 +0200 Subject: [PATCH 3/7] [ci test] server dockerfile fix --- packages/server/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/Dockerfile b/packages/server/Dockerfile index ea54af8de3..46a55145eb 100644 --- a/packages/server/Dockerfile +++ b/packages/server/Dockerfile @@ -7,7 +7,7 @@ RUN apt-get update && apt-get install -y \ ENV NODE_ENV=production WORKDIR /app -COPY packages/server/package*.json . +COPY packages/server/package*.json ./ RUN npm ci COPY packages/server . From 0be8fd7746b4ae0832927fa1ebb8eb30598169d8 Mon Sep 17 00:00:00 2001 From: cristi8 Date: Mon, 15 Mar 2021 12:33:48 +0200 Subject: [PATCH 4/7] [ci test] fix nginx config, enabled testing k8s deployment updates --- .circleci/build-and-deploy.sh | 32 +++++++++++++++--------------- packages/frontend/nginx/nginx.conf | 1 + 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/.circleci/build-and-deploy.sh b/.circleci/build-and-deploy.sh index b3abc7a991..418045929a 100755 --- a/.circleci/build-and-deploy.sh +++ b/.circleci/build-and-deploy.sh @@ -19,19 +19,19 @@ echo "$DOCKER_REG_PASS" | docker login -u "$DOCKER_REG_USER" --password-stdin $D docker push $DOCKER_IMAGE_TAG:latest docker push $DOCKER_IMAGE_TAG:$IMAGE_VERSION_TAG -# echo "$K8S_CLUSTER_CERTIFICATE" | base64 --decode > k8s_cert.crt - - -#./kubectl \ -# --kubeconfig=/dev/null \ -# --server=$K8S_SERVER \ -# --certificate-authority=k8s_cert.crt \ -# --token=$K8S_TOKEN \ -# set image deployment/$TARGET_SPECKLE_DEPLOYMENT main=$DOCKER_IMAGE_TAG:$IMAGE_VERSION_TAG - -#./kubectl \ -# --kubeconfig=/dev/null \ -# --server=$K8S_SERVER \ -# --certificate-authority=k8s_cert.crt \ -# --token=$K8S_TOKEN \ -# rollout status -w deployment/$TARGET_SPECKLE_DEPLOYMENT --timeout=1m +echo "$K8S_CLUSTER_CERTIFICATE" | base64 --decode > k8s_cert.crt + + +./kubectl \ + --kubeconfig=/dev/null \ + --server=$K8S_SERVER \ + --certificate-authority=k8s_cert.crt \ + --token=$K8S_TOKEN \ + set image deployment/$TARGET_SPECKLE_DEPLOYMENT main=$DOCKER_IMAGE_TAG:$IMAGE_VERSION_TAG + +./kubectl \ + --kubeconfig=/dev/null \ + --server=$K8S_SERVER \ + --certificate-authority=k8s_cert.crt \ + --token=$K8S_TOKEN \ + rollout status -w deployment/$TARGET_SPECKLE_DEPLOYMENT --timeout=1m diff --git a/packages/frontend/nginx/nginx.conf b/packages/frontend/nginx/nginx.conf index 1bab0adef0..390cd531f0 100644 --- a/packages/frontend/nginx/nginx.conf +++ b/packages/frontend/nginx/nginx.conf @@ -3,6 +3,7 @@ server { location / { root /usr/share/nginx/html; + index app.html; try_files $uri $uri/ /app.html; } From 6b10265c6af031be90930970493ea697fbae0217 Mon Sep 17 00:00:00 2001 From: cristi8 Date: Mon, 15 Mar 2021 21:50:27 +0200 Subject: [PATCH 5/7] [ci test] test for tagged builds --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0dd8f5deb2..8ea4e97532 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -23,7 +23,7 @@ workflows: only: main deploy-prod: jobs: - - docker_build_and_deploy: + - test_sep_build: context: main-builds filters: tags: From 6aa312b83b22f89c191e61bdfe4d605ab68ca77c Mon Sep 17 00:00:00 2001 From: cristi8 Date: Mon, 15 Mar 2021 22:06:23 +0200 Subject: [PATCH 6/7] [ci test] cleanup; final test before merging --- .circleci/Dockerfile | 52 -------------------------------- .circleci/ci-build-and-deploy.sh | 35 --------------------- .circleci/config.yml | 21 ++----------- 3 files changed, 2 insertions(+), 106 deletions(-) delete mode 100644 .circleci/Dockerfile delete mode 100755 .circleci/ci-build-and-deploy.sh diff --git a/.circleci/Dockerfile b/.circleci/Dockerfile deleted file mode 100644 index 217f54f6a5..0000000000 --- a/.circleci/Dockerfile +++ /dev/null @@ -1,52 +0,0 @@ -FROM node:14.16.0-buster-slim as node - -FROM node as build -# Having multiple steps in builder doesn't increase the final image size -# So having verbose steps for readability and caching should be the target - -WORKDIR /opt/viewer -COPY packages/viewer/package*.json ./ -RUN npm install -COPY packages/viewer . -RUN npm run build - -WORKDIR /opt/frontend -# Copy package defs first they are the least likely to change -# Keeping this order will least likely trigger full rebuild -COPY packages/frontend/package*.json ./ -RUN npm install ../viewer -RUN npm ci - -WORKDIR /opt -COPY packages/server/package*.json server/ -ENV NODE_ENV production -RUN npm --prefix server ci server - -# Copy remaining files across for frontend. Changes to these files -# will be more common than changes to the dependencies. This should -# speed up rebuilds. -COPY packages/frontend frontend - -WORKDIR /opt/frontend -RUN npm run build - -# --- -FROM node as runtime - -RUN apt-get update && apt-get install -y \ - tini \ - && rm -rf /var/lib/apt/lists/* - -# Copy dependencies and static files from build layer -COPY --from=build --chown=node /opt/frontend/dist /home/node/frontend/dist -COPY --from=build --chown=node /opt/server /home/node/server - -# Run the application from the non root users home directory -WORKDIR /home/node/server - -COPY packages/server /home/node/server - -ENV NODE_ENV production - -ENTRYPOINT [ "tini", "--" ] -CMD ["node", "bin/www"] diff --git a/.circleci/ci-build-and-deploy.sh b/.circleci/ci-build-and-deploy.sh deleted file mode 100755 index 1f1f99c769..0000000000 --- a/.circleci/ci-build-and-deploy.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -set -e - -TARGET_SPECKLE_DEPLOYMENT=$SPECKLE_K8S_DEPLOYMENT -IMAGE_VERSION_TAG=$CIRCLE_SHA1 - -if [[ "$CIRCLE_TAG" =~ ^v.* ]]; then - TARGET_SPECKLE_DEPLOYMENT=$SPECKLE_K8S_DEPLOYMENT_PROD - IMAGE_VERSION_TAG=$CIRCLE_TAG -fi - -docker build -t $DOCKER_IMAGE_TAG:latest . -f .circleci/Dockerfile -docker tag $DOCKER_IMAGE_TAG:latest $DOCKER_IMAGE_TAG:$IMAGE_VERSION_TAG - -echo "$DOCKER_REG_PASS" | docker login -u "$DOCKER_REG_USER" --password-stdin $DOCKER_REG_URL -docker push $DOCKER_IMAGE_TAG:latest -docker push $DOCKER_IMAGE_TAG:$IMAGE_VERSION_TAG - -echo "$K8S_CLUSTER_CERTIFICATE" | base64 --decode > k8s_cert.crt - - -./kubectl \ - --kubeconfig=/dev/null \ - --server=$K8S_SERVER \ - --certificate-authority=k8s_cert.crt \ - --token=$K8S_TOKEN \ - set image deployment/$TARGET_SPECKLE_DEPLOYMENT main=$DOCKER_IMAGE_TAG:$IMAGE_VERSION_TAG - -./kubectl \ - --kubeconfig=/dev/null \ - --server=$K8S_SERVER \ - --certificate-authority=k8s_cert.crt \ - --token=$K8S_TOKEN \ - rollout status -w deployment/$TARGET_SPECKLE_DEPLOYMENT --timeout=1m diff --git a/.circleci/config.yml b/.circleci/config.yml index 8ea4e97532..9be93f19b7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -23,7 +23,7 @@ workflows: only: main deploy-prod: jobs: - - test_sep_build: + - docker_build_and_deploy: context: main-builds filters: tags: @@ -32,7 +32,7 @@ workflows: ignore: /.*/ test-separation: jobs: - - test_sep_build: + - docker_build_and_deploy: context: main-builds filters: branches: @@ -71,23 +71,6 @@ jobs: working_directory: 'packages/server' docker_build_and_deploy: - docker: - - image: circleci/golang:1.15 - steps: - - checkout - - setup_remote_docker: - docker_layer_caching: true - - run: - name: Install kubectl - command: | - curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl - chmod u+x ./kubectl - - run: - name: Create and Deploy Docker image - no_output_timeout: 30m - command: ./.circleci/ci-build-and-deploy.sh - - test_sep_build: docker: - image: circleci/golang:1.15 steps: From 8fe624872e406f4cca924a5c9885cef5e833b1ea Mon Sep 17 00:00:00 2001 From: cristi8 Date: Mon, 15 Mar 2021 22:08:12 +0200 Subject: [PATCH 7/7] [ci test] ready for merge --- .circleci/config.yml | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9be93f19b7..49998e13a4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -10,10 +10,7 @@ workflows: version: 2.1 test: jobs: - - test_server: - filters: - branches: - ignore: cristi/fe-be-separation + - test_server deploy-latest: jobs: - docker_build_and_deploy: @@ -30,13 +27,6 @@ workflows: only: /^v.*/ branches: ignore: /.*/ - test-separation: - jobs: - - docker_build_and_deploy: - context: main-builds - filters: - branches: - only: cristi/fe-be-separation jobs: test_server: