DEV Community

M. Glenn
M. Glenn

Posted on

https://github.com/BuckosBits/dev.to.t.anonymous.io

version: 2.1

}

  - &docker
    - image: circleci/openjdk:8-jdk-node-browsers

  - &environment
    TZ: /usr/share/zoneinfo/America/Los_Angeles

  - &restore_yarn_cache
    restore_cache:
      name: Restore yarn cache
      key: v2-node-{{ arch }}-{{ checksum "yarn.lock" }}-yarn

  - &restore_node_modules
    restore_cache:
      name: Restore node_modules cache
      keys:
        - v2-node-{{ arch }}-{{ .Branch }}-{{ checksum "yarn.lock" }}-{{ checksum "workspace_info.txt" }}-node-modules

  - &TEST_PARALLELISM 20

  - &attach_workspace
    at: build

# The CircleCI API doesn't yet support triggering a specific workflow, but it
# does support triggering a pipeline. So as a workaround you can triggger the
# entire pipeline and use parameters to disable everything except the workflow
# you want. CircleCI recommends this workaround here:
# https://support.circleci.com/hc/en-us/articles/360050351292-How-to-trigger-a-workflow-via-CircleCI-API-v2-
parameters:
  # This is only set when triggering the CI pipeline via an API request.
  prerelease_commit_sha:
    type: string
    default: ''

