ThinkDeepTech/thinkdeep

View on GitHub
.circleci/config.yml

Summary

Maintainability
Test Coverage
version: 2.1

orbs:
    browser-tools: circleci/browser-tools@1.2.4
    k8s: digitalocean/k8s@0.1.1
    helm: circleci/helm@1.2.0
    coveralls: coveralls/coveralls@1.0.6

commands:
    install_monorepo:
      steps:
        - restore_cache:
            key: deps1-{{ .Branch }}-{{ checksum "yarn.lock" }}
        - run:
            name: Installing monorepo
            command: yarn install
        - save_cache:
            key: deps1-{{ .Branch }}-{{ checksum "yarn.lock" }}
            paths:
              - "node_modules"

    login_docker:
      steps:
        - run:
            name: Logging into Docker
            command: echo "$DOCKER_PASSWORD" | docker login --username $DOCKER_USERNAME --password-stdin

    test_monorepo:
      steps:
        - run:
            name: Testing monorepo
            command: yarn run tests

    build_ui_command:
      steps:
        - run:
            name: Building monorepo
            command: yarn run build

    deploy_ui_command:
      steps:
        - run: curl -sL https://firebase.tools | bash
        - run: firebase --token $FIREBASE_TOKEN deploy

    patch_firefox:
      steps:
        - run:
              name: Update repositories
              command: sudo apt-get update
        - run:
            name: Install firefox dependency (take this out when browser-tools orb is fixed)
            command: sudo apt-get install -y libasound-dev

