#!/bin/bash set -eu -o pipefail readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" readonly SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"/.. && pwd)" export JSON="${SOURCE_DIR}/node_modules/.bin/json" installer_revision=$(git rev-parse HEAD) instance_id="" server_ip="" destroy_server="yes" ami_id="ami-f9e30f96" region="eu-central-1" aws_credentials="testing" security_group="sg-b9a473d1" instance_type="t2.micro" subnet_id="subnet-801402e9" key_pair_name="id_rsa_yellowtent" # Only GNU getopt supports long options. OS X comes bundled with the BSD getopt # brew install gnu-getopt to get the GNU getopt on OS X [[ $(uname -s) == "Darwin" ]] && GNU_GETOPT="/usr/local/opt/gnu-getopt/bin/getopt" || GNU_GETOPT="getopt" readonly GNU_GETOPT args=$(${GNU_GETOPT} -o "" -l "revisio0n:,no-destroy" -n "$0" -- "$@") eval set -- "${args}" while true; do case "$1" in --revision) installer_revision="$2"; shift 2;; --no-destroy) destroy_server="no"; shift 2;; --) break;; *) echo "Unknown option $1"; exit 1;; esac done readonly ssh_keys="${HOME}/.ssh/id_rsa_yellowtent" readonly scp202="scp -P 202 -o ConnectTimeout=10 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i ${ssh_keys}" readonly scp22="scp -o ConnectTimeout=10 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i ${ssh_keys}" readonly ssh202="ssh -p 202 -o IdentitiesOnly=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i ${ssh_keys}" readonly ssh22="ssh -o IdentitiesOnly=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i ${ssh_keys}" if [[ ! -f "${ssh_keys}" ]]; then echo "caas ssh key is missing at ${ssh_keys} (pick it up from secrets repo)" exit 1 fi function debug() { echo "$@" >&2 } function get_pretty_revision() { local git_rev="$1" local sha1=$(git rev-parse --short "${git_rev}" 2>/dev/null) echo "${sha1}" } now=$(date "+%Y-%m-%d-%H%M%S") pretty_revision=$(get_pretty_revision "${installer_revision}") echo "Creating EC2 instance" instance_id=$(aws ec2 run-instances --image-id ${ami_id} --region ${region} --profile ${aws_credentials} --security-group-ids ${security_group} --instance-type ${instance_type} --key-name ${key_pair_name} --subnet-id ${subnet_id} --associate-public-ip-address | $JSON Instances[0].InstanceId) echo "Got InstanceId: ${instance_id}" echo "Waiting for instance to be running..." while true; do event_status=`aws ec2 describe-instances --instance-id ${instance_id} --region ${region} --profile ${aws_credentials} | $JSON Reservations[0].Instances[0].State.Name` if [[ "${event_status}" == "running" ]]; then break fi debug -n "." sleep 10 done server_ip=$(aws ec2 describe-instances --instance-id ${instance_id} --region ${region} --profile ${aws_credentials} | $JSON Reservations[0].Instances[0].PublicIpAddress) echo "Server IP is: ${server_ip}" while true; do echo "Trying to copy init script to server" if $scp22 "${SCRIPT_DIR}/initializeBaseUbuntuImage.sh" ubuntu@${server_ip}:.; then break fi echo "Timedout, trying again in 30 seconds" sleep 30 done echo "Copying infra_version.js" $scp22 "${SCRIPT_DIR}/../src/infra_version.js" ubuntu@${server_ip}:. echo "Copying box source" cd "${SOURCE_DIR}" git archive --format=tar HEAD | $ssh22 "ubuntu@${server_ip}" "cat - > /tmp/box.tar.gz" echo "Executing init script" if ! $ssh22 "ubuntu@${server_ip}" "sudo /bin/bash /home/ubuntu/initializeBaseUbuntuImage.sh ${installer_revision}"; then echo "Init script failed" echo "Make sure to cleanup the ec2 instance ${instance_id}" exit 1 fi snapshot_name="cloudron-${pretty_revision}-${now}" echo "Creating ami image ${snapshot_name}" image_id=$(aws ec2 create-image --region ${region} --profile ${aws_credentials} --instance-id ${instance_id} --name ${snapshot_name} | $JSON ImageId) echo "Image creation started for image id: ${image_id}" echo "Waiting for image creation to finish..." while true; do event_status=`aws ec2 describe-images --region ${region} --profile ${aws_credentials} --image-id ${image_id} | $JSON Images[0].State` if [[ "${event_status}" == "available" ]]; then break fi debug -n "." sleep 10 done echo "Terminating instance" aws ec2 terminate-instances --region ${region} --profile ${aws_credentials} --instance-ids ${instance_id} echo "Make image public" aws ec2 modify-image-attribute --region ${region} --profile ${aws_credentials} --image-id ${image_id} --launch-permission "{\"Add\":[{\"Group\":\"all\"}]}" echo "Copy image to other regions" aws ec2 copy-image --region us-west-2 --profile ${aws_credentials} --source-image-id ${image_id} --source-region ${region} --name ${snapshot_name} aws ec2 copy-image --region ap-southeast-1 --profile ${aws_credentials} --source-image-id ${image_id} --source-region ${region} --name ${snapshot_name} echo "Done." echo "" echo "--------------------------------------------------" echo "New image id is: ${image_id}" echo "--------------------------------------------------" echo ""