Delete : 불필요한 파일 삭제 #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: CD for main | |
| on: | |
| push: | |
| branches: [main] | |
| workflow_dispatch: | |
| inputs: | |
| branch: | |
| description: 'Branch to deploy from' | |
| required: true | |
| default: 'develop' | |
| env: | |
| # DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} # ECR 사용으로 주석 처리 또는 삭제 | |
| # DOCKERHUB_REPOSITORY_NAME: ${{ secrets.DOCKERHUB_REPOSITORY_NAME }} # ECR 사용으로 주석 처리 또는 삭제 | |
| IMAGE_TAG: latest # 이 부분은 generate_tag 단계에서 덮어쓰므로 큰 의미는 없으나 유지 | |
| AWS_REGION: ap-northeast-2 # AWS 리전 설정 | |
| jobs: | |
| build-and-docker-operations: | |
| runs-on: ubuntu-latest | |
| outputs: | |
| image_tag: ${{ steps.generate_tag.outputs.tag }} | |
| # ECR_REGISTRY_URI는 secrets에서 직접 사용하므로 output으로 넘길 필요 없음 | |
| steps: | |
| - uses: actions/checkout@v2 # GitHub 저장소의 코드를 워크플로우 러너로 가져옵니다. | |
| - name: Set up JDK 17 # Java 개발 환경(JDK 17)을 설정합니다. | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '17' | |
| distribution: 'corretto' | |
| - name: Create resources directory # Spring Boot 설정 파일이 위치할 디렉토리를 생성합니다. | |
| run: mkdir -p src/main/resources | |
| - name: Create application-prod.yml for prod profile # GitHub Secret에 저장된 application-prod.yml 파일 내용을 실제 파일로 생성합니다. | |
| run: | | |
| echo "${{ secrets.APPLICATION }}" > ./src/main/resources/application-prod.yml | |
| - name: Create firebase.json from Secret | |
| run: | | |
| mkdir -p src/main/resources | |
| echo "${{ secrets.FIREBASE_SERVICE_ACCOUNT_KEY_BASE64 }}" | base64 --decode > src/main/resources/firebase.json | |
| echo "firebase.json created from Secret in src/main/resources/" | |
| - name: Set up Gradle # Gradle 빌드 환경을 설정합니다. | |
| uses: gradle/actions/setup-gradle@v4 | |
| - name: Set up Docker # Docker 빌드 환경(Buildx)을 설정합니다. | |
| uses: docker/setup-buildx-action@v2 | |
| - name: Grant execute permission for gradlew # gradlew 파일에 실행 권한을 부여합니다. | |
| run: chmod +x gradlew | |
| - name: Build JAR # Gradle을 사용하여 Spring Boot 애플리케이션을 JAR 파일로 빌드합니다. | |
| run: ./gradlew bootjar | |
| - name: Generate Unique Tag # Git commit 해시의 앞 7자리를 사용하여 Docker 이미지 태그를 생성합니다. | |
| id: generate_tag | |
| run: echo "::set-output name=tag::$(echo $GITHUB_SHA | cut -c1-7)" | |
| - name: Configure AWS credentials for ECR # AWS 서비스(ECR)에 접근하기 위한 자격 증명을 설정합니다. | |
| uses: aws-actions/configure-aws-credentials@v1 | |
| with: | |
| aws-access-key-id: ${{ secrets.ECR_AWS_ACCESS_KEY_ID }} | |
| aws-secret-access-key: ${{ secrets.ECR_AWS_SECRET_ACCESS_KEY }} | |
| aws-region: ${{ env.AWS_REGION }} | |
| - name: Login to Amazon ECR # 설정된 자격 증명을 사용하여 Amazon ECR에 로그인합니다. | |
| id: login-ecr | |
| uses: aws-actions/amazon-ecr-login@v1 | |
| - name: Build Docker image for ECR # Dockerfile을 사용하여 ECR에 푸시할 이미지를 빌드합니다. 이미지 이름은 ECR_REGISTRY_URI와 생성된 태그를 사용합니다. | |
| run: | | |
| docker build --platform linux/amd64 -t ${{ secrets.ECR_REGISTRY_URI }}:${{ steps.generate_tag.outputs.tag }} -f docker/Dockerfile . | |
| - name: Push Docker image to ECR # 빌드된 Docker 이미지를 Amazon ECR로 푸시합니다. | |
| run: | | |
| docker push ${{ secrets.ECR_REGISTRY_URI }}:${{ steps.generate_tag.outputs.tag }} | |
| # EC2로의 SSH 터널링은 CD 단계에서는 직접적인 DB 접근이 필요 없으므로 제거하거나, 특별한 이유가 있다면 유지합니다. | |
| # 여기서는 우선 제거된 상태로 가정합니다. CI에서는 테스트를 위해 필요했지만, CD는 빌드/푸시 후 EC2에서 직접 DB를 바라봅니다. | |
| # - name: Set up SSH key | |
| # ... | |
| # - name: Add EC2 to known hosts | |
| # ... | |
| # - name: Start SSH Tunnel | |
| # ... | |
| deploy: | |
| needs: build-and-docker-operations # 'build-and-docker-operations' 작업이 성공해야 실행됩니다. | |
| runs-on: ubuntu-latest | |
| env: # 여기에 모든 필요한 변수들을 secrets에서 가져오도록 정의 | |
| MYSQL_DB_NAME: ${{ secrets.MYSQL_DB_NAME }} | |
| MYSQL_DB_USERNAME: ${{ secrets.MYSQL_DB_USERNAME }} | |
| MYSQL_DB_PASSWORD: ${{ secrets.MYSQL_DB_PASSWORD }} | |
| IMAGE_TAG: ${{ needs.build-and-docker-operations.outputs.image_tag }} | |
| ECR_REGISTRY_URI: ${{ secrets.ECR_REGISTRY_URI }} | |
| RDS_ENDPOINT: ${{ secrets.RDS_ENDPOINT }} | |
| JWT_SECRET: ${{ secrets.JWT_SECRET }} | |
| KAKAO_CLIENT_ID: ${{ secrets.KAKAO_CLIENT_ID }} | |
| KAKAO_CLIENT_SECRET: ${{ secrets.KAKAO_CLIENT_SECRET }} | |
| KAKAO_REDIRECT_URI_EC2_PROD: ${{ secrets.KAKAO_REDIRECT_URI_EC2_PROD }} | |
| MQTT_URL_EC2_PROD: ${{ secrets.MQTT_URL_FOR_CD }} # MQTT_URL_FOR_CD Secret 사용 | |
| MQTT_USERNAME_EC2_PROD: ${{ secrets.MQTT_USERNAME_EC2_PROD }} # Secret 필요시 생성 | |
| MQTT_PASSWORD_EC2_PROD: ${{ secrets.MQTT_PASSWORD_EC2_PROD }} # Secret 필요시 생성 | |
| MQTT_TOPIC: ${{ secrets.MQTT_TOPIC }} # Secret 필요시 생성 | |
| FIREBASE_CONFIG_PATH: "classpath:firebase.json" # JAR 내 firebase.json 사용 가정 | |
| S3_BUCKET_NAME: ${{ secrets.S3_BUCKET_NAME_FOR_CI }} # CI용 Secret 사용 또는 앱 전용 Secret 생성 | |
| AWS_S3_ACCESS_KEY_ID: ${{ secrets.AWS_S3_ACCESS_KEY_ID_FOR_CI }} # CI용 Secret 사용 또는 앱 전용 Secret 생성 | |
| AWS_S3_SECRET_ACCESS_KEY: ${{ secrets.AWS_S3_SECRET_ACCESS_KEY_FOR_CI }} # CI용 Secret 사용 또는 앱 전용 Secret 생성 | |
| SPRING_PROFILES_ACTIVE: prod # prod 프로파일 활성화 | |
| THINQ_API_BASE_URL: ${{ secrets.THINQ_API_BASE_URL }} | |
| THINQ_API_API_KEY: ${{ secrets.THINQ_API_API_KEY }} | |
| THINQ_API_COUNTRY: ${{ secrets.THINQ_API_COUNTRY }} | |
| THINQ_API_CLIENT_ID_PREFIX: ${{ secrets.THINQ_API_CLIENT_ID_PREFIX }} | |
| PAT_SECRET_KEY: ${{ secrets.PAT_SECRET_KEY }} | |
| steps: | |
| - name: Checkout code # deploy 작업에서도 코드가 필요할 수 있으므로 checkout (docker-compose.yml 등) | |
| uses: actions/checkout@v3 | |
| - name: Copy Docker files to EC2 # EC2 인스턴스에 docker-compose.yml과 관련 스크립트를 복사합니다. | |
| uses: appleboy/scp-action@master | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ${{ secrets.EC2_USERNAME }} # EC2_USERNAME Secret 사용 | |
| key: ${{ secrets.EC2_SSH_PRIVATE_KEY }} | |
| port: 22 | |
| source: "docker/" # <--- source를 "docker/" 로 변경 (디렉토리 전체 복사) | |
| target: 'compose/docker' # <--- target은 compose/docker로 유지 (결과적으로 EC2에 ~/compose/docker/docker/ 구조 생성 유도) | |
| rm: true | |
| - name: SSH remote and Run Docker Compose # EC2에 SSH로 접속하여 Docker Compose 명령을 실행합니다. | |
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ${{ secrets.EC2_USERNAME }} # EC2_USERNAME Secret 사용 | |
| key: ${{ secrets.EC2_SSH_PRIVATE_KEY }} | |
| port: 22 | |
| envs: AWS_REGION,MYSQL_DB_NAME,MYSQL_DB_USERNAME,MYSQL_DB_PASSWORD,IMAGE_TAG,ECR_REGISTRY_URI,RDS_ENDPOINT, | |
| JWT_SECRET,KAKAO_CLIENT_ID,KAKAO_CLIENT_SECRET,KAKAO_REDIRECT_URI_EC2_PROD,MQTT_URL_EC2_PROD,MQTT_USERNAME_EC2_PROD,MQTT_TOPIC, | |
| MQTT_PASSWORD_EC2_PROD,FIREBASE_CONFIG_PATH,S3_BUCKET_NAME,AWS_S3_ACCESS_KEY_ID,AWS_S3_SECRET_ACCESS_KEY,SPRING_PROFILES_ACTIVE, | |
| THINQ_API_BASE_URL,THINQ_API_API_KEY,THINQ_API_COUNTRY,THINQ_API_CLIENT_ID_PREFIX,PAT_SECRET_KEY | |
| script: | | |
| echo "--- Initial directory before cd ---" | |
| pwd | |
| mkdir -p ~/compose/docker/docker | |
| cd ~/compose/docker/docker/ # <--- cd 경로는 compose/docker/docker로 유지 | |
| echo "--- Current directory after cd (should be ~/compose/docker/docker/) ---" | |
| pwd | |
| echo "--- Listing files in current directory (should show docker-compose.yml, mosquitto.conf) ---" | |
| ls -la | |
| ECR_ACCOUNT_ID=$(echo $ECR_REGISTRY_URI | cut -d'.' -f1) | |
| aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin $ECR_ACCOUNT_ID.dkr.ecr.${AWS_REGION}.amazonaws.com | |
| echo "--- Creating .env file in $(pwd) ---" | |
| echo " | |
| MYSQL_DB_NAME=$MYSQL_DB_NAME | |
| MYSQL_DB_USERNAME=$MYSQL_DB_USERNAME | |
| MYSQL_DB_PASSWORD=$MYSQL_DB_PASSWORD | |
| IMAGE_TAG=$IMAGE_TAG | |
| RDS_ENDPOINT=$RDS_ENDPOINT | |
| ECR_REGISTRY_URI=$ECR_REGISTRY_URI | |
| JWT_SECRET=$JWT_SECRET | |
| KAKAO_CLIENT_ID=$KAKAO_CLIENT_ID | |
| KAKAO_CLIENT_SECRET=$KAKAO_CLIENT_SECRET | |
| KAKAO_REDIRECT_URI_EC2_PROD=$KAKAO_REDIRECT_URI_EC2_PROD | |
| MQTT_URL_EC2_PROD=$MQTT_URL_EC2_PROD | |
| MQTT_USERNAME_EC2_PROD=$MQTT_USERNAME_EC2_PROD | |
| MQTT_PASSWORD_EC2_PROD=$MQTT_PASSWORD_EC2_PROD | |
| MQTT_TOPIC=$MQTT_TOPIC | |
| FIREBASE_CONFIG_PATH=$FIREBASE_CONFIG_PATH | |
| S3_BUCKET_NAME=$S3_BUCKET_NAME | |
| AWS_S3_ACCESS_KEY_ID=$AWS_S3_ACCESS_KEY_ID | |
| AWS_S3_SECRET_ACCESS_KEY=$AWS_S3_SECRET_ACCESS_KEY | |
| SPRING_PROFILES_ACTIVE=$SPRING_PROFILES_ACTIVE | |
| THINQ_API_BASE_URL=$THINQ_API_BASE_URL | |
| THINQ_API_API_KEY=$THINQ_API_API_KEY | |
| THINQ_API_COUNTRY=$THINQ_API_COUNTRY | |
| THINQ_API_CLIENT_ID_PREFIX=$THINQ_API_CLIENT_ID_PREFIX | |
| PAT_SECRET_KEY=$PAT_SECRET_KEY | |
| # Spring Boot Datasource 환경 변수 | |
| SPRING_DATASOURCE_URL=jdbc:mysql://${RDS_ENDPOINT}:3306/${MYSQL_DB_NAME}?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul | |
| SPRING_DATASOURCE_USERNAME=${MYSQL_DB_USERNAME} | |
| SPRING_DATASOURCE_PASSWORD=${MYSQL_DB_PASSWORD} | |
| # Spring Boot JWT Secret 환경 변수 | |
| SPRING_JWT_SECRET=$JWT_SECRET | |
| # Spring Boot Kakao OAuth 환경 변수 | |
| SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_CLIENT_ID=$KAKAO_CLIENT_ID | |
| SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_CLIENT_SECRET=$KAKAO_CLIENT_SECRET | |
| SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_REDIRECT_URI=$KAKAO_REDIRECT_URI_EC2_PROD | |
| # MQTT 환경 변수 (기존 MQTT_URL_EC2_PROD 외에 추가) | |
| # mqtt.url, mqtt.username, mqtt.password 에 해당 | |
| MQTT_URL=$MQTT_URL_EC2_PROD | |
| MQTT_USERNAME=$MQTT_USERNAME_EC2_PROD | |
| MQTT_PASSWORD=$MQTT_PASSWORD_EC2_PROD | |
| MQTT_TOPIC=$MQTT_TOPIC | |
| # Spring Cloud AWS S3 환경 변수 | |
| # cloud.aws.s3.bucket, cloud.aws.credentials.accessKey, cloud.aws.credentials.secretKey 에 해당 | |
| CLOUD_AWS_S3_BUCKET=$S3_BUCKET_NAME | |
| CLOUD_AWS_CREDENTIALS_ACCESS_KEY=$AWS_S3_ACCESS_KEY_ID | |
| CLOUD_AWS_CREDENTIALS_SECRET_KEY=$AWS_S3_SECRET_ACCESS_KEY | |
| # AWS S3 환경 변수 | |
| S3_BUCKET_NAME=$S3_BUCKET_NAME | |
| AWS_S3_ACCESS_KEY_ID=$AWS_S3_ACCESS_KEY_ID | |
| AWS_S3_SECRET_ACCESS_KEY=$AWS_S3_SECRET_ACCESS_KEY | |
| # Spring Profiles | |
| SPRING_PROFILES_ACTIVE=$SPRING_PROFILES_ACTIVE | |
| # Spring Boot 환경 변수 (위와 동일하지만 Spring Boot 관례에 따름) | |
| SPRING_THINQ_API_BASE_URL=$THINQ_API_BASE_URL | |
| SPRING_THINQ_API_API_KEY=$THINQ_API_API_KEY | |
| SPRING_THINQ_API_COUNTRY=$THINQ_API_COUNTRY | |
| SPRING_THINQ_API_CLIENT_ID_PREFIX=$THINQ_API_CLIENT_ID_PREFIX | |
| SPRING_PAT_SECRET_KEY=$PAT_SECRET_KEY | |
| # 로깅 레벨 환경 변수 | |
| LOGGING_LEVEL_ORG_HIBERNATE_SQL=DEBUG | |
| LOGGING_LEVEL_ORG_HIBERNATE_TYPE_DESCRIPTOR_SQL=TRACE | |
| LOGGING_LEVEL_COM_ZAXXER_HIKARI=DEBUG | |
| " > .env # 현재 디렉토리(~/compose/docker/docker/)에 .env 생성 | |
| chmod 644 .env | |
| echo "--- .env file created, content of $(pwd): ---" | |
| ls -la | |
| echo "--- Checking for docker-compose.yml before execution in $(pwd) ---" | |
| ls -la ./docker-compose.yml # ./docker-compose.yml이 존재하는지 확인 | |
| echo "--- Pulling Docker image ---" | |
| docker pull $ECR_REGISTRY_URI:$IMAGE_TAG | |
| echo "--- Running docker-compose down (using ./docker-compose.yml in $(pwd)) ---" | |
| docker-compose -f ./docker-compose.yml down | |
| echo "--- Running docker-compose up -d (using ./docker-compose.yml in $(pwd)) ---" | |
| docker-compose -f ./docker-compose.yml up -d | |
| echo "--- Docker ps ---" | |
| docker ps -a |