jobs:

    build_microservice_analysis:
      docker:
        - image: 'cimg/node:16.14.2'

      working_directory: ~/project

      steps:
        - checkout
        - setup_remote_docker:
            version: 20.10.7
            docker_layer_caching: true
        - login_docker
        - restore_cache:
            key: ms-analysis1-{{ .Branch }}-{{ checksum "./packages/deep-microservice-analysis/package.json" }}
        - run:
            name: Installing package
            command: yarn install
            working_directory: ./packages/deep-microservice-analysis
        - save_cache:
            key: ms-analysis1-{{ .Branch }}-{{ checksum "./packages/deep-microservice-analysis/package.json" }}
            paths:
              - "./packages/deep-microservice-analysis/node_modules"
        - run:
            command: docker build -t thinkdeeptech/deep-microservice-analysis:${CIRCLE_BUILD_NUM} -t thinkdeeptech/deep-microservice-analysis:latest --build-arg PORT=$MICROSERVICE_ANALYSIS_PORT .
            working_directory: ./packages/deep-microservice-analysis
        - run: docker push thinkdeeptech/deep-microservice-analysis:${CIRCLE_BUILD_NUM}
        - run: docker push thinkdeeptech/deep-microservice-analysis:latest

    build_microservice_analysis_dev:
      docker:
        - image: 'cimg/node:16.14.2'

      working_directory: ~/project

      steps:
        - checkout
        - setup_remote_docker:
            version: 20.10.7
            docker_layer_caching: true
        - login_docker
        - restore_cache:
            key: ms-analysis1-{{ .Branch }}-{{ checksum "./packages/deep-microservice-analysis/package.json" }}
        - run:
            name: Installing package
            command: yarn install
            working_directory: ./packages/deep-microservice-analysis
        - save_cache:
            key: ms-analysis1-{{ .Branch }}-{{ checksum "./packages/deep-microservice-analysis/package.json" }}
            paths:
              - "./packages/deep-microservice-analysis/node_modules"
        - run:
            command: docker build -t thinkdeeptech/deep-microservice-analysis-dev:${CIRCLE_BUILD_NUM} -t thinkdeeptech/deep-microservice-analysis-dev:latest --build-arg PORT=$MICROSERVICE_ANALYSIS_PORT .
            working_directory: ./packages/deep-microservice-analysis
        - run: docker push thinkdeeptech/deep-microservice-analysis-dev:${CIRCLE_BUILD_NUM}
        - run: docker push thinkdeeptech/deep-microservice-analysis-dev:latest

    build_microservice_collection:
      docker:
        - image: 'cimg/node:16.14.2'

      working_directory: ~/project

      steps:
        - checkout
        - setup_remote_docker:
            version: 20.10.7
            docker_layer_caching: true
        - login_docker
        - restore_cache:
            key: ms-collection1-{{ .Branch }}-{{ checksum "./packages/deep-microservice-collection/package.json" }}
        - run:
            name: Installing package
            command: yarn install
            working_directory: ./packages/deep-microservice-collection
        - save_cache:
            key: ms-collection1-{{ .Branch }}-{{ checksum "./packages/deep-microservice-collection/package.json" }}
            paths:
              - "./packages/deep-microservice-collection/node_modules"
        - run:
            command: docker build -t thinkdeeptech/deep-microservice-collection:${CIRCLE_BUILD_NUM} -t thinkdeeptech/deep-microservice-collection:latest --build-arg PORT=$MICROSERVICE_COLLECTION_PORT .
            working_directory: ./packages/deep-microservice-collection
        - run: docker push thinkdeeptech/deep-microservice-collection:${CIRCLE_BUILD_NUM}
        - run: docker push thinkdeeptech/deep-microservice-collection:latest


    build_microservice_collection_dev:
      docker:
        - image: 'cimg/node:16.14.2'

      working_directory: ~/project

      steps:
        - checkout
        - setup_remote_docker:
            version: 20.10.7
            docker_layer_caching: true
        - login_docker
        - restore_cache:
            key: ms-collection1-{{ .Branch }}-{{ checksum "./packages/deep-microservice-collection/package.json" }}
        - run:
            name: Installing package
            command: yarn install
            working_directory: ./packages/deep-microservice-collection
        - save_cache:
            key: ms-collection1-{{ .Branch }}-{{ checksum "./packages/deep-microservice-collection/package.json" }}
            paths:
              - "./packages/deep-microservice-collection/node_modules"
        - run:
            command: docker build -t thinkdeeptech/deep-microservice-collection-dev:${CIRCLE_BUILD_NUM} -t thinkdeeptech/deep-microservice-collection-dev:latest --build-arg PORT=$MICROSERVICE_COLLECTION_PORT .
            working_directory: ./packages/deep-microservice-collection
        - run: docker push thinkdeeptech/deep-microservice-collection-dev:${CIRCLE_BUILD_NUM}
        - run: docker push thinkdeeptech/deep-microservice-collection-dev:latest

    build_microservice_configuration:
      docker:
        - image: 'cimg/node:16.14.2'

      working_directory: ~/project

      steps:
        - checkout
        - setup_remote_docker:
            version: 20.10.7
            docker_layer_caching: true
        - login_docker
        - restore_cache:
            key: ms-config1-{{ .Branch }}-{{ checksum "./packages/deep-microservice-configuration/package.json" }}
        - run:
            name: Installing package
            command: yarn install
            working_directory: ./packages/deep-microservice-configuration
        - save_cache:
            key: ms-config1-{{ .Branch }}-{{ checksum "./packages/deep-microservice-configuration/package.json" }}
            paths:
              - "./packages/deep-microservice-configuration/node_modules"
        - run:
            command: docker build -t thinkdeeptech/deep-microservice-configuration:${CIRCLE_BUILD_NUM} -t thinkdeeptech/deep-microservice-configuration:latest --build-arg PORT=$MICROSERVICE_CONFIGURATION_PORT .
            working_directory: ./packages/deep-microservice-configuration
        - run: docker push thinkdeeptech/deep-microservice-configuration:${CIRCLE_BUILD_NUM}
        - run: docker push thinkdeeptech/deep-microservice-configuration:latest

    build_microservice_configuration_dev:
      docker:
        - image: 'cimg/node:16.14.2'

      working_directory: ~/project

      steps:
        - checkout
        - setup_remote_docker:
            version: 20.10.7
            docker_layer_caching: true
        - login_docker
        - restore_cache:
            key: ms-config1-{{ .Branch }}-{{ checksum "./packages/deep-microservice-configuration/package.json" }}
        - run:
            name: Installing package
            command: yarn install
            working_directory: ./packages/deep-microservice-configuration
        - save_cache:
            key: ms-config1-{{ .Branch }}-{{ checksum "./packages/deep-microservice-configuration/package.json" }}
            paths:
              - "./packages/deep-microservice-configuration/node_modules"
        - run:
            command: docker build -t thinkdeeptech/deep-microservice-configuration-dev:${CIRCLE_BUILD_NUM} -t thinkdeeptech/deep-microservice-configuration-dev:latest --build-arg PORT=$MICROSERVICE_CONFIGURATION_PORT .
            working_directory: ./packages/deep-microservice-configuration
        - run: docker push thinkdeeptech/deep-microservice-configuration-dev:${CIRCLE_BUILD_NUM}
        - run: docker push thinkdeeptech/deep-microservice-configuration-dev:latest


    build_microservice_gateway:
      docker:
        - image: 'cimg/node:16.14.2'

      working_directory: ~/project

      steps:
        - checkout
        - setup_remote_docker:
            version: 20.10.7
            docker_layer_caching: true
        - login_docker
        - run:
            command: docker build -t thinkdeeptech/deep-microservice-gateway:${CIRCLE_BUILD_NUM} -t thinkdeeptech/deep-microservice-gateway:latest --build-arg PORT=$MICROSERVICE_GATEWAY_PORT .
            working_directory: ./packages/deep-microservice-gateway
        - run: docker push thinkdeeptech/deep-microservice-gateway:${CIRCLE_BUILD_NUM}
        - run: docker push thinkdeeptech/deep-microservice-gateway:latest

    build_microservice_gateway_dev:
      docker:
        - image: 'cimg/node:16.14.2'

      working_directory: ~/project

      steps:
        - checkout
        - setup_remote_docker:
            version: 20.10.7
            docker_layer_caching: true
        - login_docker
        - run:
            command: docker build -t thinkdeeptech/deep-microservice-gateway-dev:${CIRCLE_BUILD_NUM} -t thinkdeeptech/deep-microservice-gateway-dev:latest --build-arg PORT=$MICROSERVICE_GATEWAY_PORT .
            working_directory: ./packages/deep-microservice-gateway
        - run: docker push thinkdeeptech/deep-microservice-gateway-dev:${CIRCLE_BUILD_NUM}
        - run: docker push thinkdeeptech/deep-microservice-gateway-dev:latest


    build_microservice_subscription:
      docker:
        - image: 'cimg/node:16.14.2'

      working_directory: ~/project
      resource_class: large

      steps:
        - checkout
        - setup_remote_docker:
            version: 20.10.7
            docker_layer_caching: true
        - login_docker
        - run:
            command: yarn install
            working_directory: ./packages/deep-microservice-subscription
        - run:
            command: docker build -t thinkdeeptech/deep-microservice-subscription:${CIRCLE_BUILD_NUM} -t thinkdeeptech/deep-microservice-subscription:latest --build-arg PORT=$MICROSERVICE_SUBSCRIPTION_PORT .
            working_directory: ./packages/deep-microservice-subscription
        - run: docker push thinkdeeptech/deep-microservice-subscription:${CIRCLE_BUILD_NUM}
        - run: docker push thinkdeeptech/deep-microservice-subscription:latest

    build_microservice_subscription_dev:
      docker:
        - image: 'cimg/node:16.14.2'

      working_directory: ~/project
      resource_class: large

      steps:
        - checkout
        - setup_remote_docker:
            version: 20.10.7
            docker_layer_caching: true
        - login_docker
        - run:
            command: yarn install
            working_directory: ./packages/deep-microservice-subscription
        - run:
            command: docker build -t thinkdeeptech/deep-microservice-subscription-dev:${CIRCLE_BUILD_NUM} -t thinkdeeptech/deep-microservice-subscription-dev:latest --build-arg PORT=$MICROSERVICE_SUBSCRIPTION_PORT .
            working_directory: ./packages/deep-microservice-subscription
        - run: docker push thinkdeeptech/deep-microservice-subscription-dev:${CIRCLE_BUILD_NUM}
        - run: docker push thinkdeeptech/deep-microservice-subscription-dev:latest


    build_data_collector:
      docker:
        - image: 'cimg/node:16.14.2'

      working_directory: ~/project

      steps:
        - checkout
        - setup_remote_docker:
            version: 20.10.7
            docker_layer_caching: true
        - login_docker
        - restore_cache:
            key: ms-datacollector-{{ .Branch }}-{{ checksum "./packages/data-collector/package.json" }}
        - run:
            name: Installing package
            command: yarn install
            working_directory: ./packages/data-collector
        - save_cache:
            key: ms-datacollector-{{ .Branch }}-{{ checksum "./packages/data-collector/package.json" }}
            paths:
              - "./packages/data-collector/node_modules"
        - run:
            command: docker build -t thinkdeeptech/data-collector:${CIRCLE_BUILD_NUM} -t thinkdeeptech/data-collector:latest .
            working_directory: ./packages/data-collector
        - run: docker push thinkdeeptech/data-collector:${CIRCLE_BUILD_NUM}
        - run: docker push thinkdeeptech/data-collector:latest

    build_data_collector_dev:
      docker:
        - image: 'cimg/node:16.14.2'

      working_directory: ~/project

      steps:
        - checkout
        - setup_remote_docker:
            version: 20.10.7
            docker_layer_caching: true
        - login_docker
        - restore_cache:
            key: ms-datacollector-{{ .Branch }}-{{ checksum "./packages/data-collector/package.json" }}
        - run:
            name: Installing package
            command: yarn install
            working_directory: ./packages/data-collector
        - save_cache:
            key: ms-datacollector-{{ .Branch }}-{{ checksum "./packages/data-collector/package.json" }}
            paths:
              - "./packages/data-collector/node_modules"
        - run:
            command: docker build -t thinkdeeptech/data-collector-dev:${CIRCLE_BUILD_NUM} -t thinkdeeptech/data-collector-dev:latest .
            working_directory: ./packages/data-collector
        - run: docker push thinkdeeptech/data-collector-dev:${CIRCLE_BUILD_NUM}
        - run: docker push thinkdeeptech/data-collector-dev:latest

    build_ui_and_test_system:
      docker:
          - image: 'cimg/node:16.14.2'

      working_directory: ~/project

      steps:
          - patch_firefox
          - browser-tools/install-browser-tools
          - checkout
          - install_monorepo
          - test_monorepo
          - build_ui_command

    deploy_microservices:
      docker:
        - image: 'cimg/base:stable'

      working_directory: ~/project

      steps:
        - checkout
        - k8s/install
        - k8s/initialize:
            cluster: predecos-k8s-cluster-1
        - helm/install-helm-client:
            version: v3.7.2
        - run:
            name: Download analysis microservice project dependencies
            command: helm dependency update
            working_directory: ./packages/deep-microservice-analysis
        - run:
            name: Download collection microservice project dependencies
            command: helm dependency update
            working_directory: ./packages/deep-microservice-collection
        - run:
            name: Download configuration microservice project dependencies
            command: helm dependency update
            working_directory: ./packages/deep-microservice-configuration
        - run:
            name: Download gateway microservice project dependencies
            command: helm dependency update
            working_directory: ./packages/deep-microservice-gateway
        - run:
            name: Download subscription microservice project dependencies
            command: helm dependency update
            working_directory: ./packages/deep-microservice-subscription
        - run:
            name: Download project dependencies
            command: helm dependency update
        - helm/upgrade-helm-chart:
            chart: "."
            helm-version: "v3.7.2"
            namespace: "production"
            release-name: "v1"
            atomic: true
            values-to-override: "gateway.service.certificateId=$PROD_MICROSERVICE_GATEWAY_CERTIFICATE_ID,subscription.service.certificateId=$PROD_MICROSERVICE_SUBSCRIPTION_CERTIFICATE_ID,auth.audience=$PREDECOS_AUTH_AUDIENCE,auth.jwksUri=$PREDECOS_AUTH_JWKS_URI,auth.issuer=$PREDECOS_AUTH_ISSUER,analysis.neo4j.neo4j.username=$PROD_MICROSERVICE_ANALYSIS_NEO4J_USERNAME,analysis.neo4j.neo4j.password=$PROD_MICROSERVICE_ANALYSIS_NEO4J_PASSWORD,analysis.neo4j.services.neo4j.enabled=true,analysis.neo4j.services.neo4j.annotations.service\\.beta\\.kubernetes\\.io/do-loadbalancer-certificate-id=$PROD_ANALYSIS_NEO4J_LOADBALANCER_CERTIFICATE_ID,analysis.neo4j.config.dbms\\.default_database=$PROD_MICROSERVICE_ANALYSIS_NEO4J_DATABASE,analysis.neo4j.config.dbms\\.default_advertised_address=$PROD_MICROSERVICE_ANALYSIS_NEO4J_ADVERTISED_ADDRESS,collection.replicas=3,collection.twitter.bearer=$PROD_PREDECOS_TWITTER_BEARER,collection.data.collector.image=thinkdeeptech/data-collector:latest,replicas=1,global.docker.secretName=docker-secret,global.nodeEnv=production"
            update-repositories: true
            timeout: "960s"
            wait: true


    deploy_microservices_dev:
      docker:
        - image: 'cimg/base:stable'

      working_directory: ~/project

      steps:
        - checkout
        - k8s/install
        - k8s/initialize:
            cluster: predecos-k8s-cluster-1
        - helm/install-helm-client:
            version: v3.7.2
        - run:
            name: Download analysis microservice project dependencies
            command: helm dependency update
            working_directory: ./packages/deep-microservice-analysis
        - run:
            name: Download collection microservice project dependencies
            command: helm dependency update
            working_directory: ./packages/deep-microservice-collection
        - run:
            name: Download configuration microservice project dependencies
            command: helm dependency update
            working_directory: ./packages/deep-microservice-configuration
        - run:
            name: Download gateway microservice project dependencies
            command: helm dependency update
            working_directory: ./packages/deep-microservice-gateway
        - run:
            name: Download subscription microservice project dependencies
            command: helm dependency update
            working_directory: ./packages/deep-microservice-subscription
        - run:
            name: Download project dependencies
            command: helm dependency update
        - helm/upgrade-helm-chart:
            chart: "."
            helm-version: "v3.7.2"
            namespace: "development"
            release-name: "v1"
            atomic: true
            values-to-override: "gateway.service.certificateId=$DEV_MICROSERVICE_GATEWAY_CERTIFICATE_ID,subscription.service.certificateId=$DEV_MICROSERVICE_SUBSCRIPTION_CERTIFICATE_ID,auth.audience=$PREDECOS_TEST_AUTH_AUDIENCE,auth.jwksUri=$PREDECOS_TEST_AUTH_JWKS_URI,auth.issuer=$PREDECOS_TEST_AUTH_ISSUER,collection.twitter.bearer=$DEV_PREDECOS_TWITTER_BEARER,replicas=1,global.docker.secretName=docker-secret,analysis.container.image=thinkdeeptech/deep-microservice-analysis-dev:latest,analysis.neo4j.neo4j.username=$DEV_MICROSERVICE_ANALYSIS_NEO4J_USERNAME,analysis.neo4j.neo4j.password=$DEV_MICROSERVICE_ANALYSIS_NEO4J_PASSWORD,analysis.neo4j.services.neo4j.enabled=true,analysis.neo4j.services.neo4j.annotations.service\\.beta\\.kubernetes\\.io/do-loadbalancer-certificate-id=$DEV_ANALYSIS_NEO4J_LOADBALANCER_CERTIFICATE_ID,analysis.neo4j.config.dbms\\.default_database=$DEV_MICROSERVICE_ANALYSIS_NEO4J_DATABASE,analysis.neo4j.config.dbms\\.default_advertised_address=$DEV_MICROSERVICE_ANALYSIS_NEO4J_ADVERTISED_ADDRESS,collection.replicas=3,collection.container.image=thinkdeeptech/deep-microservice-collection-dev:latest,collection.data.collector.image=thinkdeeptech/data-collector-dev:latest,configuration.container.image=thinkdeeptech/deep-microservice-configuration-dev:latest,gateway.container.image=thinkdeeptech/deep-microservice-gateway-dev:latest,subscription.container.image=thinkdeeptech/deep-microservice-subscription-dev:latest,global.nodeEnv=development"
            update-repositories: true
            timeout: "960s"
            wait: true

    deploy_ui_and_publish_coverage:
      docker:
          - image: 'cimg/node:16.14.2'

      working_directory: ~/project

      steps:
          - patch_firefox
          - browser-tools/install-browser-tools
          - checkout
          - install_monorepo
          - build_ui_command
          - run:
              name: Publishing test coverage results
              command: yarn run tests:coverage:publish
          - deploy_ui_command


