ci(docs-infra): move AIO preview deployment to CircleCI

Now instead of pushing the AIO build artifacts to the preview server
from inside a Travis job, the artifacts are built and hosted on the
CircleCI infrastructure. The preview server will then pull these
down after being triggered by a CircleCI build webhook.
This commit is contained in:
Pete Bacon Darwin 2018-05-09 18:54:13 +01:00
parent 8347bb0d2d
commit 364459c576
7 changed files with 43 additions and 79 deletions

View File

@ -148,6 +148,22 @@ jobs:
- run: bazel run @yarn//:yarn - run: bazel run @yarn//:yarn
- run: bazel query --output=label //... | xargs bazel test --define=compile=local --build_tag_filters=ivy-local --test_tag_filters=-manual,ivy-local - run: bazel query --output=label //... | xargs bazel test --define=compile=local --build_tag_filters=ivy-local --test_tag_filters=-manual,ivy-local
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
- run: ./aio/scripts/build-artifacts.sh $AIO_SNAPSHOT_ARTIFACT_PATH
- 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 exists only for backwards-compatibility with old scripts and tests # This job exists only for backwards-compatibility with old scripts and tests
# that rely on the pre-Bazel dist/packages-dist layout. # that rely on the pre-Bazel dist/packages-dist layout.
# It duplicates some work with the job above: we build the bazel packages # It duplicates some work with the job above: we build the bazel packages
@ -245,6 +261,7 @@ workflows:
- test_ivy_jit - test_ivy_jit
- test_ivy_aot - test_ivy_aot
- build-packages-dist - build-packages-dist
- aio_preview
- integration_test: - integration_test:
requires: requires:
- build-packages-dist - build-packages-dist
@ -273,3 +290,6 @@ workflows:
branches: branches:
only: only:
- master - master
notify:
webhooks:
- url: https://35.224.48.224/circle-build

View File

@ -13,6 +13,10 @@ EXPOSE 80 443
# Build-time args and env vars # Build-time args and env vars
# The AIO_ARTIFACT_PATH path needs to be kept in synch with the value of
# `aio_preview->steps->store_artifacts->destination` property in `.circleci/config.yml`
ARG AIO_ARTIFACT_PATH=aio/dist/aio-snapshot.tgz
ARG TEST_AIO_ARTIFACT_PATH=$AIO_ARTIFACT_PATH
ARG AIO_BUILDS_DIR=/var/www/aio-builds ARG AIO_BUILDS_DIR=/var/www/aio-builds
ARG TEST_AIO_BUILDS_DIR=/tmp/aio-builds ARG TEST_AIO_BUILDS_DIR=/tmp/aio-builds
ARG AIO_DOMAIN_NAME=ngbuilds.io ARG AIO_DOMAIN_NAME=ngbuilds.io

View File

