ABOUT ME

나의 공부 기록

Today
Yesterday
Total
  • NCP를 이용한 프로젝트 배포 - (2) 배포
    ☁️ infra/Naver Cloud Platform 2025. 2. 28. 00:54

    Spring Boot로 개발한 애플리케이션을 Docker Hub에 올리고 이를 NCP 서버에서 자동으로 pull 받아 실행하도록 설정하는 과정

    또한, GitHub Actions을 이용해 main 브랜치에 코드가 push될 때 자동으로 배포가 이루어지도록 설정

     

    ⤴️ Github Actions

    GitHub Actions을 이용하여 CI/CD 파이프라인을 구축하는 설정입니다.

    name: github-actions
    
    on:
      push:
        branches: [ "develop", "main" ]
      pull_request:
        branches: [ "develop", "main" ]
    
    jobs:
      build:
        name: build
        runs-on: ubuntu-latest
    
        steps:
          - uses: actions/checkout@v4
    
          - name: Set up JDK 17
            uses: actions/setup-java@v4
            with:
              java-version: 17
              distribution: 'temurin'
    
          - name: Cache Gradle packages
            uses: actions/cache@v2
            with:
              path: |
                ~/.gradle/caches
                ~/.gradle/wrapper
              key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
              restore-keys: |
                ${{ runner.os }}-gradle-
    
          - name: Make application.yml
            run: |
              mkdir ./src/main/resources
              touch ./src/main/resources/application.yml
              echo "${{ secrets.APPLICATION_YML }}" >> ./src/main/resources/application.yml
            shell: bash
    
          - uses: actions/upload-artifact@v4
            with:
              name: application.yml
              path: ./src/main/resources/application.yml
    
          - name: Grant execute permission for gradlew
            run: chmod +x gradlew
    
          - name: Build with Gradle
            run: ./gradlew clean build --exclude-task test
    
          - name: Docker build & push
            run: |
              docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} -p ${{ secrets.DOCKER_HUB_PASSWORD }}
              docker build -f Dockerfile -t ${{ secrets.DOCKER_HUB_REPO }} .
              docker push ${{ secrets.DOCKER_HUB_REPO }}
          - name: Deploy Service
            uses: appleboy/ssh-action@master
            with:
              host: ${{ secrets.NCP_HOST }}
              username: ${{ secrets.NCP_USERNAME }}
              password: ${{ secrets.NCP_PASSWORD }}
              port: ${{ secrets.NCP_PORT }}
              script: |
                echo "${{ secrets.DOCKER_HUB_PASSWORD }}" | sudo docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} --password-stdin
                
                sudo docker rm -f ${docker ps -qa}
                sudo docker pull ${{ secrets.DOCKER_HUB_REPO }}
                sudo docker-compose up -d
                
                sudo docker image prune -f

     

    📍 설정 설명

    1. Gradle 빌드 캐싱: 빌드 속도를 높이기 위해 캐싱을 사용합니다.
    2. 환경 변수(application.yml) 적용: GitHub Secrets에 저장된 설정을 application.yml 파일로 생성합니다.
    3. Gradle 빌드: 테스트 제외 후 빌드 실행
    4. Docker Build & Push: 생성된 이미지를 Docker Hub에 push
    5. 배포(Deploy Service): NCP 서버에서 최신 이미지를 pull하여 실행

    📌 NCP Server 환경 설정

    1️⃣ Docker 설치

    패키지 업데이트

    sudo apt update
    

     

    필수 패키지 설치

    • Docker에 설치 전 필요한 필수 패키지를 먼저 설치
    sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
    

     

    Docker 공식 GPG Key 추가

    curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | sudo apt-key add -
    

     

    Docker Repository 등록

    sudo add-apt-repository \\
    "deb [arch=amd64] <https://download.docker.com/linux/ubuntu> \\
    $(lsb_release -cs) \\
    stable"
    

     

    Docker 설치

    sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.i
    

     

    설치 확인

    sudo docker run hello-world
    

     

    2️⃣ Docker compose 설치

    도커 컴포즈 다운로드 및 설치

    sudo curl -L "<https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-$>(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    

     

    실행 권한 부여

    sudo chmod +x /usr/local/bin/docker-compose
    

     

    3️⃣ docker-compose.yml

    version: "3"
    services:
    
      spring-app:
        image: ${{ secrets.DOCKER_HUB_REPO }}
        container_name: spring_app_container
        ports:
          - "8080:8080"
    

     

    👟 전체 과정

    1. main 브랜치에 코드 push
    2. GitHub Actions 실행
      • Gradle build
      • Docker build & push
      • NCP 서버에 SSH 접속 후 최신 이미지 pull 및 실행
    3. NCP 서버에서 최신 컨테이너 실행

     

    📖 참고자료

    https://docs.docker.com/engine/install/ubuntu/

    댓글

Designed by Tistory.