version: 2.1 ### ABOUT # # This configuration powers our Circleci.io integration # # Note: # Netlify works independently from this configuration to # create pull request previews and to update `https://docs.ohif.org` ### ## https://github.com/cypress-io/circleci-orb ## orbs: codecov: codecov/codecov@1.0.5 cypress: cypress-io/cypress@1.26.0 executors: # Custom executor to override Cypress config deploy-to-prod-executor: docker: - image: cimg/node:16.14 environment: CYPRESS_BASE_URL: https://ohif-staging.netlify.com/ chrome-and-pacs: docker: # Primary container image where all steps run. - image: 'cypress/browsers:node16.14.2-slim-chrome103-ff102' defaults: &defaults docker: - image: cimg/node:16.14-browsers environment: TERM: xterm # Enable colors in term QUICK_BUILD: true working_directory: ~/repo jobs: ### # Workflow: PR_CHECKS ### UNIT_TESTS: <<: *defaults steps: # Update yarn - run: yarn -v # Checkout code and ALL Git Tags - checkout - restore_cache: name: Restore Yarn and Cypress Package Cache keys: # when lock file changes, use increasingly general patterns to restore cache - yarn-packages-{{ checksum "yarn.lock" }} - yarn-packages- - run: name: Install Dependencies command: yarn install --frozen-lockfile - save_cache: name: Save Yarn Package Cache paths: - ~/.cache ## Cache yarn and Cypress key: yarn-packages-{{ checksum "yarn.lock" }} # RUN TESTS - run: name: 'JavaScript Test Suite' command: yarn run test:unit:ci # platform/app - run: name: 'VIEWER: Combine report output' command: | viewerCov="/home/circleci/repo/platform/app/coverage" touch "${viewerCov}/reports" cat "${viewerCov}/clover.xml" >> "${viewerCov}/reports" echo "\<<\<<\<< EOF" >> "${viewerCov}/reports" cat "${viewerCov}/lcov.info" >>"${viewerCov}/reports" echo "\<<\<<\<< EOF" >> "${viewerCov}/reports" - codecov/upload: file: '/home/circleci/repo/platform/app/coverage/reports' flags: 'viewer' # PLATFORM/CORE - run: name: 'CORE: Combine report output' command: | coreCov="/home/circleci/repo/platform/core/coverage" touch "${coreCov}/reports" cat "${coreCov}/clover.xml" >> "${coreCov}/reports" echo "\<<\<<\<< EOF" >> "${coreCov}/reports" cat "${coreCov}/lcov.info" >> "${coreCov}/reports" echo "\<<\<<\<< EOF" >> "${coreCov}/reports" - codecov/upload: file: '/home/circleci/repo/platform/core/coverage/reports' flags: 'core' ### # Workflow: PR_OPTIONAL_DOCKER_PUBLISH ### DOCKER_PR_PUBLISH: <<: *defaults steps: # Enable yarn workspaces - run: yarn config set workspaces-experimental true # Checkout code and ALL Git Tags - checkout - restore_cache: name: Restore Yarn and Cypress Package Cache keys: # when lock file changes, use increasingly general patterns to restore cache - yarn-packages-{{ checksum "yarn.lock" }} - yarn-packages- - run: name: Install Dependencies command: yarn install --frozen-lockfile - setup_remote_docker: docker_layer_caching: false - run: name: Build and push Docker image command: | # Remove npm config rm -f ./.npmrc # Set our version number using vars echo $CIRCLE_BUILD_NUM # Build our image, auth, and push docker build --tag ohif/app:PR_BUILD-$CIRCLE_BUILD_NUM . echo $DOCKER_PWD | docker login -u $DOCKER_LOGIN --password-stdin docker push ohif/app:PR_BUILD-$CIRCLE_BUILD_NUM ### # Workflow: DEPLOY ### BUILD: <<: *defaults steps: # Checkout code and ALL Git Tags - checkout - restore_cache: name: Restore Yarn and Cypress Package Cache keys: # when lock file changes, use increasingly general patterns to restore cache - yarn-packages-{{ checksum "yarn.lock" }} - yarn-packages- - run: name: Install Dependencies command: yarn install --frozen-lockfile - save_cache: name: Save Yarn Package Cache paths: - ~/.cache ## Cache yarn and Cypress key: yarn-packages-{{ checksum "yarn.lock" }} # Build & Test - run: name: 'Perform the versioning before build' command: node ./version.mjs - run: name: 'Build the OHIF Viewer' command: yarn run build no_output_timeout: 45m - run: name: 'Upload SourceMaps, Send Deploy Notification' command: | # export FILE_1=$(find ./build/static/js -type f -name "2.*.js" -exec basename {} \;) # export FILE_MAIN=$(find ./build/static/js -type f -name "main.*.js" -exec basename {} \;) # export FILE_RUNTIME_MAIN=$(find ./build/static/js -type f -name "runtime~main.*.js" -exec basename {} \;) # curl https://api.rollbar.com/api/1/sourcemap -F source_map=@build/static/js/$FILE_1.map -F access_token=$ROLLBAR_TOKEN -F version=$CIRCLE_SHA1 -F minified_url=https://$GOOGLE_STORAGE_BUCKET/static/js/$FILE_1 # curl https://api.rollbar.com/api/1/sourcemap -F source_map=@build/static/js/$FILE_MAIN.map -F access_token=$ROLLBAR_TOKEN -F version=$CIRCLE_SHA1 -F minified_url=https://$GOOGLE_STORAGE_BUCKET/static/js/$FILE_MAIN # curl https://api.rollbar.com/api/1/sourcemap -F source_map=@build/static/js/$FILE_RUNTIME_MAIN.map -F access_token=$ROLLBAR_TOKEN -F version=$CIRCLE_SHA1 -F minified_url=https://$GOOGLE_STORAGE_BUCKET/static/js/$FILE_RUNTIME_MAIN curl --request POST https://api.rollbar.com/api/1/deploy/ -F access_token=$ROLLBAR_TOKEN -F environment=$GOOGLE_STORAGE_BUCKET -F revision=$CIRCLE_SHA1 -F local_username=CircleCI # Persist :+1: - persist_to_workspace: root: ~/repo paths: - platform/app/dist - Dockerfile - version.txt - commit.txt - version.json # DEPLOY_TO_DEV: # docker: # - image: circleci/node:16.14.0 # environment: # TERM: xterm # NETLIFY_SITE_ID: 32708787-c9b0-4634-b50f-7ca41952da77 # working_directory: ~/repo # steps: # - attach_workspace: # at: ~/repo # - run: cd .netlify && npm install # - run: cp .netlify/deploy-workflow/_redirects platform/app/dist/_redirects # - run: cd .netlify && npm run deploy # DEPLOY_TO_STAGING: # docker: # - image: circleci/node:16.14.0 # environment: # TERM: xterm # NETLIFY_SITE_ID: c7502ae3-b150-493c-8422-05701e44a969 # working_directory: ~/repo # steps: # - attach_workspace: # at: ~/repo # - run: cd .netlify && npm install # - run: cp .netlify/deploy-workflow/_redirects platform/app/dist/_redirects # - run: cd .netlify && npm run deploy # DEPLOY_TO_PRODUCTION: # docker: # - image: circleci/node:16.14.0 # environment: # TERM: xterm # NETLIFY_SITE_ID: 79c4a5da-5c95-4dc9-84f7-45fd9dfe21b0 # working_directory: ~/repo # steps: # - attach_workspace: # at: ~/repo # - run: cd .netlify && npm install # - run: cp .netlify/deploy-workflow/_redirects platform/app/dist/_redirects # - run: cd .netlify && npm run deploy # DEPLOY_TO_RELEASE_DEV: # docker: # - image: circleci/node:16.14.0 # environment: # TERM: xterm # NETLIFY_SITE_ID: 3270878-22 # working_directory: ~/repo # steps: # - attach_workspace: # at: ~/repo # - run: cd .netlify && npm install # - run: # cp .netlify/deploy-workflow/_redirects platform/app/dist/_redirects # - run: cd .netlify && npm run deploy ### # Workflow: RELEASE ### NPM_PUBLISH: <<: *defaults steps: - run: yarn -v # Checkout code and ALL Git Tags - checkout - attach_workspace: at: ~/repo # Use increasingly general patterns to restore cache - restore_cache: name: Restore Yarn and Cypress Package Cache keys: - yarn-packages-{{ checksum "yarn.lock" }} - yarn-packages- - run: name: Install Dependencies command: yarn install --frozen-lockfile - save_cache: name: Save Yarn Package Cache paths: - ~/.cache/yarn key: yarn-packages-{{ checksum "yarn.lock" }} - run: name: Avoid hosts unknown for github command: | rm -rf ~/.ssh mkdir ~/.ssh/ echo -e "Host github.com\n\tStrictHostKeyChecking no\n" > ~/.ssh/config git config --global user.email "danny.ri.brown+ohif-bot@gmail.com" git config --global user.name "ohif-bot" - run: name: Authenticate with NPM registry command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/repo/.npmrc - run: name: Increase the event emitter limit command: | node ./increaseEventEmitterLimit.mjs - run: name: build half of the packages (to avoid out of memory in circleci) command: | yarn run build:package-all - run: name: build the other half of the packages command: | yarn run build:package-all-1 - run: name: publish package versions command: | node ./publish-version.mjs - run: name: Again set the NPM registry (was deleted in the version script) command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/repo/.npmrc - run: name: publish package dist command: | node ./publish-package.mjs - persist_to_workspace: root: ~/repo paths: - . DOCKER_RELEASE_PUBLISH: <<: *defaults steps: - attach_workspace: at: ~/repo - setup_remote_docker: docker_layer_caching: false - run: name: Build and push Docker image from the release branch command: | # This file will exist if a new version was published by # our command in the previous job. if [[ ! -e version.txt ]]; then exit 0 else # Remove npm config rm -f ./.npmrc # Set our version number using vars export IMAGE_VERSION=$(cat version.txt) export IMAGE_VERSION_FULL=v$IMAGE_VERSION echo $IMAGE_VERSION echo $IMAGE_VERSION_FULL # Build our image, auth, and push docker build --tag ohif/app:$IMAGE_VERSION_FULL --tag ohif/app:latest . echo $DOCKER_PWD | docker login -u $DOCKER_LOGIN --password-stdin docker push ohif/app:$IMAGE_VERSION_FULL docker push ohif/app:latest fi DOCKER_BETA_PUBLISH: <<: *defaults steps: - attach_workspace: at: ~/repo - setup_remote_docker: docker_layer_caching: false - run: name: Build and push Docker image from the master branch (beta releases) command: | echo $(ls -l) # This file will exist if a new version was published by # our command in the previous job. if [[ ! -e version.txt ]]; then echo "don't have version txt" exit 0 else echo "Building and pushing Docker image from the master branch (beta releases)" rm -f ./.npmrc # Set our version number using vars export IMAGE_VERSION=$(cat version.txt) export IMAGE_VERSION_FULL=v$IMAGE_VERSION echo $IMAGE_VERSION echo $IMAGE_VERSION_FULL # Build our image, auth, and push echo "starting docker build" docker build --tag ohif/app:$IMAGE_VERSION_FULL . echo $DOCKER_PWD | docker login -u $DOCKER_LOGIN --password-stdin echo "starting docker push" docker push ohif/app:$IMAGE_VERSION_FULL fi workflows: version: 2 PR_CHECKS: jobs: - UNIT_TESTS # E2E: PWA - cypress/run: name: 'E2E: PWA' executor: chrome-and-pacs browser: chrome pre-steps: - run: | # Clear yarn cache; use yarn from image (update image to update yarn) rm -rf ~/.yarn yarn -v yarn: true record: true store_artifacts: true working_directory: platform/app build: yarn test:data start: yarn run test:e2e:serve spec: 'cypress/integration/**/*' wait-on: 'http://localhost:3000' cache-key: 'yarn-packages-{{ checksum "yarn.lock" }}' no-workspace: true # Don't persist workspace post-steps: - store_artifacts: path: platform/app/cypress/screenshots - store_artifacts: path: platform/app/cypress/videos - store_test_results: path: platform/app/cypress/results requires: - UNIT_TESTS PR_OPTIONAL_VISUAL_TESTS: jobs: - AWAIT_APPROVAL: type: approval # Update hub.docker.org - cypress/run: name: 'Generate Percy Snapshots' executor: cypress/browsers-chrome76 browser: chrome pre-steps: - run: 'rm -rf ~/.yarn && yarn -v && yarn global add wait-on' yarn: true store_artifacts: false working_directory: platform/app build: yarn test:data && npx cross-env QUICK_BUILD=true APP_CONFIG=config/dicomweb-server.js yarn run build # start server --> verify running --> percy + chrome + cypress command: yarn run test:e2e:dist cache-key: 'yarn-packages-{{ checksum "yarn.lock" }}' no-workspace: true # Don't persist workspace post-steps: - store_artifacts: path: platform/app/cypress/screenshots - store_artifacts: path: platform/app/cypress/videos requires: - AWAIT_APPROVAL # Our master branch deploys to viewer-dev.ohif.org, the viewer.ohif.org is # deployed from the release branch which is more stable and less frequently updated. DEPLOY_MASTER: jobs: - BUILD: filters: branches: only: master - NPM_PUBLISH: requires: - BUILD - DOCKER_BETA_PUBLISH: requires: - NPM_PUBLISH # Our release branch deploys to viewer.ohif.org and is more stable and less # frequently updated after being tested in the staging environment. DEPLOY_RELEASE: jobs: - BUILD: filters: branches: only: release - NPM_PUBLISH: requires: - BUILD - DOCKER_RELEASE_PUBLISH: requires: - NPM_PUBLISH ### # Unit and E2E tests have already run for PR_CHECKS # Re-running should not gain us any confidence here ### # RELEASE: # jobs: # - NPM_PUBLISH: # filters: # branches: # only: master # - DOCS_PUBLISH: # filters: # branches: # only: master # # Update base branch snapshots # # and record a Cypress dashboard test run # - cypress/run: # name: 'Generate Percy Snapshots' # executor: cypress/browsers-chrome76 # browser: chrome # pre-steps: # - run: 'rm -rf ~/.yarn && npm i -g yarn && yarn -v && yarn global # add wait-on' # Use yarn latest # yarn: true # store_artifacts: false # working_directory: platform/app # build: # npx cross-env QUICK_BUILD=true APP_CONFIG=config/e2e.js yarn run # build # # start server --> verify running --> percy + chrome + cypress # command: yarn run test:e2e:dist # cache-key: 'yarn-packages-{{ checksum "yarn.lock" }}' # no-workspace: true # Don't persist workspace # post-steps: # - store_artifacts: # path: platform/app/cypress/screenshots # - store_artifacts: # path: platform/app/cypress/videos # - store_test_results: # path: platform/app/cypress/results # filters: # branches: # only: master # - DOCKER_MASTER_PUBLISH: # requires: # - NPM_PUBLISH