Skip to content

Commit 569aeb8

Browse files
Merge pull request #109 from DevKor-github/deploy
[CICD] test.yml 파일 생성
2 parents 123caf4 + 6e94539 commit 569aeb8

File tree

2 files changed

+182
-64
lines changed

2 files changed

+182
-64
lines changed

.github/workflows/deploy.yml

Lines changed: 104 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -9,94 +9,102 @@ jobs:
99
build-and-docker:
1010
runs-on: ubuntu-latest
1111
steps:
12-
# 1. 코드 체크아웃
12+
# 코드 체크아웃
1313
- name: Checkout code
1414
uses: actions/checkout@v3
15-
16-
- name: List files in Runner
17-
run: |
18-
echo "Current directory:"
19-
pwd
20-
echo "Contents of the directory:"
21-
ls -la
22-
23-
# 2. JDK 설치
15+
# JDK 설치
2416
- name: Set up JDK 21 # 실행 환경에서 사용 중인 JDK 확인 (java -version)
2517
uses: actions/setup-java@v2
2618
with:
2719
java-version: '21'
2820
distribution: 'temurin'
29-
# 3. Gradle Wrapper 검증
21+
# Gradle Wrapper 검증
3022
- name: Set up Gradle
3123
uses: gradle/wrapper-validation-action@v1
32-
# 4. Gradle 빌드
24+
# 설정 파일 생성
25+
- name: Create Config Files
26+
run: |
27+
mkdir -p ontime-back/src/main/resources
28+
mkdir -p ontime-back/src/main/resources/key
29+
echo "spring.application.name=${{ secrets.SPRING_APPLICATION_NAME }}" > ontime-back/src/main/resources/application.properties
30+
echo "spring.datasource.url=${{ secrets.SPRING_DATASOURCE_URL }}" >> ontime-back/src/main/resources/application.properties
31+
echo "spring.datasource.username=${{ secrets.SPRING_DATASOURCE_USERNAME }}" >> ontime-back/src/main/resources/application.properties
32+
echo "spring.datasource.password=${{ secrets.SPRING_DATASOURCE_PASSWORD }}" >> ontime-back/src/main/resources/application.properties
33+
echo "spring.datasource.driver-class-name=${{ secrets.SPRING_DATASOURCE_DRIVER_CLASS_NAME }}" >> ontime-back/src/main/resources/application.properties
34+
echo "spring.jpa.hibernate.ddl-auto=${{ secrets.SPRING_JPA_HIBERNATE_DDL_AUTO }}" >> ontime-back/src/main/resources/application.properties
35+
echo "jwt.secret.key=${{ secrets.JWT_SECRETKEY }}" >> ontime-back/src/main/resources/application.properties
36+
echo "jwt.access.expiration=${{ secrets.JWT_ACCESS_EXPIRATION }}" >> ontime-back/src/main/resources/application.properties
37+
echo "jwt.refresh.expiration=${{ secrets.JWT_REFRESH_EXPIRATION }}" >> ontime-back/src/main/resources/application.properties
38+
echo "jwt.access.header=${{ secrets.JWT_ACCESS_HEADER }}" >> ontime-back/src/main/resources/application.properties
39+
echo "jwt.refresh.header=${{ secrets.JWT_REFRESH_HEADER }}" >> ontime-back/src/main/resources/application.properties
40+
echo "spring.security.oauth2.client.registration.google.client-id=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_ID }}" >> ontime-back/src/main/resources/application.properties
41+
echo "spring.security.oauth2.client.registration.google.client-secret=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_SECRET }}" >> ontime-back/src/main/resources/application.properties
42+
echo "spring.security.oauth2.client.registration.google.scope=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_SCOPE }}" >> ontime-back/src/main/resources/application.properties
43+
echo "spring.security.oauth2.client.registration.google.redirect-uri=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_REDIRECT_URI }}" >> ontime-back/src/main/resources/application.properties
44+
echo "spring.security.oauth2.client.registration.google.authorization-grant-type=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_AUTHORIZATION_GRANT_TYPE }}" >> ontime-back/src/main/resources/application.properties
45+
echo "spring.security.oauth2.client.registration.google.client-name=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_NAME }}" >> ontime-back/src/main/resources/application.properties
46+
echo "spring.security.oauth2.client.provider.google.authorization-uri=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_GOOGLE_AUTHORIZATION_URI }}" >> ontime-back/src/main/resources/application.properties
47+
echo "spring.security.oauth2.client.provider.google.token-uri=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_GOOGLE_TOKEN_URI }}" >> ontime-back/src/main/resources/application.properties
48+
echo "spring.security.oauth2.client.provider.google.user-info-uri=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_GOOGLE_USER_INFO_URI }}" >> ontime-back/src/main/resources/application.properties
49+
echo "spring.security.oauth2.client.provider.google.user-name-attribute=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_GOOGLE_USER_NAME_ATTRIBUTE }}" >> ontime-back/src/main/resources/application.properties
50+
echo "spring.security.oauth2.client.registration.kakao.client-id=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_CLIENT_ID }}" >> ontime-back/src/main/resources/application.properties
51+
echo "spring.security.oauth2.client.registration.kakao.scope=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_SCOPE }}" >> ontime-back/src/main/resources/application.properties
52+
echo "spring.security.oauth2.client.registration.kakao.redirect-uri=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_REDIRECT_URI }}" >> ontime-back/src/main/resources/application.properties
53+
echo "spring.security.oauth2.client.registration.kakao.authorization-grant-type=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_AUTHORIZATION_GRANT_TYPE }}" >> ontime-back/src/main/resources/application.properties
54+
echo "spring.security.oauth2.client.registration.kakao.client-name=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_CLIENT_NAME }}" >> ontime-back/src/main/resources/application.properties
55+
echo "spring.security.oauth2.client.provider.kakao.authorization-uri=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_KAKAO_AUTHORIZATION_URI }}" >> ontime-back/src/main/resources/application.properties
56+
echo "spring.security.oauth2.client.provider.kakao.token-uri=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_KAKAO_TOKEN_URI }}" >> ontime-back/src/main/resources/application.properties
57+
echo "spring.security.oauth2.client.provider.kakao.user-info-uri=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_KAKAO_USER_INFO_URI }}" >> ontime-back/src/main/resources/application.properties
58+
echo "spring.security.oauth2.client.provider.kakao.user-name-attribute=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_KAKAO_USER_NAME_ATTRIBUTE }}" >> ontime-back/src/main/resources/application.properties
59+
echo "apple.client.id=${{ secrets.APPLE_CLIENT_ID }}" >> ontime-back/src/main/resources/application.properties
60+
echo "apple.client.secret=${{ secrets.APPLE_CLIENT_SECRET }}" >> ontime-back/src/main/resources/application.properties
61+
echo "apple.login.key=${{ secrets.APPLE_LOGIN_KEY }}" >> ontime-back/src/main/resources/application.properties
62+
echo "apple.team.id=${{ secrets.APPLE_TEAM_ID }}" >> ontime-back/src/main/resources/application.properties
63+
echo "management.endpoints.web.exposure.include=health" >> ontime-back/src/main/resources/application.properties
64+
echo "management.endpoint.health.show-details=always" >> ontime-back/src/main/resources/application.properties
65+
echo "${{ secrets.ONTIME_PUSH_FIREBASE_ADMINSDK }}" > ontime-back/src/main/resources/ontime-push-firebase-adminsdk-gnpxs-7d098872ff.json
66+
67+
echo "${{ secrets.AUTHKEY_743M7R5W3W }}" > ontime-back/src/main/resources/key/AuthKey_743M7R5W3W.p8
68+
# Gradle 빌드
3369
- name: Build with Gradle
3470
run: |
3571
cd ontime-back
3672
./gradlew build -x test
37-
deploy-to-ec2:
73+
# 파일 위치 변경
74+
- name: Move file
75+
run: |
76+
mv ontime-back/src/main/resources/ontime-push-firebase-adminsdk-gnpxs-7d098872ff.json ./ontime-push-firebase-adminsdk-gnpxs-7d098872ff.json
77+
mv ontime-back/src/main/resources/application.properties ./application.properties
78+
mv ontime-back/src/main/resources/key/AuthKey_743M7R5W3W.p8 ./AuthKey_743M7R5W3W.p8
79+
mv ontime-back/build/libs/ontime-back-0.0.1-SNAPSHOT.jar ./project.jar
80+
mv ontime-back/docker-compose.yml ./docker-compose.yml
81+
mv ontime-back/Dockerfile ./Dockerfile
82+
# EC2 서버에 업로드
83+
- name: Upload files to EC2
84+
uses: appleboy/scp-action@v0.1.7
85+
with:
86+
host: ${{ secrets.EC2_HOST }}
87+
username: ${{ secrets.EC2_USER }}
88+
key: ${{ secrets.EC2_SSH_KEY }}
89+
source: "./project.jar, ./docker-compose.yml, ./Dockerfile, ./ontime-push-firebase-adminsdk-gnpxs-7d098872ff.json, ./application.properties, ./AuthKey_743M7R5W3W.p8"
90+
target: "/home/ubuntu/OnTime-back"
91+
debug: true
92+
create-config-files:
3893
needs: build-and-docker
3994
runs-on: ubuntu-latest
40-
41-
4295
steps:
43-
- name: Delete existing folder
96+
# EC2 서버에 접근 + 설정 파일 생성
97+
- name: SSH to EC2 & Create Config Files
4498
uses: appleboy/ssh-action@master
4599
with:
46100
host: ${{ secrets.EC2_HOST }}
47101
username: ${{ secrets.EC2_USER }}
48102
key: ${{ secrets.EC2_SSH_KEY }}
49103
debug: true
50104
script: |
51-
sudo rm -rf /home/ubuntu/OnTime-back
52-
53-
- name: Checkout code
54-
uses: actions/checkout@v3
55-
56-
- name: Upload files to EC2
57-
uses: appleboy/scp-action@v0.1.7
58-
with:
59-
host: ${{ secrets.EC2_HOST }}
60-
username: ${{ secrets.EC2_USER }}
61-
key: ${{ secrets.EC2_SSH_KEY }}
62-
source: "./"
63-
target: "/home/ubuntu/OnTime-back"
64-
debug: true
65-
66-
67-
- name: Deploy to EC2
68-
uses: appleboy/ssh-action@master
69-
with:
70-
host: ${{ secrets.EC2_HOST }}
71-
username: ${{ secrets.EC2_USER }}
72-
key: ${{ secrets.EC2_SSH_KEY }}
73-
debug: true
74-
script: |
75-
sudo mkdir -p /home/ubuntu/OnTime-back/ontime-back/src/main/resources
76-
echo "${{ secrets.ONTIME_PUSH_FIREBASE_ADMINSDK }}" > /home/ubuntu/OnTime-back/ontime-back/src/main/resources/ontime-push-firebase-adminsdk-gnpxs-7d098872ff.json
77-
78105
sudo mkdir -p /home/ubuntu/OnTime-back/ontime-back/src/main/resources/key
79-
cd /home/ubuntu/OnTime-back/ontime-back/src/main/resources/key
80-
cat <<EOT > /home/ubuntu/OnTime-back/ontime-back/src/main/resources/key/AuthKey_743M7R5W3W.p8
81-
${{ secrets.AUTHKEY_743M7R5W3W }}
82-
EOT
83-
84-
cd /home/ubuntu/OnTime-back/ontime-back
85-
CONTAINER_ID=$(sudo docker ps -aq --filter "name=ontime-container")
86-
if [ ! -z "$CONTAINER_ID" ]; then
87-
sudo docker stop $CONTAINER_ID
88-
sudo docker rm $CONTAINER_ID
89-
fi
90-
# 기존 컨테이너 중지 및 제거
91-
sudo docker-compose down
92-
# 용량 정리
93-
sudo docker container prune
94-
sudo docker image prune -a
95-
sudo docker volume prune
96-
sudo docker network prune
97-
# 소스 코드 빌드 및 컨테이너 실행
98106
# .env 파일 생성
99-
cat <<EOT > .env
107+
sudo bash -c 'cat <<EOT > /home/ubuntu/OnTime-back/.env
100108
MYSQL_DATABASE=${{ secrets.MYSQL_DATABASE }}
101109
MYSQL_USER=${{ secrets.MYSQL_USER }}
102110
MYSQL_PASSWORD=${{ secrets.MYSQL_PASSWORD }}
@@ -137,7 +145,39 @@ jobs:
137145
APPLE_CLIENT_SECRET=${{ secrets.APPLE_CLIENT_SECRET }}
138146
APPLE_LOGIN_KEY=${{ secrets.APPLE_LOGIN_KEY }}
139147
APPLE_TEAM_ID=${{ secrets.APPLE_TEAM_ID }}
140-
EOT
148+
EOT'
149+
150+
sudo mv /home/ubuntu/OnTime-back/ontime-push-firebase-adminsdk-gnpxs-7d098872ff.json /home/ubuntu/OnTime-back/ontime-back/src/main/resources/ontime-push-firebase-adminsdk-gnpxs-7d098872ff.json
151+
sudo mv /home/ubuntu/OnTime-back/application.properties /home/ubuntu/OnTime-back/ontime-back/src/main/resources/application.properties
152+
sudo mv /home/ubuntu/OnTime-back/AuthKey_743M7R5W3W.p8 /home/ubuntu/OnTime-back/ontime-back/src/main/resources/key/AuthKey_743M7R5W3W.p8
153+
154+
deploy-to-ec2:
155+
needs: create-config-files
156+
runs-on: ubuntu-latest
157+
steps:
158+
# EC2 서버에 접근 + docker container 배포
159+
- name: SSH to EC2 & Deploy Docker Containers
160+
uses: appleboy/ssh-action@master
161+
with:
162+
host: ${{ secrets.EC2_HOST }}
163+
username: ${{ secrets.EC2_USER }}
164+
key: ${{ secrets.EC2_SSH_KEY }}
165+
script: |
166+
# 기존 컨테이너 종료 및 삭제
167+
CONTAINER_ID=$(sudo docker ps -aq --filter "name=ontime-container")
168+
if [ ! -z "$CONTAINER_ID" ]; then
169+
sudo docker stop $CONTAINER_ID
170+
sudo docker rm $CONTAINER_ID
171+
fi
172+
173+
# 기존 컨테이너 및 볼륨 정리
174+
sudo docker-compose down
175+
sudo docker container prune -f
176+
sudo docker image prune -a -f
177+
sudo docker volume prune -f
178+
sudo docker network prune -f
141179
142180
# Docker Compose 실행
181+
cd /home/ubuntu/OnTime-back
143182
docker-compose up --build -d
183+

