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"]