Skip to content

Delete : 불필요한 파일 삭제 #2

Delete : 불필요한 파일 삭제

Delete : 불필요한 파일 삭제 #2

Workflow file for this run

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