-
Notifications
You must be signed in to change notification settings - Fork 0
134 lines (114 loc) · 5.84 KB
/
cicd.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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."