workflows:

  version: 2

  build_and_deploy_if_master:

    jobs:

      - build_microservice_analysis_dev:
          filters:
            branches:
              ignore: master

      - build_microservice_collection_dev:
          filters:
            branches:
              ignore: master

      - build_data_collector_dev:
          filters:
            branches:
              ignore: master

      - build_microservice_configuration_dev:
          filters:
            branches:
              ignore: master

      - build_microservice_gateway_dev:
          filters:
            branches:
              ignore: master

      - build_microservice_subscription_dev:
          filters:
            branches:
              ignore: master

      - deploy_microservices_dev:
          filters:
            branches:
              ignore: master
          requires:
            - build_microservice_analysis_dev
            - build_microservice_collection_dev
            - build_data_collector_dev
            - build_microservice_configuration_dev
            - build_microservice_gateway_dev
            - build_microservice_subscription_dev

      - build_ui_and_test_system:
          requires:
            - deploy_microservices_dev

      - build_microservice_collection:
          filters:
            branches:
              only: master

      - build_data_collector:
          filters:
            branches:
              only: master

      - build_microservice_analysis:
          filters:
            branches:
              only: master

      - build_microservice_configuration:
          filters:
            branches:
              only: master

      - build_microservice_gateway:
          filters:
            branches:
              only: master

      - build_microservice_subscription:
          filters:
            branches:
              only: master

      - deploy_microservices:
          requires:
            - build_microservice_analysis
            - build_microservice_collection
            - build_data_collector
            - build_microservice_configuration
            - build_microservice_gateway
            - build_microservice_subscription
          filters:
            branches:
              only: master

      - deploy_ui_and_publish_coverage:
          requires:
            - deploy_microservices
          filters:
            branches:
              only: master