version: 2 defaults: &defaults working_directory: ~/project docker: - image: circleci/node:latest environment: NODE_ENV: test release_branches: &release_branches branches: only: - dev - next release: &release <<: *defaults steps: - checkout - attach_workspace: at: ~/project - run: name: release command: | if [ -z "$COMMIT_MSG" ]; then COMMIT_MSG=$(git --no-pager log --pretty=full -n1 $CIRCLE_SHA1) fi if echo "$COMMIT_MSG" | grep -o "\[release\]"; then echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc echo "//registry.yarnpkg.com/:_authToken=$NPM_TOKEN" >> ~/.npmrc yarn lerna version --yes --no-git-tag-version --no-push PACKAGE_SUFFIX=edge yarn build if [ "$CIRCLE_BRANCH" = "next" ]; then tag="--tag next"; fi ./scripts/workspace-run npm publish $tag -q else echo "Release phase is skipped." fi jobs: # -------------------------------------------------------------------------- # Phase 1: Setup # -------------------------------------------------------------------------- setup: <<: *defaults steps: # Checkout repository - checkout # Restore cache - restore_cache: key: lock-{{ checksum "yarn.lock" }} # Install dependencies - run: name: Install Dependencies command: yarn --frozen-lockfile --non-interactive # Save cache - save_cache: key: lock-{{ checksum "yarn.lock" }} paths: - node_modules - packages/*/node_modules - distributions/*/node_modules # Persist workspace - persist_to_workspace: root: ~/project paths: - node_modules - packages/*/node_modules - distributions/*/node_modules - packages/*/dist # -------------------------------------------------------------------------- # Phase 2: Lint + Audit + Build Nuxt and fixtures # -------------------------------------------------------------------------- lint: <<: *defaults steps: - checkout - attach_workspace: at: ~/project - run: name: Lint command: yarn test:lint audit: <<: *defaults steps: - checkout - attach_workspace: at: ~/project - run: name: Security Audit command: yarn audit build: <<: *defaults steps: - checkout - attach_workspace: at: ~/project - run: name: Build Fixtures command: yarn test:fixtures -w=4 --coverage && yarn coverage - persist_to_workspace: root: ~/project paths: - test/fixtures lint-app: <<: *defaults steps: - checkout - attach_workspace: at: ~/project - run: name: Lint vue-app templates command: yarn lint:app # -------------------------------------------------------------------------- # Phase 3: Unit and E2E tests # -------------------------------------------------------------------------- test-unit: <<: *defaults steps: - checkout - attach_workspace: at: ~/project - run: name: Unit Tests command: yarn test:unit -w=4 --coverage && yarn coverage test-e2e: <<: *defaults docker: - image: circleci/node:latest-browsers steps: - checkout - attach_workspace: at: ~/project - run: name: E2E Tests command: yarn test:e2e && yarn coverage # -------------------------------------------------------------------------- # Phase 4: Release (dev branch only) # -------------------------------------------------------------------------- release-commit: <<: *release release-nightly: <<: *release environment: COMMIT_MSG: '[release]' # Workflow definition workflows: version: 2 # Build and test after each commit # Manually release on release branches commit: jobs: - setup - lint: { requires: [setup] } - audit: { requires: [setup] } - build: { requires: [setup] } - lint-app: { requires: [build] } - test-unit: { requires: [build] } - test-e2e: { requires: [build] } - release-commit: requires: [build, lint, lint-app, audit, test-unit, test-e2e] filters: <<: *release_branches # Release nightly builds on release branches nightly: jobs: - setup - lint: { requires: [setup] } - audit: { requires: [setup] } - build: { requires: [setup] } - lint-app: { requires: [build] } - test-unit: { requires: [build] } - test-e2e: { requires: [build] } - release-nightly: requires: [build, lint, lint-app, audit, test-unit, test-e2e] triggers: - schedule: cron: "0 0 * * *" filters: <<: *release_branches