@ -66,23 +66,16 @@ server {
return 200 ''; return 200 '';
} }
# Upload builds # Notify about CircleCI builds
location "~^/create-build/(?<pr>[1-9][0-9]*)/(?<sha>[0-9a-f]{40})/?$" { location "~^/circle-build/?$" {
if ($request_method != "POST") { if ($request_method != "POST") {
add_header Allow "POST"; add_header Allow "POST";
return 405; return 405;
} }
client_body_temp_path /tmp/aio-create-builds;
client_body_buffer_size 128K;
client_max_body_size {{$AIO_UPLOAD_MAX_SIZE}};
client_body_in_file_only on;
proxy_pass_request_headers on; proxy_pass_request_headers on;
proxy_set_header X-FILE $request_body_file;
proxy_set_body off;
proxy_redirect off; proxy_redirect off;
proxy_method GET; proxy_method POST;
proxy_pass http://{{$AIO_UPLOAD_HOSTNAME}}:{{$AIO_UPLOAD_PORT}}$request_uri; proxy_pass http://{{$AIO_UPLOAD_HOSTNAME}}:{{$AIO_UPLOAD_PORT}}$request_uri;
resolver 127.0.0.1; resolver 127.0.0.1;

View File

@ -35,7 +35,6 @@
"example-use-local": "node tools/ng-packages-installer overwrite ./tools/examples/shared --debug", "example-use-local": "node tools/ng-packages-installer overwrite ./tools/examples/shared --debug",
"example-use-npm": "node tools/ng-packages-installer restore ./tools/examples/shared", "example-use-npm": "node tools/ng-packages-installer restore ./tools/examples/shared",
"example-check-local": "node tools/ng-packages-installer check ./tools/examples/shared", "example-check-local": "node tools/ng-packages-installer check ./tools/examples/shared",
"deploy-preview": "scripts/deploy-preview.sh",
"deploy-production": "scripts/deploy-to-firebase.sh", "deploy-production": "scripts/deploy-to-firebase.sh",
"check-env": "yarn ~~check-env", "check-env": "yarn ~~check-env",
"postcheck-env": "yarn aio-check-local", "postcheck-env": "yarn aio-check-local",

16
aio/scripts/build-artifacts.sh Executable file
View File

@ -0,0 +1,16 @@
#!/usr/bin/env bash
set -eu -o pipefail
source "`dirname $0`/../../scripts/ci/env.sh" print
readonly INPUT_DIR=dist/
readonly OUTPUT_FILE=$PROJECT_ROOT/$1
(
cd $PROJECT_ROOT/aio
# Build and store the app
yarn build
mkdir -p "`dirname $OUTPUT_FILE`"
tar --create --gzip --directory "$INPUT_DIR" --file "$OUTPUT_FILE" .
)

View File

@ -1,58 +0,0 @@
#!/usr/bin/env bash
# WARNING: NGBUILDS_IO_KEY should NOT be printed.
set +x -eu -o pipefail
exec 3>&1
readonly INPUT_DIR=dist/
readonly OUTPUT_FILE=/tmp/snapshot.tar.gz
readonly AIO_BUILDS_DOMAIN=ngbuilds.io
readonly UPLOAD_URL=https://$AIO_BUILDS_DOMAIN/create-build/$TRAVIS_PULL_REQUEST/$TRAVIS_PULL_REQUEST_SHA
readonly SHORT_SHA=$(echo $TRAVIS_PULL_REQUEST_SHA | cut -c1-7)
readonly DEPLOYED_URL=https://pr$TRAVIS_PULL_REQUEST-$SHORT_SHA.$AIO_BUILDS_DOMAIN
readonly skipBuild=$([[ "$1" == "--skip-build" ]] && echo "true" || echo "");
readonly relevantChangedFilesCount=$(git diff --name-only $TRAVIS_COMMIT_RANGE | grep -P "^(?:aio|packages)/(?!.*[._]spec\.[jt]s$)" | wc -l)
(
cd "`dirname $0`/.."
# Do not deploy unless this PR has touched relevant files: `aio/` or `packages/` (except for spec files)
if [[ $relevantChangedFilesCount -eq 0 ]]; then
echo "Skipping deploy because this PR did not touch any relevant files."
exit 0
fi
# Build the app
if [[ "$skipBuild" != "true" ]]; then
yarn build
fi
tar --create --gzip --directory "$INPUT_DIR" --file "$OUTPUT_FILE" .
# Deploy to staging
readonly output=$(
curl --include --location --request POST --silent --write-out "\nHTTP_CODE: %{http_code}\n" \
--header "Authorization: Token $NGBUILDS_IO_KEY" --data-binary "@$OUTPUT_FILE" "$UPLOAD_URL" \
| sed 's/\r\n/\n/' \
| tee /dev/fd/3
)
readonly isHidden=$([[ `echo $output | grep 'non-public'` ]] && echo "true" || echo "")
readonly httpCode=$(echo "$output" | tail -1 | sed 's/HTTP_CODE: //')
# Exit with an error if the request failed.
# (Ignore 409 failures, which mean trying to re-deploy for the same PR/SHA.)
if [[ $httpCode -lt 200 ]] || ([[ $httpCode -ge 400 ]] && [[ $httpCode -ne 409 ]]); then
exit 1
fi
# Run PWA-score tests (unless the deployment is not public yet;
# i.e. it could not be automatically verified).
if [[ $httpCode -ne 202 ]] && [[ "$isHidden" != "true" ]]; then
yarn test-pwa-score "$DEPLOYED_URL" "$MIN_PWA_SCORE"
fi
# Check the bundle sizes.
yarn payload-size
)

View File

@ -25,16 +25,6 @@ if [[ ${CI_MODE:-} == "aio" ]]; then
( (
cd "`dirname $0`/../../aio" cd "`dirname $0`/../../aio"
yarn build yarn build
# If this is a PR for angular/angular@master or angular/angular@<stable-branch>, deploy a
# snapshot for previewing early (if preconditions are met) regardless of the test outcome.
if [[ ${TRAVIS_REPO_SLUG} == "angular/angular" ]] &&
([[ $TRAVIS_BRANCH == "master" ]] || [[ $TRAVIS_BRANCH == $STABLE_BRANCH ]]) &&
[[ $TRAVIS_PULL_REQUEST != "false" ]]; then
travisFoldStart "deploy.aio.pr-preview"
yarn deploy-preview --skip-build
travisFoldEnd "deploy.aio.pr-preview"
fi
) )
travisFoldEnd "build.aio" travisFoldEnd "build.aio"
exit 0; exit 0;