본문 바로가기
IT 서비스/시퀀스

[ CI/CD] GithubAction + Docker를 활용한 SpringBoot CI/CD 과정

by agong이 2025. 2. 26.
더보기
name: CI CD process

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

jobs:
  build:
    runs-on: ubuntu-latest
    
    permissions:
      contents: read
      
    # 테스트용 MariaDB 컨테이너 추가
    services:
      mariadb:
        image: mariadb:latest
        env:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: testdb
          MYSQL_USER: testuser
          MYSQL_PASSWORD: testpass
        ports:
          - 3306:3306

    env:
      DATABASE_URL: jdbc:mariadb://localhost:3306/testdb
      DATABASE_USERNAME: testuser
      DATABASE_PASSWORD: testpass
      DATABASE_DRIVER: org.mariadb.jdbc.Driver
      JWT_SECRET: ${{ secrets.JWT_SECRET }}
      MAX_FILE_SIZE: ${{ secrets.MAX_FILE_SIZE }}
      MAX_REQUEST_SIZE : ${{ secrets.MAX_REQUEST_SIZE }}

    
    steps:
    - uses: actions/checkout@v4
    - name: Set up JDK 17
      uses: actions/setup-java@v4
      with:
        java-version: '17'
        distribution: 'temurin'


    # Configure Gradle for optimal use in GitHub Actions, including caching of downloaded dependencies.
    # See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md
    - name: Setup Gradle
      uses: gradle/actions/setup-gradle@v4 # v4.0.0
      with:
        gradle-version: '8.10.2'

    - name: Build with Gradle Wrapper
      run: ./gradlew build
      working-directory: sequence_member


    # NOTE: The Gradle Wrapper is the default and recommended way to run Gradle (https://docs.gradle.org/current/userguide/gradle_wrapper.html).
    # If your project does not have the Gradle Wrapper configured, you can use the following configuration to run Gradle with a specified version.
    #
    # - name: Setup Gradle
    #   uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
    #   with:
    #     gradle-version: '8.9'
    #
    # - name: Build with Gradle 8.9
    #   run: gradle build

    # 도커 로그인
    - name: Docker Login
      uses: docker/login-action@v3.3.0
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}

    - name: List repository root
      run: ls -la
    - name: List sequence_member directory
      run: ls -la sequence_member
    # Docker 이미지 빌드
    - name: Build Docker image
      run: |
        docker build -t ${{secrets.DOCKER_USERNAME}}/sequence:latest .
      working-directory: sequence_member
    # Docker 이미지 푸시
    - name: Push Docker image
      run: |
        docker push ${{secrets.DOCKER_USERNAME}}/sequence:latest
      working-directory: sequence_member

  dependency-submission:
    runs-on: ubuntu-latest
    permissions:
      contents: write

    steps:
    - uses: actions/checkout@v4
    - name: Set up JDK 17
      uses: actions/setup-java@v4
      with:
        java-version: '17'
        distribution: 'temurin'

    - name: Generate and submit dependency graph
      uses: gradle/actions/dependency-submission@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
      with:
        build-root-directory: sequence_member
  
  # ssh연결 및 실행
  deploy:
    needs: [build]
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to Server via SSH
        uses: appleboy/ssh-action@v0.1.8
        with:
          host: ${{secrets.SERVER_HOST}}
          username: ${{secrets.SERVER_USERNAME}}
          key: ${{secrets.SERVER_SSH_KEY}}
          port: 22
          script: |
            # 서버에서 최신 이미지 pull
            docker pull ${{secrets.DOCKER_USERNAME}}/sequence:latest
            # 기존 컨테이너 종료 및 삭제 (존재하는 경우)
            docker stop sequence-spring-container || true
            docker rm sequence-spring-container || true
            # 새로운 컨테이너 실행 (포트 및 필요한 환경 변수 지정 가능)
            docker run -d --name sequence-spring-container --network sequence -p 10101:8080 \
              -e JWT_SECRET=${{secrets.JWT_SECRET}} \
              -e MAX_FILE_SIZE=${{secrets.MAX_FILE_SIZE}} \
              -e MAX_REQUEST_SIZE=${{secrets.MAX_REQUEST_SIZE}} \
              -e DATABASE_DRIVER=org.mariadb.jdbc.Driver \
              -e DATABASE_URL=${{secrets.DATABASE_URL}} \
              -e DATABASE_USERNAME=${{secrets.DATABASE_USERNAME}} \
              -e DATABASE_PASSWORD=${{secrets.DATABASE_PASSWORD}} \
              ${{secrets.DOCKER_USERNAME}}/sequence:latest

 

💬정리

GithubAction + Docker를 활용하여 CI/CD를 구축하였습니다.

Jenkins와는 다르게 서버가 별도로 필요없고, GithubAction의 클라우드 서버안에 도커가 미리 설치되어있는점, 다양한 action을 미리 템플릿으로 제공한다는 점, 이 세가지 때문에 Jenkins에 비해 정말 편리하게 느껴졌습니다. 

혹시 Jenkins만 사용해보신분들은 한번쯤 사용해보시면 신세계이실것 같습니다. 그럼 이만 😊

댓글