Skip to content

Commit fc0a5e3

Browse files
authored
Merge pull request #4 from Nexters/dev
[feature-2] CI/CD 구축
2 parents 0f2a251 + 5d5ec58 commit fc0a5e3

File tree

4 files changed

+186
-0
lines changed

4 files changed

+186
-0
lines changed

.github/pull_request_template.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
## #️⃣연관된 이슈
2+
3+
> ex) #이슈번호, #이슈번호
4+
5+
## 📝작업 내용
6+
7+
> 이번 PR에서 작업한 내용을 간략히 설명해주세요(이미지 첨부 가능)
8+
9+
### 스크린샷 (선택)
10+
11+
## 💬리뷰 요구사항(선택)
12+
13+
> 리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요
14+
>
15+
> ex) 메서드 XXX의 이름을 더 잘 짓고 싶은데 혹시 좋은 명칭이 있을까요?

.github/workflows/cd.yml

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
name: CD
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
8+
permissions: write-all #테스트 결과 작성을 위해 쓰기권한 추가
9+
10+
jobs:
11+
# 빌드
12+
build:
13+
runs-on: ubuntu-latest
14+
15+
steps:
16+
#jdk 세팅
17+
- name: check out
18+
uses: actions/checkout@v3
19+
20+
- name: Set up JDK 17
21+
uses: actions/setup-java@v3
22+
with:
23+
java-version: '17'
24+
distribution: 'temurin'
25+
26+
#gradle 캐싱
27+
- name: Gradle Caching
28+
uses: actions/cache@v3
29+
with:
30+
path: |
31+
~/.gradle/caches
32+
~/.gradle/wrapper
33+
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
34+
restore-keys: |
35+
${{ runner.os }}-gradle-
36+
37+
### CD
38+
#배포를 위한 prod properties 설정
39+
- name: Make application-prod.properties
40+
run: |
41+
cd ./src/main/resources
42+
touch ./application-prod.properties
43+
echo "${{ secrets.PROPERTIES_PROD }}" > ./application-prod.properties
44+
shell: bash
45+
46+
#test를 제외한 프로젝트 빌드
47+
- name: Build With Gradle
48+
run: ./gradlew build -x test
49+
# 도커
50+
docker:
51+
runs-on: ubuntu-latest
52+
needs: build
53+
steps:
54+
- name: Set up Docker Buildx
55+
uses: docker/setup-buildx-action@v2
56+
57+
- name: Login to Docker Hub
58+
uses: docker/login-action@v2
59+
with:
60+
username: ${{ secrets.DOCKER_HUB_USERNAME }}
61+
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
62+
63+
- name: Build and push Docker image
64+
uses: docker/build-push-action@v4
65+
with:
66+
context: .
67+
push: true
68+
tags: ${{ secrets.DOCKER_HUB_USERNAME }}/donmani:latest
69+
70+
# 배포
71+
deploy:
72+
needs: build
73+
runs-on: ubuntu-latest
74+
steps:
75+
- name: Deploy to Prod
76+
uses: appleboy/ssh-action@master
77+
id: deploy-prod
78+
with:
79+
host: ${{ secrets.SERVER_IP }}
80+
username: ${{ secrets.SERVER_USER }}
81+
key: ${{ secrets.SERVER_PASSWORD }}
82+
envs: GITHUB_SHA
83+
script: |
84+
docker stop donmani
85+
docker rm donmani
86+
sudo docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/donmani
87+
docker run -d --name donmani -p 8080:8080 ${{ secrets.DOCKER_HUB_USERNAME }}/donmani
88+
docker rmi -f $(docker images -f "dangling=true" -q)

.github/workflows/ci.yml

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
name: Java CI with Gradle
2+
3+
on:
4+
pull_request:
5+
branches:
6+
- dev
7+
8+
permissions: write-all # 테스트 결과 작성을 위해 쓰기 권한 추가
9+
10+
jobs:
11+
build:
12+
runs-on: ubuntu-latest
13+
14+
services:
15+
mysql:
16+
image: mysql:8
17+
env:
18+
MYSQL_ROOT_PASSWORD: root
19+
MYSQL_DATABASE: testdb
20+
MYSQL_USER: testuser
21+
MYSQL_PASSWORD: testpassword
22+
ports:
23+
- 3306:3306
24+
options: >-
25+
--health-cmd="mysqladmin ping --host=localhost --user=testuser --password=testpassword"
26+
--health-interval=10s
27+
--health-timeout=10s
28+
--health-retries=5
29+
30+
env:
31+
SPRING_DATASOURCE_URL: jdbc:mysql://localhost:3306/testdb
32+
SPRING_DATASOURCE_USERNAME: testuser
33+
SPRING_DATASOURCE_PASSWORD: testpassword
34+
SPRING_JPA_DATABASE_PLATFORM: org.hibernate.dialect.MySQL8Dialect
35+
36+
steps:
37+
# JDK 세팅
38+
- name: Check out repository
39+
uses: actions/checkout@v3
40+
41+
- name: Set up JDK 17
42+
uses: actions/setup-java@v3
43+
with:
44+
java-version: '17'
45+
distribution: 'temurin'
46+
47+
# Gradle 캐싱
48+
- name: Gradle Caching
49+
uses: actions/cache@v3
50+
with:
51+
path: |
52+
~/.gradle/caches
53+
~/.gradle/wrapper
54+
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
55+
restore-keys: |
56+
${{ runner.os }}-gradle-
57+
58+
# CI
59+
- name: Grant Execute Permission For Gradlew
60+
run: chmod +x gradlew
61+
62+
# MySQL이 제대로 실행되도록 대기 (선택 사항)
63+
- name: Wait for MySQL to be ready
64+
run: sleep 15
65+
66+
# 테스트를 제외한 프로젝트 빌드
67+
- name: Build With Gradle
68+
run: ./gradlew build -x test
69+
70+
# 테스트 실행
71+
- name: Build With Test
72+
run: ./gradlew test
73+
74+
# 테스트 결과 파일 생성
75+
- name: Publish Unit Test Results
76+
uses: EnricoMi/publish-unit-test-result-action@v1
77+
if: ${{ always() }}
78+
with:
79+
files: build/test-results/**/*.xml

Dockerfile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
FROM openjdk:17-ea-11-jdk-slim
2+
ARG JAR_FILE=./build/libs/donmani_server-0.0.1-SNAPSHOT.jar
3+
COPY ${JAR_FILE} donmani_server.jar
4+
ENTRYPOINT ["java", "-jar", "/donmani_server.jar", "--spring.profiles.active=prod"]

0 commit comments

Comments
 (0)