In order to avoid unnecessary operations, the `update-preview-server.sh`
script, that is used to update the PR preview server Docker container,
will only try to update the Docker container if either any files in the
`aio/aio-builds-setup/` directory have changed since the last update or
if a previous update failed. A failed previous update is detected by
checking whether the temporary `aio-builds:provisional` Docker image
still exists. This temporary image is created during the update
operation and is renamed to `aio-builds:latest` if the update goes well.
Previously, the update script was not able to detect a previous failed
attempt if the operation failed before creating the
`aio-builds:provisional` Docker image, such as if the `create-image.sh`
script failed. This could lead to a situation where the preview server
Docker container would not be updated after a failed attempt.
This commit improves the logic for detecting failed attempts to account
for this type of failures. It does this by not removing an older
`aio-builds:provisional` Docker image until a new one is successfully
created.
NOTE: While this is not full-proof, it is an improvement as it
      eliminates a certain kind of failures.
PR Close #37015
		
	
			
		
			
				
	
	
		
			72 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env bash
 | |
| 
 | |
| set -eux -o pipefail
 | |
| exec 3>&1
 | |
| 
 | |
| echo -e "\n\n[`date`] - Updating the preview server..."
 | |
| 
 | |
| # Input
 | |
| readonly HOST_REPO_DIR=$1
 | |
| readonly HOST_SECRETS_DIR=$2
 | |
| readonly HOST_BUILDS_DIR=$3
 | |
| readonly HOST_LOCALCERTS_DIR=$4
 | |
| readonly HOST_LOGS_DIR=$5
 | |
| 
 | |
| # Constants
 | |
| readonly PROVISIONAL_TAG=provisional
 | |
| readonly PROVISIONAL_IMAGE_NAME=aio-builds:$PROVISIONAL_TAG
 | |
| 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
 | |
| 
 | |
|   # 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).
 | |
|   readonly relevantChangedFilesCount=$(git diff --name-only $lastDeployedCommit...HEAD | grep -P "^aio/aio-builds-setup/" | wc -l)
 | |
|   readonly lastAttemptFailed=$(sudo docker image ls | grep "$PROVISIONAL_TAG" >> /dev/fd/3 && echo "true" || echo "false")
 | |
|   if [[ $relevantChangedFilesCount -eq 0 ]] && [[ "$lastAttemptFailed" != "true" ]]; then
 | |
|     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" --no-cache
 | |
|   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")
 | |
| 
 | |
|   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_SECRETS_DIR:/aio-secrets:ro \
 | |
|       --volume $HOST_BUILDS_DIR:/var/www/aio-builds \
 | |
|       --volume $HOST_LOCALCERTS_DIR:/etc/ssl/localcerts:ro \
 | |
|       --volume $HOST_LOGS_DIR:/var/log/aio \
 | |
|       "$LATEST_IMAGE_NAME"
 | |
| 
 | |
|   echo "The new docker image has been successfully deployed."
 | |
| )
 |