diff --git a/.github/workflows/ci-test.yml b/.github/workflows/ci-test.yml new file mode 100644 index 0000000..96bf053 --- /dev/null +++ b/.github/workflows/ci-test.yml @@ -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 }} + diff --git a/.github/workflows/dev-ci-cd.yml b/.github/workflows/dev-ci-cd.yml new file mode 100644 index 0000000..f97e32f --- /dev/null +++ b/.github/workflows/dev-ci-cd.yml @@ -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 + + +