| 
									
										
										
										
											2017-05-17 17:09:53 +03:00
										 |  |  | #!/usr/bin/env bash
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | set -eux -o pipefail | 
					
						
							|  |  |  | exec 3>&1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-18 12:06:10 +03:00
										 |  |  | echo "[`date`] - Updating the preview server..." | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-17 17:09:53 +03:00
										 |  |  | # Input | 
					
						
							|  |  |  | readonly HOST_REPO_DIR=$1 | 
					
						
							|  |  |  | readonly HOST_LOCALCERTS_DIR=$2 | 
					
						
							|  |  |  | readonly HOST_SECRETS_DIR=$3 | 
					
						
							|  |  |  | readonly HOST_BUILDS_DIR=$4 | 
					
						
							|  |  |  | readonly HOST_LOGS_DIR=$5 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Constants | 
					
						
							|  |  |  | readonly PROVISIONAL_IMAGE_NAME=aio-builds:provisional | 
					
						
							|  |  |  | readonly LATEST_IMAGE_NAME=aio-builds:latest | 
					
						
							|  |  |  | readonly CONTAINER_NAME=aio | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Run | 
					
						
							|  |  |  | ( | 
					
						
							|  |  |  |   cd "$HOST_REPO_DIR" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   readonly lastDeployedCommit=$(git rev-parse HEAD) | 
					
						
							|  |  |  |   echo "Currently at commit $lastDeployedCommit." | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Pull latest master from origin. | 
					
						
							|  |  |  |   git pull origin master | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-18 12:06:10 +03:00
										 |  |  |   # Do not update the server unless files inside `aio-builds-setup/` have changed | 
					
						
							|  |  |  |   # or the last attempt failed (identified by the provisional image still being around). | 
					
						
							| 
									
										
										
										
											2017-05-17 17:09:53 +03:00
										 |  |  |   readonly relevantChangedFilesCount=$(git diff --name-only $lastDeployedCommit...HEAD | grep -P "^aio/aio-builds-setup/" | wc -l) | 
					
						
							| 
									
										
										
										
											2017-05-18 12:06:10 +03:00
										 |  |  |   readonly lastAttemptFailed=$(sudo docker rmi "$PROVISIONAL_IMAGE_NAME" >> /dev/fd/3 && echo "true" || echo "false") | 
					
						
							|  |  |  |   if [[ $relevantChangedFilesCount -eq 0 ]] && [[ "$lastAttemptFailed" != "true" ]]; then | 
					
						
							| 
									
										
										
										
											2017-05-17 17:09:53 +03:00
										 |  |  |     echo "Skipping update because no relevant files have been touched." | 
					
						
							|  |  |  |     exit 0 | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Create and verify a new docker image. | 
					
						
							|  |  |  |   aio/aio-builds-setup/scripts/create-image.sh "$PROVISIONAL_IMAGE_NAME" | 
					
						
							| 
									
										
										
										
											2017-05-18 12:06:10 +03:00
										 |  |  |   readonly imageVerified=$(sudo docker run --dns 127.0.0.1 --rm --volume $HOST_SECRETS_DIR:/aio-secrets:ro "$PROVISIONAL_IMAGE_NAME" /bin/bash -c "aio-init && aio-health-check && aio-verify-setup" >> /dev/fd/3 && echo "true" || echo "false") | 
					
						
							| 
									
										
										
										
											2017-05-17 17:09:53 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if [[ "$imageVerified" != "true" ]]; then | 
					
						
							|  |  |  |     echo "Failed to verify new docker image. Aborting update!" | 
					
						
							|  |  |  |     exit 1 | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Remove the old container and replace the docker image. | 
					
						
							|  |  |  |   sudo docker stop "$CONTAINER_NAME" || true | 
					
						
							|  |  |  |   sudo docker rm "$CONTAINER_NAME" || true | 
					
						
							|  |  |  |   sudo docker rmi "$LATEST_IMAGE_NAME" || true | 
					
						
							|  |  |  |   sudo docker tag "$PROVISIONAL_IMAGE_NAME" "$LATEST_IMAGE_NAME" | 
					
						
							|  |  |  |   sudo docker rmi "$PROVISIONAL_IMAGE_NAME" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Create and start a docker container based on the new image. | 
					
						
							|  |  |  |   sudo docker run \
 | 
					
						
							|  |  |  |       --detach \
 | 
					
						
							|  |  |  |       --dns 127.0.0.1 \
 | 
					
						
							|  |  |  |       --name "$CONTAINER_NAME" \
 | 
					
						
							|  |  |  |       --publish 80:80 \
 | 
					
						
							|  |  |  |       --publish 443:443 \
 | 
					
						
							|  |  |  |       --restart unless-stopped \
 | 
					
						
							|  |  |  |       --volume $HOST_LOCALCERTS_DIR:/etc/ssl/localcerts:ro \
 | 
					
						
							|  |  |  |       --volume $HOST_SECRETS_DIR:/aio-secrets:ro \
 | 
					
						
							|  |  |  |       --volume $HOST_BUILDS_DIR:/var/www/aio-builds \
 | 
					
						
							|  |  |  |       --volume $HOST_LOGS_DIR:/var/log/aio \
 | 
					
						
							|  |  |  |       "$LATEST_IMAGE_NAME" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   echo "The new docker image has been successfully deployed." | 
					
						
							|  |  |  | ) |