462 lines
17 KiB
YAML
462 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
|
|
steps:
|
|
- checkout:
|
|
<<: *post_checkout
|
|
- restore_cache:
|
|
key: *cache_key
|
|
- *define_env_vars
|
|
- *yarn_install
|
|
|
|
- run: 'yarn bazel:format -mode=check ||
|
|
(echo "BUILD files not formatted. Please run ''yarn bazel:format''" ; exit 1)'
|
|
# Run the skylark linter to check our Bazel rules
|
|
- run: 'yarn bazel:lint ||
|
|
(echo -e "\n.bzl files have lint errors. Please run ''yarn bazel:lint-fix''"; 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
|