배포한 서버 github actions로 CI/CD 구축하기

왬스터·2025년 2월 21일
post-thumbnail

🔥이전 시리즈들을 통합하여 github actions로 ci/cd를 구축하려합니다🔥
[Naver Cloud] 웹서버 구축시리즈: 바로가기
[Docker] 도커를 이용한 서버 배포: 바로가기

0️⃣ 들어가기 앞서 ci/cd란?

  • CI/CD의 기본 개념

    • CI/CD는 '지속적 통합(Continuous Integration)'과 '지속적 배포(Continuous Deployment)'를 아우르는 개발 방법론입니다. 이는 개발자가 코드를 작성하는 순간부터 실제 사용자에게 서비스를 제공하는 순간까지의 모든 과정을 자동화하는 것을 목표로 합니다.

    • 지속적 통합(CI)은 여러 개발자의 코드 변경사항을 정기적으로 통합하는 프로세스입니다. 각자 작업한 코드 조각들이 전체 시스템과 잘 맞는지 자동으로 확인하고 검증합니다.

    • 지속적 배포(CD)는 통합된 코드를 실제 운영 환경에 자동으로 배포하는 과정입니다. 때로는 '지속적 전달(Continuous Delivery)'이라는 중간 단계를 포함하기도 하는데, 이는 배포 전에 수동 승인 단계를 두는 보다 신중한 접근 방식입니다.

출처: https://blog.kakaocloud.com/138

1️⃣ 🔐 GitHub Actions용 SSH키 생성 (로컬에서 실행)

서버에서 다음 명령어로 ssh키를 생성하겠습니다

$ ssh-keygen -t rsa -b 4096 -C "github-actions"
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
  • -t rsa: RSA 알고리즘 사용
  • -b 4096: 4096비트 길이의 키 생성
  • -C "github-actions": 키에 주석을 추가해 용도를 식별

👉 주요 입력 사항

  • 파일 경로: ~/.ssh/id_rsa (기본 경로로 Enter)
    • 저는 root로 로그인해서 루트경로가 뜨네요
  • 비밀번호: 비워두거나 원하는 비밀번호 설정

2️⃣ 📄 공개 키 서버에 등록 (Rocky 서버)

  1. 만들어진 공개 키 확인!
$ cat ~/.ssh/id_rsa.pub
  1. 서버에 등록!
# 서버에 로그인
$ ssh [사용자명]@[서버_공인_IP]

# authorized_keys에 공개 키 등록
$ mkdir -p ~/.ssh
$ echo "공개 키 내용" >> ~/.ssh/authorized_keys

# 권한 설정
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

3️⃣ 🔑 GitHub Secrets에 개인 키 등록

  1. 개인 키 확인
$ cat ~/.ssh/id_rsa
  1. GitHub 저장소에서 등록
    • Settings → Secrets and variables → Actions → New repository secret
    • Name: SSH_PRIVATE_KEY
    • Value: 개인 키(id_rsa) 전체 내용 붙여넣기

4️⃣ 🌐 GitHub Actions용 서버 접속 테스트

로컬 환경에서 다음 명령어로 GitHub Actions가 서버에 접속할 수 있는지 확인!

$ ssh -i ~/.ssh/id_rsa [사용자명]@[서버_공인_IP]
------------------------------------------------------------------------------------------------------------
                        //                            //
   //////      //////  //    ////    //    //    //////
  //    //  //        //  //    //  //    //  //    //
 //    //  //        //  //    //  //    //  //    //
//    //    //////  //    ////      //////    //////
Welcome to Naver Cloud Platform Server!
Authorized access only!
If you are not authorized to access this system, disconnect now!
------------------------------------------------------------------------------------------------------------
Activate the web console with: systemctl enable --now cockpit.socket

서버 접속 성공!

5️⃣ 📜 GitHub Actions Workflow 파일 생성

이제 GitHub Actions에서 Gradle 빌드와 Docker 배포를 자동화하는 gradle.yml 파일을 만들어보겠습니다

name: CI/CD with Gradle and Docker

on:
  push:
    branches:
      - main  # main 브랜치에 푸시할 때 실행

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    # 코드 체크아웃
    - name: 소스 코드 체크아웃
      uses: actions/checkout@v4

    # JDK 설정
    - name: JDK 17 설정
      uses: actions/setup-java@v4
      with:
        java-version: '17'
        distribution: 'temurin'

    # Gradle 캐시 설정 (빌드 속도 향상)
    - name: Gradle 캐시 설정
      uses: actions/cache@v4
      with:
        path: ~/.gradle/caches
        key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
        restore-keys: |
          ${{ runner.os }}-gradle

    # Gradle 빌드
    - name: Gradle 빌드 및 테스트
      run: |
        chmod +x gradlew
        ./gradlew clean build -x test

    # Docker 이미지 빌드
    - name: Docker 이미지 빌드
      run: |
        docker build -t my-app:${{ github.sha }} .

    # 서버에 Docker 이미지 배포
    - name: 서버에 Docker 배포
      uses: appleboy/ssh-action@v0.1.10
      with:
        host: ${{ secrets.SERVER_IP }}
        username: ${{ secrets.SERVER_USER }}
        key: ${{ secrets.SSH_PRIVATE_KEY }}
        script: |
          docker stop my-app || true
          docker rm my-app || true
          docker pull my-app:${{ github.sha }}
          docker run -d -p 8080:8080 --env-file .env --name izikgram kokiyo1030/izikgram:${{ github.sha }}

🔑 GitHub Secrets 설정

GitHub 저장소의 Settings → Secrets and variables → Actions

  • SERVER_IP: 서버 공인 IP
  • SERVER_USER: Rocky 서버의 사용자명
  • SSH_PRIVATE_KEY: 생성한 개인 키
  • DOCKER_PASSWORD: Docker Hub 비밀번호 (Docker Hub에 이미지를 푸시할 경우)

4️⃣ 🚀 테스트 및 배포

main 브랜치에 코드를 푸시하면 GitHub Actions가 자동으로 실행됩니다!

⚠️ 오류...

다음 내용은 오류 수정에 대해...

profile
공부를 햄스터하는 남자

0개의 댓글