삭제할 커밋! #75
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # This workflow uses actions that are not certified by GitHub. | |
| # They are provided by a third-party and are governed by | |
| # separate terms of service, privacy policy, and support | |
| # documentation. | |
| # This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time | |
| # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle | |
| name: 키키하이 dev CI-CD 파이프라인 | |
| on: | |
| push: | |
| branches: [ "develop","feat/LOG"] | |
| jobs: | |
| #1. 개발 서버 CI, Build 용 | |
| CI: | |
| runs-on: ubuntu-22.04 | |
| services: | |
| mysql: | |
| image: mysql:8.0 | |
| ports: | |
| - '3306:3306' | |
| env: | |
| MYSQL_DATABASE: kkh_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 | |
| elasticsearch: | |
| image: docker.elastic.co/elasticsearch/elasticsearch:7.17.0 | |
| ports: | |
| - 9200:9200 | |
| options: >- | |
| --health-cmd "curl -f http://localhost:9200/_cluster/health || exit 1" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 10 | |
| env: | |
| discovery.type: single-node | |
| ES_JAVA_OPTS: "-Xms512m -Xmx512m" | |
| 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_PROD_YML }}" > ./src/main/resources/application-prod.yml | |
| echo "${{ secrets.APPLICATION_OAUTH2_YML }}" > ./src/main/resources/application-oauth2.yml | |
| mkdir -p src/test/resources | |
| echo "${{ secrets.APPLICATION_TEST_YML }}" > ./src/test/resources/application-test.yml | |
| echo "${{ secrets.LOGBACK_TEST_XML }}" > ./src/test/resources/logback-test.xml | |
| # 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 }} | |
| # 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 | |
| - name: Elasticsearch 체크 | |
| run: | | |
| until curl -sSf http://localhost:9200/_cluster/health; do | |
| echo "Waiting for Elasticsearch..." | |
| sleep 5 | |
| done | |
| # 5-2. Nori 플러그인 설치 | |
| - name: Install Nori plugin | |
| run: | | |
| CONTAINER_ID=$(docker ps -q -f ancestor=docker.elastic.co/elasticsearch/elasticsearch:7.17.0) | |
| echo "Elasticsearch container ID: $CONTAINER_ID" | |
| docker exec $CONTAINER_ID bin/elasticsearch-plugin install analysis-nori --batch | |
| docker restart $CONTAINER_ID | |
| sleep 30 | |
| # 6. Gradle 빌드 | |
| - name: Gradle 빌드 | |
| run: ./gradlew clean build | |
| #7. 도커 허브 로그인 | |
| - name: Docker 로그인 | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{secrets.DOCKER_USERNAME}} | |
| password: ${{secrets.DOCKER_ACCESS_TOKEN}} | |
| #8. 도커 이미지 Push | |
| - name: Docker 이미지 Push | |
| uses: docker/build-push-action@v4 | |
| 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/docker/" | |
| - 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: "./docker/docker-compose.yml" | |
| target: "/home/ubuntu/app/" | |
| - name: 3. 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/docker/ | |
| docker compose pull spring | |
| docker compose up -d spring | |