riju/tools/ci-ec2.bash

98 lines
3.1 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
remote_url="$(git remote get-url origin | sed -E 's|git@github\.com:|https://github.com/|')"
commit="$(git rev-parse HEAD)"
echo >&2 "[ci-run.bash] Fetching build parameters from SSM."
parameters="riju-ci-ami-id riju-docker-repo-host riju-public-docker-repo-host riju-s3-bucket-name"
resp="$(aws ssm get-parameters --names ${parameters})"
read -r ami < <(jq '.Parameters[] | select(.Name == "riju-ci-ami-id").Value' -r <<< "${resp}")
read -r docker_repo < <(jq '.Parameters[] | select(.Name == "riju-docker-repo-host").Value' -r <<< "${resp}")
read -r public_docker_repo < <(jq '.Parameters[] | select(.Name == "riju-public-docker-repo-host").Value' -r <<< "${resp}")
read -r s3_bucket < <(jq '.Parameters[] | select(.Name == "riju-s3-bucket-name").Value' -r <<< "${resp}")
echo >&2 "[ci-run.bash] Launching EC2 instance for CI job."
ebs_config="DeviceName=/dev/sdh,Ebs={DeleteOnTermination=true,VolumeSize=128,VolumeType=gp3}"
instance_tags="ResourceType=instance,Tags=[{Key=Name,Value=Riju CI},{Key=BillingCategory,Value=Riju},{Key=BillingSubcategory,Value=Riju:EC2:CI}]"
ebs_tags="ResourceType=volume,Tags=[{Key=Name,Value=Riju CI},{Key=BillingCategory,Value=Riju},{Key=BillingSubcategory,Value=Riju:EBS:CI}]"
resp="$(aws ec2 run-instances \
--image-id "${ami}" \
--instance-type t3.2xlarge \
--security-groups riju-deploy \
--iam-instance-profile Name=riju-deploy \
--instance-initiated-shutdown-behavior terminate \
--user-data file://tools/ci-user-data.bash \
--tag-specifications "${instance_tags}" "${ebs_tags}" \
--block-device-mappings "${ebs_config}")"
instance_id="$(jq '.Instances[].InstanceId' -r <<< "${resp}")"
echo >&2 "[ci-run.bash] Waiting for instance ${instance_id} to become ready."
success=
for i in $(seq 1 15); do
sleep 2
resp="$(aws ec2 describe-instance-status --instance-id "${instance_id}")"
status="$(jq '.InstanceStatuses[].InstanceState.Name' -r <<< "${resp}")"
status="${status:-unknown}"
case "${status}" in
pending|unknown) ;;
running) success=yes; break ;;
* ) exit 1 ;;
esac
done
if [[ -z "${success}}" ]]; then
exit 124
fi
echo >&2 "[ci-run.bash] Waiting for SSH to come online."
success=
for i in $(seq 1 15); do
if (yes || true) | timeout 5 mssh "ubuntu@${instance_id}" true 2>/dev/null; then
success=yes
break
elif (( $# == 124 )); then
exit 1
fi
sleep 2
done
if [[ -z "${success}}" ]]; then
exit 124
fi
echo >&2 "[ci-run.bash] Running CI remotely using EC2 Instance Connect."
mssh "ubuntu@${instance_id}" bash <<EOF
set -euo pipefail
sudo riju-init-volume
sudo chown ubuntu:ubuntu /mnt/riju
pushd /mnt/riju
mkdir -p src
pushd src
git clone ${remote_url} riju -b ${commit}
pushd riju
./tools/ci-bootstrap.bash
popd
popd
popd
EOF
echo >&2 "[ci-run.bash] CI completed."