diff --git a/.bazelrc b/.bazelrc
index aca58640cc7..5049882e2dc 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -78,12 +78,6 @@ query --output=label_kind
# By default, failing tests don't print any output, it goes to the log file
test --test_output=errors
-################################
-# Settings for CircleCI #
-################################
-
-# Bazel flags for CircleCI are in /.circleci/bazel.linux.rc and /.circleci/bazel.windows.rc
-
##################################
# Remote Build Execution support #
# Turn on these settings with #
diff --git a/.circleci/README.md b/.circleci/README.md
deleted file mode 100644
index cddaf76fe8c..00000000000
--- a/.circleci/README.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Encryption
-
-Based on https://github.com/circleci/encrypted-files
-
-In the CircleCI web UI, we have a secret variable called `KEY`
-https://circleci.com/gh/angular/angular/edit#env-vars
-which is only exposed to non-fork builds
-(see "Pass secrets to builds from forked pull requests" under
-https://circleci.com/gh/angular/angular/edit#advanced-settings)
-
-We use this as a symmetric AES encryption key to encrypt tokens like
-a GitHub token that enables publishing snapshots.
-
-To create the github_token file, we take this approach:
-- Find the angular-builds:token in the internal pw database
-- Go inside the CircleCI default docker image so you use the same version of openssl as we will at runtime: `docker run --rm -it circleci/node:10.12`
-- echo "https://[token]:@github.com" > credentials
-- openssl aes-256-cbc -e -in credentials -out .circleci/github_token -k $KEY
-- If needed, base64-encode the result so you can copy-paste it out of docker: `base64 github_token`
diff --git a/.circleci/bazel.common.rc b/.circleci/bazel.common.rc
deleted file mode 100644
index 2b4c9ec625d..00000000000
--- a/.circleci/bazel.common.rc
+++ /dev/null
@@ -1,16 +0,0 @@
-# Settings in this file should be OS agnostic. Use the bazel.`: The code to run to compute the value for the variable. Since this code should be
-# executed lazily, it must be properly escaped. For example:
-# ```sh
-# # DO NOT do this:
-# createPublicVarSetter MY_VAR "$(whoami)"; # `whoami` will be evaluated eagerly
-#
-# # DO this isntead:
-# createPublicVarSetter MY_VAR "\$(whoami)"; # `whoami` will NOT be evaluated eagerly
-# ```
-#
-# Usage: `createPublicVarSetter `
-#
-# Example:
-# ```sh
-# createPublicVarSetter MY_VAR 'echo "FOO"';
-# echo $MY_VAR; # Not defined
-#
-# setPublicVar_MY_VAR;
-# source $BASH_ENV;
-# echo $MY_VAR; # FOO
-# ```
-function createPublicVarSetter() {
- echo "setPublicVar_$1() { setPublicVar $1 \"$2\"; }" >> $BASH_ENV;
-}
diff --git a/.circleci/env.linux.sh b/.circleci/env.linux.sh
deleted file mode 100755
index 6fab1c71143..00000000000
--- a/.circleci/env.linux.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-####################################################################################################
-# Set bazel configuration for CircleCI runs.
-####################################################################################################
-cp "${PROJECT_ROOT}/.circleci/bazel.linux.rc" ".bazelrc.user";
diff --git a/.circleci/env.sh b/.circleci/env.sh
deleted file mode 100755
index 9522f3c56a7..00000000000
--- a/.circleci/env.sh
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/usr/bin/env bash
-
-# Variables
-readonly projectDir=$(realpath "$(dirname ${BASH_SOURCE[0]})/..")
-readonly envHelpersPath="$projectDir/.circleci/env-helpers.inc.sh";
-
-# Load helpers and make them available everywhere (through `$BASH_ENV`).
-source $envHelpersPath;
-echo "source $envHelpersPath;" >> $BASH_ENV;
-
-
-####################################################################################################
-# Define PUBLIC environment variables for CircleCI.
-####################################################################################################
-# See https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables for more info.
-####################################################################################################
-setPublicVar CI "$CI"
-setPublicVar PROJECT_ROOT "$projectDir";
-# This is the branch being built; e.g. `pull/12345` for PR builds.
-setPublicVar CI_BRANCH "$CIRCLE_BRANCH";
-setPublicVar CI_BUILD_URL "$CIRCLE_BUILD_URL";
-setPublicVar CI_COMMIT "$CIRCLE_SHA1";
-# `CI_COMMIT_RANGE` is only used on push builds (a.k.a. non-PR, non-scheduled builds and rerun
-# workflows of such builds).
-setPublicVar CI_GIT_BASE_REVISION "${CIRCLE_GIT_BASE_REVISION}";
-setPublicVar CI_GIT_REVISION "${CIRCLE_GIT_REVISION}";
-setPublicVar CI_COMMIT_RANGE "$CIRCLE_GIT_BASE_REVISION..$CIRCLE_GIT_REVISION";
-setPublicVar CI_PULL_REQUEST "${CIRCLE_PR_NUMBER:-false}";
-setPublicVar CI_REPO_NAME "$CIRCLE_PROJECT_REPONAME";
-setPublicVar CI_REPO_OWNER "$CIRCLE_PROJECT_USERNAME";
-setPublicVar CI_PR_REPONAME "$CIRCLE_PR_REPONAME";
-setPublicVar CI_PR_USERNAME "$CIRCLE_PR_USERNAME";
-
-
-####################################################################################################
-# Define "lazy" PUBLIC environment variables for CircleCI.
-# (I.e. functions to set an environment variable when called.)
-####################################################################################################
-createPublicVarSetter CI_STABLE_BRANCH "\$(npm info @angular/core dist-tags.latest | sed -r 's/^\\s*([0-9]+\\.[0-9]+)\\.[0-9]+.*$/\\1.x/')";
-
-
-####################################################################################################
-# Define SECRET environment variables for CircleCI.
-####################################################################################################
-setSecretVar CI_SECRET_AIO_DEPLOY_FIREBASE_TOKEN "$AIO_DEPLOY_TOKEN";
-setSecretVar CI_SECRET_PAYLOAD_FIREBASE_TOKEN "$ANGULAR_PAYLOAD_TOKEN";
-
-
-####################################################################################################
-# Define SauceLabs environment variables for CircleCI.
-####################################################################################################
-setPublicVar SAUCE_USERNAME "angular-framework";
-setSecretVar SAUCE_ACCESS_KEY "f4bf7c639c5a-c6bb-d6a4-a4b5-800aa111";
-# TODO(josephperrott): Remove environment variables once all saucelabs tests are via bazel method.
-setPublicVar SAUCE_LOG_FILE /tmp/angular/sauce-connect.log
-setPublicVar SAUCE_READY_FILE /tmp/angular/sauce-connect-ready-file.lock
-setPublicVar SAUCE_PID_FILE /tmp/angular/sauce-connect-pid-file.lock
-setPublicVar SAUCE_TUNNEL_IDENTIFIER "angular-framework-${CIRCLE_BUILD_NUM}-${CIRCLE_NODE_INDEX}"
-# Amount of seconds we wait for sauceconnect to establish a tunnel instance. In order to not
-# acquire CircleCI instances for too long if sauceconnect failed, we need a connect timeout.
-setPublicVar SAUCE_READY_FILE_TIMEOUT 120
-
-####################################################################################################
-# Create shell script in /tmp for Bazel actions to access CI envs without
-# busting the cache. Used by payload-size.sh script in integration tests.
-####################################################################################################
-readonly bazelVarEnv="/tmp/bazel-ci-env.sh"
-echo "# Setup by /.circle/env.sh" > $bazelVarEnv
-echo "export PROJECT_ROOT=\"${PROJECT_ROOT}\";" >> $bazelVarEnv
-echo "export CI_BRANCH=\"${CI_BRANCH}\";" >> $bazelVarEnv
-echo "export CI_BUILD_URL=\"${CI_BUILD_URL}\";" >> $bazelVarEnv
-echo "export CI_COMMIT=\"${CI_COMMIT}\";" >> $bazelVarEnv
-echo "export CI_PULL_REQUEST=\"${CI_PULL_REQUEST}\";" >> $bazelVarEnv
-echo "export CI_REPO_NAME=\"${CI_REPO_NAME}\";" >> $bazelVarEnv
-echo "export CI_REPO_OWNER=\"${CI_REPO_OWNER}\";" >> $bazelVarEnv
-echo "export CI_SECRET_PAYLOAD_FIREBASE_TOKEN=\"${CI_SECRET_PAYLOAD_FIREBASE_TOKEN}\";" >> $bazelVarEnv
-
-####################################################################################################
-# Platform-specific environment setup (which can leverage the base variables from here)
-####################################################################################################
-
-# Conditionally, load additional environment settings based on the current VM
-# operating system running. We detect Windows by checking for `%AppData%`.
-if [[ -n "${APPDATA}" ]]; then
- source ${projectDir}/.circleci/env.windows.sh
-else
- source ${projectDir}/.circleci/env.linux.sh
-fi
diff --git a/.circleci/env.windows.sh b/.circleci/env.windows.sh
deleted file mode 100755
index 19a6fbe1c65..00000000000
--- a/.circleci/env.windows.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-####################################################################################################
-# Set bazel configuration for CircleCI runs.
-####################################################################################################
-cp "${PROJECT_ROOT}/.circleci/bazel.windows.rc" ".bazelrc.user";
-
-# Override the `PATH` environment variable so that the windows-nvm NodeJS version
-# always has precedence over potential existing NodeJS versions from the image.
-setPublicVar PATH "/c/Program Files/nodejs/:$PATH"
-
-# Expose the Bazelisk version. We need to run Bazelisk globally since Windows has problems launching
-# Bazel from a node modules directoy that might be modified by the Bazel Yarn install then.
-setPublicVar BAZELISK_VERSION \
- "$(cd ${PROJECT_ROOT}; node -p 'require("./package.json").devDependencies["@bazel/bazelisk"]')"
diff --git a/.circleci/setup_cache.sh b/.circleci/setup_cache.sh
deleted file mode 100755
index 232596df4a9..00000000000
--- a/.circleci/setup_cache.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-# Install bazel remote cache proxy
-# This is temporary until the feature is no longer experimental on CircleCI.
-# See remote cache documentation in /docs/BAZEL.md
-
-set -u -e
-
-readonly DOWNLOAD_URL="https://5-116431813-gh.circle-artifacts.com/0/pkg/bazel-remote-proxy-$(uname -s)_$(uname -m)"
-
-curl --fail -o ~/bazel-remote-proxy "$DOWNLOAD_URL"
-chmod +x ~/bazel-remote-proxy
diff --git a/.devcontainer/recommended-Dockerfile b/.devcontainer/recommended-Dockerfile
index b12a0a70ed1..d128851219b 100644
--- a/.devcontainer/recommended-Dockerfile
+++ b/.devcontainer/recommended-Dockerfile
@@ -1,6 +1,5 @@
# Image metadata and config.
# Ideally, the Node.js version should match what we use on CI.
-# See `executors > default-executor` in `.circleci/config.yml`.
FROM cimg/node:18.13.0@sha256:45d0ee279f522c4562a464df71108104cc9b2187205333ffd0707d4f05589731
@@ -12,7 +11,7 @@ LABEL name="Angular dev environment" \
EXPOSE 4000 4200 4433 5000 8080 9876
-# Switch to `root` (CircleCI images use `circleci` as the user).
+# Switch to `root`.
USER root
diff --git a/.gitignore b/.gitignore
index 487a4952c50..9590c28b2a1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,10 +6,6 @@
*.log
/node_modules/
-# CircleCI temporary file for cache key computation.
-# See `save_month_to_file` in `.circleci/config.yml`.
-month.txt
-
# Include when developing application packages.
pubspec.lock
.c9
diff --git a/.pullapprove.yml b/.pullapprove.yml
index 89af31257c0..c64c3d11c52 100644
--- a/.pullapprove.yml
+++ b/.pullapprove.yml
@@ -634,7 +634,6 @@ groups:
- >
contains_any_globs(files.exclude('.pullapprove.yml'), [
'{*,.*}',
- '.circleci/**/{*,.*}',
'.devcontainer/**/{*,.*}',
'.github/**/{*,.*}',
'.husky/**/{*,.*}',
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 9d69f1f8c89..a8703ba25ab 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -260,7 +260,7 @@ The `
-
-
-
@@ -35,12 +32,6 @@
-
-
-
-