1010 required : true
1111 default : ' develop'
1212
13- env :
14- # DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} # ECR 사용으로 주석 처리 또는 삭제
15- # DOCKERHUB_REPOSITORY_NAME: ${{ secrets.DOCKERHUB_REPOSITORY_NAME }} # ECR 사용으로 주석 처리 또는 삭제
16- IMAGE_TAG : latest # 이 부분은 generate_tag 단계에서 덮어쓰므로 큰 의미는 없으나 유지
17- AWS_REGION : ap-northeast-2 # AWS 리전 설정
18-
1913jobs :
20- build-and-docker-operations :
21- runs-on : ubuntu-latest
22- outputs :
23- image_tag : ${{ steps.generate_tag.outputs.tag }}
24- # ECR_REGISTRY_URI는 secrets에서 직접 사용하므로 output으로 넘길 필요 없음
25-
26- steps :
27- - uses : actions/checkout@v2 # GitHub 저장소의 코드를 워크플로우 러너로 가져옵니다.
28-
29- - name : Set up JDK 17 # Java 개발 환경(JDK 17)을 설정합니다.
30- uses : actions/setup-java@v4
31- with :
32- java-version : ' 17'
33- distribution : ' corretto'
34-
35- - name : Create resources directory # Spring Boot 설정 파일이 위치할 디렉토리를 생성합니다.
36- run : mkdir -p src/main/resources
37-
38- - name : Create application-prod.yml for prod profile # GitHub Secret에 저장된 application-prod.yml 파일 내용을 실제 파일로 생성합니다.
39- run : |
40- echo "${{ secrets.APPLICATION }}" > ./src/main/resources/application-prod.yml
41-
42- - name : Create firebase.json from Secret
43- run : |
44- mkdir -p src/main/resources
45- echo "${{ secrets.FIREBASE_SERVICE_ACCOUNT_KEY_BASE64 }}" | base64 --decode > src/main/resources/firebase.json
46- echo "firebase.json created from Secret in src/main/resources/"
47-
48- - name : Set up Gradle # Gradle 빌드 환경을 설정합니다.
49- uses : gradle/actions/setup-gradle@v4
50-
51- - name : Set up Docker # Docker 빌드 환경(Buildx)을 설정합니다.
52- uses : docker/setup-buildx-action@v2
53-
54- - name : Grant execute permission for gradlew # gradlew 파일에 실행 권한을 부여합니다.
55- run : chmod +x gradlew
56-
57- - name : Build JAR # Gradle을 사용하여 Spring Boot 애플리케이션을 JAR 파일로 빌드합니다.
58- run : ./gradlew bootjar
59-
60- - name : Generate Unique Tag # Git commit 해시의 앞 7자리를 사용하여 Docker 이미지 태그를 생성합니다.
61- id : generate_tag
62- run : echo "::set-output name=tag::$(echo $GITHUB_SHA | cut -c1-7)"
63-
64- - name : Configure AWS credentials for ECR # AWS 서비스(ECR)에 접근하기 위한 자격 증명을 설정합니다.
65- uses : aws-actions/configure-aws-credentials@v1
66- with :
67- aws-access-key-id : ${{ secrets.ECR_AWS_ACCESS_KEY_ID }}
68- aws-secret-access-key : ${{ secrets.ECR_AWS_SECRET_ACCESS_KEY }}
69- aws-region : ${{ env.AWS_REGION }}
70-
71- - name : Login to Amazon ECR # 설정된 자격 증명을 사용하여 Amazon ECR에 로그인합니다.
72- id : login-ecr
73- uses : aws-actions/amazon-ecr-login@v1
74-
75- - name : Build Docker image for ECR # Dockerfile을 사용하여 ECR에 푸시할 이미지를 빌드합니다. 이미지 이름은 ECR_REGISTRY_URI와 생성된 태그를 사용합니다.
76- run : |
77- docker build --platform linux/amd64 -t ${{ secrets.ECR_REGISTRY_URI }}:${{ steps.generate_tag.outputs.tag }} -f docker/Dockerfile .
78-
79- - name : Push Docker image to ECR # 빌드된 Docker 이미지를 Amazon ECR로 푸시합니다.
80- run : |
81- docker push ${{ secrets.ECR_REGISTRY_URI }}:${{ steps.generate_tag.outputs.tag }}
82-
83- # EC2로의 SSH 터널링은 CD 단계에서는 직접적인 DB 접근이 필요 없으므로 제거하거나, 특별한 이유가 있다면 유지합니다.
84- # 여기서는 우선 제거된 상태로 가정합니다. CI에서는 테스트를 위해 필요했지만, CD는 빌드/푸시 후 EC2에서 직접 DB를 바라봅니다.
85- # - name: Set up SSH key
86- # ...
87- # - name: Add EC2 to known hosts
88- # ...
89- # - name: Start SSH Tunnel
90- # ...
91-
9214 deploy :
93- needs : build-and-docker-operations # 'build-and-docker-operations' 작업이 성공해야 실행됩니다.
9415 runs-on : ubuntu-latest
95- env : # 여기에 모든 필요한 변수들을 secrets에서 가져오도록 정의
96- MYSQL_DB_NAME : ${{ secrets.MYSQL_DB_NAME }}
97- MYSQL_DB_USERNAME : ${{ secrets.MYSQL_DB_USERNAME }}
98- MYSQL_DB_PASSWORD : ${{ secrets.MYSQL_DB_PASSWORD }}
99- IMAGE_TAG : ${{ needs.build-and-docker-operations.outputs.image_tag }}
100- ECR_REGISTRY_URI : ${{ secrets.ECR_REGISTRY_URI }}
101- RDS_ENDPOINT : ${{ secrets.RDS_ENDPOINT }}
102- JWT_SECRET : ${{ secrets.JWT_SECRET }}
103- KAKAO_CLIENT_ID : ${{ secrets.KAKAO_CLIENT_ID }}
104- KAKAO_CLIENT_SECRET : ${{ secrets.KAKAO_CLIENT_SECRET }}
105- KAKAO_REDIRECT_URI_EC2_PROD : ${{ secrets.KAKAO_REDIRECT_URI_EC2_PROD }}
106- MQTT_URL_EC2_PROD : ${{ secrets.MQTT_URL_FOR_CD }} # MQTT_URL_FOR_CD Secret 사용
107- MQTT_USERNAME_EC2_PROD : ${{ secrets.MQTT_USERNAME_EC2_PROD }} # Secret 필요시 생성
108- MQTT_PASSWORD_EC2_PROD : ${{ secrets.MQTT_PASSWORD_EC2_PROD }} # Secret 필요시 생성
109- MQTT_TOPIC : ${{ secrets.MQTT_TOPIC }} # Secret 필요시 생성
110- FIREBASE_CONFIG_PATH : " classpath:firebase.json" # JAR 내 firebase.json 사용 가정
111- S3_BUCKET_NAME : ${{ secrets.S3_BUCKET_NAME_FOR_CI }} # CI용 Secret 사용 또는 앱 전용 Secret 생성
112- AWS_S3_ACCESS_KEY_ID : ${{ secrets.AWS_S3_ACCESS_KEY_ID_FOR_CI }} # CI용 Secret 사용 또는 앱 전용 Secret 생성
113- AWS_S3_SECRET_ACCESS_KEY : ${{ secrets.AWS_S3_SECRET_ACCESS_KEY_FOR_CI }} # CI용 Secret 사용 또는 앱 전용 Secret 생성
114- SPRING_PROFILES_ACTIVE : prod # prod 프로파일 활성화
115-
116- THINQ_API_BASE_URL : ${{ secrets.THINQ_API_BASE_URL }}
117- THINQ_API_API_KEY : ${{ secrets.THINQ_API_API_KEY }}
118- THINQ_API_COUNTRY : ${{ secrets.THINQ_API_COUNTRY }}
119- THINQ_API_CLIENT_ID_PREFIX : ${{ secrets.THINQ_API_CLIENT_ID_PREFIX }}
120- PAT_SECRET_KEY : ${{ secrets.PAT_SECRET_KEY }}
121-
12216 steps :
123- - name : Checkout code # deploy 작업에서도 코드가 필요할 수 있으므로 checkout (docker-compose.yml 등)
17+ - name : Checkout code
12418 uses : actions/checkout@v3
12519
126- - name : Copy Docker files to EC2 # EC2 인스턴스에 docker-compose.yml과 관련 스크립트를 복사합니다.
127- uses : appleboy/scp-action@master
128- with :
129- host : ${{ secrets.EC2_HOST }}
130- username : ${{ secrets.EC2_USERNAME }} # EC2_USERNAME Secret 사용
131- key : ${{ secrets.EC2_SSH_PRIVATE_KEY }}
132- port : 22
133- source : " docker/" # <--- source를 "docker/" 로 변경 (디렉토리 전체 복사)
134- target : ' compose/docker' # <--- target은 compose/docker로 유지 (결과적으로 EC2에 ~/compose/docker/docker/ 구조 생성 유도)
135- rm : true
136-
137- - name : SSH remote and Run Docker Compose # EC2에 SSH로 접속하여 Docker Compose 명령을 실행합니다.
20+ - name : SSH into Ubuntu server and deploy
13821 uses : appleboy/ssh-action@master
13922 with :
140- host : ${{ secrets.EC2_HOST }}
141- username : ${{ secrets.EC2_USERNAME }} # EC2_USERNAME Secret 사용
142- key : ${{ secrets.EC2_SSH_PRIVATE_KEY }}
143- port : 22
144- envs : AWS_REGION,MYSQL_DB_NAME,MYSQL_DB_USERNAME,MYSQL_DB_PASSWORD,IMAGE_TAG,ECR_REGISTRY_URI,RDS_ENDPOINT,
145- JWT_SECRET,KAKAO_CLIENT_ID,KAKAO_CLIENT_SECRET,KAKAO_REDIRECT_URI_EC2_PROD,MQTT_URL_EC2_PROD,MQTT_USERNAME_EC2_PROD,MQTT_TOPIC,
146- MQTT_PASSWORD_EC2_PROD,FIREBASE_CONFIG_PATH,S3_BUCKET_NAME,AWS_S3_ACCESS_KEY_ID,AWS_S3_SECRET_ACCESS_KEY,SPRING_PROFILES_ACTIVE,
147- THINQ_API_BASE_URL,THINQ_API_API_KEY,THINQ_API_COUNTRY,THINQ_API_CLIENT_ID_PREFIX,PAT_SECRET_KEY
148-
23+ host : ${{ secrets.UBUNTU_HOST }}
24+ username : ubuntu
25+ key : ${{ secrets.SSH_PRIVATE_KEY }}
14926 script : |
150- echo "--- Initial directory before cd ---"
151- pwd
152- mkdir -p ~/compose/docker/docker
153- cd ~/compose/docker/docker/ # <--- cd 경로는 compose/docker/docker로 유지
154- echo "--- Current directory after cd (should be ~/compose/docker/docker/) ---"
155- pwd
156- echo "--- Listing files in current directory (should show docker-compose.yml, mosquitto.conf) ---"
157- ls -la
158-
159- ECR_ACCOUNT_ID=$(echo $ECR_REGISTRY_URI | cut -d'.' -f1)
160- aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin $ECR_ACCOUNT_ID.dkr.ecr.${AWS_REGION}.amazonaws.com
161-
162- echo "--- Creating .env file in $(pwd) ---"
163- echo "
164- MYSQL_DB_NAME=$MYSQL_DB_NAME
165- MYSQL_DB_USERNAME=$MYSQL_DB_USERNAME
166- MYSQL_DB_PASSWORD=$MYSQL_DB_PASSWORD
167- IMAGE_TAG=$IMAGE_TAG
168- RDS_ENDPOINT=$RDS_ENDPOINT
169- ECR_REGISTRY_URI=$ECR_REGISTRY_URI
170- JWT_SECRET=$JWT_SECRET
171- KAKAO_CLIENT_ID=$KAKAO_CLIENT_ID
172- KAKAO_CLIENT_SECRET=$KAKAO_CLIENT_SECRET
173- KAKAO_REDIRECT_URI_EC2_PROD=$KAKAO_REDIRECT_URI_EC2_PROD
174- MQTT_URL_EC2_PROD=$MQTT_URL_EC2_PROD
175- MQTT_USERNAME_EC2_PROD=$MQTT_USERNAME_EC2_PROD
176- MQTT_PASSWORD_EC2_PROD=$MQTT_PASSWORD_EC2_PROD
177- MQTT_TOPIC=$MQTT_TOPIC
178- FIREBASE_CONFIG_PATH=$FIREBASE_CONFIG_PATH
179- S3_BUCKET_NAME=$S3_BUCKET_NAME
180- AWS_S3_ACCESS_KEY_ID=$AWS_S3_ACCESS_KEY_ID
181- AWS_S3_SECRET_ACCESS_KEY=$AWS_S3_SECRET_ACCESS_KEY
182- SPRING_PROFILES_ACTIVE=$SPRING_PROFILES_ACTIVE
183- THINQ_API_BASE_URL=$THINQ_API_BASE_URL
184- THINQ_API_API_KEY=$THINQ_API_API_KEY
185- THINQ_API_COUNTRY=$THINQ_API_COUNTRY
186- THINQ_API_CLIENT_ID_PREFIX=$THINQ_API_CLIENT_ID_PREFIX
187- PAT_SECRET_KEY=$PAT_SECRET_KEY
188-
189- # Spring Boot Datasource 환경 변수
190- SPRING_DATASOURCE_URL=jdbc:mysql://${RDS_ENDPOINT}:3306/${MYSQL_DB_NAME}?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul
191- SPRING_DATASOURCE_USERNAME=${MYSQL_DB_USERNAME}
192- SPRING_DATASOURCE_PASSWORD=${MYSQL_DB_PASSWORD}
193-
194- # Spring Boot JWT Secret 환경 변수
195- SPRING_JWT_SECRET=$JWT_SECRET
196-
197- # Spring Boot Kakao OAuth 환경 변수
198- SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_CLIENT_ID=$KAKAO_CLIENT_ID
199- SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_CLIENT_SECRET=$KAKAO_CLIENT_SECRET
200- SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_REDIRECT_URI=$KAKAO_REDIRECT_URI_EC2_PROD
201-
202- # MQTT 환경 변수 (기존 MQTT_URL_EC2_PROD 외에 추가)
203- # mqtt.url, mqtt.username, mqtt.password 에 해당
204- MQTT_URL=$MQTT_URL_EC2_PROD
205- MQTT_USERNAME=$MQTT_USERNAME_EC2_PROD
206- MQTT_PASSWORD=$MQTT_PASSWORD_EC2_PROD
207- MQTT_TOPIC=$MQTT_TOPIC
208-
209- # Spring Cloud AWS S3 환경 변수
210- # cloud.aws.s3.bucket, cloud.aws.credentials.accessKey, cloud.aws.credentials.secretKey 에 해당
211- CLOUD_AWS_S3_BUCKET=$S3_BUCKET_NAME
212- CLOUD_AWS_CREDENTIALS_ACCESS_KEY=$AWS_S3_ACCESS_KEY_ID
213- CLOUD_AWS_CREDENTIALS_SECRET_KEY=$AWS_S3_SECRET_ACCESS_KEY
214-
215- # AWS S3 환경 변수
216- S3_BUCKET_NAME=$S3_BUCKET_NAME
217- AWS_S3_ACCESS_KEY_ID=$AWS_S3_ACCESS_KEY_ID
218- AWS_S3_SECRET_ACCESS_KEY=$AWS_S3_SECRET_ACCESS_KEY
219-
220- # Spring Profiles
221- SPRING_PROFILES_ACTIVE=$SPRING_PROFILES_ACTIVE
222-
223- # Spring Boot 환경 변수 (위와 동일하지만 Spring Boot 관례에 따름)
224- SPRING_THINQ_API_BASE_URL=$THINQ_API_BASE_URL
225- SPRING_THINQ_API_API_KEY=$THINQ_API_API_KEY
226- SPRING_THINQ_API_COUNTRY=$THINQ_API_COUNTRY
227- SPRING_THINQ_API_CLIENT_ID_PREFIX=$THINQ_API_CLIENT_ID_PREFIX
228- SPRING_PAT_SECRET_KEY=$PAT_SECRET_KEY
229-
230- # 로깅 레벨 환경 변수
231- LOGGING_LEVEL_ORG_HIBERNATE_SQL=DEBUG
232- LOGGING_LEVEL_ORG_HIBERNATE_TYPE_DESCRIPTOR_SQL=TRACE
233- LOGGING_LEVEL_COM_ZAXXER_HIKARI=DEBUG
234- " > .env # 현재 디렉토리(~/compose/docker/docker/)에 .env 생성
235- chmod 644 .env
236- echo "--- .env file created, content of $(pwd): ---"
237- ls -la
238-
239- echo "--- Checking for docker-compose.yml before execution in $(pwd) ---"
240- ls -la ./docker-compose.yml # ./docker-compose.yml이 존재하는지 확인
241-
242- echo "--- Pulling Docker image ---"
243- docker pull $ECR_REGISTRY_URI:$IMAGE_TAG
244-
245- echo "--- Running docker-compose down (using ./docker-compose.yml in $(pwd)) ---"
246- docker-compose -f ./docker-compose.yml down
247-
248- echo "--- Running docker-compose up -d (using ./docker-compose.yml in $(pwd)) ---"
249- docker-compose -f ./docker-compose.yml up -d
250-
251- echo "--- Docker ps ---"
252- docker ps -a
27+ cd ~/back
28+ git pull origin main
29+ docker-compose down
30+ docker system prune -f
31+ docker build -t enjoy-app .
32+ docker-compose up -d
0 commit comments