1616 IMAGE_TAG : latest
1717
1818jobs :
19+ discover-servers :
20+ runs-on : ubuntu-latest
21+ outputs :
22+ matrix : ${{ steps.set-matrix.outputs.matrix }}
23+ steps :
24+ - name : Configure AWS credentials
25+ uses : aws-actions/configure-aws-credentials@v4
26+ with :
27+ aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }}
28+ aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
29+ aws-region : ${{ secrets.AWS_REGION }}
30+
31+ - name : Get frontend servers from AWS
32+ id : set-matrix
33+ run : |
34+ SERVERS=$(aws ec2 describe-instances \
35+ --filters "Name=tag:role,Values=frontend" "Name=instance-state-name,Values=running" \
36+ --query 'Reservations[*].Instances[*].[PublicIpAddress]' \
37+ --output json | jq -c 'flatten | map(select(. != null))')
38+ echo "Discovered servers: $SERVERS"
39+ echo "matrix={\"server\":$SERVERS}" >> $GITHUB_OUTPUT
40+
1941 build-and-push :
2042 runs-on : ubuntu-latest
2143 steps :
@@ -33,17 +55,18 @@ jobs:
3355 --build-arg NEXT_PUBLIC_API_URL=${{ secrets.NEXT_PUBLIC_API_URL }} \
3456 --build-arg NEXT_PUBLIC_SOCKET_URL=${{ secrets.NEXT_PUBLIC_SOCKET_URL }} \
3557 --build-arg NEXT_PUBLIC_AWS_REGION=${{ secrets.AWS_REGION }} \
36- --build-arg NEXT_PUBLIC_AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }} \
37- --build-arg NEXT_PUBLIC_AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }} \
38- --build-arg NEXT_PUBLIC_AWS_S3_BUCKET=${{ secrets.AWS_S3_BUCKET }} \
58+ --build-arg NEXT_PUBLIC_BUCKET=${{ secrets.NEXT_PUBLIC_BUCKET }} \
3959 --build-arg NEXT_PUBLIC_CLOUDFRONT_DOMAIN=${{ secrets.CLOUDFRONT_DOMAIN }} \
4060 -t $IMAGE_NAME:$IMAGE_TAG .
4161 docker push $IMAGE_NAME:$IMAGE_TAG
4262
4363 deploy :
44- needs : build-and-push
64+ needs : [ build-and-push, discover-servers]
4565 runs-on : ubuntu-latest
4666 if : github.event_name == 'push'
67+ strategy :
68+ matrix : ${{ fromJson(needs.discover-servers.outputs.matrix) }}
69+ fail-fast : false # 한 서버 실패해도 다른 서버 계속 배포
4770 steps :
4871 - name : Set up SSH
4972 uses : webfactory/ssh-agent@v0.9.0
@@ -53,16 +76,28 @@ jobs:
5376 - name : Add known_hosts
5477 run : |
5578 mkdir -p ~/.ssh
56- ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts
79+ ssh-keyscan -H ${{ matrix.server }} >> ~/.ssh/known_hosts
80+
81+ - name : Deploy to EC2 (${{ matrix.server }})
5782
58- - name : Deploy to EC2
5983 run : |
60- ssh ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} 'bash -s' <<EOF
84+ ssh ${{ secrets.SERVER_USER }}@${{ matrix.server }} 'bash -s' <<EOF
6185 set -e
6286 DOCKER_USERNAME=${{ secrets.DOCKER_USERNAME }}
6387 DOCKER_TOKEN=${{ secrets.DOCKER_TOKEN }}
6488 IMAGE_NAME=\$DOCKER_USERNAME/front:latest
65-
89+
90+ echo ">>> Create .test file with environment variables"
91+ cat > /home/${{ secrets.SERVER_USER }}/app/.test <<ENVFILE
92+ NEXT_PUBLIC_API_URL=${{ secrets.NEXT_PUBLIC_API_URL }}
93+ NEXT_PUBLIC_SOCKET_URL=${{ secrets.NEXT_PUBLIC_SOCKET_URL }}
94+ NEXT_PUBLIC_AWS_REGION=${{ secrets.AWS_REGION }}
95+ NEXT_PUBLIC_ACCESSKEY=${{ secrets.AWS_ACCESS_KEY_ID }}
96+ NEXT_PUBLIC_SECRETKEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}
97+ NEXT_PUBLIC_BUCKET=${{ secrets.NEXT_PUBLIC_BUCKET }}
98+ NEXT_PUBLIC_CLOUDFRONT_DOMAIN=${{ secrets.CLOUDFRONT_DOMAIN }}
99+ ENVFILE
100+
66101 echo ">>> Docker Hub login"
67102 echo "\$DOCKER_TOKEN" | docker login -u "\$DOCKER_USERNAME" --password-stdin
68103
@@ -74,10 +109,10 @@ jobs:
74109 cd /home/${{ secrets.SERVER_USER }}/app
75110
76111 echo ">>> docker compose down (if exists)"
77- docker compose down || true
78-
112+ docker compose -f /home/${{ secrets.SERVER_USER }}/app/docker-compose.yml down || true
113+
79114 echo ">>> docker compose up -d"
80- docker compose up -d
81-
115+ docker compose -f /home/${{ secrets.SERVER_USER }}/app/docker-compose.yml up -d
116+
82117 echo ">>> Deployed!"
83118 EOF
0 commit comments