#!/bin/bash # AppSRE runs this script to build an ami and share it with an account set -exv COMMIT_SHA=$(git rev-parse HEAD) COMMIT_BRANCH=$(git rev-parse --abbrev-ref HEAD) # Use CI variables if available if [ -n "$CI_COMMIT_SHA" ]; then COMMIT_SHA="$CI_COMMIT_SHA" fi if [ -n "$CI_COMMIT_BRANCH" ]; then COMMIT_BRANCH="$CI_COMMIT_BRANCH" fi # $WORKSPACE is set by jenkins and in gitlab, # for gitlab change it to the current directory if [ -n "$CI_COMMIT_SHA" ]; then WORKSPACE="$PWD" fi if [ -n "$CI_COMMIT_SHA" ]; then sudo dnf install -y podman jq fi # decide whether podman or docker should be used if which podman 2>/dev/null >&2; then CONTAINER_RUNTIME=podman elif which docker 2>/dev/null >&2; then CONTAINER_RUNTIME="docker --config=$PWD/.docker" else echo No container runtime found, install podman or docker. exit 2 fi function greenprint { echo -e "\033[1;32m[$(date -Isecond)] ${1}\033[0m" } KEY_NAME=$(uuidgen) function cleanup { set +e if [ -z "$CI_COMMIT_SHA" ]; then if [ -n "$AWS_INSTANCE_ID" ]; then $CONTAINER_RUNTIME run --rm \ -e AWS_ACCESS_KEY_ID="$PACKER_AWS_ACCESS_KEY_ID" \ -e AWS_SECRET_ACCESS_KEY="$PACKER_AWS_SECRET_ACCESS_KEY" \ -e AWS_DEFAULT_REGION="us-east-1" \ "packer:$COMMIT_SHA" aws ec2 terminate-instances \ --instance-ids "$AWS_INSTANCE_ID" fi $CONTAINER_RUNTIME run --rm \ -e AWS_ACCESS_KEY_ID="$PACKER_AWS_ACCESS_KEY_ID" \ -e AWS_SECRET_ACCESS_KEY="$PACKER_AWS_SECRET_ACCESS_KEY" \ -e AWS_DEFAULT_REGION="us-east-1" \ "packer:$COMMIT_SHA" aws ec2 delete-key-pair --key-name "$KEY_NAME" fi $CONTAINER_RUNTIME rmi "packer:$COMMIT_SHA" } trap cleanup EXIT function ec2_rpm_build { RPMBUILD_DIR="./templates/packer/ansible/roles/common/files/rpmbuild/RPMS" mkdir -p "$RPMBUILD_DIR" greenprint "🚀 Start RHEL Cloud Access image to build rpms on" $CONTAINER_RUNTIME run --rm \ -e AWS_ACCESS_KEY_ID="$PACKER_AWS_ACCESS_KEY_ID" \ -e AWS_SECRET_ACCESS_KEY="$PACKER_AWS_SECRET_ACCESS_KEY" \ -e AWS_DEFAULT_REGION="us-east-1" \ "packer:$COMMIT_SHA" aws ec2 create-key-pair \ --key-name "$KEY_NAME" \ --query 'KeyMaterial' \ --output text \ > ./keypair.pem chmod 600 ./keypair.pem $CONTAINER_RUNTIME run --rm \ -e AWS_ACCESS_KEY_ID="$PACKER_AWS_ACCESS_KEY_ID" \ -e AWS_SECRET_ACCESS_KEY="$PACKER_AWS_SECRET_ACCESS_KEY" \ -e AWS_DEFAULT_REGION="us-east-1" \ "packer:$COMMIT_SHA" aws ec2 run-instances \ --image-id ami-0b0af3577fe5e3532 --instance-type c5.large \ --key-name "$KEY_NAME" \ --tag-specifications "ResourceType=instance,Tags=[{Key=commit,Value=$COMMIT_SHA},{Key=name,Value=rpm-builder-$COMMIT_SHA}]" \ > ./rpminstance.json AWS_INSTANCE_ID=$(jq -r '.Instances[].InstanceId' "rpminstance.json") $CONTAINER_RUNTIME run --rm \ -e AWS_ACCESS_KEY_ID="$PACKER_AWS_ACCESS_KEY_ID" \ -e AWS_SECRET_ACCESS_KEY="$PACKER_AWS_SECRET_ACCESS_KEY" \ -e AWS_DEFAULT_REGION="us-east-1" \ "packer:$COMMIT_SHA" aws ec2 wait instance-running \ --instance-ids "$AWS_INSTANCE_ID" $CONTAINER_RUNTIME run --rm \ -e AWS_ACCESS_KEY_ID="$PACKER_AWS_ACCESS_KEY_ID" \ -e AWS_SECRET_ACCESS_KEY="$PACKER_AWS_SECRET_ACCESS_KEY" \ -e AWS_DEFAULT_REGION="us-east-1" \ "packer:$COMMIT_SHA" aws ec2 describe-instances \ --instance-ids "$AWS_INSTANCE_ID" \ > "instances.json" RPMBUILDER_HOST=$(jq -r '.Reservations[].Instances[].PublicIpAddress' "instances.json") for LOOP_COUNTER in {0..30}; do if ssh -i ./keypair.pem -o ConnectTimeout=5 -o StrictHostKeyChecking=no "ec2-user@$RPMBUILDER_HOST" true; then break fi sleep 5 echo "sleeping, try #$LOOP_COUNTER" done cat > tools/appsre-ansible/inventory < templates/packer/share.auto.pkrvars.hcl <