diff --git a/aio/aio-builds-setup/dockerbuild/Dockerfile b/aio/aio-builds-setup/dockerbuild/Dockerfile index 41887f4a0b..1145c41b64 100644 --- a/aio/aio-builds-setup/dockerbuild/Dockerfile +++ b/aio/aio-builds-setup/dockerbuild/Dockerfile @@ -38,12 +38,12 @@ ARG AIO_SIGNIFICANT_FILES_PATTERN='^(?:aio|packages)/(?!.*[._]spec\\.[jt]s$ ARG TEST_AIO_SIGNIFICANT_FILES_PATTERN=$AIO_SIGNIFICANT_FILES_PATTERN ARG AIO_TRUSTED_PR_LABEL="aio: preview" ARG TEST_AIO_TRUSTED_PR_LABEL="aio: preview" -ARG AIO_UPLOAD_HOSTNAME=upload.localhost -ARG TEST_AIO_UPLOAD_HOSTNAME=upload.localhost -ARG AIO_UPLOAD_MAX_SIZE=20971520 -ARG TEST_AIO_UPLOAD_MAX_SIZE=200 -ARG AIO_UPLOAD_PORT=3000 -ARG TEST_AIO_UPLOAD_PORT=3001 +ARG AIO_PREVIEW_SERVER_HOSTNAME=preview.localhost +ARG TEST_AIO_PREVIEW_SERVER_HOSTNAME=preview.localhost +ARG AIO_ARTIFACT_MAX_SIZE=20971520 +ARG TEST_AIO_ARTIFACT_MAX_SIZE=200 +ARG AIO_PREVIEW_SERVER_PORT=3000 +ARG TEST_AIO_PREVIEW_SERVER_PORT=3001 ENV AIO_ARTIFACT_PATH=$AIO_ARTIFACT_PATH TEST_AIO_ARTIFACT_PATH=$TEST_AIO_ARTIFACT_PATH \ AIO_BUILDS_DIR=$AIO_BUILDS_DIR TEST_AIO_BUILDS_DIR=$TEST_AIO_BUILDS_DIR \ @@ -60,9 +60,9 @@ ENV AIO_ARTIFACT_PATH=$AIO_ARTIFACT_PATH TEST_AIO_ARTIF AIO_SCRIPTS_SH_DIR=/usr/share/aio-scripts-sh \ AIO_SIGNIFICANT_FILES_PATTERN=$AIO_SIGNIFICANT_FILES_PATTERN TEST_AIO_SIGNIFICANT_FILES_PATTERN=$TEST_AIO_SIGNIFICANT_FILES_PATTERN \ AIO_TRUSTED_PR_LABEL=$AIO_TRUSTED_PR_LABEL TEST_AIO_TRUSTED_PR_LABEL=$TEST_AIO_TRUSTED_PR_LABEL \ - AIO_UPLOAD_HOSTNAME=$AIO_UPLOAD_HOSTNAME TEST_AIO_UPLOAD_HOSTNAME=$TEST_AIO_UPLOAD_HOSTNAME \ - AIO_UPLOAD_MAX_SIZE=$AIO_UPLOAD_MAX_SIZE TEST_AIO_UPLOAD_MAX_SIZE=$TEST_AIO_UPLOAD_MAX_SIZE \ - AIO_UPLOAD_PORT=$AIO_UPLOAD_PORT TEST_AIO_UPLOAD_PORT=$TEST_AIO_UPLOAD_PORT \ + AIO_PREVIEW_SERVER_HOSTNAME=$AIO_PREVIEW_SERVER_HOSTNAME TEST_AIO_PREVIEW_SERVER_HOSTNAME=$TEST_AIO_PREVIEW_SERVER_HOSTNAME \ + AIO_ARTIFACT_MAX_SIZE=$AIO_ARTIFACT_MAX_SIZE TEST_AIO_ARTIFACT_MAX_SIZE=$TEST_AIO_ARTIFACT_MAX_SIZE \ + AIO_PREVIEW_SERVER_PORT=$AIO_PREVIEW_SERVER_PORT TEST_AIO_PREVIEW_SERVER_PORT=$TEST_AIO_PREVIEW_SERVER_PORT \ AIO_WWW_USER=www-data \ NODE_ENV=production @@ -108,9 +108,9 @@ RUN printenv | grep AIO_ >> /etc/environment # Set up dnsmasq COPY dnsmasq/dnsmasq.conf /etc/ RUN sed -i "s|{{\$AIO_NGINX_HOSTNAME}}|$AIO_NGINX_HOSTNAME|g" /etc/dnsmasq.conf -RUN sed -i "s|{{\$AIO_UPLOAD_HOSTNAME}}|$AIO_UPLOAD_HOSTNAME|g" /etc/dnsmasq.conf +RUN sed -i "s|{{\$AIO_PREVIEW_SERVER_HOSTNAME}}|$AIO_PREVIEW_SERVER_HOSTNAME|g" /etc/dnsmasq.conf RUN sed -i "s|{{\$TEST_AIO_NGINX_HOSTNAME}}|$TEST_AIO_NGINX_HOSTNAME|g" /etc/dnsmasq.conf -RUN sed -i "s|{{\$TEST_AIO_UPLOAD_HOSTNAME}}|$TEST_AIO_UPLOAD_HOSTNAME|g" /etc/dnsmasq.conf +RUN sed -i "s|{{\$TEST_AIO_PREVIEW_SERVER_HOSTNAME}}|$TEST_AIO_PREVIEW_SERVER_HOSTNAME|g" /etc/dnsmasq.conf # Set up SSL/TLS certificates @@ -134,9 +134,9 @@ RUN sed -i "s|{{\$AIO_LOCALCERTS_DIR}}|$AIO_LOCALCERTS_DIR|g" /etc/nginx/conf.d/ RUN sed -i "s|{{\$AIO_NGINX_LOGS_DIR}}|$AIO_NGINX_LOGS_DIR|g" /etc/nginx/conf.d/aio-builds-prod.conf RUN sed -i "s|{{\$AIO_NGINX_PORT_HTTP}}|$AIO_NGINX_PORT_HTTP|g" /etc/nginx/conf.d/aio-builds-prod.conf RUN sed -i "s|{{\$AIO_NGINX_PORT_HTTPS}}|$AIO_NGINX_PORT_HTTPS|g" /etc/nginx/conf.d/aio-builds-prod.conf -RUN sed -i "s|{{\$AIO_UPLOAD_HOSTNAME}}|$AIO_UPLOAD_HOSTNAME|g" /etc/nginx/conf.d/aio-builds-prod.conf -RUN sed -i "s|{{\$AIO_UPLOAD_MAX_SIZE}}|$AIO_UPLOAD_MAX_SIZE|g" /etc/nginx/conf.d/aio-builds-prod.conf -RUN sed -i "s|{{\$AIO_UPLOAD_PORT}}|$AIO_UPLOAD_PORT|g" /etc/nginx/conf.d/aio-builds-prod.conf +RUN sed -i "s|{{\$AIO_PREVIEW_SERVER_HOSTNAME}}|$AIO_PREVIEW_SERVER_HOSTNAME|g" /etc/nginx/conf.d/aio-builds-prod.conf +RUN sed -i "s|{{\$AIO_ARTIFACT_MAX_SIZE}}|$AIO_ARTIFACT_MAX_SIZE|g" /etc/nginx/conf.d/aio-builds-prod.conf +RUN sed -i "s|{{\$AIO_PREVIEW_SERVER_PORT}}|$AIO_PREVIEW_SERVER_PORT|g" /etc/nginx/conf.d/aio-builds-prod.conf COPY nginx/aio-builds.conf /etc/nginx/conf.d/aio-builds-test.conf RUN sed -i "s|{{\$AIO_BUILDS_DIR}}|$TEST_AIO_BUILDS_DIR|g" /etc/nginx/conf.d/aio-builds-test.conf @@ -145,9 +145,9 @@ RUN sed -i "s|{{\$AIO_LOCALCERTS_DIR}}|$TEST_AIO_LOCALCERTS_DIR|g" /etc/nginx/co RUN sed -i "s|{{\$AIO_NGINX_LOGS_DIR}}|$TEST_AIO_NGINX_LOGS_DIR|g" /etc/nginx/conf.d/aio-builds-test.conf RUN sed -i "s|{{\$AIO_NGINX_PORT_HTTP}}|$TEST_AIO_NGINX_PORT_HTTP|g" /etc/nginx/conf.d/aio-builds-test.conf RUN sed -i "s|{{\$AIO_NGINX_PORT_HTTPS}}|$TEST_AIO_NGINX_PORT_HTTPS|g" /etc/nginx/conf.d/aio-builds-test.conf -RUN sed -i "s|{{\$AIO_UPLOAD_HOSTNAME}}|$TEST_AIO_UPLOAD_HOSTNAME|g" /etc/nginx/conf.d/aio-builds-test.conf -RUN sed -i "s|{{\$AIO_UPLOAD_MAX_SIZE}}|$TEST_AIO_UPLOAD_MAX_SIZE|g" /etc/nginx/conf.d/aio-builds-test.conf -RUN sed -i "s|{{\$AIO_UPLOAD_PORT}}|$TEST_AIO_UPLOAD_PORT|g" /etc/nginx/conf.d/aio-builds-test.conf +RUN sed -i "s|{{\$AIO_PREVIEW_SERVER_HOSTNAME}}|$TEST_AIO_PREVIEW_SERVER_HOSTNAME|g" /etc/nginx/conf.d/aio-builds-test.conf +RUN sed -i "s|{{\$AIO_ARTIFACT_MAX_SIZE}}|$TEST_AIO_ARTIFACT_MAX_SIZE|g" /etc/nginx/conf.d/aio-builds-test.conf +RUN sed -i "s|{{\$AIO_PREVIEW_SERVER_PORT}}|$TEST_AIO_PREVIEW_SERVER_PORT|g" /etc/nginx/conf.d/aio-builds-test.conf # Set up pm2 diff --git a/aio/aio-builds-setup/dockerbuild/dnsmasq/dnsmasq.conf b/aio/aio-builds-setup/dockerbuild/dnsmasq/dnsmasq.conf index 231625141c..af43feeb2e 100644 --- a/aio/aio-builds-setup/dockerbuild/dnsmasq/dnsmasq.conf +++ b/aio/aio-builds-setup/dockerbuild/dnsmasq/dnsmasq.conf @@ -8,9 +8,9 @@ listen-address=127.0.0.1 # Force an IP address for these domains. address=/{{$AIO_NGINX_HOSTNAME}}/127.0.0.1 -address=/{{$AIO_UPLOAD_HOSTNAME}}/127.0.0.1 +address=/{{$AIO_PREVIEW_SERVER_HOSTNAME}}/127.0.0.1 address=/{{$TEST_AIO_NGINX_HOSTNAME}}/127.0.0.1 -address=/{{$TEST_AIO_UPLOAD_HOSTNAME}}/127.0.0.1 +address=/{{$TEST_AIO_PREVIEW_SERVER_HOSTNAME}}/127.0.0.1 # Run as root (required from inside docker container). user=root diff --git a/aio/aio-builds-setup/dockerbuild/logrotate/aio-upload-server b/aio/aio-builds-setup/dockerbuild/logrotate/aio-preview-server similarity index 71% rename from aio/aio-builds-setup/dockerbuild/logrotate/aio-upload-server rename to aio/aio-builds-setup/dockerbuild/logrotate/aio-preview-server index d3f2fc6188..3fe5d31f88 100644 --- a/aio/aio-builds-setup/dockerbuild/logrotate/aio-upload-server +++ b/aio/aio-builds-setup/dockerbuild/logrotate/aio-preview-server @@ -1,4 +1,4 @@ -/var/log/aio/upload-server-*.log { +/var/log/aio/preview-server-*.log { compress copytruncate delaycompress diff --git a/aio/aio-builds-setup/dockerbuild/nginx/aio-builds.conf b/aio/aio-builds-setup/dockerbuild/nginx/aio-builds.conf index 6399bfab3c..74b38efa69 100644 --- a/aio/aio-builds-setup/dockerbuild/nginx/aio-builds.conf +++ b/aio/aio-builds-setup/dockerbuild/nginx/aio-builds.conf @@ -76,7 +76,7 @@ server { proxy_pass_request_headers on; proxy_redirect off; proxy_method POST; - proxy_pass http://{{$AIO_UPLOAD_HOSTNAME}}:{{$AIO_UPLOAD_PORT}}$request_uri; + proxy_pass http://{{$AIO_PREVIEW_SERVER_HOSTNAME}}:{{$AIO_PREVIEW_SERVER_PORT}}$request_uri; resolver 127.0.0.1; } @@ -91,7 +91,7 @@ server { proxy_pass_request_headers on; proxy_redirect off; proxy_method POST; - proxy_pass http://{{$AIO_UPLOAD_HOSTNAME}}:{{$AIO_UPLOAD_PORT}}$request_uri; + proxy_pass http://{{$AIO_PREVIEW_SERVER_HOSTNAME}}:{{$AIO_PREVIEW_SERVER_PORT}}$request_uri; resolver 127.0.0.1; } diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/common/env-variables.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/common/env-variables.ts index bc55c90d9c..1383836d1e 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/common/env-variables.ts +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/common/env-variables.ts @@ -13,7 +13,7 @@ export const AIO_NGINX_PORT_HTTP = +getEnvVar('AIO_NGINX_PORT_HTTP'); export const AIO_NGINX_PORT_HTTPS = +getEnvVar('AIO_NGINX_PORT_HTTPS'); export const AIO_SIGNIFICANT_FILES_PATTERN = getEnvVar('AIO_SIGNIFICANT_FILES_PATTERN'); export const AIO_TRUSTED_PR_LABEL = getEnvVar('AIO_TRUSTED_PR_LABEL'); -export const AIO_UPLOAD_HOSTNAME = getEnvVar('AIO_UPLOAD_HOSTNAME'); -export const AIO_UPLOAD_PORT = +getEnvVar('AIO_UPLOAD_PORT'); -export const AIO_UPLOAD_MAX_SIZE = +getEnvVar('AIO_UPLOAD_MAX_SIZE'); +export const AIO_PREVIEW_SERVER_HOSTNAME = getEnvVar('AIO_PREVIEW_SERVER_HOSTNAME'); +export const AIO_PREVIEW_SERVER_PORT = +getEnvVar('AIO_PREVIEW_SERVER_PORT'); +export const AIO_ARTIFACT_MAX_SIZE = +getEnvVar('AIO_ARTIFACT_MAX_SIZE'); export const AIO_WWW_USER = getEnvVar('AIO_WWW_USER'); diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/common/github-pull-requests.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/common/github-pull-requests.ts index 92241300b3..62d832fbf1 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/common/github-pull-requests.ts +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/common/github-pull-requests.ts @@ -1,5 +1,5 @@ -import {assert, assertNotMissingOrEmpty} from '../common/utils'; import {GithubApi} from './github-api'; +import {assert, assertNotMissingOrEmpty} from './utils'; export interface PullRequest { number: number; diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/common/github-teams.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/common/github-teams.ts index 99199b65e7..e1657ce979 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/common/github-teams.ts +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/common/github-teams.ts @@ -1,5 +1,5 @@ -import {assertNotMissingOrEmpty} from '../common/utils'; import {GithubApi} from './github-api'; +import {assertNotMissingOrEmpty} from './utils'; export interface Team { id: number; diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/build-creator.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/build-creator.ts similarity index 88% rename from aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/build-creator.ts rename to aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/build-creator.ts index 97f3f787d3..6a93c155d8 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/build-creator.ts +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/build-creator.ts @@ -7,7 +7,7 @@ import * as shell from 'shelljs'; import {HIDDEN_DIR_PREFIX} from '../common/constants'; import {assertNotMissingOrEmpty, computeShortSha, createLogger} from '../common/utils'; import {ChangedPrVisibilityEvent, CreatedBuildEvent} from './build-events'; -import {UploadError} from './upload-error'; +import {PreviewServerError} from './preview-error'; // Classes export class BuildCreator extends EventEmitter { @@ -36,7 +36,7 @@ export class BuildCreator extends EventEmitter { then(([prDirExisted, shaDirExisted]) => { if (shaDirExisted) { const publicOrNot = isPublic ? 'public' : 'non-public'; - throw new UploadError(409, `Request to overwrite existing ${publicOrNot} directory: ${shaDir}`); + throw new PreviewServerError(409, `Request to overwrite existing ${publicOrNot} directory: ${shaDir}`); } dirToRemoveOnError = prDirExisted ? shaDir : prDir; @@ -52,8 +52,8 @@ export class BuildCreator extends EventEmitter { shell.rm('-rf', dirToRemoveOnError); } - if (!(err instanceof UploadError)) { - err = new UploadError(500, `Error while uploading to directory: ${shaDir}\n${err}`); + if (!(err instanceof PreviewServerError)) { + err = new PreviewServerError(500, `Error while creating preview at: ${shaDir}\n${err}`); } throw err; @@ -71,7 +71,8 @@ export class BuildCreator extends EventEmitter { return false; } else if (targetVisPrDirExisted) { // Error: Directories for both visibilities exist. - throw new UploadError(409, `Request to move '${otherVisPrDir}' to existing directory '${targetVisPrDir}'.`); + throw new PreviewServerError(409, + `Request to move '${otherVisPrDir}' to existing directory '${targetVisPrDir}'.`); } // Visibility change: Moving `otherVisPrDir` to `targetVisPrDir`. @@ -82,8 +83,8 @@ export class BuildCreator extends EventEmitter { then(() => true); }). catch(err => { - if (!(err instanceof UploadError)) { - err = new UploadError(500, `Error while making PR ${pr} ${makePublic ? 'public' : 'hidden'}.\n${err}`); + if (!(err instanceof PreviewServerError)) { + err = new PreviewServerError(500, `Error while making PR ${pr} ${makePublic ? 'public' : 'hidden'}.\n${err}`); } throw err; diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/build-events.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/build-events.ts similarity index 100% rename from aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/build-events.ts rename to aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/build-events.ts diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/build-retriever.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/build-retriever.ts similarity index 91% rename from aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/build-retriever.ts rename to aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/build-retriever.ts index b59e06a39b..34b05103f6 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/build-retriever.ts +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/build-retriever.ts @@ -5,7 +5,7 @@ import {mkdir} from 'shelljs'; import {promisify} from 'util'; import {CircleCiApi} from '../common/circle-ci-api'; import {assert, assertNotMissingOrEmpty, computeArtifactDownloadPath, createLogger} from '../common/utils'; -import {UploadError} from '../upload-server/upload-error'; +import {PreviewServerError} from './preview-error'; export interface GithubInfo { org: string; @@ -58,7 +58,7 @@ export class BuildRetriever { const url = await this.api.getBuildArtifactUrl(buildNum, artifactPath); const response = await fetch(url, {size: this.downloadSizeLimit}); if (response.status !== 200) { - throw new UploadError(response.status, `Error ${response.status} - ${response.statusText}`); + throw new PreviewServerError(response.status, `Error ${response.status} - ${response.statusText}`); } const buffer = await response.buffer(); mkdir('-p', dirname(outPath)); @@ -68,7 +68,7 @@ export class BuildRetriever { } catch (error) { this.logger.warn(error); const status = (error.type === 'max-size') ? 413 : 500; - throw new UploadError(status, `CircleCI artifact download failed (${error.message || error})`); + throw new PreviewServerError(status, `CircleCI artifact download failed (${error.message || error})`); } } } diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/build-verifier.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/build-verifier.ts similarity index 100% rename from aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/build-verifier.ts rename to aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/build-verifier.ts diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/index.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/index.ts similarity index 75% rename from aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/index.ts rename to aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/index.ts index 91400f8208..90780bc8de 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/index.ts +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/index.ts @@ -1,6 +1,7 @@ // Imports import {AIO_DOWNLOADS_DIR} from '../common/constants'; import { + AIO_ARTIFACT_MAX_SIZE, AIO_ARTIFACT_PATH, AIO_BUILDS_DIR, AIO_CIRCLE_CI_TOKEN, @@ -9,26 +10,25 @@ import { AIO_GITHUB_REPO, AIO_GITHUB_TEAM_SLUGS, AIO_GITHUB_TOKEN, + AIO_PREVIEW_SERVER_HOSTNAME, + AIO_PREVIEW_SERVER_PORT, AIO_SIGNIFICANT_FILES_PATTERN, AIO_TRUSTED_PR_LABEL, - AIO_UPLOAD_HOSTNAME, - AIO_UPLOAD_MAX_SIZE, - AIO_UPLOAD_PORT, } from '../common/env-variables'; -import {UploadServerFactory} from './upload-server-factory'; +import {PreviewServerFactory} from './preview-server-factory'; // Run _main(); // Functions function _main(): void { - UploadServerFactory + PreviewServerFactory .create({ buildArtifactPath: AIO_ARTIFACT_PATH, buildsDir: AIO_BUILDS_DIR, circleCiToken: AIO_CIRCLE_CI_TOKEN, domainName: AIO_DOMAIN_NAME, - downloadSizeLimit: AIO_UPLOAD_MAX_SIZE, + downloadSizeLimit: AIO_ARTIFACT_MAX_SIZE, downloadsDir: AIO_DOWNLOADS_DIR, githubOrg: AIO_GITHUB_ORGANIZATION, githubRepo: AIO_GITHUB_REPO, @@ -37,5 +37,5 @@ function _main(): void { significantFilesPattern: AIO_SIGNIFICANT_FILES_PATTERN, trustedPrLabel: AIO_TRUSTED_PR_LABEL, }) - .listen(AIO_UPLOAD_PORT, AIO_UPLOAD_HOSTNAME); + .listen(AIO_PREVIEW_SERVER_PORT, AIO_PREVIEW_SERVER_HOSTNAME); } diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/upload-error.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/preview-error.ts similarity index 51% rename from aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/upload-error.ts rename to aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/preview-error.ts index 877a3c2baf..af23b26cd0 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/upload-error.ts +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/preview-error.ts @@ -1,8 +1,8 @@ // Classes -export class UploadError extends Error { +export class PreviewServerError extends Error { // Constructor constructor(public status: number = 500, message?: string) { super(message); - Object.setPrototypeOf(this, UploadError.prototype); + Object.setPrototypeOf(this, PreviewServerError.prototype); } } diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/upload-server-factory.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/preview-server-factory.ts similarity index 92% rename from aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/upload-server-factory.ts rename to aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/preview-server-factory.ts index f1facfa6d3..d1b26a23cf 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/upload-server-factory.ts +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/preview-server-factory.ts @@ -16,7 +16,7 @@ import {respondWithError, throwRequestError} from './utils'; const AIO_PREVIEW_JOB = 'aio_preview'; // Interfaces - Types -export interface UploadServerConfig { +export interface PreviewServerConfig { downloadsDir: string; downloadSizeLimit: number; buildArtifactPath: string; @@ -31,12 +31,12 @@ export interface UploadServerConfig { trustedPrLabel: string; } -const logger = createLogger('UploadServer'); +const logger = createLogger('PreviewServer'); // Classes -export class UploadServerFactory { +export class PreviewServerFactory { // Methods - Public - public static create(cfg: UploadServerConfig): http.Server { + public static create(cfg: PreviewServerConfig): http.Server { assertNotMissingOrEmpty('domainName', cfg.domainName); const circleCiApi = new CircleCiApi(cfg.githubOrg, cfg.githubRepo, cfg.circleCiToken); @@ -46,9 +46,9 @@ export class UploadServerFactory { const buildRetriever = new BuildRetriever(circleCiApi, cfg.downloadSizeLimit, cfg.downloadsDir); const buildVerifier = new BuildVerifier(prs, teams, cfg.githubTeamSlugs, cfg.trustedPrLabel); - const buildCreator = UploadServerFactory.createBuildCreator(prs, cfg.buildsDir, cfg.domainName); + const buildCreator = PreviewServerFactory.createBuildCreator(prs, cfg.buildsDir, cfg.domainName); - const middleware = UploadServerFactory.createMiddleware(buildRetriever, buildVerifier, buildCreator, cfg); + const middleware = PreviewServerFactory.createMiddleware(buildRetriever, buildVerifier, buildCreator, cfg); const httpServer = http.createServer(middleware as any); httpServer.on('listening', () => { @@ -60,7 +60,7 @@ export class UploadServerFactory { } public static createMiddleware(buildRetriever: BuildRetriever, buildVerifier: BuildVerifier, - buildCreator: BuildCreator, cfg: UploadServerConfig): express.Express { + buildCreator: BuildCreator, cfg: PreviewServerConfig): express.Express { const middleware = express(); const jsonParser = bodyParser.json(); @@ -149,7 +149,7 @@ export class UploadServerFactory { middleware.all('*', req => throwRequestError(404, 'Unknown resource', req)); middleware.use((err: any, _req: any, res: express.Response, _next: any) => { const statusText = http.STATUS_CODES[err.status] || '???'; - logger.error(`Upload error: ${err.status} - ${statusText}:`, err.message); + logger.error(`Preview server error: ${err.status} - ${statusText}:`, err.message); respondWithError(res, err); }); diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/utils.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/utils.ts similarity index 80% rename from aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/utils.ts rename to aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/utils.ts index 743468e7b8..00f1df0aba 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/utils.ts +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/preview-server/utils.ts @@ -1,6 +1,6 @@ import * as express from 'express'; import {promisify} from 'util'; -import {UploadError} from './upload-error'; +import {PreviewServerError} from './preview-error'; /** * Update the response to report that an error has occurred. @@ -8,8 +8,8 @@ import {UploadError} from './upload-error'; * @param err The error that needs to be reported. */ export async function respondWithError(res: express.Response, err: any): Promise { - if (!(err instanceof UploadError)) { - err = new UploadError(500, String((err && err.message) || err)); + if (!(err instanceof PreviewServerError)) { + err = new PreviewServerError(500, String((err && err.message) || err)); } res.status(err.status); @@ -25,5 +25,5 @@ export async function respondWithError(res: express.Response, err: any): Promise export function throwRequestError(status: number, error: string, req: express.Request): never { const message = `${error} in request: ${req.method} ${req.originalUrl}` + (!req.body ? '' : ` ${JSON.stringify(req.body)}`); - throw new UploadError(status, message); + throw new PreviewServerError(status, message); } diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/mock-external-apis.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/mock-external-apis.ts index 7b5583457f..050bbb9102 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/mock-external-apis.ts +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/mock-external-apis.ts @@ -6,9 +6,9 @@ import {createLogger, getEnvVar} from '../common/utils'; import {BuildNums, PrNums, SHA} from './constants'; // We are using the `nock` library to fake responses from REST requests, when testing. -// This is necessary, because the test upload-server runs as a separate node process to +// This is necessary, because the test preview-server runs as a separate node process to // the test harness, so we do not have direct access to the code (e.g. for mocking). -// (See also 'lib/verify-setup/start-test-upload-server.ts'.) +// (See also 'lib/verify-setup/start-test-preview-server.ts'.) // Each of the potential requests to an external API (e.g. Github or CircleCI) are mocked // below and return a suitable response. This is quite complicated to setup since the diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/nginx.e2e.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/nginx.e2e.ts index 3dd639d470..1979a621de 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/nginx.e2e.ts +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/nginx.e2e.ts @@ -266,7 +266,7 @@ describe(`nginx`, () => { }); - it('should pass requests through to the upload server', done => { + it('should pass requests through to the preview server', done => { h.runCmd(`curl -iLX POST ${scheme}://${host}/circle-build`). then(h.verifyResponse(400, /Incorrect body content. Expected JSON/)). then(done); @@ -304,7 +304,7 @@ describe(`nginx`, () => { }); - it('should pass requests through to the upload server', done => { + it('should pass requests through to the preview server', done => { const cmdPrefix = `curl -iLX POST --header "Content-Type: application/json"`; const cmd1 = `${cmdPrefix} ${url}`; diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/upload-server.e2e.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/preview-server.e2e.ts similarity index 98% rename from aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/upload-server.e2e.ts rename to aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/preview-server.e2e.ts index 2387a36a99..8ae9bf77e7 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/upload-server.e2e.ts +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/preview-server.e2e.ts @@ -1,16 +1,16 @@ // Imports import * as fs from 'fs'; import {join} from 'path'; -import {AIO_UPLOAD_HOSTNAME, AIO_UPLOAD_PORT, AIO_WWW_USER} from '../common/env-variables'; +import {AIO_PREVIEW_SERVER_HOSTNAME, AIO_PREVIEW_SERVER_PORT, AIO_WWW_USER} from '../common/env-variables'; import {computeShortSha} from '../common/utils'; import {ALT_SHA, BuildNums, PrNums, SHA, SIMILAR_SHA} from './constants'; import {helper as h, makeCurl, payload} from './helper'; import {customMatchers} from './jasmine-custom-matchers'; // Tests -describe('upload-server', () => { - const hostname = AIO_UPLOAD_HOSTNAME; - const port = AIO_UPLOAD_PORT; +describe('preview-server', () => { + const hostname = AIO_PREVIEW_SERVER_HOSTNAME; + const port = AIO_PREVIEW_SERVER_PORT; const host = `http://${hostname}:${port}`; beforeEach(() => jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000); @@ -122,7 +122,7 @@ describe('upload-server', () => { describe(`for ${label} builds`, () => { - it('should extract the contents of the uploaded file', async () => { + it('should extract the contents of the build artifact', async () => { await curl(payload(build)) .then(h.verifyResponse(statusCode)); expect(h.readBuildFile(prNum, SHA, 'index.html', isPublic)) @@ -148,7 +148,7 @@ describe('upload-server', () => { expect({ prNum, isPublic }).toExistAsABuild(); }); - it('should delete the uploaded file', async () => { + it('should delete the build artifact file', async () => { await curl(payload(build)) .then(h.verifyResponse(statusCode)); expect({ prNum, SHA }).not.toExistAsAnArtifact(); diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/server-integration.e2e.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/server-integration.e2e.ts index 13caad776d..83755dda3a 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/server-integration.e2e.ts +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/server-integration.e2e.ts @@ -25,7 +25,7 @@ h.runForAllSupportedSchemes((scheme, port) => describe(`integration (on ${scheme describe('for a new/non-existing PR', () => { - it('should be able to upload and serve a public build', async () => { + it('should be able to create and serve a public preview', async () => { const BUILD = BuildNums.TRUST_CHECK_ACTIVE_TRUSTED_USER; const PR = PrNums.TRUST_CHECK_ACTIVE_TRUSTED_USER; @@ -44,7 +44,7 @@ h.runForAllSupportedSchemes((scheme, port) => describe(`integration (on ${scheme }); - it('should be able to upload but not serve a hidden build', async () => { + it('should be able to create but not serve a hidden preview', async () => { const BUILD = BuildNums.TRUST_CHECK_UNTRUSTED; const PR = PrNums.TRUST_CHECK_UNTRUSTED; @@ -59,7 +59,7 @@ h.runForAllSupportedSchemes((scheme, port) => describe(`integration (on ${scheme }); - it('should reject an upload if verification fails', async () => { + it('should reject if verification fails', async () => { const BUILD = BuildNums.TRUST_CHECK_ERROR; const PR = PrNums.TRUST_CHECK_ERROR; @@ -82,7 +82,7 @@ h.runForAllSupportedSchemes((scheme, port) => describe(`integration (on ${scheme describe('for an existing PR', () => { - it('should be able to upload and serve a public build', async () => { + it('should be able to create and serve a public preview', async () => { const BUILD = BuildNums.TRUST_CHECK_ACTIVE_TRUSTED_USER; const PR = PrNums.TRUST_CHECK_ACTIVE_TRUSTED_USER; @@ -108,7 +108,7 @@ h.runForAllSupportedSchemes((scheme, port) => describe(`integration (on ${scheme }); - it('should be able to upload but not serve a hidden build', async () => { + it('should be able to create but not serve a hidden preview', async () => { const BUILD = BuildNums.TRUST_CHECK_UNTRUSTED; const PR = PrNums.TRUST_CHECK_UNTRUSTED; @@ -129,7 +129,7 @@ h.runForAllSupportedSchemes((scheme, port) => describe(`integration (on ${scheme }); - it('should reject an upload if verification fails', async () => { + it('should reject if verification fails', async () => { const BUILD = BuildNums.TRUST_CHECK_ERROR; const PR = PrNums.TRUST_CHECK_ERROR; @@ -144,7 +144,7 @@ h.runForAllSupportedSchemes((scheme, port) => describe(`integration (on ${scheme }); - it('should not be able to overwrite an existing public build', async () => { + it('should not be able to overwrite an existing public preview', async () => { const BUILD = BuildNums.TRUST_CHECK_ACTIVE_TRUSTED_USER; const PR = PrNums.TRUST_CHECK_ACTIVE_TRUSTED_USER; @@ -165,7 +165,7 @@ h.runForAllSupportedSchemes((scheme, port) => describe(`integration (on ${scheme }); - it('should not be able to overwrite an existing hidden build', async () => { + it('should not be able to overwrite an existing hidden preview', async () => { const BUILD = BuildNums.TRUST_CHECK_UNTRUSTED; const PR = PrNums.TRUST_CHECK_UNTRUSTED; h.createDummyBuild(PR, SHA, false); diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/start-test-upload-server.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/start-test-preview-server.ts similarity index 52% rename from aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/start-test-upload-server.ts rename to aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/start-test-preview-server.ts index 455e3ad4a2..cc1cfd19de 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/start-test-upload-server.ts +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/lib/verify-setup/start-test-preview-server.ts @@ -1,2 +1,2 @@ -import '../upload-server'; +import '../preview-server'; import './mock-external-apis'; diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/build-creator.spec.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/build-creator.spec.ts similarity index 92% rename from aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/build-creator.spec.ts rename to aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/build-creator.spec.ts index a90e10fca4..5f0d5db171 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/build-creator.spec.ts +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/build-creator.spec.ts @@ -5,10 +5,10 @@ import * as fs from 'fs'; import * as path from 'path'; import * as shell from 'shelljs'; import {SHORT_SHA_LEN} from '../../lib/common/constants'; -import {BuildCreator} from '../../lib/upload-server/build-creator'; -import {ChangedPrVisibilityEvent, CreatedBuildEvent} from '../../lib/upload-server/build-events'; -import {UploadError} from '../../lib/upload-server/upload-error'; -import {expectToBeUploadError} from './helpers'; +import {BuildCreator} from '../../lib/preview-server/build-creator'; +import {ChangedPrVisibilityEvent, CreatedBuildEvent} from '../../lib/preview-server/build-events'; +import {PreviewServerError} from '../../lib/preview-server/preview-error'; +import {expectToBePreviewServerError} from './helpers'; // Tests describe('BuildCreator', () => { @@ -134,7 +134,7 @@ describe('BuildCreator', () => { it('should abort and skip further operations if changing the PR\'s visibility fails', done => { - const mockError = new UploadError(543, 'Test'); + const mockError = new PreviewServerError(543, 'Test'); bcUpdatePrVisibilitySpy.and.callFake(() => Promise.reject(mockError)); bc.create(pr, sha, archive, isPublic).catch(err => { @@ -154,7 +154,7 @@ describe('BuildCreator', () => { existsValues[shaDir] = true; bc.create(pr, sha, archive, isPublic).catch(err => { const publicOrNot = isPublic ? 'public' : 'non-public'; - expectToBeUploadError(err, 409, `Request to overwrite existing ${publicOrNot} directory: ${shaDir}`); + expectToBePreviewServerError(err, 409, `Request to overwrite existing ${publicOrNot} directory: ${shaDir}`); expect(shellMkdirSpy).not.toHaveBeenCalled(); expect(bcExtractArchiveSpy).not.toHaveBeenCalled(); expect(bcEmitSpy).not.toHaveBeenCalled(); @@ -171,7 +171,7 @@ describe('BuildCreator', () => { bc.create(pr, sha, archive, isPublic).catch(err => { const publicOrNot = isPublic ? 'public' : 'non-public'; - expectToBeUploadError(err, 409, `Request to overwrite existing ${publicOrNot} directory: ${shaDir}`); + expectToBePreviewServerError(err, 409, `Request to overwrite existing ${publicOrNot} directory: ${shaDir}`); expect(shellMkdirSpy).not.toHaveBeenCalled(); expect(bcExtractArchiveSpy).not.toHaveBeenCalled(); expect(bcEmitSpy).not.toHaveBeenCalled(); @@ -222,20 +222,20 @@ describe('BuildCreator', () => { }); - it('should reject with an UploadError', done => { + it('should reject with an PreviewServerError', done => { // tslint:disable-next-line: no-string-throw shellMkdirSpy.and.callFake(() => { throw 'Test'; }); bc.create(pr, sha, archive, isPublic).catch(err => { - expectToBeUploadError(err, 500, `Error while uploading to directory: ${shaDir}\nTest`); + expectToBePreviewServerError(err, 500, `Error while creating preview at: ${shaDir}\nTest`); done(); }); }); - it('should pass UploadError instances unmodified', done => { - shellMkdirSpy.and.callFake(() => { throw new UploadError(543, 'Test'); }); + it('should pass PreviewServerError instances unmodified', done => { + shellMkdirSpy.and.callFake(() => { throw new PreviewServerError(543, 'Test'); }); bc.create(pr, sha, archive, isPublic).catch(err => { - expectToBeUploadError(err, 543, 'Test'); + expectToBePreviewServerError(err, 543, 'Test'); done(); }); }); @@ -376,7 +376,8 @@ describe('BuildCreator', () => { it('should abort and skip further operations if both directories exist', done => { bcExistsSpy.and.returnValue(true); bc.updatePrVisibility(pr, makePublic).catch(err => { - expectToBeUploadError(err, 409, `Request to move '${oldPrDir}' to existing directory '${newPrDir}'.`); + expectToBePreviewServerError(err, 409, + `Request to move '${oldPrDir}' to existing directory '${newPrDir}'.`); expect(shellMvSpy).not.toHaveBeenCalled(); expect(bcListShasByDate).not.toHaveBeenCalled(); expect(bcEmitSpy).not.toHaveBeenCalled(); @@ -407,20 +408,21 @@ describe('BuildCreator', () => { }); - it('should reject with an UploadError', done => { + it('should reject with an PreviewServerError', done => { // tslint:disable-next-line: no-string-throw shellMvSpy.and.callFake(() => { throw 'Test'; }); bc.updatePrVisibility(pr, makePublic).catch(err => { - expectToBeUploadError(err, 500, `Error while making PR ${pr} ${makePublic ? 'public' : 'hidden'}.\nTest`); + expectToBePreviewServerError(err, 500, + `Error while making PR ${pr} ${makePublic ? 'public' : 'hidden'}.\nTest`); done(); }); }); - it('should pass UploadError instances unmodified', done => { - shellMvSpy.and.callFake(() => { throw new UploadError(543, 'Test'); }); + it('should pass PreviewServerError instances unmodified', done => { + shellMvSpy.and.callFake(() => { throw new PreviewServerError(543, 'Test'); }); bc.updatePrVisibility(pr, makePublic).catch(err => { - expectToBeUploadError(err, 543, 'Test'); + expectToBePreviewServerError(err, 543, 'Test'); done(); }); }); @@ -528,7 +530,7 @@ describe('BuildCreator', () => { }); - it('should delete the uploaded file on success', done => { + it('should delete the build artifact file on success', done => { (bc as any).extractArchive('input/file', 'output/dir'). then(() => expect(shellRmSpy).toHaveBeenCalledWith('-f', 'input/file')). then(done); @@ -568,7 +570,7 @@ describe('BuildCreator', () => { }); - it('should abort and reject if it fails to remove the uploaded file', done => { + it('should abort and reject if it fails to remove the build artifact file', done => { (bc as any).extractArchive('foo', 'bar').catch((err: any) => { expect(shellChmodSpy).toHaveBeenCalled(); expect(shellRmSpy).toHaveBeenCalled(); diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/build-events.spec.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/build-events.spec.ts similarity index 97% rename from aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/build-events.spec.ts rename to aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/build-events.spec.ts index 73214f3d9e..7c6af3fcad 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/build-events.spec.ts +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/build-events.spec.ts @@ -1,5 +1,5 @@ // Imports -import {ChangedPrVisibilityEvent, CreatedBuildEvent} from '../../lib/upload-server/build-events'; +import {ChangedPrVisibilityEvent, CreatedBuildEvent} from '../../lib/preview-server/build-events'; // Tests describe('ChangedPrVisibilityEvent', () => { diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/build-retriever.spec.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/build-retriever.spec.ts similarity index 99% rename from aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/build-retriever.spec.ts rename to aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/build-retriever.spec.ts index ab11ca8ca1..7a305bf6cf 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/build-retriever.spec.ts +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/build-retriever.spec.ts @@ -1,7 +1,7 @@ import * as fs from 'fs'; import * as nock from 'nock'; import {BuildInfo, CircleCiApi} from '../../lib/common/circle-ci-api'; -import {BuildRetriever} from '../../lib/upload-server/build-retriever'; +import {BuildRetriever} from '../../lib/preview-server/build-retriever'; describe('BuildRetriever', () => { const MAX_DOWNLOAD_SIZE = 10000; diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/build-verifier.spec.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/build-verifier.spec.ts similarity index 98% rename from aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/build-verifier.spec.ts rename to aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/build-verifier.spec.ts index 1e84cf1715..07494f7ff5 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/build-verifier.spec.ts +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/build-verifier.spec.ts @@ -2,7 +2,7 @@ import {GithubApi} from '../../lib/common/github-api'; import {GithubPullRequests, PullRequest} from '../../lib/common/github-pull-requests'; import {GithubTeams} from '../../lib/common/github-teams'; -import {BuildVerifier} from '../../lib/upload-server/build-verifier'; +import {BuildVerifier} from '../../lib/preview-server/build-verifier'; // Tests describe('BuildVerifier', () => { diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/helpers.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/helpers.ts new file mode 100644 index 0000000000..190774dbfb --- /dev/null +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/helpers.ts @@ -0,0 +1,11 @@ +import {PreviewServerError} from '../../lib/preview-server/preview-error'; + +export const expectToBePreviewServerError = (actual: PreviewServerError, status?: number, message?: string) => { + expect(actual).toEqual(jasmine.any(PreviewServerError)); + if (status != null) { + expect(actual.status).toBe(status); + } + if (message != null) { + expect(actual.message).toBe(message); + } +}; diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/preview-error.spec.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/preview-error.spec.ts new file mode 100644 index 0000000000..11a1e0eabc --- /dev/null +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/preview-error.spec.ts @@ -0,0 +1,39 @@ +// Imports +import {PreviewServerError} from '../../lib/preview-server/preview-error'; + +// Tests +describe('PreviewServerError', () => { + let err: PreviewServerError; + + beforeEach(() => err = new PreviewServerError(999, 'message')); + + + it('should extend Error', () => { + expect(err).toEqual(jasmine.any(PreviewServerError)); + expect(err).toEqual(jasmine.any(Error)); + + expect(Object.getPrototypeOf(err)).toBe(PreviewServerError.prototype); + }); + + + it('should have a \'status\' property', () => { + expect(err.status).toBe(999); + }); + + + it('should have a \'message\' property', () => { + expect(err.message).toBe('message'); + }); + + + it('should have a 500 \'status\' by default', () => { + expect(new PreviewServerError().status).toBe(500); + }); + + + it('should have an empty \'message\' by default', () => { + expect(new PreviewServerError().message).toBe(''); + expect(new PreviewServerError(999).message).toBe(''); + }); + +}); diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/upload-server-factory.spec.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/preview-server-factory.spec.ts similarity index 92% rename from aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/upload-server-factory.spec.ts rename to aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/preview-server-factory.spec.ts index e36e4cd6bc..3b59da17c4 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/upload-server-factory.spec.ts +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/preview-server-factory.spec.ts @@ -7,11 +7,11 @@ import {CircleCiApi} from '../../lib/common/circle-ci-api'; import {GithubApi} from '../../lib/common/github-api'; import {GithubPullRequests} from '../../lib/common/github-pull-requests'; import {GithubTeams} from '../../lib/common/github-teams'; -import {BuildCreator} from '../../lib/upload-server/build-creator'; -import {ChangedPrVisibilityEvent, CreatedBuildEvent} from '../../lib/upload-server/build-events'; -import {BuildRetriever, GithubInfo} from '../../lib/upload-server/build-retriever'; -import {BuildVerifier} from '../../lib/upload-server/build-verifier'; -import {UploadServerConfig, UploadServerFactory} from '../../lib/upload-server/upload-server-factory'; +import {BuildCreator} from '../../lib/preview-server/build-creator'; +import {ChangedPrVisibilityEvent, CreatedBuildEvent} from '../../lib/preview-server/build-events'; +import {BuildRetriever, GithubInfo} from '../../lib/preview-server/build-retriever'; +import {BuildVerifier} from '../../lib/preview-server/build-verifier'; +import {PreviewServerConfig, PreviewServerFactory} from '../../lib/preview-server/preview-server-factory'; interface CircleCiWebHookPayload { payload: { @@ -23,8 +23,8 @@ interface CircleCiWebHookPayload { } // Tests -describe('uploadServerFactory', () => { - const defaultConfig: UploadServerConfig = { +describe('PreviewServerFactory', () => { + const defaultConfig: PreviewServerConfig = { buildArtifactPath: 'artifact/path.zip', buildsDir: 'builds/dir', circleCiToken: 'CIRCLE_CI_TOKEN', @@ -40,8 +40,8 @@ describe('uploadServerFactory', () => { }; // Helpers - const createUploadServer = (partialConfig: Partial = {}) => - UploadServerFactory.create({...defaultConfig, ...partialConfig}); + const createPreviewServer = (partialConfig: Partial = {}) => + PreviewServerFactory.create({...defaultConfig, ...partialConfig}); beforeEach(() => { spyOn(console, 'error'); @@ -53,64 +53,64 @@ describe('uploadServerFactory', () => { let usfCreateMiddlewareSpy: jasmine.Spy; beforeEach(() => { - usfCreateMiddlewareSpy = spyOn(UploadServerFactory, 'createMiddleware').and.callThrough(); + usfCreateMiddlewareSpy = spyOn(PreviewServerFactory, 'createMiddleware').and.callThrough(); }); it('should throw if \'buildsDir\' is missing or empty', () => { - expect(() => createUploadServer({buildsDir: ''})). + expect(() => createPreviewServer({buildsDir: ''})). toThrowError('Missing or empty required parameter \'buildsDir\'!'); }); it('should throw if \'domainName\' is missing or empty', () => { - expect(() => createUploadServer({domainName: ''})). + expect(() => createPreviewServer({domainName: ''})). toThrowError('Missing or empty required parameter \'domainName\'!'); }); it('should throw if \'githubToken\' is missing or empty', () => { - expect(() => createUploadServer({githubToken: ''})). + expect(() => createPreviewServer({githubToken: ''})). toThrowError('Missing or empty required parameter \'githubToken\'!'); }); it('should throw if \'githubOrg\' is missing or empty', () => { - expect(() => createUploadServer({githubOrg: ''})). + expect(() => createPreviewServer({githubOrg: ''})). toThrowError('Missing or empty required parameter \'githubOrg\'!'); }); it('should throw if \'githubTeamSlugs\' is missing or empty', () => { - expect(() => createUploadServer({githubTeamSlugs: []})). + expect(() => createPreviewServer({githubTeamSlugs: []})). toThrowError('Missing or empty required parameter \'allowedTeamSlugs\'!'); }); it('should throw if \'githubRepo\' is missing or empty', () => { - expect(() => createUploadServer({githubRepo: ''})). + expect(() => createPreviewServer({githubRepo: ''})). toThrowError('Missing or empty required parameter \'githubRepo\'!'); }); it('should throw if \'trustedPrLabel\' is missing or empty', () => { - expect(() => createUploadServer({trustedPrLabel: ''})). + expect(() => createPreviewServer({trustedPrLabel: ''})). toThrowError('Missing or empty required parameter \'trustedPrLabel\'!'); }); it('should return an http.Server', () => { const httpCreateServerSpy = spyOn(http, 'createServer').and.callThrough(); - const server = createUploadServer(); + const server = createPreviewServer(); expect(server).toBe(httpCreateServerSpy.calls.mostRecent().returnValue); }); it('should create and use an appropriate BuildCreator', () => { - const usfCreateBuildCreatorSpy = spyOn(UploadServerFactory, 'createBuildCreator').and.callThrough(); + const usfCreateBuildCreatorSpy = spyOn(PreviewServerFactory, 'createBuildCreator').and.callThrough(); - createUploadServer(); + createPreviewServer(); const buildRetriever = jasmine.any(BuildRetriever); const buildVerifier = jasmine.any(BuildVerifier); const prs = jasmine.any(GithubPullRequests); @@ -124,7 +124,7 @@ describe('uploadServerFactory', () => { it('should create and use an appropriate middleware', () => { const httpCreateServerSpy = spyOn(http, 'createServer').and.callThrough(); - createUploadServer(); + createPreviewServer(); const buildRetriever = jasmine.any(BuildRetriever); const buildVerifier = jasmine.any(BuildVerifier); @@ -137,14 +137,14 @@ describe('uploadServerFactory', () => { it('should log the server address info on \'listening\'', () => { - const server = createUploadServer(); + const server = createPreviewServer(); server.address = () => ({address: 'foo', family: '', port: 1337}); expect(console.info).not.toHaveBeenCalled(); server.emit('listening'); expect(console.info).toHaveBeenCalledWith( - jasmine.any(String), 'UploadServer: ', 'Up and running (and listening on foo:1337)...'); + jasmine.any(String), 'PreviewServer: ', 'Up and running (and listening on foo:1337)...'); }); }); @@ -158,7 +158,7 @@ describe('uploadServerFactory', () => { beforeEach(() => { const api = new GithubApi(defaultConfig.githubToken); const prs = new GithubPullRequests(api, defaultConfig.githubOrg, defaultConfig.githubRepo); - buildCreator = UploadServerFactory.createBuildCreator(prs, defaultConfig.buildsDir, defaultConfig.domainName); + buildCreator = PreviewServerFactory.createBuildCreator(prs, defaultConfig.buildsDir, defaultConfig.domainName); }); it('should pass the \'buildsDir\' to the BuildCreator', () => { @@ -256,7 +256,7 @@ describe('uploadServerFactory', () => { buildVerifier = new BuildVerifier(prs, teams, defaultConfig.githubTeamSlugs, defaultConfig.trustedPrLabel); buildCreator = new BuildCreator(defaultConfig.buildsDir); - const middleware = UploadServerFactory.createMiddleware(buildRetriever, buildVerifier, buildCreator, + const middleware = PreviewServerFactory.createMiddleware(buildRetriever, buildVerifier, buildCreator, defaultConfig); agent = supertest.agent(middleware); }); @@ -359,7 +359,7 @@ describe('uploadServerFactory', () => { await agent.post(URL).send(BASIC_PAYLOAD).expect(204); expect(getGithubInfoSpy).not.toHaveBeenCalled(); expect(getSignificantFilesChangedSpy).not.toHaveBeenCalled(); - expect(console.log).toHaveBeenCalledWith(jasmine.any(String), 'UploadServer: ', + expect(console.log).toHaveBeenCalledWith(jasmine.any(String), 'PreviewServer: ', 'Build:12345, Job:lint -', 'Skipping preview processing because this is not the "aio_preview" job.'); expect(downloadBuildArtifactSpy).not.toHaveBeenCalled(); expect(getPrIsTrustedSpy).not.toHaveBeenCalled(); @@ -371,7 +371,7 @@ describe('uploadServerFactory', () => { await agent.post(URL).send(BASIC_PAYLOAD).expect(204); expect(getGithubInfoSpy).toHaveBeenCalledWith(BUILD_NUM); expect(getSignificantFilesChangedSpy).toHaveBeenCalledWith(PR, jasmine.any(RegExp)); - expect(console.log).toHaveBeenCalledWith(jasmine.any(String), 'UploadServer: ', + expect(console.log).toHaveBeenCalledWith(jasmine.any(String), 'PreviewServer: ', 'PR:777, Build:12345 - Skipping preview processing because this PR did not touch any significant files.'); expect(downloadBuildArtifactSpy).not.toHaveBeenCalled(); expect(getPrIsTrustedSpy).not.toHaveBeenCalled(); diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/utils.spec.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/utils.spec.ts similarity index 76% rename from aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/utils.spec.ts rename to aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/utils.spec.ts index b322c80501..8be6ce6b49 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/utils.spec.ts +++ b/aio/aio-builds-setup/dockerbuild/scripts-js/test/preview-server/utils.spec.ts @@ -1,8 +1,8 @@ import * as express from 'express'; -import {UploadError} from '../../lib/upload-server/upload-error'; -import {respondWithError, throwRequestError} from '../../lib/upload-server/utils'; +import {PreviewServerError} from '../../lib/preview-server/preview-error'; +import {respondWithError, throwRequestError} from '../../lib/preview-server/utils'; -describe('upload-server/utils', () => { +describe('preview-server/utils', () => { describe('respondWithError', () => { let endSpy: jasmine.Spy; let statusSpy: jasmine.Spy; @@ -15,12 +15,12 @@ describe('upload-server/utils', () => { }); it('should set the status on the response', () => { - respondWithError(response, new UploadError(505, 'TEST MESSAGE')); + respondWithError(response, new PreviewServerError(505, 'TEST MESSAGE')); expect(statusSpy).toHaveBeenCalledWith(505); expect(endSpy).toHaveBeenCalledWith('TEST MESSAGE', jasmine.any(Function)); }); - it('should convert non-UploadError errors to 500 UploadErrors', () => { + it('should convert non-PreviewServerError errors to 500 PreviewServerErrors', () => { respondWithError(response, new Error('OTHER MESSAGE')); expect(statusSpy).toHaveBeenCalledWith(500); expect(endSpy).toHaveBeenCalledWith('OTHER MESSAGE', jasmine.any(Function)); @@ -39,7 +39,7 @@ describe('upload-server/utils', () => { throwRequestError(505, 'ERROR MESSAGE', request); } catch (error) { caught = true; - expect(error).toEqual(jasmine.any(UploadError)); + expect(error).toEqual(jasmine.any(PreviewServerError)); expect(error.status).toEqual(505); expect(error.message).toEqual(`ERROR MESSAGE in request: POST some.domain.com/path "The request body"`); } diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/helpers.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/helpers.ts deleted file mode 100644 index 9213d7c1a6..0000000000 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/helpers.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {UploadError} from '../../lib/upload-server/upload-error'; - -export const expectToBeUploadError = (actual: UploadError, status?: number, message?: string) => { - expect(actual).toEqual(jasmine.any(UploadError)); - if (status != null) { - expect(actual.status).toBe(status); - } - if (message != null) { - expect(actual.message).toBe(message); - } -}; diff --git a/aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/upload-error.spec.ts b/aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/upload-error.spec.ts deleted file mode 100644 index 9a20925932..0000000000 --- a/aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/upload-error.spec.ts +++ /dev/null @@ -1,39 +0,0 @@ -// Imports -import {UploadError} from '../../lib/upload-server/upload-error'; - -// Tests -describe('UploadError', () => { - let err: UploadError; - - beforeEach(() => err = new UploadError(999, 'message')); - - - it('should extend Error', () => { - expect(err).toEqual(jasmine.any(UploadError)); - expect(err).toEqual(jasmine.any(Error)); - - expect(Object.getPrototypeOf(err)).toBe(UploadError.prototype); - }); - - - it('should have a \'status\' property', () => { - expect(err.status).toBe(999); - }); - - - it('should have a \'message\' property', () => { - expect(err.message).toBe('message'); - }); - - - it('should have a 500 \'status\' by default', () => { - expect(new UploadError().status).toBe(500); - }); - - - it('should have an empty \'message\' by default', () => { - expect(new UploadError().message).toBe(''); - expect(new UploadError(999).message).toBe(''); - }); - -}); diff --git a/aio/aio-builds-setup/dockerbuild/scripts-sh/health-check.sh b/aio/aio-builds-setup/dockerbuild/scripts-sh/health-check.sh index d61ddada65..6a50c22175 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-sh/health-check.sh +++ b/aio/aio-builds-setup/dockerbuild/scripts-sh/health-check.sh @@ -30,7 +30,7 @@ done # Check servers origins=( - http://$AIO_UPLOAD_HOSTNAME:$AIO_UPLOAD_PORT + http://$AIO_PREVIEW_SERVER_HOSTNAME:$AIO_PREVIEW_SERVER_PORT http://$AIO_NGINX_HOSTNAME:$AIO_NGINX_PORT_HTTP https://$AIO_NGINX_HOSTNAME:$AIO_NGINX_PORT_HTTPS ) diff --git a/aio/aio-builds-setup/dockerbuild/scripts-sh/init.sh b/aio/aio-builds-setup/dockerbuild/scripts-sh/init.sh index 9e888e0c3d..b9f949e7f0 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-sh/init.sh +++ b/aio/aio-builds-setup/dockerbuild/scripts-sh/init.sh @@ -14,5 +14,5 @@ service cron start service dnsmasq start service nginx start service pm2-root start -aio-upload-server-prod start +aio-preview-server-prod start echo [`date`] - Services started successfully. diff --git a/aio/aio-builds-setup/dockerbuild/scripts-sh/upload-server-prod.sh b/aio/aio-builds-setup/dockerbuild/scripts-sh/preview-server-prod.sh similarity index 68% rename from aio/aio-builds-setup/dockerbuild/scripts-sh/upload-server-prod.sh rename to aio/aio-builds-setup/dockerbuild/scripts-sh/preview-server-prod.sh index a69ceca113..091384ee48 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-sh/upload-server-prod.sh +++ b/aio/aio-builds-setup/dockerbuild/scripts-sh/preview-server-prod.sh @@ -5,10 +5,10 @@ set -eu -o pipefail export AIO_CIRCLE_CI_TOKEN=$(head -c -1 /aio-secrets/CIRCLE_CI_TOKEN 2>/dev/null || echo "MISSING_CIRCLE_CI_TOKEN") export AIO_GITHUB_TOKEN=$(head -c -1 /aio-secrets/GITHUB_TOKEN 2>/dev/null || echo "MISSING_GITHUB_TOKEN") -# Start the upload-server instance +# Start the preview-server instance action=$([ "$1" == "stop" ] && echo "stop" || echo "start") -pm2 $action $AIO_SCRIPTS_JS_DIR/dist/lib/upload-server \ +pm2 $action $AIO_SCRIPTS_JS_DIR/dist/lib/preview-server \ --uid $AIO_WWW_USER \ - --log /var/log/aio/upload-server-prod.log \ - --name aio-upload-server-prod \ + --log /var/log/aio/preview-server-prod.log \ + --name aio-preview-server-prod \ ${@:2} diff --git a/aio/aio-builds-setup/dockerbuild/scripts-sh/upload-server-test.sh b/aio/aio-builds-setup/dockerbuild/scripts-sh/preview-server-test.sh similarity index 65% rename from aio/aio-builds-setup/dockerbuild/scripts-sh/upload-server-test.sh rename to aio/aio-builds-setup/dockerbuild/scripts-sh/preview-server-test.sh index f24550d127..8a94550441 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-sh/upload-server-test.sh +++ b/aio/aio-builds-setup/dockerbuild/scripts-sh/preview-server-test.sh @@ -1,15 +1,15 @@ #!/bin/bash set -eu -o pipefail -# Start the upload-server instance -appName=aio-upload-server-test +# Start the preview-server instance +appName=aio-preview-server-test if [[ "$1" == "stop" ]]; then pm2 delete $appName else source aio-test-env - pm2 start $AIO_SCRIPTS_JS_DIR/dist/lib/verify-setup/start-test-upload-server.js \ + pm2 start $AIO_SCRIPTS_JS_DIR/dist/lib/verify-setup/start-test-preview-server.js \ --uid $AIO_WWW_USER \ - --log /var/log/aio/upload-server-test.log \ + --log /var/log/aio/preview-server-test.log \ --name $appName \ --no-autorestart \ ${@:2} diff --git a/aio/aio-builds-setup/dockerbuild/scripts-sh/test-env.sh b/aio/aio-builds-setup/dockerbuild/scripts-sh/test-env.sh index 130d8151d0..00826bab4d 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-sh/test-env.sh +++ b/aio/aio-builds-setup/dockerbuild/scripts-sh/test-env.sh @@ -11,9 +11,9 @@ export AIO_GITHUB_TEAM_SLUGS=$TEST_AIO_GITHUB_TEAM_SLUGS export AIO_SIGNIFICANT_FILES_PATTERN=$TEST_AIO_SIGNIFICANT_FILES_PATTERN export AIO_TRUSTED_PR_LABEL=$TEST_AIO_TRUSTED_PR_LABEL - export AIO_UPLOAD_HOSTNAME=$TEST_AIO_UPLOAD_HOSTNAME - export AIO_UPLOAD_PORT=$TEST_AIO_UPLOAD_PORT - export AIO_UPLOAD_MAX_SIZE=$TEST_AIO_UPLOAD_MAX_SIZE + export AIO_PREVIEW_SERVER_HOSTNAME=$TEST_AIO_PREVIEW_SERVER_HOSTNAME + export AIO_PREVIEW_SERVER_PORT=$TEST_AIO_PREVIEW_SERVER_PORT + export AIO_ARTIFACT_MAX_SIZE=$TEST_AIO_ARTIFACT_MAX_SIZE export AIO_CIRCLE_CI_TOKEN=TEST_CIRCLE_CI_TOKEN export AIO_GITHUB_TOKEN=TEST_GITHUB_TOKEN diff --git a/aio/aio-builds-setup/dockerbuild/scripts-sh/verify-setup-and-log.sh b/aio/aio-builds-setup/dockerbuild/scripts-sh/verify-setup-and-log.sh index b65bdddef6..af8f876eca 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-sh/verify-setup-and-log.sh +++ b/aio/aio-builds-setup/dockerbuild/scripts-sh/verify-setup-and-log.sh @@ -1,2 +1,2 @@ aio-verify-setup -ls -t /var/log/aio/upload-server-verify* | head -1 | xargs cat +ls -t /var/log/aio/preview-server-verify* | head -1 | xargs cat diff --git a/aio/aio-builds-setup/dockerbuild/scripts-sh/verify-setup.sh b/aio/aio-builds-setup/dockerbuild/scripts-sh/verify-setup.sh index d6c9000561..a83fcca693 100644 --- a/aio/aio-builds-setup/dockerbuild/scripts-sh/verify-setup.sh +++ b/aio/aio-builds-setup/dockerbuild/scripts-sh/verify-setup.sh @@ -2,7 +2,7 @@ set -eu -o pipefail logFile=/var/log/aio/verify-setup.log -uploadServerLogFile=/var/log/aio/upload-server-verify-setup.log +previewServerLogFile=/var/log/aio/preview-server-verify-setup.log exec 3>&1 exec >> $logFile @@ -24,18 +24,18 @@ function countdown { function onExit { echo -e "Stopping Test Server" - aio-upload-server-test stop + aio-preview-server-test stop echo -e "Full logs in '$logFile'.\n" > /dev/fd/3 } # Setup EXIT trap trap 'onExit' EXIT -# Start an upload-server instance for testing +# Start an preview-server instance for testing echo -e "Starting Test Server" -aio-upload-server-test start --log $uploadServerLogFile +aio-preview-server-test start --log $previewServerLogFile -# Give the upload-server some time to start :( +# Give the preview-server some time to start :( countdown "Starting" 5 > /dev/fd/3 # Run the tests diff --git a/aio/aio-builds-setup/docs/image-config--environment-variables.md b/aio/aio-builds-setup/docs/image-config--environment-variables.md index 1a324afee2..43ba7e70a5 100644 --- a/aio/aio-builds-setup/docs/image-config--environment-variables.md +++ b/aio/aio-builds-setup/docs/image-config--environment-variables.md @@ -54,14 +54,14 @@ you don't need to specify values for those. build artifacts publicly served. This is useful for enabling previews for any PR (not only those from trusted authors). -- `AIO_UPLOAD_HOSTNAME`: - The internal hostname for accessing the Node.js upload-server. This is used by nginx for - delegating upload requests and also for performing a periodic health-check. +- `AIO_PREVIEW_SERVER_HOSTNAME`: + The internal hostname for accessing the Node.js preview-server. This is used by nginx for + delegating web-hook requests and also for performing a periodic health-check. -- `AIO_UPLOAD_MAX_SIZE`: - The maximum allowed size for the uploaded gzip archive containing the build artifacts. Files - larger than this will be rejected. +- `AIO_ARTIFACT_MAX_SIZE`: + The maximum allowed size for the gzip archive containing the build artifacts. + Files larger than this will be rejected. -- `AIO_UPLOAD_PORT`: - The port number on which the Node.js upload-server listens for HTTP connections. This is used by - nginx for delegating upload requests and also for performing a periodic health-check. +- `AIO_PREVIEW_SERVER_PORT`: + The port number on which the Node.js preview-server listens for HTTP connections. This is used by + nginx for delegating web-hook requests and also for performing a periodic health-check. diff --git a/aio/aio-builds-setup/docs/misc--debug-docker-container.md b/aio/aio-builds-setup/docs/misc--debug-docker-container.md index 69b40d5969..9f024bca22 100644 --- a/aio/aio-builds-setup/docs/misc--debug-docker-container.md +++ b/aio/aio-builds-setup/docs/misc--debug-docker-container.md @@ -5,14 +5,14 @@ TODO (gkalpak): Add docs. Mention: - `aio-health-check` - `aio-verify-setup` - Test nginx accessible at: - - `http://$TEST_AIO_NGINX_HOTNAME:$TEST_AIO_NGINX_PORT_HTTP` - - `https://$TEST_AIO_NGINX_HOTNAME:$TEST_AIO_NGINX_PORT_HTTPS` -- Test upload-server accessible at: - - `http://$TEST_AIO_UPLOAD_HOTNAME:$TEST_AIO_UPLOAD_PORT` + - `http://$TEST_AIO_NGINX_HOSTNAME:$TEST_AIO_NGINX_PORT_HTTP` + - `https://$TEST_AIO_NGINX_HOSTNAME:$TEST_AIO_NGINX_PORT_HTTPS` +- Test preview-server accessible at: + - `http://$TEST_AIO_PREVIEW_SERVER_HOSTNAME:$TEST_AIO_PREVIEW_SERVER_PORT` - Local DNS (via dnsmasq) maps the above hostnames to 127.0.0.1 -## Developing the upload server TypeScript files +## Developing the preview server TypeScript files If you are running Docker on OS/X then you can benefit from linking the built TypeScript files (i.e. `script-js/dist`) to the JavaScript files inside the Docker container. @@ -39,9 +39,9 @@ aio-verify-setup ``` Sometimes, the errors in the unit test log are not enough to tell you what went wrong. -In that case you can also look at the log of the upload-server itself. +In that case you can also look at the log of the preview-server itself. A helper script that runs the unit tests (i.e. `aio-verify-setup`) and displays the -last relevant test-upload-server log is: +last relevant test-preview-server log is: ```bash aio-verify-setup-and-log diff --git a/aio/aio-builds-setup/docs/overview--general.md b/aio/aio-builds-setup/docs/overview--general.md index 31172f5ebe..4b4560f2d0 100644 --- a/aio/aio-builds-setup/docs/overview--general.md +++ b/aio/aio-builds-setup/docs/overview--general.md @@ -3,7 +3,7 @@ ## Objective Whenever a PR job is run on the CI infrastructure (e.g. CircleCI), we want to build `angular.io` -and upload the build artifacts to a publicly accessible server so that collaborators (developers, +and host the build artifacts on a publicly accessible server so that collaborators (developers, designers, authors, etc) can preview the changes without having to checkout and build the app locally. @@ -40,31 +40,31 @@ container: - The CI script checks whether the PR has touched any files that might affect the angular.io app (currently the `aio/` or `packages/` directories, ignoring spec files). - The CI script gzips and stores the build artifacts in the CI infrastructure. -- When the build completes CircleCI triggers a webhook on the upload-server. +- When the build completes CircleCI triggers a webhook on the preview-server. More info on how to set things up on CI can be found [here](misc--integrate-with-ci.md). ### Hosting build artifacts -- nginx receives the webhook trigger and passes it through to the upload server. -- The upload-server makes a request to CircleCI for the URL of the AIO build artifacts. -- The upload-server makes a request to this URL to receive the artifact - failing if the size +- nginx receives the webhook trigger and passes it through to the preview server. +- The preview-server makes a request to CircleCI for the URL of the AIO build artifacts. +- The preview-server makes a request to this URL to receive the artifact - failing if the size exceeds the specified max file size - and stores it in a temporary location. -- The upload-server runs several checks to determine whether the request should be accepted and +- The preview-server runs several checks to determine whether the request should be accepted and whether it should be publicly accessible or stored for later verification (more details can be found [here](overview--security-model.md)). -- The upload-server changes the "visibility" of the associated PR, if necessary. For example, if +- The preview-server changes the "visibility" of the associated PR, if necessary. For example, if builds for the same PR had been previously deployed as non-public and the current build has been automatically verified, all previous builds are made public as well. - If the PR transitions from "non-public" to "public", the upload-server posts a comment on the + If the PR transitions from "non-public" to "public", the preview-server posts a comment on the corresponding PR on GitHub mentioning the SHAs and the links where the previews can be found. -- The upload-server verifies that the uploaded file is not trying to overwrite an existing build. -- The upload-server deploys the artifacts to a sub-directory named after the PR number and the first +- The preview-server verifies that it is not trying to overwrite an existing build. +- The preview-server deploys the artifacts to a sub-directory named after the PR number and the first few characters of the SHA: `//` (Non-publicly accessible PRs will be stored in a different location, but again derived from the PR number and SHA.) -- If the PR is publicly accessible, the upload-server posts a comment on the corresponding PR on +- If the PR is publicly accessible, the preview-server posts a comment on the corresponding PR on GitHub mentioning the SHA and the link where the preview can be found. More info on the possible HTTP status codes and their meaning can be found @@ -73,24 +73,24 @@ More info on the possible HTTP status codes and their meaning can be found ### Updating PR visibility - nginx receives a natification that a PR has been updated and passes it through to the - upload-server. This could, for example, be sent by a GitHub webhook every time a PR's labels + preview-server. This could, for example, be sent by a GitHub webhook every time a PR's labels change. E.g.: `ngbuilds.io/pr-updated` (payload: `{"number":,"action":"labeled"}`) - The request contains the PR number (as `number`) and optionally the action that triggered the request (as `action`) in the payload. -- The upload-server verifies the payload and determines whether the `action` (if specified) could +- The preview-server verifies the payload and determines whether the `action` (if specified) could have led to PR visibility changes. Only requests that omit the `action` field altogether or specify an action that can affect visibility are further processed. (Currently, the only actions that are considered capable of affecting visibility are `labeled` and `unlabeled`.) -- The upload-server re-checks and if necessary updates the PR's visibility. +- The preview-server re-checks and if necessary updates the PR's visibility. More info on the possible HTTP status codes and their meaning can be found [here](overview--http-status-codes.md). ### Serving build artifacts -- nginx receives a request for an uploaded resource on a subdomain corresponding to the PR and SHA. +- nginx receives a request for a hosted preview resource on a subdomain corresponding to the PR and SHA. E.g.: `pr-.ngbuilds.io/path/to/resource` - nginx maps the subdomain to the correct sub-directory and serves the resource. E.g.: `///path/to/resource` @@ -108,4 +108,4 @@ that do not correspond with an open PR. ### Health-check The docker service runs a periodic health-check that verifies the running conditions of the container. This includes verifying the status of specific system services, the responsiveness of -nginx and the upload-server and internet connectivity. +nginx and the preview-server and internet connectivity. diff --git a/aio/aio-builds-setup/docs/overview--http-status-codes.md b/aio/aio-builds-setup/docs/overview--http-status-codes.md index e796f5cd67..f2b0b62502 100644 --- a/aio/aio-builds-setup/docs/overview--http-status-codes.md +++ b/aio/aio-builds-setup/docs/overview--http-status-codes.md @@ -1,8 +1,8 @@ # Overview - HTTP Status Codes -This is a list of all the possible HTTP status codes returned by the nginx anf upload servers, along -with a bried explanation of what they mean: +This is a list of all the possible HTTP status codes returned by the nginx and preview servers, along +with a brief explanation of what they mean: ## `http://*.ngbuilds.io/*` diff --git a/aio/aio-builds-setup/docs/overview--scripts-and-commands.md b/aio/aio-builds-setup/docs/overview--scripts-and-commands.md index 5400a1eb79..84c1b683c3 100644 --- a/aio/aio-builds-setup/docs/overview--scripts-and-commands.md +++ b/aio/aio-builds-setup/docs/overview--scripts-and-commands.md @@ -40,23 +40,23 @@ purposes. Each command is backed by a corresponding script inside Initializes the container (mainly by starting the necessary services). _It is run (by default) when starting the container._ -- `aio-upload-server-prod`: - Spins up a Node.js upload-server instance. +- `aio-preview-server-prod`: + Spins up a Node.js preview-server instance. _It is used in `aio-init` (see above) during initialization._ ## Developer Commands -- `aio-upload-server-test`: - Spins up a Node.js upload-server instance for tests. +- `aio-preview-server-test`: + Spins up a Node.js preview-server instance for tests. _It is used in `aio-verify-setup` (see below) for running tests._ - `aio-verify-setup`: Runs a suite of e2e-like tests, mainly verifying the correct (inter)operation of nginx and the - Node.js upload-server. + Node.js preview-server. - `aio-verify-setup-and-log`: - Runs the `aio-verify-setup` command but also then dumps the logs from the upload server, which + Runs the `aio-verify-setup` command but also then dumps the logs from the preview server, which gives additional useful debugging information. See the [debugging docs](misc--debug-docker-container.md) for more info. diff --git a/aio/aio-builds-setup/docs/overview--security-model.md b/aio/aio-builds-setup/docs/overview--security-model.md index f56554cc7a..38ee9cb15d 100644 --- a/aio/aio-builds-setup/docs/overview--security-model.md +++ b/aio/aio-builds-setup/docs/overview--security-model.md @@ -48,7 +48,7 @@ The implemented approach can be broken up to the following sub-tasks: 5. Deploy the artifacts to the corresponding PR's directory. 6. Prevent overwriting previously deployed artifacts (which ensures that the guarantees established during deployment will remain valid until the artifacts are removed). -7. Prevent uploaded files from accessing anything outside their directory. +7. Prevent hosted preview files from accessing anything outside their directory. ### Implementation details @@ -56,7 +56,7 @@ This section describes how each of the aforementioned sub-tasks is accomplished: 0. **Receive notification from CircleCI of a completed build** - CircleCI is configured to trigger a webhook on our upload-server whenever a build completes. + CircleCI is configured to trigger a webhook on our preview-server whenever a build completes. The payload contains the number of the build that completed. 1. **Verify that the build is valid and download the artifact.** @@ -71,7 +71,7 @@ This section describes how each of the aforementioned sub-tasks is accomplished: Next we make another call to the CircleCI API to get a list of the URLS for artifacts of that build. If there is one that matches the configured artifact path, we download the contents of the build artifact and store it in a local folder. This download has a maximum size limit to prevent - PRs from producing artifacts that are so large they would cause the upload server to crash. + PRs from producing artifacts that are so large they would cause the preview server to crash. 2. **Fetch the PR's metadata, including author and labels**. @@ -98,7 +98,7 @@ This section describes how each of the aforementioned sub-tasks is accomplished: Once we have determined whether the PR is considered "trusted", we update its "visibility" (i.e. whether it is publicly accessible or not), based on the new verification status. For example, if a PR was initially considered "not trusted" but the check triggered by a new build determined - otherwise, the PR (and all the previously uploaded previews) are made public. It works the same + otherwise, the PR (and all the previously hosted previews) are made public. It works the same way if a PR has gone from "trusted" to "not trusted". 5. **Deploy the artifacts to the corresponding PR's directory.** @@ -117,23 +117,23 @@ This section describes how each of the aforementioned sub-tasks is accomplished: Express server) rejects builds that have already been handled. _Note: A PR can contain multiple builds; one for each SHA that was built on CircleCI._ -7. **Prevent uploaded files from accessing anything outside their directory.** +7. **Prevent hosted preview files from accessing anything outside their directory.** - Nginx (which is used to serve the uploaded artifacts) has been configured to not follow symlinks - outside of the directory where the build artifacts are stored. + Nginx (which is used to serve the hosted preview) has been configured to not follow symlinks + outside of the directory where the preview files are stored. ## Assumptions / Things to keep in mind - Other than the initial webhook trigger, which provides a build number, all requests for data come - from the upload-server making requests to well defined API endpoints (e.g. CircleCI and Github). - This means that any secret access keys need only be stored on the upload-server and not on any of + from the preview-server making requests to well defined API endpoints (e.g. CircleCI and Github). + This means that any secret access keys need only be stored on the preview-server and not on any of the CI build infrastructure (e.g. CircleCI). -- Each trusted PR author has full control over the content that is uploaded for their PRs. Part of - the security model relies on the trustworthiness of these authors. +- Each trusted PR author has full control over the content that is hosted as a preview for their PRs. + Part of the security model relies on the trustworthiness of these authors. -- Adding the specified label on a PR and marking it as trusted, gives the author full control over - the content that is uploaded for the specific PR (e.g. by pushing more commits to it). The user - adding the label is responsible for ensuring that this control is not abused and that the PR is - either closed (one way of another) or the access is revoked. +- Adding the specified label on a PR to mark it as trusted, gives the author full control over + the content that is hosted for the specific PR preview (e.g. by pushing more commits to it). + The user adding the label is responsible for ensuring that this control is not abused and that + the PR is either closed (one way of another) or the access is revoked. diff --git a/aio/aio-builds-setup/docs/vm-setup--create-host-dirs-and-files.md b/aio/aio-builds-setup/docs/vm-setup--create-host-dirs-and-files.md index 423904954b..b38a02b9ed 100644 --- a/aio/aio-builds-setup/docs/vm-setup--create-host-dirs-and-files.md +++ b/aio/aio-builds-setup/docs/vm-setup--create-host-dirs-and-files.md @@ -12,8 +12,8 @@ More info on how to create `secrets` directory and files can be found ## Create directory for build artifacts -The uploaded build artifacts should be kept on a directory outside the docker container, so it is -easier to replace the container without losing the uploaded builds. For portability across VMs a +The build artifacts should be kept on a directory outside the docker container, so it is +easier to replace the container without losing the builds. For portability across VMs a persistent disk can be used (as described [here](vm-setup--attach-persistent-disk.md)). **Note:** The directories created inside that directory will be owned by user `www-data`. @@ -21,7 +21,7 @@ persistent disk can be used (as described [here](vm-setup--attach-persistent-dis ## Create SSL certificates (Optional for dev) The host VM can attach a directory containing the SSL certificate and key to be used by the nginx -server for serving the uploaded build artifacts. More info on how to attach the directory when +server for serving the hosted previews. More info on how to attach the directory when starting the container can be found [here](vm-setup--start-docker-container.md). In order for the container to be able to find the certificate and key, they should be named @@ -61,15 +61,15 @@ The following log files are kept in this directory: used when running tests locally from inside the container, e.g. with the `aio-verify-setup` command. (See [here](overview--scripts-and-commands.md) for more info.) -- `upload-server-{prod,test,verify-setup}-*.log`: - The logs produced by the Node.js upload-server while serving either: +- `preview-server-{prod,test,verify-setup}-*.log`: + The logs produced by the Node.js preview-server while serving either: - `-prod`: "Production" files (g.g during normal operation). - - `-test`: "Test" files (e.g. when a test instance is started with the `aio-upload-server-test` + - `-test`: "Test" files (e.g. when a test instance is started with the `aio-preview-server-test` command). - `-verify-setup`: "Test" files, but while running `aio-verify-setup`. (See [here](overview--scripts-and-commands.md) for more info the commands mentioned above.) - `verify-setup.log`: - The output of the `aio-verify-setup` command (e.g. Jasmine output), except for upload-server - output which is logged to `upload-server-verify-setup-*.log` (see above). + The output of the `aio-verify-setup` command (e.g. Jasmine output), except for preview-server + output which is logged to `preview-server-verify-setup-*.log` (see above). diff --git a/aio/aio-builds-setup/docs/vm-setup--start-docker-container.md b/aio/aio-builds-setup/docs/vm-setup--start-docker-container.md index b8b8fcce00..cdbe53be88 100644 --- a/aio/aio-builds-setup/docs/vm-setup--start-docker-container.md +++ b/aio/aio-builds-setup/docs/vm-setup--start-docker-container.md @@ -31,7 +31,7 @@ sudo docker run \ --detach \ # Use the local DNS server. - # (This is necessary for mapping internal URLs, e.g. for the Node.js upload-server.) + # (This is necessary for mapping internal URLs, e.g. for the Node.js preview-server.) --dns 127.0.0.1 \ # USe `` as an alias for the container. @@ -50,7 +50,7 @@ sudo docker run \ # (See [here](vm-setup--set-up-secrets.md) for more info.) --volume :/aio-secrets:ro \ - # The uploaded build artifacts will stored to and served from this directory. + # The build artifacts and hosted previews will stored to and served from this directory. # (If you are using a persistent disk - as described [here](vm-setup--attach-persistent-disk.md) - # this will be a directory inside the disk.) --volume :/var/www/aio-builds \