.github/workflows/test.yml

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
name: PR Test
2+
3+
on:
4+
pull_request:
5+
branches:
6+
- main # main 브랜치로 머지되는 PR에서 실행
7+
8+
jobs:
9+
test:
10+
runs-on: ubuntu-latest
11+
12+
steps:
13+
# 1. 코드 체크아웃
14+
- name: Checkout repository
15+
uses: actions/checkout@v3
16+
17+
# 2. JDK 21 설정
18+
- name: Set up JDK 21
19+
uses: actions/setup-java@v2
20+
with:
21+
java-version: '21'
22+
distribution: 'temurin'
23+
24+
# 3. Gradle Wrapper 검증
25+
- name: Validate Gradle Wrapper
26+
uses: gradle/wrapper-validation-action@v1
27+
28+
# 4. 환경 변수 설정 파일 생성
29+
- name: Create Config Files
30+
run: |
31+
mkdir -p ontime-back/src/main/resources
32+
echo "spring.application.name=${{ secrets.SPRING_APPLICATION_NAME }}" > ontime-back/src/main/resources/application.properties
33+
echo "spring.datasource.url=${{ secrets.SPRING_DATASOURCE_URL }}" >> ontime-back/src/main/resources/application.properties
34+
echo "spring.datasource.username=${{ secrets.SPRING_DATASOURCE_USERNAME }}" >> ontime-back/src/main/resources/application.properties
35+
echo "spring.datasource.password=${{ secrets.SPRING_DATASOURCE_PASSWORD }}" >> ontime-back/src/main/resources/application.properties
36+
echo "spring.datasource.driver-class-name=${{ secrets.SPRING_DATASOURCE_DRIVER_CLASS_NAME }}" >> ontime-back/src/main/resources/application.properties
37+
echo "spring.jpa.hibernate.ddl-auto=${{ secrets.SPRING_JPA_HIBERNATE_DDL_AUTO }}" >> ontime-back/src/main/resources/application.properties
38+
echo "jwt.secret.key=${{ secrets.JWT_SECRETKEY }}" >> ontime-back/src/main/resources/application.properties
39+
echo "jwt.access.expiration=${{ secrets.JWT_ACCESS_EXPIRATION }}" >> ontime-back/src/main/resources/application.properties
40+
echo "jwt.refresh.expiration=${{ secrets.JWT_REFRESH_EXPIRATION }}" >> ontime-back/src/main/resources/application.properties
41+
echo "jwt.access.header=${{ secrets.JWT_ACCESS_HEADER }}" >> ontime-back/src/main/resources/application.properties
42+
echo "jwt.refresh.header=${{ secrets.JWT_REFRESH_HEADER }}" >> ontime-back/src/main/resources/application.properties
43+
44+
# 5. Gradle 빌드 & JUnit 테스트 실행
45+
- name: Run Tests with Gradle
46+
id: test
47+
run: |
48+
cd ontime-back
49+
./gradlew test
50+
continue-on-error: true # 실패해도 다음 스텝 실행 가능하도록 설정
51+
52+
handle-failure:
53+
needs: test
54+
if: failure() # 이전 job이 실패한 경우 실행
55+
runs-on: ubuntu-latest
56+
steps:
57+
- name: Close PR
58+
uses: octokit/request-action@v2.x
59+
with:
60+
route: PATCH /repos/{owner}/{repo}/pulls/{pull_number}
61+
owner: ${{ github.repository_owner }}
62+
repo: ${{ github.event.repository.name }}
63+
pull_number: ${{ github.event.pull_request.number }}
64+
state: closed
65+
env:
66+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
67+
68+
- name: Comment on PR
69+
uses: actions/github-script@v6
70+
with:
71+
github-token: ${{ secrets.GITHUB_TOKEN }}
72+
script: |
73+
github.issues.createComment({
74+
owner: context.repo.owner,
75+
repo: context.repo.repo,
76+
issue_number: context.payload.pull_request.number,
77+
body: "테스트가 실패했습니다.\n자세한 실패 로그를 확인하고 수정한 후 다시 PR을 올려주세요!"
78+
})

0 commit comments

Comments
 (0)