Skip to content

Commit 18641cc

Browse files
committed
Docs : create ci cd
1 parent 3086e25 commit 18641cc

File tree

2 files changed

+60
-337
lines changed

2 files changed

+60
-337
lines changed

.github/workflows/cd.yml

Lines changed: 11 additions & 231 deletions
Original file line numberDiff line numberDiff line change
@@ -10,243 +10,23 @@ on:
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-
1913
jobs:
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

Comments
 (0)