-
Notifications
You must be signed in to change notification settings - Fork 0
90 lines (79 loc) · 5.69 KB
/
aws.yml
File metadata and controls
90 lines (79 loc) · 5.69 KB
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
name: 백엔드 AWS 배포 파이프라인 구현 # GitHub Actions 워크플로우의 이름. eCommerce 웹 애플리케이션을 AWS에 배포하기 위한 워크플로우
on:
workflow_run:
workflows: ["백엔드 CI 테스트 코드 자동화"]
types:
- completed
branches:
- main
jobs:
build: # 'build'라는 이름의 job 정의. 빌드 및 배포 작업을 수행
runs-on: ubuntu-latest # 최신 버전의 Ubuntu 운영 체제에서 job 실행
steps: # job을 구성하는 개별 단계들 정의
- name: Checkout repository # Step 1: 코드 저장소 체크아웃
uses: actions/checkout@v3 # GitHub Actions의 checkout 액션(v3)을 사용하여 저장소 코드 가져오기
- name: JDK 21 설정 # Step 2: JDK 21 환경 설정
uses: actions/setup-java@v4 # setup-java 액션(v4)을 사용하여 Java 환경 구성
with:
java-version: '21' # JDK 21 버전 지정
distribution: 'temurin' # Eclipse Temurin JDK 배포판 사용
java-package: 'jdk' # JDK 패키지 설치
check-latest: false # 최신 버전 확인 비활성화
server-id: 'github' # GitHub 패키지 레지스트리 서버 ID 설정
server-username: ${{ github.actor }} # GitHub Actions 실행 주체(사용자 또는 봇)의 이름 사용
server-password: ${{ secrets.GITHUB_TOKEN }} # GitHub 토큰을 사용하여 인증
overwrite-settings: true # 기존 Maven/Gradle 설정 파일 덮어쓰기
- name: Cache Gradle packages # Step 3: Gradle 패키지 캐시 설정
uses: actions/cache@v3 # 캐싱 액션(v3)을 사용하여 빌드 속도 향상
with:
path: ~/.gradle # Gradle 캐시 디렉토리 경로 지정
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} # 운영 체제와 Gradle 파일 해시를 기반으로 캐시 키 생성
restore-keys: ${{ runner.os }}-gradle # 복원 가능한 캐시 키 접두사 지정
- name: Make gradlew executable # Step 4: Gradle Wrapper 실행 권한 부여
run: chmod +x backend/gradlew # backend 디렉토리의 gradlew 스크립트에 실행 권한 추가
- name: Build with Gradle # Step 5: Gradle로 프로젝트 빌드
working-directory: backend # 작업 디렉토리를 backend로 설정
run: ./gradlew clean build -x test # Gradle 명령어를 실행하여 프로젝트 정리(clean) 및 빌드(build)
- name: Login to Docker Hub # Step 6: Docker Hub에 로그인
uses: docker/login-action@v3 # Docker 로그인 액션(v3) 사용
with:
username: ${{ secrets.DOCKER_USERNAME }} # GitHub Secrets에 저장된 Docker Hub 사용자 이름
password: ${{ secrets.DOCKER_PASSWORD }} # GitHub Secrets에 저장된 Docker Hub 비밀번호
- name: Build Docker image # Step 7: Docker 이미지 빌드
working-directory: backend # 작업 디렉토리를 backend로 설정
run: |
docker build . -t ${{ secrets.DOCKER_USERNAME }}/ecommerce:${{ github.sha }} # 현재 디렉토리에서 Docker 이미지 빌드, GitHub 커밋 SHA로 태그 지정
docker tag ${{ secrets.DOCKER_USERNAME }}/ecommerce:${{ github.sha }} ${{ secrets.DOCKER_USERNAME }}/ecommerce:v${{ github.run_number }} # 동일한 이미지를 빌드 번호로 태그 추가
- name: Push Docker image to Docker Hub # Step 8: Docker 이미지를 Docker Hub에 푸시
run: |
docker push ${{ secrets.DOCKER_USERNAME }}/ecommerce:${{ github.sha }} # GitHub SHA 태그가 붙은 이미지 푸시
docker push ${{ secrets.DOCKER_USERNAME }}/ecommerce:v${{ github.run_number }} # 빌드 번호 태그가 붙은 이미지 푸시
- name: Deploy to server # Step 9: 서버에 배포
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.DEPLOY_SERVER }} # GitHub Secrets에 저장된 배포 서버 주소
username: ${{ secrets.SSH_USER }} # GitHub Secrets에 저장된 SSH 사용자 이름
key: ${{ secrets.SSH_PRIVATE_KEY }} # GitHub Secrets에 저장된 SSH 비밀 키
port: 22 # SSH 접속 포트 (기본값: 22)
script: |
# 네트워크 확인 및 생성
if ! sudo docker network ls | grep -q nbe4-5-2-team06_app-network; then
sudo docker network create nbe4-5-2-team06_app-network # 지정된 Docker 네트워크가 없으면 생성
fi
# Docker 이미지 풀
sudo docker pull ${{ secrets.DOCKER_USERNAME }}/ecommerce:${{ github.sha }} # Docker Hub에서 최신 이미지 다운로드
# 기존 컨테이너 정리
sudo docker stop ecommerce || true # 실행 중인 ecommerce 컨테이너 중지 (없으면 무시)
sudo docker rm ecommerce || true # 기존 ecommerce 컨테이너 제거 (없으면 무시)
# 새 컨테이너 실행
sudo docker run -d -p 8080:8080 --network nbe4-5-2-team06_app-network \
--name ecommerce --restart always \
${{ secrets.DOCKER_USERNAME }}/ecommerce:${{ github.sha }} # 새 컨테이너 실행: 8080 포트 매핑, 네트워크 연결, 항상 재시작 정책
# 컨테이너 상태 확인
sleep 5 # 컨테이너 시작 대기
if sudo docker ps | grep -q ecommerce; then
echo "Container ecommerce is running" # 컨테이너가 정상 실행 중이면 메시지 출력
else
echo "Failed to start container ecommerce" # 컨테이너 실행 실패 시 메시지 출력
exit 1 # 워크플로우 실패 처리
fi