Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 115 additions & 0 deletions .github/workflows/ci-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
name: 핀하우스 테스트 CI 파이프라인

### develop으로 PR 올릴 때, 테스트 코드를 실행하여, 빌드 여부 및 테스트를 체크하는 로직을 수행한다.

on:
pull_request:
branches: [ "develop"]

jobs:
#1. 통합 테스트 용
test:

runs-on: ubuntu-22.04
services:

mysql:
image: mysql:8.0
ports:
- '3306:3306'
env:
MYSQL_DATABASE: pinhouse_test
MYSQL_USER: testuser
MYSQL_PASSWORD: testpass
MYSQL_ROOT_PASSWORD: root

redis:
image: redis:7.2.5
ports:
- '6379:6379'

mongo:
image: mongo:6.0
ports:
- 27017:27017

permissions:
contents: write
checks: write
pull-requests: write

steps:
# 1-1. repository checkout
- uses: actions/checkout@v4

# 1-2. jdk 환경 설치
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'

# 1-3. '*.yml' 파일 세팅
- name: application.yml 파일 설정
run: |
mkdir -p src/main/resources
echo "${{ secrets.APPLICATION_YML }}" > ./src/main/resources/application.yml

- name: application-dev.yml 설정
run: echo "${{ secrets.APPLICATION_DEV_YML }}" > ./src/main/resources/application-dev.yml

- name: application-oauth2.yml 설정
run: echo "${{ secrets.APPLICATION_OAUTH2_YML }}" > ./src/main/resources/application-oauth2.yml

- name: application-test.yml 설정
run: |
mkdir -p src/test/resources
echo "${{ secrets.APPLICATION_TEST_YML }}" > ./src/test/resources/application-test.yml


# 1-4. 성능 향상을 위한 Gradle 캐싱
- name: Gradle Caching
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
gradle-${{ runner.os }}

# 1-5. 테스트 컨테이너들 작동여부 체크
- name: MySQL 체크
run: |
until nc -z localhost 3306; do
echo "Waiting for MySQL..."
sleep 3
done


- name: Redis 체크
run: |
until nc -z localhost 6379; do
echo "Waiting for Redis..."
sleep 3
done

- name: MongoDB 체크
run: |
until nc -z localhost 27017; do
echo "Waiting for MongoDB..."
sleep 3
done

# 2. 빌드
- name: Build with Gradle Wrapper
run: ./gradlew clean build

# 3. JUnit 테스트 결과 게시
- name: Test 결과 출력
uses: EnricoMi/publish-unit-test-result-action@v2
if: always()
with:
junit_files: '**/build/test-results/test/TEST-*.xml'
github_token: ${{ secrets.GITHUB_TOKEN }}

169 changes: 169 additions & 0 deletions .github/workflows/dev-ci-cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
name: 핀하우스 dev CI-CD 파이프라인

### develop으로 Merge 되었을 때, 테스트 코드를 실행하여, 빌드 및 배포하는 로직을 수행한다.

on:
push:
branches: [ "develop"]

jobs:
#1. 개발 서버 CI, Build 용
CI:
runs-on: ubuntu-22.04
services:
mysql:
image: mysql:8.0
ports:
- '3306:3306'
env:
MYSQL_DATABASE: pinhouse_test
MYSQL_USER: testuser
MYSQL_PASSWORD: testpass
MYSQL_ROOT_PASSWORD: root

redis:
image: redis:7.2.5
ports:
- '6379:6379'

mongo:
image: mongo:6.0
ports:
- 27017:27017

permissions:
contents: write
checks: write
pull-requests: write

steps:
# 1. repository checkout
- uses: actions/checkout@v4

# 2. jdk 환경 설치
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'

# 3. '*.yml' 파일 세팅
- name: application.yml 파일 설정
run: |
mkdir -p src/main/resources
echo "${{ secrets.APPLICATION_YML }}" > ./src/main/resources/application.yml
echo "${{ secrets.APPLICATION_DEV_YML }}" > ./src/main/resources/application-dev.yml
echo "${{ secrets.APPLICATION_OAUTH2_DEV_YML }}" > ./src/main/resources/application-oauth2-dev.yml

mkdir -p src/test/resources
echo "${{ secrets.APPLICATION_TEST_YML }}" > ./src/test/resources/application-test.yml

# 체크
- name: MySQL 체크
run: |
until nc -z localhost 3306; do
echo "Waiting for MySQL..."
sleep 3
done


- name: Redis 체크
run: |
until nc -z localhost 6379; do
echo "Waiting for Redis..."
sleep 3
done

- name: MongoDB 체크
run: |
until nc -z localhost 27017; do
echo "Waiting for MongoDB..."
sleep 3
done

# 4. gradle 환경 설치
- name: Gradle Wrapper 권한 부여
run: chmod +x gradlew

# 4-1. 캐싱
- name: Gradle Caching
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
gradle-${{ runner.os }}

- name: Gradle 빌드
run: ./gradlew clean build

# 5. JUnit 테스트 결과 게시
- name: Test 결과 출력
uses: EnricoMi/publish-unit-test-result-action@v2
if: always()
with:
junit_files: '**/build/test-results/test/TEST-*.xml'
github_token: ${{ secrets.GITHUB_TOKEN }}

#6. 도커 허브 로그인
- name: Docker 로그인
uses: docker/login-action@v3
with:
username: ${{secrets.DOCKER_USERNAME}}
password: ${{secrets.DOCKER_ACCESS_TOKEN}}

#7. 도커 이미지 Push
- name: Docker 이미지 Push
uses: docker/build-push-action@v5
with:
context: .
dockerfile: Dockerfile
push: true
tags: ${{secrets.DOCKER_USERNAME}}/server:latest


CD:
needs: CI
runs-on: ubuntu-22.04

steps:
- name: 1. Checkout source code
uses: actions/checkout@v3

- name: env 생성
run: echo "${{ secrets.ENV }}" > .env

- name: 2. .env 파일 EC2에 전송
uses: appleboy/scp-action@master
with:
host: ${{ secrets.EC2_PUBLIC_IP }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
source: ".env" # 방금 생성한 .env 파일
target: "/home/ubuntu/app/setting/"

- name: 3. docker-compose.yml 전달
uses: appleboy/scp-action@master
with:
host: ${{ secrets.EC2_PUBLIC_IP }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
source: "./pinhouse_docker/docker-compose.yml"
target: "/home/ubuntu/app/"

- name: 4. EC2에서 docker-compose 실행
uses: appleboy/ssh-action@master # SSH를 사용하여 EC2에서 명령 실행
with:
host: ${{ secrets.EC2_PUBLIC_IP }} # EC2 퍼블릭 IP
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
script: |
# docker-compose 명령어 실행
cd /home/ubuntu/app/setting/
docker compose pull spring
docker compose up -d spring



Loading