d2/ci/release/builders/aws_ensure.sh

237 lines
8.2 KiB
Bash
Raw Normal View History

2022-11-13 03:10:45 +00:00
#!/bin/sh
set -eu
cd -- "$(dirname "$0")/../../.."
. ./ci/sub/lib.sh
help() {
cat <<EOF
2022-11-14 06:59:09 +00:00
usage: $0 [--dry-run]
2022-11-13 03:10:45 +00:00
2022-11-13 04:39:14 +00:00
$0 creates and ensures the d2 builders in AWS.
2022-11-13 03:10:45 +00:00
EOF
}
main() {
while :; do
flag_parse "$@"
case "$FLAG" in
h|help)
help
return 0
;;
2022-11-14 06:59:09 +00:00
dry-run)
2022-11-14 05:58:55 +00:00
flag_noarg && shift "$FLAGSHIFT"
2022-11-14 06:59:09 +00:00
DRY_RUN=1
2022-11-13 03:10:45 +00:00
;;
'')
shift "$FLAGSHIFT"
break
;;
*)
flag_errusage "unrecognized flag $FLAGRAW"
;;
esac
done
if [ $# -gt 0 ]; then
flag_errusage "no arguments are accepted"
fi
2022-11-13 04:39:14 +00:00
create_rhosts
init_rhosts
2022-11-13 03:10:45 +00:00
}
2022-11-13 04:39:14 +00:00
create_rhosts() {
2022-11-13 03:10:45 +00:00
KEY_NAME=$(aws ec2 describe-key-pairs | jq -r .KeyPairs[0].KeyName)
VPC_ID=$(aws ec2 describe-vpcs | jq -r .Vpcs[0].VpcId)
header security-group
SG_ID=$(aws ec2 describe-security-groups --group-names ssh 2>/dev/null \
| jq -r .SecurityGroups[0].GroupId)
if [ -z "$SG_ID" ]; then
SG_ID=$(sh_c aws ec2 create-security-group \
--group-name ssh \
--description ssh \
--vpc-id "$VPC_ID" | jq -r .GroupId)
fi
header security-group-ingress
SG_RULES_COUNT=$(aws ec2 describe-security-groups --group-names ssh \
| jq -r '.SecurityGroups[0].IpPermissions | length')
if [ "$SG_RULES_COUNT" -eq 0 ]; then
sh_c aws ec2 authorize-security-group-ingress \
--group-id "$SG_ID" \
--protocol tcp \
--port 22 \
--cidr 0.0.0.0/0 >/dev/null
fi
header linux-amd64
state=$(aws ec2 describe-instances --filters \
'Name=instance-state-name,Values=pending,running,stopping,stopped' 'Name=tag:Name,Values=d2-builder-linux-amd64' \
| jq -r '.Reservations[].Instances[].State.Name')
if [ -z "$state" ]; then
2022-11-13 03:10:45 +00:00
sh_c aws ec2 run-instances \
--image-id=ami-0d593311db5abb72b \
--count=1 \
2022-11-13 04:39:14 +00:00
--instance-type=t2.small \
2022-11-13 03:10:45 +00:00
--security-groups=ssh \
"--key-name=$KEY_NAME" \
2022-11-14 14:57:01 +00:00
--tag-specifications '"ResourceType=instance,Tags=[{Key=Name,Value=d2-builder-linux-amd64}]"' \
'"ResourceType=volume,Tags=[{Key=Name,Value=d2-builder-linux-amd64}]"' >/dev/null
2022-11-13 03:10:45 +00:00
fi
2022-11-13 03:36:56 +00:00
while true; do
dnsname=$(sh_c aws ec2 describe-instances \
--filters 'Name=instance-state-name,Values=pending,running,stopping,stopped' 'Name=tag:Name,Values=d2-builder-linux-amd64' \
2022-11-13 03:36:56 +00:00
| jq -r '.Reservations[].Instances[].PublicDnsName')
if [ -n "$dnsname" ]; then
2022-11-13 04:39:14 +00:00
log "TSTRUCT_LINUX_AMD64_BUILDER=ec2-user@$dnsname"
export TSTRUCT_LINUX_AMD64_BUILDER=ec2-user@$dnsname
2022-11-13 03:36:56 +00:00
break
fi
sleep 5
done
2022-11-13 03:10:45 +00:00
header linux-arm64
state=$(aws ec2 describe-instances --filters \
'Name=instance-state-name,Values=pending,running,stopping,stopped' 'Name=tag:Name,Values=d2-builder-linux-arm64' \
| jq -r '.Reservations[].Instances[].State.Name')
if [ -z "$state" ]; then
2022-11-13 03:10:45 +00:00
sh_c aws ec2 run-instances \
--image-id=ami-0efabcf945ffd8831 \
--count=1 \
2022-11-13 04:39:14 +00:00
--instance-type=t4g.small \
2022-11-13 03:10:45 +00:00
--security-groups=ssh \
"--key-name=$KEY_NAME" \
2022-11-14 14:57:01 +00:00
--tag-specifications '"ResourceType=instance,Tags=[{Key=Name,Value=d2-builder-linux-arm64}]"' \
'"ResourceType=volume,Tags=[{Key=Name,Value=d2-builder-linux-arm64}]"' >/dev/null
2022-11-13 03:10:45 +00:00
fi
2022-11-13 03:36:56 +00:00
while true; do
dnsname=$(sh_c aws ec2 describe-instances \
--filters 'Name=instance-state-name,Values=pending,running,stopping,stopped' 'Name=tag:Name,Values=d2-builder-linux-arm64' \
2022-11-13 03:36:56 +00:00
| jq -r '.Reservations[].Instances[].PublicDnsName')
if [ -n "$dnsname" ]; then
2022-11-13 04:39:14 +00:00
log "TSTRUCT_LINUX_ARM64_BUILDER=ec2-user@$dnsname"
export TSTRUCT_LINUX_ARM64_BUILDER=ec2-user@$dnsname
2022-11-13 03:36:56 +00:00
break
fi
sleep 5
done
2022-11-14 14:57:01 +00:00
header "macos-amd64-host"
MACOS_AMD64_HOST_ID=$(aws ec2 describe-hosts --filter 'Name=state,Values=pending,available' 'Name=tag:Name,Values=d2-builder-macos-amd64' | jq -r '.Hosts[].HostId')
if [ -z "$MACOS_AMD64_HOST_ID" ]; then
MACOS_AMD64_HOST_ID=$(sh_c aws ec2 allocate-hosts --instance-type mac1.metal --quantity 1 --availability-zone us-west-2a \
--tag-specifications '"ResourceType=dedicated-host,Tags=[{Key=Name,Value=d2-builder-macos-amd64}]"' \
| jq -r .HostIds[0])
2022-11-14 14:57:01 +00:00
fi
header "macos-arm64-host"
MACOS_ARM64_HOST_ID=$(aws ec2 describe-hosts --filter 'Name=state,Values=pending,available' 'Name=tag:Name,Values=d2-builder-macos-arm64' | jq -r '.Hosts[].HostId')
if [ -z "$MACOS_ARM64_HOST_ID" ]; then
MACOS_ARM64_HOST_ID=$(sh_c aws ec2 allocate-hosts --instance-type mac2.metal --quantity 1 --availability-zone us-west-2a \
--tag-specifications '"ResourceType=dedicated-host,Tags=[{Key=Name,Value=d2-builder-macos-amd64}]"' \
| jq -r .HostIds[0])
2022-11-14 14:57:01 +00:00
fi
header macos-amd64
state=$(aws ec2 describe-instances --filters \
'Name=instance-state-name,Values=pending,running,stopping,stopped' 'Name=tag:Name,Values=d2-builder-macos-amd64' \
| jq -r '.Reservations[].Instances[].State.Name')
if [ -z "$state" ]; then
2022-11-14 14:57:01 +00:00
sh_c aws ec2 run-instances \
--image-id=ami-0dd2ded7568750663 \
--count=1 \
--instance-type=mac1.metal \
--security-groups=ssh \
"--key-name=$KEY_NAME" \
--placement "Tenancy=host,HostId=$MACOS_AMD64_HOST_ID" \
2022-11-14 14:57:01 +00:00
--tag-specifications '"ResourceType=instance,Tags=[{Key=Name,Value=d2-builder-macos-amd64}]"' \
'"ResourceType=volume,Tags=[{Key=Name,Value=d2-builder-macos-amd64}]"' >/dev/null
fi
while true; do
dnsname=$(sh_c aws ec2 describe-instances \
--filters 'Name=instance-state-name,Values=pending,running,stopping,stopped' 'Name=tag:Name,Values=d2-builder-macos-amd64' \
2022-11-14 14:57:01 +00:00
| jq -r '.Reservations[].Instances[].PublicDnsName')
if [ -n "$dnsname" ]; then
log "TSTRUCT_MACOS_AMD64_BUILDER=ec2-user@$dnsname"
export TSTRUCT_MACOS_AMD64_BUILDER=ec2-user@$dnsname
break
fi
sleep 5
done
header macos-arm64
state=$(aws ec2 describe-instances --filters \
'Name=instance-state-name,Values=pending,running,stopping,stopped' 'Name=tag:Name,Values=d2-builder-macos-arm64' \
| jq -r '.Reservations[].Instances[].State.Name')
if [ -z "$state" ]; then
2022-11-14 14:57:01 +00:00
sh_c aws ec2 run-instances \
--image-id=ami-0af0516ff2c43dbbe \
--count=1 \
--instance-type=mac2.metal \
--security-groups=ssh \
"--key-name=$KEY_NAME" \
--placement "Tenancy=host,HostId=$MACOS_ARM64_HOST_ID" \
2022-11-14 14:57:01 +00:00
--tag-specifications '"ResourceType=instance,Tags=[{Key=Name,Value=d2-builder-macos-arm64}]"' \
'"ResourceType=volume,Tags=[{Key=Name,Value=d2-builder-macos-arm64}]"' >/dev/null
fi
while true; do
dnsname=$(sh_c aws ec2 describe-instances \
--filters 'Name=instance-state-name,Values=pending,running,stopping,stopped' 'Name=tag:Name,Values=d2-builder-macos-arm64' \
2022-11-14 14:57:01 +00:00
| jq -r '.Reservations[].Instances[].PublicDnsName')
if [ -n "$dnsname" ]; then
log "TSTRUCT_MACOS_ARM64_BUILDER=ec2-user@$dnsname"
export TSTRUCT_MACOS_ARM64_BUILDER=ec2-user@$dnsname
break
fi
sleep 5
done
2022-11-13 03:10:45 +00:00
}
2022-11-13 04:39:14 +00:00
init_rhosts() {
header linux-amd64
2022-11-14 14:57:01 +00:00
RHOST=$TSTRUCT_LINUX_AMD64_BUILDER init_rhost_linux
2022-11-13 04:39:14 +00:00
header linux-arm64
2022-11-14 14:57:01 +00:00
RHOST=$TSTRUCT_LINUX_ARM64_BUILDER init_rhost_linux
header macos-amd64
RHOST=$TSTRUCT_MACOS_AMD64_BUILDER init_rhost_macos
header macos-arm64
RHOST=$TSTRUCT_MACOS_ARM64_BUILDER init_rhost_macos
COLOR=2 header summary
2022-11-13 05:07:11 +00:00
log "export TSTRUCT_LINUX_AMD64_BUILDER=$TSTRUCT_LINUX_AMD64_BUILDER"
log "export TSTRUCT_LINUX_ARM64_BUILDER=$TSTRUCT_LINUX_ARM64_BUILDER"
2022-11-14 14:57:01 +00:00
log "export TSTRUCT_MACOS_AMD64_BUILDER=$TSTRUCT_MACOS_AMD64_BUILDER"
log "export TSTRUCT_MACOS_ARM64_BUILDER=$TSTRUCT_MACOS_ARM64_BUILDER"
2022-11-13 04:39:14 +00:00
}
2022-11-14 14:57:01 +00:00
init_rhost_linux() {
2022-11-13 04:39:14 +00:00
while true; do
if sh_c ssh "$RHOST" :; then
break
fi
sleep 5
done
sh_c ssh "$RHOST" 'sudo yum upgrade -y'
sh_c ssh "$RHOST" 'sudo yum install -y docker'
sh_c ssh "$RHOST" 'sudo systemctl start docker'
sh_c ssh "$RHOST" 'sudo systemctl enable docker'
sh_c ssh "$RHOST" 'sudo usermod -a -G docker ec2-user'
sh_c ssh "$RHOST" 'sudo reboot' || true
}
2022-11-14 14:57:01 +00:00
init_rhost_macos() {
while true; do
if sh_c ssh "$RHOST" :; then
break
fi
sleep 5
done
sh_c ssh "$RHOST" '": | /bin/bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\""'
sh_c ssh "$RHOST" '/usr/local/bin/brew update'
sh_c ssh "$RHOST" '/usr/local/bin/brew upgrade'
sh_c ssh "$RHOST" '/usr/local/bin/brew install go'
2022-11-14 14:57:01 +00:00
}
2022-11-13 03:10:45 +00:00
main "$@"