Update aws.yml #2
This file contains hidden or 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: 백엔드 AWS 배포 파이프라인 구 # GitHub Actions 워크플로우의 이름. eCommerce 웹 애플리케이션을 AWS에 배포하기 위한 워크플로우 | |
| on: | |
| push: # 코드가 main 브랜치로 푸시될 때 워크플로우 실행 | |
| branches: | |
| - main # main 브랜치로의 푸시 이벤트 감지 | |
| - develop | |
| pull_request: # main 브랜치로의 풀 리퀘스트가 생성될 때 워크플로우 실행 | |
| branches: | |
| - main # main 브랜치로의 풀 리퀘스트 이벤트 감지 | |
| - develop | |
| 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 # 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 |