# Configuration file for https://circleci.com/gh/angular/angular # Note: YAML anchors allow an object to be re-used, reducing duplication. # The ampersand declares an alias for an object, then later the `<<: *name` # syntax dereferences it. # See http://blog.daemonl.com/2016/02/yaml.html # To validate changes, use an online parser, eg. # http://yaml-online-parser.appspot.com/ # Variables ## IMPORTANT # If you change the `docker_image` version, also change the `cache_key` suffix and the version of # `com_github_bazelbuild_buildtools` in the `/WORKSPACE` file. var_1: &docker_image angular/ngcontainer:0.7.0 var_2: &cache_key v2-angular-{{ .Branch }}-{{ checksum "yarn.lock" }}-0.7.0 # Define common ENV vars var_3: &define_env_vars run: name: Define environment variables command: | echo "export PROJECT_ROOT=$(pwd)" | tee -a $BASH_ENV echo "export CI_AIO_MIN_PWA_SCORE=95" | tee -a $BASH_ENV # This is the branch being built; e.g. `pull/12345` for PR builds. echo "export CI_BRANCH=$CIRCLE_BRANCH" | tee -a $BASH_ENV echo "export CI_COMMIT=$CIRCLE_SHA1" | tee -a $BASH_ENV # `CI_COMMIT_RANGE` will only be available when `CIRCLE_COMPARE_URL` is also available, # i.e. on push builds (a.k.a. non-PR builds). That is fine, since we only need it in push builds. echo "export CI_COMMIT_RANGE=$(sed -r 's|^.*/([0-9a-f]+\.\.\.[0-9a-f]+)$|\1|i' <<< ${CIRCLE_COMPARE_URL:-})" | tee -a $BASH_ENV echo "export CI_PULL_REQUEST=${CIRCLE_PR_NUMBER:-false}" | tee -a $BASH_ENV echo "export CI_REPO_NAME=$CIRCLE_PROJECT_REPONAME" | tee -a $BASH_ENV echo "export CI_REPO_OWNER=$CIRCLE_PROJECT_USERNAME" | tee -a $BASH_ENV # WARNING: Secrets (do not print). echo "export CI_SECRET_AIO_DEPLOY_FIREBASE_TOKEN=$AIO_DEPLOY_TOKEN" >> $BASH_ENV echo "export CI_SECRET_PAYLOAD_FIREBASE_TOKEN=$ANGULAR_PAYLOAD_TOKEN" >> $BASH_ENV # See remote cache documentation in /docs/BAZEL.md var_4: &setup-bazel-remote-cache run: name: Start up bazel remote cache proxy command: ~/bazel-remote-proxy -backend circleci:// background: true var_5: &setup_bazel_remote_execution run: name: "Setup bazel RBE remote execution" command: openssl aes-256-cbc -d -in .circleci/gcp_token -k "$CI_REPO_NAME" -out /home/circleci/.gcp_credentials && echo "export GOOGLE_APPLICATION_CREDENTIALS=/home/circleci/.gcp_credentials" >> $BASH_ENV && sudo bash -c "cat .circleci/rbe-bazel.rc >> /etc/bazel.bazelrc" # Settings common to each job anchor_1: &job_defaults working_directory: ~/ng docker: - image: *docker_image # After checkout, rebase on top of master. # Similar to travis behavior, but not quite the same. # See https://discuss.circleci.com/t/1662 anchor_2: &post_checkout post: git pull --ff-only origin "refs/pull/${CI_PULL_REQUEST//*pull\//}/merge" version: 2 jobs: lint: <<: *job_defaults resource_class: xlarge steps: - *define_env_vars - checkout: <<: *post_checkout - run: sudo cp .circleci/bazel.rc /etc/bazel.bazelrc # Check BUILD.bazel formatting before we have a node_modules directory # Then we don't need any exclude pattern to avoid checking those files - run: 'yarn buildifier -mode=check || (echo "BUILD files not formatted. Please run ''yarn buildifier''" ; exit 1)' # Run the skylark linter to check our Bazel rules - run: 'yarn skylint || (echo -e "\n.bzl files have lint errors. Please run ''yarn skylint''"; exit 1)' - restore_cache: key: *cache_key - run: yarn install --frozen-lockfile --non-interactive - run: ./node_modules/.bin/gulp lint test: <<: *job_defaults resource_class: xlarge steps: - *define_env_vars - checkout: <<: *post_checkout - run: sudo cp .circleci/bazel.rc /etc/bazel.bazelrc - run: bazel info release - run: bazel run @nodejs//:yarn # Setup remote execution and run RBE-compatible tests. - *setup_bazel_remote_execution - run: bazel test //... --build_tag_filters=-ivy-only --test_tag_filters=-ivy-only,-local # Now run RBE incompatible tests locally. - run: sudo cp .circleci/bazel.rc /etc/bazel.bazelrc - run: bazel test //... --build_tag_filters=-ivy-only,local --test_tag_filters=-ivy-only,local # CircleCI will allow us to go back and view/download these artifacts from past builds. # Also we can use a service like https://buildsize.org/ to automatically track binary size of these artifacts. # The destination keys need be format {projectName}/{context}/{fileName} so that the github-robot can process them for size calculations # projectName should remain consistant to group files # context and fileName can be almost anything (within usual URI rules) # There should only be exactly 2 forward slashes in the path # This is so they're backwards compatiable with the existing data we have on bundle sizes - store_artifacts: path: dist/bin/packages/core/test/bundling/hello_world/bundle.min.js destination: core/hello_world/bundle - store_artifacts: path: dist/bin/packages/core/test/bundling/todo/bundle.min.js destination: core/todo/bundle - store_artifacts: path: dist/bin/packages/core/test/bundling/hello_world/bundle.min.js.br destination: core/hello_world/bundle.br - store_artifacts: path: dist/bin/packages/core/test/bundling/todo/bundle.min.js.br destination: core/todo/bundle.br - save_cache: key: *cache_key paths: - "node_modules" - "~/bazel_repository_cache" # Temporary job to test what will happen when we flip the Ivy flag to true test_ivy_jit: <<: *job_defaults resource_class: xlarge steps: - *define_env_vars - checkout: <<: *post_checkout - run: sudo cp .circleci/bazel.rc /etc/bazel.bazelrc - run: bazel run @yarn//:yarn - *setup_bazel_remote_execution - run: bazel test //... --define=compile=jit --build_tag_filters=ivy-jit --test_tag_filters=ivy-jit test_ivy_aot: <<: *job_defaults resource_class: xlarge steps: - *define_env_vars - checkout: <<: *post_checkout - run: sudo cp .circleci/bazel.rc /etc/bazel.bazelrc - run: bazel run @yarn//:yarn - *setup_bazel_remote_execution - run: bazel test //... --define=compile=aot --build_tag_filters=ivy-aot --test_tag_filters=ivy-aot test_aio: <<: *job_defaults steps: - *define_env_vars - checkout: <<: *post_checkout - restore_cache: key: *cache_key # Build aio - run: yarn --cwd aio build --progress=false # Lint the code - run: yarn --cwd aio lint # Run PWA-score tests # (Run before unit and e2e tests, which destroy the `dist/` directory.) - run: name: Run PWA-score tests command: xvfb-run --auto-servernum yarn --cwd aio test-pwa-score-localhost $CI_AIO_MIN_PWA_SCORE # Check the bundle sizes. # (Run before unit and e2e tests, which destroy the `dist/` directory.) - run: yarn --cwd aio payload-size # Run unit tests - run: xvfb-run --auto-servernum yarn --cwd aio test --watch=false # Run e2e tests - run: xvfb-run --auto-servernum yarn --cwd aio e2e # Run unit tests for Firebase redirects - run: yarn --cwd aio redirects-test deploy_aio: <<: *job_defaults steps: - *define_env_vars - checkout: <<: *post_checkout - restore_cache: key: *cache_key # Deploy angular.io to production (if necessary) - run: echo "export CI_STABLE_BRANCH=$(npm info @angular/core dist-tags.latest | sed -r 's/^\s*([0-9]+\.[0-9]+)\.[0-9]+.*$/\1.x/')" | tee -a $BASH_ENV - run: xvfb-run --auto-servernum yarn --cwd aio deploy-production test_aio_local: <<: *job_defaults steps: - *define_env_vars - checkout: <<: *post_checkout - attach_workspace: at: dist - restore_cache: key: *cache_key # Build aio (with local Angular packages) - run: yarn --cwd aio build-local --progress=false # Run PWA-score tests # (Run before unit and e2e tests, which destroy the `dist/` directory.) - run: name: Run PWA-score tests command: xvfb-run --auto-servernum yarn --cwd aio test-pwa-score-localhost $CI_AIO_MIN_PWA_SCORE # Run unit tests - run: xvfb-run --auto-servernum yarn --cwd aio test --watch=false # Run e2e tests - run: xvfb-run --auto-servernum yarn --cwd aio e2e test_aio_tools: <<: *job_defaults steps: - *define_env_vars - checkout: <<: *post_checkout - attach_workspace: at: dist - restore_cache: key: *cache_key # Install - run: yarn --cwd aio install --frozen-lockfile --non-interactive - run: yarn --cwd aio extract-cli-command-docs # Run tools tests - run: yarn --cwd aio tools-test - run: ./aio/aio-builds-setup/scripts/test.sh test_docs_examples_0: <<: *job_defaults steps: - *define_env_vars - checkout: <<: *post_checkout - attach_workspace: at: dist - restore_cache: key: *cache_key # Install root - run: yarn install --frozen-lockfile --non-interactive # Install aio - run: yarn --cwd aio install --frozen-lockfile --non-interactive # Run examples tests - run: xvfb-run --auto-servernum yarn --cwd aio example-e2e --setup --local --shard=0/2 test_docs_examples_1: <<: *job_defaults steps: - *define_env_vars - checkout: <<: *post_checkout - attach_workspace: at: dist - restore_cache: key: *cache_key # Install root - run: yarn install --frozen-lockfile --non-interactive # Install aio - run: yarn --cwd aio install --frozen-lockfile --non-interactive # Run examples tests - run: xvfb-run --auto-servernum yarn --cwd aio example-e2e --setup --local --shard=1/2 # This job should only be run on PR builds, where `CI_PULL_REQUEST` is not `false`. aio_preview: <<: *job_defaults environment: AIO_SNAPSHOT_ARTIFACT_PATH: &aio_preview_artifact_path 'aio/tmp/snapshot.tgz' steps: - *define_env_vars - checkout: <<: *post_checkout - restore_cache: key: *cache_key - run: yarn install --frozen-lockfile --non-interactive - run: ./aio/scripts/build-artifacts.sh $AIO_SNAPSHOT_ARTIFACT_PATH $CI_PULL_REQUEST $CI_COMMIT - store_artifacts: path: *aio_preview_artifact_path # The `destination` needs to be kept in synch with the value of # `AIO_ARTIFACT_PATH` in `aio/aio-builds-setup/Dockerfile` destination: aio/dist/aio-snapshot.tgz # This job should only be run on PR builds, where `CI_PULL_REQUEST` is not `false`. test_aio_preview: <<: *job_defaults steps: - *define_env_vars - checkout: <<: *post_checkout - restore_cache: key: *cache_key - run: yarn install --cwd aio --frozen-lockfile --non-interactive - run: name: Wait for preview and run tests command: xvfb-run --auto-servernum node aio/scripts/test-preview.js $CI_PULL_REQUEST $CI_COMMIT $CI_AIO_MIN_PWA_SCORE # This job exists only for backwards-compatibility with old scripts and tests # that rely on the pre-Bazel dist/packages-dist layout. # It duplicates some work with the job above: we build the bazel packages # twice. Even though we have a remote cache, these jobs will typically run in # parallel so up-to-date outputs will not be available at the time the build # starts. # No new jobs should depend on this one. build-packages-dist: <<: *job_defaults resource_class: xlarge steps: - *define_env_vars - checkout: <<: *post_checkout - run: sudo cp .circleci/bazel.rc /etc/bazel.bazelrc - run: bazel run @nodejs//:yarn - *setup_bazel_remote_execution - run: scripts/build-packages-dist.sh # Save the npm packages from //packages/... for other workflow jobs to read # https://circleci.com/docs/2.0/workflows/#using-workspaces-to-share-data-among-jobs - persist_to_workspace: root: dist paths: - packages-dist - packages-dist-ivy-jit - packages-dist-ivy-aot # We run the integration tests outside of Bazel for now. # They are a separate workflow job so that they can be easily re-run. # When the tests are ported to bazel test targets, they should move to the "test" # job above, as part of the bazel test command. That has flaky_test_attempts so the # need to re-run manually should be alleviated. # See comments inside the integration/run_tests.sh script. integration_test: <<: *job_defaults # Note: we run Bazel in one of the integration tests, and it can consume >2G # of memory. Together with the system under test, this can exhaust the RAM # on a 4G worker so we use a larger machine here too. resource_class: xlarge steps: - *define_env_vars - checkout: <<: *post_checkout - attach_workspace: at: dist - run: xvfb-run --auto-servernum ./integration/run_tests.sh # This job updates the content of repos like github.com/angular/core-builds # for every green build on angular/angular. publish_snapshot: <<: *job_defaults steps: - *define_env_vars # See below - ideally this job should not trigger for non-upstream builds. # But since it does, we have to check this condition. - run: name: Skip this job for Pull Requests and Fork builds # Note, `|| true` on the end makes this step always exit 0 command: '[[ "$CI_PULL_REQUEST" != "false" || "$CI_REPO_OWNER" != "angular" || "$CI_REPO_NAME" != "angular" ]] && circleci step halt || true' - checkout: <<: *post_checkout - attach_workspace: at: dist # CircleCI has a config setting to force SSH for all github connections # This is not compatible with our mechanism of using a Personal Access Token # Clear the global setting - run: git config --global --unset "url.ssh://git@github.com.insteadof" - run: name: Decrypt github credentials command: 'openssl aes-256-cbc -d -in .circleci/github_token -k "${KEY}" -out ~/.git_credentials' - run: ./scripts/ci/publish-build-artifacts.sh aio_monitoring: <<: *job_defaults steps: - *define_env_vars - checkout: <<: *post_checkout - restore_cache: key: *cache_key - run: name: Run tests against the deployed apps command: xvfb-run --auto-servernum ./aio/scripts/test-production.sh $CI_AIO_MIN_PWA_SCORE workflows: version: 2 default_workflow: jobs: - lint - test - test_ivy_jit - test_ivy_aot - build-packages-dist - test_aio - deploy_aio: requires: - test_aio - test_aio_local: requires: - build-packages-dist - test_aio_tools: requires: - build-packages-dist - test_docs_examples_0: requires: - build-packages-dist - test_docs_examples_1: requires: - build-packages-dist - aio_preview: # Only run on PR builds. (There can be no previews for non-PR builds.) filters: branches: only: /pull\/\d+/ - test_aio_preview: requires: - aio_preview - integration_test: requires: - build-packages-dist - publish_snapshot: # Note: no filters on this job because we want it to run for all upstream branches # We'd really like to filter out pull requests here, but not yet available: # https://discuss.circleci.com/t/workflows-pull-request-filter/14396/4 # Instead, the job just exits immediately at the first step. requires: # Only publish if tests and integration tests pass - test - test_ivy_jit - test_ivy_aot - integration_test # Only publish if `aio`/`docs` tests using the locally built Angular packages pass - test_aio_local - test_docs_examples_0 - test_docs_examples_1 # Get the artifacts to publish from the build-packages-dist job # since the publishing script expects the legacy outputs layout. - build-packages-dist aio_monitoring: jobs: - aio_monitoring triggers: - schedule: cron: "0 0 * * *" filters: branches: only: - master notify: webhooks: - url: https://ngbuilds.io/circle-build