./src/main/resources/application-secret.yaml chmod +x gradlew ./gradlew clean build --info -x test - name: Login to DockerHub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build Docker run: docker build --platform linux/amd64 -t ${{ secrets.DOCKERHUB_USERNAME }}/infra_server . workin"> ./src/main/resources/application-secret.yaml chmod +x gradlew ./gradlew clean build --info -x test - name: Login to DockerHub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build Docker run: docker build --platform linux/amd64 -t ${{ secrets.DOCKERHUB_USERNAME }}/infra_server . workin"> ./src/main/resources/application-secret.yaml chmod +x gradlew ./gradlew clean build --info -x test - name: Login to DockerHub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build Docker run: docker build --platform linux/amd64 -t ${{ secrets.DOCKERHUB_USERNAME }}/infra_server . workin">
name: CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

permissions:
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: ./refactoring_project/Bobi/
    steps:
      - uses: actions/checkout@v3
      - name: Install JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'
   
      - name: Build with Gradle
        run: |
          echo ${{secrets.APPLICATION_SECRET}} | base64 --decode > ./src/main/resources/application-secret.yaml
          chmod +x gradlew
          ./gradlew clean build --info -x test

      - name: Login to DockerHub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Build Docker
        run: docker build --platform linux/amd64 -t ${{ secrets.DOCKERHUB_USERNAME }}/infra_server .
        working-directory: ./refactoring_project/Bobi/
      
      - name: Push Docker
        run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/infra_server:latest
        
  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Set target IP
        run: |
          STATUS=$(curl -o /dev/null -w "%{http_code}" "<http://$>{{ secrets.INFRA_SERVER_IP }}/api/v1/ssenbi/env")
          echo $STATUS
          if [ $STATUS = 200 ]; then
            CURRENT_UPSTREAM=$(curl -s "<http://$>{{ secrets.INFRA_SERVER_IP }}/api/v1/ssenbi/env")
          else
            CURRENT_UPSTREAM=green
          fi
          echo CURRENT_UPSTREAM=$CURRENT_UPSTREAM >> $GITHUB_ENV
          if [ $CURRENT_UPSTREAM = blue ]; then
            echo "CURRENT_PORT=8080" >> $GITHUB_ENV
            echo "STOPPED_PORT=8081" >> $GITHUB_ENV
            echo "TARGET_UPSTREAM=green" >> $GITHUB_ENV
          elif [ $CURRENT_UPSTREAM = green ]; then
            echo "CURRENT_PORT=8081" >> $GITHUB_ENV
            echo "STOPPED_PORT=8080" >> $GITHUB_ENV
            echo "TARGET_UPSTREAM=blue" >> $GITHUB_ENV
          else
            echo "error"
            exit 1
          fi
          
      - name: Docker compose
        uses: appleboy/ssh-action@master
        with:
          username: ec2-user
          host: ${{ secrets.INFRA_SERVER_IP }}
          key: ${{ secrets.EC2_SSH_KEY }}
          script_stop: true
          script: |
            sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/infra_server:latest
            sudo docker compose -f docker-compose-${{env.TARGET_UPSTREAM}}.yml up -d
      
      - name: Check deploy server URL
        uses: jtalk/url-health-check-action@v3
        with:
          url: <http://$>{{ secrets.INFRA_SERVER_IP }}:${{env.STOPPED_PORT}}/api/v1/ssenbi/env
          max-attempts: 3
          retry-delay: 10s

      - name: Change nginx upstream
        uses: appleboy/ssh-action@master
        with:
          username: ec2-user
          host: ${{ secrets.INFRA_SERVER_IP }}
          key: ${{ secrets.EC2_SSH_KEY }}
          script_stop: true
          script: |
            sudo docker exec -i nginx_server bash -c 'echo "set \\$service_url ${{ env.TARGET_UPSTREAM }};" > /etc/nginx/conf.d/service-env.inc && nginx -s reload' 

      - name: Stop current server
        uses: appleboy/ssh-action@master
        with:
          username: ec2-user
          host: ${{ secrets.INFRA_SERVER_IP }}
          key: ${{ secrets.EC2_SSH_KEY }}
          script_stop: true
          script: |
            sudo docker stop ${{env.CURRENT_UPSTREAM}}
            sudo docker rm ${{env.CURRENT_UPSTREAM}}

코드 분석

CI (Continuous Integration) 설정

1. Push 및 Pull Request 트리거

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main"

2. 권한 설정

permissions:
  contents: rea

jobs

build (빌드 작업)

runs-on: ubuntu-latest

빌드 과정

defaults:
  run:
    working-directory: ./refactoring_project/Bobi/

1. GitHub 레포지토리 체크아웃