With this change, we no longer depend on CircleCI to trigger the webhook (which it sometimes does with considerable delay or not at all). This has the added benefit that other jobs will not unnecessarily trigger webhooks and spam the preview server logs. It is only the `aio_preview` job's webhook that we care about. Related to #27352. PR Close #27458
464 lines
17 KiB
YAML
464 lines
17 KiB
YAML
# 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/
|
|
|
|
# Note that the browser docker image comes with Chrome and Firefox preinstalled. This is just
|
|
# needed for jobs that run tests without Bazel. Bazel runs tests with browsers that will be
|
|
# fetched by the Webtesting rules. Therefore for jobs that run tests with Bazel, we don't need a
|
|
# docker image with browsers pre-installed.
|
|
# **NOTE**: If you change the version of the docker images, also change the `cache_key` suffix.
|
|
var_1: &default_docker_image circleci/node:10.12
|
|
var_2: &browsers_docker_image circleci/node:10.12-browsers
|
|
var_3: &cache_key v2-angular-{{ .Branch }}-{{ checksum "yarn.lock" }}-node-10.12
|
|
|
|
# Define common ENV vars
|
|
var_4: &define_env_vars
|
|
run:
|
|
name: Define environment variables
|
|
command: ./.circleci/env.sh
|
|
|
|
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
|
|
var_6: &job_defaults
|
|
working_directory: ~/ng
|
|
docker:
|
|
- image: *default_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
|
|
var_7: &post_checkout
|
|
post: git pull --ff-only origin "refs/pull/${CI_PULL_REQUEST//*pull\//}/merge"
|
|
|
|
var_8: &yarn_install
|
|
run:
|
|
name: Running Yarn install
|
|
command: yarn install --frozen-lockfile --non-interactive
|
|
|
|
var_9: &setup_circleci_bazel_config
|
|
run:
|
|
name: Setting up CircleCI bazel configuration
|
|
command: sudo cp .circleci/bazel.rc /etc/bazel.bazelrc
|
|
|
|
version: 2
|
|
jobs:
|
|
lint:
|
|
<<: *job_defaults
|
|
resource_class: xlarge
|
|
steps:
|
|
- checkout:
|
|
<<: *post_checkout
|
|
- restore_cache:
|
|
key: *cache_key
|
|
- *define_env_vars
|
|
- *setup_circleci_bazel_config
|
|
- *yarn_install
|
|
|
|
- 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)'
|
|
|
|
- run: ./node_modules/.bin/gulp lint
|
|
|
|
test:
|
|
<<: *job_defaults
|
|
resource_class: xlarge
|
|
steps:
|
|
- checkout:
|
|
<<: *post_checkout
|
|
- restore_cache:
|
|
key: *cache_key
|
|
- *define_env_vars
|
|
- *setup_circleci_bazel_config
|
|
- *yarn_install
|
|
|
|
# Setup remote execution and run RBE-compatible tests.
|
|
- *setup_bazel_remote_execution
|
|
- run: yarn 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: yarn bazel test //... --build_tag_filters=-ivy-only,local --test_tag_filters=-ivy-only,local
|
|
|
|
- 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_aot:
|
|
<<: *job_defaults
|
|
resource_class: xlarge
|
|
steps:
|
|
- checkout:
|
|
<<: *post_checkout
|
|
- restore_cache:
|
|
key: *cache_key
|
|
- *define_env_vars
|
|
- *setup_circleci_bazel_config
|
|
- *yarn_install
|
|
- *setup_bazel_remote_execution
|
|
|
|
# We need to explicitly specify the --symlink_prefix option because otherwise we would
|
|
# not be able to easily find the output bin directory when uploading artifacts for size
|
|
# measurements.
|
|
- run: yarn test-ivy-aot //... --symlink_prefix=dist/
|
|
|
|
# Publish bundle artifacts which will be used to calculate the size change. **Note**: Make
|
|
# sure that the size plugin from the Angular robot fetches the artifacts from this CircleCI
|
|
# job (see .github/angular-robot.yml). Additionally any artifacts need to be stored with the
|
|
# following path format: "{projectName}/{context}/{fileName}". This format is necessary
|
|
# because otherwise the bot is not able to pick up the artifacts from CircleCI. See:
|
|
# https://github.com/angular/github-robot/blob/master/functions/src/plugins/size.ts#L392-L394
|
|
- 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
|
|
|
|
test_aio:
|
|
<<: *job_defaults
|
|
docker:
|
|
# Needed because the AIO tests and the PWA score test depend on Chrome being available.
|
|
- image: *browsers_docker_image
|
|
steps:
|
|
- checkout:
|
|
<<: *post_checkout
|
|
- restore_cache:
|
|
key: *cache_key
|
|
- *define_env_vars
|
|
# 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: 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: yarn --cwd aio test --watch=false
|
|
# Run e2e tests
|
|
- run: yarn --cwd aio e2e
|
|
# Run unit tests for Firebase redirects
|
|
- run: yarn --cwd aio redirects-test
|
|
|
|
deploy_aio:
|
|
<<: *job_defaults
|
|
docker:
|
|
# Needed because before deploying the deploy-production script runs the PWA score tests.
|
|
- image: *browsers_docker_image
|
|
steps:
|
|
- checkout:
|
|
<<: *post_checkout
|
|
- restore_cache:
|
|
key: *cache_key
|
|
- *define_env_vars
|
|
# Deploy angular.io to production (if necessary)
|
|
- run: setPublicVar CI_STABLE_BRANCH "$(npm info @angular/core dist-tags.latest | sed -r 's/^\s*([0-9]+\.[0-9]+)\.[0-9]+.*$/\1.x/')"
|
|
- run: yarn --cwd aio deploy-production
|
|
|
|
test_aio_local:
|
|
<<: *job_defaults
|
|
docker:
|
|
# Needed because the AIO tests and the PWA score test depend on Chrome being available.
|
|
- image: *browsers_docker_image
|
|
steps:
|
|
- checkout:
|
|
<<: *post_checkout
|
|
- restore_cache:
|
|
key: *cache_key
|
|
- attach_workspace:
|
|
at: dist
|
|
- *define_env_vars
|
|
# 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: yarn --cwd aio test-pwa-score-localhost $CI_AIO_MIN_PWA_SCORE
|
|
# Run unit tests
|
|
- run: yarn --cwd aio test --watch=false
|
|
# Run e2e tests
|
|
- run: yarn --cwd aio e2e
|
|
|
|
test_aio_tools:
|
|
<<: *job_defaults
|
|
steps:
|
|
- checkout:
|
|
<<: *post_checkout
|
|
- restore_cache:
|
|
key: *cache_key
|
|
- attach_workspace:
|
|
at: dist
|
|
- *define_env_vars
|
|
# 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
|
|
docker:
|
|
# Needed because the example e2e tests depend on Chrome.
|
|
- image: *browsers_docker_image
|
|
steps:
|
|
- checkout:
|
|
<<: *post_checkout
|
|
- restore_cache:
|
|
key: *cache_key
|
|
- attach_workspace:
|
|
at: dist
|
|
- *define_env_vars
|
|
# Install root
|
|
- *yarn_install
|
|
# Install aio
|
|
- run: yarn --cwd aio install --frozen-lockfile --non-interactive
|
|
# Run examples tests
|
|
- run: yarn --cwd aio example-e2e --setup --local --shard=0/2
|
|
|
|
test_docs_examples_1:
|
|
<<: *job_defaults
|
|
docker:
|
|
# Needed because the example e2e tests depend on Chrome.
|
|
- image: *browsers_docker_image
|
|
steps:
|
|
- checkout:
|
|
<<: *post_checkout
|
|
- restore_cache:
|
|
key: *cache_key
|
|
- attach_workspace:
|
|
at: dist
|
|
- *define_env_vars
|
|
# Install root
|
|
- *yarn_install
|
|
# Install aio
|
|
- run: yarn --cwd aio install --frozen-lockfile --non-interactive
|
|
# Run examples tests
|
|
- run: 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:
|
|
- checkout:
|
|
<<: *post_checkout
|
|
- restore_cache:
|
|
key: *cache_key
|
|
- *define_env_vars
|
|
- *yarn_install
|
|
- 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
|
|
- run: node ./aio/scripts/create-preview $CIRCLE_BUILD_NUM
|
|
|
|
# This job should only be run on PR builds, where `CI_PULL_REQUEST` is not `false`.
|
|
test_aio_preview:
|
|
<<: *job_defaults
|
|
docker:
|
|
# Needed because the test-preview script runs e2e tests and the PWA score test with Chrome.
|
|
- image: *browsers_docker_image
|
|
steps:
|
|
- checkout:
|
|
<<: *post_checkout
|
|
- restore_cache:
|
|
key: *cache_key
|
|
- *define_env_vars
|
|
- run: yarn install --cwd aio --frozen-lockfile --non-interactive
|
|
- run:
|
|
name: Wait for preview and run tests
|
|
command: 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:
|
|
- checkout:
|
|
<<: *post_checkout
|
|
- restore_cache:
|
|
key: *cache_key
|
|
- *define_env_vars
|
|
- *setup_circleci_bazel_config
|
|
- *yarn_install
|
|
- *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-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
|
|
docker:
|
|
# Needed because the integration tests expect Chrome to be installed (e.g cli-hello-world)
|
|
- image: *browsers_docker_image
|
|
# 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:
|
|
- checkout:
|
|
<<: *post_checkout
|
|
- restore_cache:
|
|
key: *cache_key
|
|
- attach_workspace:
|
|
at: dist
|
|
- *define_env_vars
|
|
- run: ./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:
|
|
- checkout:
|
|
<<: *post_checkout
|
|
- *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'
|
|
- 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
|
|
docker:
|
|
# This job needs Chrome to be globally installed because the tests run with Protractor
|
|
# which does not load the browser through the Bazel webtesting rules.
|
|
- image: *browsers_docker_image
|
|
steps:
|
|
- checkout:
|
|
<<: *post_checkout
|
|
- restore_cache:
|
|
key: *cache_key
|
|
- *define_env_vars
|
|
- run:
|
|
name: Run tests against the deployed apps
|
|
command: ./aio/scripts/test-production.sh $CI_AIO_MIN_PWA_SCORE
|
|
- run:
|
|
name: Notify caretaker about failure
|
|
command: 'curl --request POST --header "Content-Type: application/json" --data "{\"text\":\":x: \`$CIRCLE_JOB\` job failed on build $CIRCLE_BUILD_NUM: $CIRCLE_BUILD_URL :scream:\"}" $CI_SECRET_SLACK_CARETAKER_WEBHOOK_URL'
|
|
when: on_fail
|
|
|
|
workflows:
|
|
version: 2
|
|
default_workflow:
|
|
jobs:
|
|
- lint
|
|
- test
|
|
- 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_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
|