Update README.md #121
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Auto deploy to AWS | |
on: | |
push: | |
branches: [ "develop" ] | |
permissions: | |
contents: read | |
jobs: | |
build: | |
runs-on: ubuntu-22.04 | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Run chmod to make gradlew executable | |
run: chmod +x ./gradlew | |
- name: Set up JDK 17 | |
uses: actions/setup-java@v3 | |
with: | |
java-version: '17' | |
distribution: 'temurin' | |
- name: Set YML | |
run: | | |
echo ${{ secrets.APPLICATION_YML }} | base64 --decode > ./src/main/resources/application.yml | |
- name: Build with Gradle | |
uses: gradle/[email protected] | |
with: | |
arguments: clean build -x test | |
- name: Docker build & push to Docker repo | |
run: | | |
docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_PASSWORD }} | |
echo "docker 로그인 성공" | |
docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/ggumi . | |
echo "docker 빌드 성공" | |
docker push ${{ secrets.DOCKERHUB_USERNAME }}/ggumi | |
deploy: | |
needs: build | |
runs-on: ubuntu-latest | |
steps: | |
- name: AWS login and docker image pull and run | |
uses: appleboy/[email protected] | |
with: | |
host: ${{ secrets.EC2_HOST }} | |
username: ec2-user | |
key: ${{ secrets.EC2_PRIVATE_KEY }} | |
port: 22 | |
envs: GITHUB_SHA | |
script: | | |
sudo docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_PASSWORD }} | |
echo "docker 로그인 성공" | |
sudo docker stop $(sudo docker ps -aq) | |
echo "현재 실행 중인 모든 Docker 컨테이너 중지" | |
sudo docker rm -f $(sudo docker ps -qa) | |
echo "모든 Docker 컨테이너 강제로 삭제" | |
sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/ggumi | |
echo "docker pull 성공" | |
sudo docker run -d -p 80:8080 ${{ secrets.DOCKERHUB_USERNAME }}/ggumi | |
sudo docker image prune -f | |
echo "사용하지 않는 Docker image 정리" | |
- name: Configure AWS CLI | |
run: | | |
echo "Configuring AWS CLI" | |
aws configure set aws_access_key_id ${{ secrets.AWS_ACCESS_KEY_ID }} | |
aws configure set aws_secret_access_key ${{ secrets.AWS_SECRET_ACCESS_KEY }} | |
aws configure set default.region ap-northeast-2 # 지역 설정 | |
- name: Test AWS CLI Configuration | |
run: | | |
echo "Testing AWS CLI Configurationn" | |
aws sts get-caller-identity | |
- name: Fetch Instance ID And | |
run: | | |
echo "Fetching Instance ID..." | |
INSTANCE_ID=$(aws ec2 describe-instances --filters "Name=tag:Name,Values=ggumi" --query "Reservations[*].Instances[*].InstanceId" --output text | xargs) | |
if [ -z "$INSTANCE_ID" ]; then | |
echo "Error: No instance found with the tag 'ggumi'." | |
exit 1 | |
else | |
echo "fetch Instance ID success" | |
fi | |
echo "Creating AMI..." | |
IMAGE_ID=$(aws ec2 create-image --instance-id $INSTANCE_ID --name "ggumi-$(date +%Y%m%d%H%M%S)" --no-reboot --query 'ImageId' --output text) | |
echo "Creating AMI with ID: $IMAGE_ID" | |
echo "Waiting for the AMI to become available..." | |
aws ec2 wait image-available --image-ids $IMAGE_ID | |
echo "AMI $IMAGE_ID is now available." | |
echo "Updating existing Launch Template with new AMI..." | |
CURRENT_LAUNCH_TEMPLATE=$(aws ec2 describe-launch-templates --launch-template-names GgumiServerTemplate --query 'LaunchTemplates[0]' --output json) | |
LAUNCH_TEMPLATE_ID=$(echo $CURRENT_LAUNCH_TEMPLATE | jq -r '.LaunchTemplateId') | |
LAUNCH_TEMPLATE_VERSION_NUMBER=$(echo $CURRENT_LAUNCH_TEMPLATE | jq -r '.LatestVersionNumber') | |
LAUNCH_TEMPLATE_VERSION_DATA=$(aws ec2 describe-launch-template-versions --launch-template-id $LAUNCH_TEMPLATE_ID --query 'LaunchTemplateVersions[?VersionNumber==`'$LAUNCH_TEMPLATE_VERSION_NUMBER'`]' --output json) | |
INSTANCE_TYPE=$(echo $LAUNCH_TEMPLATE_VERSION_DATA | jq -r '.[0].LaunchTemplateData.InstanceType') | |
KEY_NAME=$(echo $LAUNCH_TEMPLATE_VERSION_DATA | jq -r '.[0].LaunchTemplateData.KeyName') | |
SECURITY_GROUP_IDS=$(echo $LAUNCH_TEMPLATE_VERSION_DATA | jq -r '.[0].LaunchTemplateData.SecurityGroupIds | join(",")') | |
aws ec2 create-launch-template-version \ | |
--launch-template-id $LAUNCH_TEMPLATE_ID \ | |
--source-version $LAUNCH_TEMPLATE_VERSION_NUMBER \ | |
--launch-template-data "{ | |
\"ImageId\":\"$IMAGE_ID\", | |
\"InstanceType\":\"$INSTANCE_TYPE\", | |
\"KeyName\":\"$KEY_NAME\", | |
\"SecurityGroupIds\":[\"$SECURITY_GROUP_IDS\"] | |
}" | |
echo "Launch Template updated successfully." | |
- name: Updating Auto Scaling Group | |
run: | | |
LATEST_LAUNCH_TEMPLATE=$(aws ec2 describe-launch-templates --launch-template-names GgumiServerTemplate --query 'LaunchTemplates[0]' --output json) | |
LATEST_LAUNCH_TEMPLATE_ID=$(echo $LATEST_LAUNCH_TEMPLATE | jq -r '.LaunchTemplateId') | |
LATEST_LAUNCH_TEMPLATE_VERSION_NUMBER=$(echo $LATEST_LAUNCH_TEMPLATE | jq -r '.LatestVersionNumber') | |
echo "Updating Auto Scaling Group with new Launch Template version..." | |
aws autoscaling update-auto-scaling-group --auto-scaling-group-name GgumiASG --launch-template "LaunchTemplateId=$LATEST_LAUNCH_TEMPLATE_ID,Version=$LATEST_LAUNCH_TEMPLATE_VERSION_NUMBER" | |
echo "Auto Scaling Group updated successfully." | |
- name: Start Instance Refresh | |
run: | | |
echo "Starting instance refresh for Auto Scaling Group..." | |
aws autoscaling start-instance-refresh --auto-scaling-group-name GgumiASG --strategy Rolling | |
echo "Instance refresh started successfully." |