jobs:
  setup:
    docker: *docker
    environment: *environment
    steps:
      - checkout
      - run:
          name: Nodejs Version
          command: node --version
      - *restore_yarn_cache
      - run:
          name: Install Packages
          command: yarn --frozen-lockfile --cache-folder ~/.cache/yarn
      - run: yarn workspaces info | head -n -1 > workspace_info.txt
      - save_cache:
          # Store the yarn cache globally for all lock files with this same
          # checksum. This will speed up the setup job for all PRs where the
          # lockfile is the same.
          name: Save yarn cache for future installs
          key: v2-node-{{ arch }}-{{ checksum "yarn.lock" }}-yarn
          paths:
            - ~/.cache/yarn
      - save_cache:
          # Store node_modules for all jobs in this workflow so that they don't
          # need to each run a yarn install for each job. This will speed up
          # all jobs run on this branch with the same lockfile.
          name: Save node_modules cache
          # This cache key is per branch, a yarn install in setup is required.
          key: v2-node-{{ arch }}-{{ .Branch }}-{{ checksum "yarn.lock" }}-{{ checksum "workspace_info.txt" }}-node-modules
          paths:
            - node_modules

  yarn_lint:
    docker: *docker
    environment: *environment

    steps:
      - checkout
      - run: yarn workspaces info | head -n -1 > workspace_info.txt
      - *restore_node_modules
      - run: node ./scripts/prettier/index
      - run: node ./scripts/tasks/eslint
      - run: ./scripts/circleci/check_license.sh
      - run: ./scripts/circleci/check_modules.sh
      - run: ./scripts/circleci/test_print_warnings.sh

  yarn_flow:
    docker: *docker
    environment: *environment
    parallelism: 5

    steps:
      - checkout
      - run: yarn workspaces info | head -n -1 > workspace_info.txt
      - *restore_node_modules
      - run: node ./scripts/tasks/flow-ci

  RELEASE_CHANNEL_stable_yarn_build:
    docker: *docker
    environment: *environment
    parallelism: *TEST_PARALLELISM
    steps:
      - checkout
      - run: yarn workspaces info | head -n -1 > workspace_info.txt
      - *restore_node_modules
      - run:
          environment:
            RELEASE_CHANNEL: stable
          command: |
            ./scripts/circleci/add_build_info_json.sh
            ./scripts/circleci/update_package_versions.sh
            yarn build
      - run: echo "stable" >> build/RELEASE_CHANNEL
      - persist_to_workspace:
          root: build
          paths:
            - RELEASE_CHANNEL
            - facebook-www
            - facebook-react-native
            - facebook-relay
            - node_modules
            - react-native
            - dist
            - sizes/*.json

  yarn_build:
    docker: *docker
    environment: *environment
    parallelism: 20
    steps:
      - checkout
      - run: yarn workspaces info | head -n -1 > workspace_info.txt
      - *restore_node_modules
      - run:
          environment:
            RELEASE_CHANNEL: experimental
          command: |
            ./scripts/circleci/add_build_info_json.sh
            ./scripts/circleci/update_package_versions.sh
            yarn build
      - run: echo "experimental" >> build/RELEASE_CHANNEL
      - persist_to_workspace:
          root: build
          paths:
            - RELEASE_CHANNEL
            - facebook-www
            - facebook-react-native
            - facebook-relay
            - node_modules
            - react-native
            - dist
            - sizes/*.json

  yarn_build_combined:
    docker: *docker
    environment: *environment
    parallelism: 40
    steps:
      - checkout
      - run: yarn workspaces info | head -n -1 > workspace_info.txt
      - *restore_node_modules
      - run: yarn build-combined
      - persist_to_workspace:
          root: .
          paths:
            - build2

  get_base_build:
    docker: *docker
    environment: *environment
    steps:
      - checkout
      - run: yarn workspaces info | head -n -1 > workspace_info.txt
      - *restore_node_modules
      - run:
          name: Download artifacts for base revision
          command: |
              git fetch origin main
              cd ./scripts/release && yarn && cd ../../
              scripts/release/download-experimental-build.js --commit=$(git merge-base HEAD origin/main)
              mv ./build2 ./base-build
      - persist_to_workspace:
          root: .
          paths:
            - base-build

  process_artifacts_combined:
    docker: *docker
    environment: *environment
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run: yarn workspaces info | head -n -1 > workspace_info.txt
      - *restore_node_modules
      - run: echo "<< pipeline.git.revision >>" >> build2/COMMIT_SHA
        # Compress build directory into a single tarball for easy download
      - run: tar -zcvf ./build2.tgz ./build2
      - store_artifacts:
          path: ./build2.tgz

  sizebot:
    docker: *docker
    environment: *environment
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run: echo "<< pipeline.git.revision >>" >> build2/COMMIT_SHA
      - run: yarn workspaces info | head -n -1 > workspace_info.txt
      - *restore_node_modules
      - run:
          command: node ./scripts/tasks/danger

  build_devtools_and_process_artifacts:
    docker: *docker
    environment: *environment
    steps:
      - checkout
      - attach_workspace: *attach_workspace
      - run: yarn workspaces info | head -n -1 > workspace_info.txt
      - *restore_yarn_cache
      - *restore_node_modules
      - run:
          name: Install Packages
          command: yarn --frozen-lockfile --cache-folder ~/.cache/yarn
      - run:
          environment:
            RELEASE_CHANNEL: experimental
          command: ./scripts/circleci/pack_and_store_devtools_artifacts.sh
      - store_artifacts:
          path: ./build/devtools.tgz

  build_devtools_scheduling_profiler:
    docker: *docker
    environment: *environment
    steps:
      - checkout
      - attach_workspace: *attach_workspace
      - run: yarn workspaces info | head -n -1 > workspace_info.txt
      - *restore_yarn_cache
      - *restore_node_modules
      - run:
          name: Install Packages
          command: yarn --frozen-lockfile --cache-folder ~/.cache/yarn
      - run:
          name: Build and archive
          command: |
            mkdir -p build/devtools
            cd packages/react-devtools-scheduling-profiler
            yarn build
            cd dist
            tar -zcvf ../../../build/devtools-scheduling-profiler.tgz .
      - store_artifacts:
          path: ./build/devtools-scheduling-profiler.tgz
      - persist_to_workspace:
          root: packages/react-devtools-scheduling-profiler
          paths:
            - dist

  deploy_devtools_scheduling_profiler:
    docker: *docker
    environment: *environment
    steps:
      - checkout
      - attach_workspace:
          at: packages/react-devtools-scheduling-profiler
      - run: yarn workspaces info | head -n -1 > workspace_info.txt
      - *restore_node_modules
      - run:
          name: Deploy
          command: |
            cd packages/react-devtools-scheduling-profiler
            yarn vercel deploy dist --prod --confirm --token $SCHEDULING_PROFILER_DEPLOY_VERCEL_TOKEN
  yarn_lint_build:
    docker: *docker
    environment: *environment
    steps:
      - checkout
      - attach_workspace: *attach_workspace
      - run: yarn workspaces info | head -n -1 > workspace_info.txt
      - *restore_node_modules
      - run: yarn lint-build
      - run: scripts/circleci/check_minified_errors.sh

  yarn_test:
    docker: *docker
    environment: *environment
    parallelism: *TEST_PARALLELISM
    parameters:
      args:
        type: string
    steps:
      - checkout
      - run: yarn workspaces info | head -n -1 > workspace_info.txt
      - *restore_node_modules
      - run: yarn test <<parameters.args>> --ci

  yarn_test_build:
    docker: *docker
    environment: *environment
    parallelism: *TEST_PARALLELISM
    parameters:
      args:
        type: string
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run: yarn workspaces info | head -n -1 > workspace_info.txt
      - *restore_node_modules
      - run:
          name: Install nested packages from Yarn cache
          command: yarn --frozen-lockfile --cache-folder ~/.cache/yarn
      - run: yarn test --build <<parameters.args>> --ci

  RELEASE_CHANNEL_stable_yarn_test_dom_fixtures:
    docker: *docker
    environment: *environment
    steps:
      - checkout
      - attach_workspace: *attach_workspace
      - run: yarn workspaces info | head -n -1 > workspace_info.txt
      - *restore_node_modules
      - run:
          name: Run DOM fixture tests
          environment:
            RELEASE_CHANNEL: stable
          command: |
            cd fixtures/dom
            yarn --frozen-lockfile
            yarn prestart
            yarn test --maxWorkers=2
  test_fuzz:
    docker: *docker
    environment: *environment
    steps:
      - checkout
      - run: yarn workspaces info | head -n -1 > workspace_info.txt
      - *restore_node_modules
      - run:
          name: Run fuzz tests
          command: |
            FUZZ_TEST_SEED=$RANDOM yarn test fuzz --ci
            FUZZ_TEST_SEED=$RANDOM yarn test --prod fuzz --ci
  publish_prerelease:
    parameters:
      commit_sha:
        type: string
      release_channel:
        type: string
      dist_tag:
        type: string
    docker: *docker
    environment: *environment
    steps:
      - checkout
      - run: yarn workspaces info | head -n -1 > workspace_info.txt
      - *restore_node_modules
      - run:
          name: Run publish script
          command: |
            git fetch origin main
            cd ./scripts/release && yarn && cd ../../
            scripts/release/prepare-release-from-ci.js --skipTests -r << parameters.release_channel >> --commit=<< parameters.commit_sha >>
            cp ./scripts/release/ci-npmrc ~/.npmrc
            scripts/release/publish.js --ci --tags << parameters.dist_tag >>
  # We don't always keep the reconciler forks in sync (otherwise it we wouldn't
  # have forked it) but during periods when they are meant to be in sync, we
  # use this job to confirm there are no differences.
  sync_reconciler_forks:
    docker: *docker
    environment: *environment
    steps:
      - checkout
      - run: yarn workspaces info | head -n -1 > workspace_info.txt
      - *restore_node_modules
      - run:
          name: Confirm reconciler forks are the same
          command: |
            yarn replace-fork
            git diff --quiet || (echo "Reconciler forks are not the same! Run yarn replace-fork. Or, if this was intentional, disable this CI check." && false)
workflows:
  version: 2
  stable:
    unless: << pipeline.parameters.prerelease_commit_sha >>
    jobs:
      - setup
      - yarn_lint:
          requires:
            - setup
      - RELEASE_CHANNEL_stable_yarn_build:
          requires:
            - setup
      - RELEASE_CHANNEL_stable_yarn_test_dom_fixtures:
          requires:
            - RELEASE_CHANNEL_stable_yarn_build

  experimental:
    unless: << pipeline.parameters.prerelease_commit_sha >>
    jobs:
      - setup
      - yarn_build:
          requires:
            - setup
      - build_devtools_and_process_artifacts:
          requires:
            - yarn_build
      - build_devtools_scheduling_profiler:
          requires:
            - yarn_build
      - deploy_devtools_scheduling_profiler:
          requires:
            - build_devtools_scheduling_profiler
          filters:
            branches:
              only:
                - main

  # New workflow that will replace "stable" and "experimental"
  build_and_test:
    unless: << pipeline.parameters.prerelease_commit_sha >>
    jobs:
      - setup
      - yarn_flow:
          requires:
            - setup
      # NOTE: This job is only enabled when we want the forks to be in sync.
      # When the forks intentionally diverge, comment out the job to disable it.
      - sync_reconciler_forks:
          requires:
            - setup
      - yarn_test:
          requires:
            - setup
          matrix:
            parameters:
              args:
                # Intentionally passing these as strings instead of creating a
                # separate parameter per CLI argument, since it's easier to
                # control/see which combinations we want to run.
                - "-r=stable --env=development"
                - "-r=stable --env=production"
                - "-r=experimental --env=development"
                - "-r=experimental --env=production"
                - "-r=www-classic --env=development --variant=false"
                - "-r=www-classic --env=production --variant=false"
                - "-r=www-classic --env=development --variant=true"
                - "-r=www-classic --env=production --variant=true"
                - "-r=www-modern --env=development --variant=false"
                - "-r=www-modern --env=production --variant=false"
                - "-r=www-modern --env=development --variant=true"
                - "-r=www-modern --env=production --variant=true"

                # TODO: Test more persistent configurations?
                - '-r=stable --env=development --persistent'
                - '-r=experimental --env=development --persistent'
      - yarn_build_combined:
          requires:
            - setup
      - process_artifacts_combined:
          requires:
            - yarn_build_combined
      - yarn_test_build:
          requires:
            - yarn_build_combined```

]
          matrix:
            parameters:
             [args:
                # Intentionally passing these as strings instead of creating a
                # separate parameter per CLI argument, since it's easier to
                # control/see which combinations we want to run.
                - "-r=stable --env=development"
                - "-r=stable --env=production"
                - "-r=experimental --env=development"
                - "-r=experimental --env=production"

                # Dev Tools
                - "--project=devtools -r=experimental"

                # TODO: Update test config to support www build tests
                # - "-r=www-classic --env=development --variant=false"
                # - "-r=www-classic --env=production --variant=false"
                # - "-r=www-classic --env=development --variant=true"
                # - "-r=www-classic --env=production --variant=true"
                # - "-r=www-modern --env=development --variant=false"
                # - "-r=www-modern --env=production --variant=false"
                # - "-r=www-modern --env=development --variant=true"
                # - "-r=www-modern --env=production --variant=true"

                # TODO: Test more persistent configurations?


   ```[- get_base_build:
          filters:
            branches:
              ignore:
                - main
          requires:
            - setup
      - sizebot:
          filters:
            branches:
              ignore:
                - main
          requires:
            - get_base_build
            - yarn_build_combined
      - yarn_lint_build:
          requires:
            - yarn_build_combined
  fuzz_tests:
    unless: << pipeline.parameters.prerelease_commit_sha >>
    triggers:
      - schedule:
          # Fuzz tests run hourly
          cron: "0 * * * *"
          filters:
            branches:
              only:
                - main
    jobs:
      - setup
      - test_fuzz:
          requires:
            - setup

  # Used to publish a prerelease manually via the command line
  publish_preleases:
    when: << pipeline.parameters.prerelease_commit_sha >>
    jobs:
      - setup
      - publish_prerelease:
          name: Publish to Next channel
          requires:
            - setup
          commit_sha: << pipeline.parameters.prerelease_commit_sha >>
          release_channel: stable
          dist_tag: "next,alpha"
      - publish_prerelease:
          name: Publish to Experimental channel
          requires:
            # NOTE: Intentionally running these jobs sequentially because npm
            # will sometimes fail if you try to concurrently publish two
            # different versions of the same package, even if they use different
            # dist tags.
            - Publish to Next channel
          commit_sha: << pipeline.parameters.prerelease_commit_sha >>
          release_channel: experimental
          dist_tag: experimental

  # Publishes on a cron schedule
  publish_preleases_nightly:
    unless: << pipeline.parameters.prerelease_commit_sha >>
    triggers:
      - schedule:
          # At 10 minutes past 16:00 on Mon, Tue, Wed, Thu, and Fri
          cron: "10 16 * * 1,2,3,4,5"
          filters:
            branches:
              only:
                - main
    jobs:
      - setup
      - publish_prerelease:
          name: Publish to Next channel
          requires:
            - setup
          commit_sha: << pipeline.git.revision >>
          release_channel: stable
          dist_tag: "next,alpha"
      - publish_prerelease:
          name: Publish to Experimental channel
          requires:
            # NOTE: Intentionally running these jobs sequentially because npm
            # will sometimes fail if you try to concurrently publish two
            # different versions of the same package, even if they use different
            # dist tags.
            - Publish to Next channel
          commit_sha: << pipeline.git.revision >>
          release_channel: experimental
          dist_tag: experimental]```

Enter fullscreen mode Exit fullscreen mode

Top comments (1)

Collapse
 
invest86llc profile image
M. Glenn