85 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Overview - General
 | |
| 
 | |
| 
 | |
| ## Objective
 | |
| Whenever a PR job is run on Travis, we want to build `angular.io` and upload the build artifacts to
 | |
| a publicly accessible server so that collaborators (developers, designers, authors, etc) can preview
 | |
| the changes without having to checkout and build the app locally.
 | |
| 
 | |
| 
 | |
| ## Source code
 | |
| In order to make it easier to administer the server and version-control the setup, we are using
 | |
| [docker](https://www.docker.com) to run a container on a VM. The Dockerfile and all other files
 | |
| necessary for creating the docker container are stored (and versioned) along with the angular.io
 | |
| project's source code (currently part of the angular/angular repo) in the `aio-builds-setup/`
 | |
| directory.
 | |
| 
 | |
| 
 | |
| ## Setup
 | |
| The VM is hosted on [Google Compute Engine](https://cloud.google.com/compute/). The host OS is
 | |
| debian:jessie. For more info how to set up the host VM take a look at the "Setting up the VM"
 | |
| section in [TOC](_TOC.md).
 | |
| 
 | |
| 
 | |
| ## Security model
 | |
| Since we are managing a public server, it is important to take appropriate measures in order to
 | |
| prevent abuse. For more details on the challenges and the chosen approach take a look at the
 | |
| [security model](overview--security-model.md).
 | |
| 
 | |
| 
 | |
| ## The 10000 feet view
 | |
| This section gives a brief summary of the several operations performed on CI and by the docker
 | |
| container:
 | |
| 
 | |
| 
 | |
| ### On CI (Travis)
 | |
| - Build job completes successfully (i.e. build succeeds and tests pass).
 | |
| - The CI script checks whether the build job was initiated by a PR against the angular/angular
 | |
|   master branch.
 | |
| - The CI script checks whether the PR has touched any files inside the angular.io project directory
 | |
|   (currently `aio/`).
 | |
| - The CI script checks whether the author of the PR is a member of one of the whitelisted GitHub
 | |
|   teams (and therefore allowed to upload).
 | |
|   **Note:**
 | |
|   For security reasons, the same checks will be performed on the server as well. This is an optional
 | |
|   step with the purpose of:
 | |
|   1. Avoiding the wasted overhead associated with uploads that are going to be rejected (e.g.
 | |
|      building the artifacts, sending them to the server, running checks on the server, etc).
 | |
|   2. Avoiding failing the build (due to an error response from the server) or requiring additional
 | |
|      logic for detecting the reasons of the failure.
 | |
| - The CI script gzip and upload the build artifacts to the server.
 | |
| 
 | |
| More info on how to set things up on CI can be found [here](misc--integrate-with-ci.md).
 | |
| 
 | |
| 
 | |
| ### Uploading build artifacts
 | |
| - nginx receives upload request.
 | |
| - nginx checks that the uploaded gzip archive does not exceed the specified max file size, stores it
 | |
|   in a temporary location and passes the filepath to the Node.js upload-server.
 | |
| - The upload-server verifies that the uploaded file is not trying to overwrite an existing build,
 | |
|   and runs several checks to determine whether the request should be accepted (more details can be
 | |
|   found [here](overview--security-model.md)).
 | |
| - The upload-server deploys the artifacts to a sub-directory named after the PR number and SHA:
 | |
|   `<PR>/<SHA>/`
 | |
| - The upload-server posts a comment on the corresponding PR on GitHub mentioning the SHA and the
 | |
|   the link where the preview can be found.
 | |
| 
 | |
| 
 | |
| ### Serving build artifacts
 | |
| - nginx receives a request for an uploaded resource on a subdomain corresponding to the PR and SHA.
 | |
|   E.g.: `pr<PR>-<SHA>.ngbuilds.io/path/to/resurce`
 | |
| - nginx maps the subdomain to the correct sub-direcory and serves the resource.
 | |
|   E.g.: `/<PR>/<SHA>/path/to/resource`
 | |
| 
 | |
| 
 | |
| ### Removing obsolete artifacts
 | |
| In order to avoid flooding the disk with unnecessary build artifacts, there is a cronjob that runs a
 | |
| clean-up tasks once a day. The task retrieves all open PRs from GitHub and removes all directories
 | |
| 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.
 |