GitHub Actions & Docker CI/CD 구축

SEUNGJUN·2024년 5월 17일
0
post-thumbnail

GitHub Actions은 GitHub에서 제공하는 CI/CD(Continuous Integration/Continuous Deployment) 플랫폼이다. GitHub Actions를 사용하면 코드 저장소에서 발생하는 이벤트에 따라 자동으로 워크플로우를 설정하고 실행할 수 있다. 이를 통해 코드 테스트, 빌드, 배포와 같은 반복적인 작업을 자동화 할수 있다.

GitHub Actions 주요 기능 및 특징

1. 이벤트 기반 워크 플로우

  • GitHub Actions는 다양한 이벤트(예: 코드 푸시, 풀 리퀘스트, 이슈 생성 등)에 반응하여 워크플로우를 트리거할 수 있다.

  • 예를 들어, 특정 브랜치에 코드가 푸시될 때마다 테스트와 빌드를 자동으로 실행하도록 설정 할 수 있다.

2. 워크플로우 정의

  • 워크플로우는 YAML 파일로 정의된다. 이 파일은 저장소의 .github/workflows 디렉토리에 위치한다.

  • YAML 파일을 통해 어떤 이벤트에 반응할지, 어떤 작업을 수행할지, 어떤 환경에서 실행할지를 정의할 수 있다.

3. 다양한 액션 사용

  • GitHub Actions는 미리 정의된 수많은 액션을 제공하며, 이를 통해 코드 체크아웃, 테스트 실행, 빌드, 배포 등의 작업을 쉽게 수행할 수 있다.

  • 커뮤니티에서 제작한 액션도 사용할 수 있으며, 직접 사용자 정의 액션을 만들어 사용할 수도 있다.

4. 직렬 및 병렬 실행

  • 여러 작업을 직렬 또는 병렬로 실행할 수 있다.

  • 이를 통해 복잡한 CI/CD 파이프라인을 유연하게 구성할 수 있다.

5. 비밀 관리

  • GitHub Secrets를 사용하여 민감한 정보를 안전하게 저장하고, 워크플로우 내에서 이를 참조 할 수 있다. 예를 들어, API키, 데이터베이스 자격 증명 등을 안전하게 관리할 수 있다.

<Nest.js 애플리케이션의 CI/CD를 구축하는 코드>

1. Dockerfile 작성

Nest.js 애플리케이션을 위한 Dockerfile을 작성한다.

# 공식 Node.js 이미지를 베이스로 사용한다.
FROM node:16-alpine

# 작업 디렉토리 설정
WORKDIR /app

# package.json과 package-lock.json 복사
COPY package*.json ./

# 종속성 설치
RUN npm install

# 나머지 애플리케이션 코드 복사
COPY . .

# 포트 노출
EXPOSE 3000

# 애플리케이션 실행 명령
CMD ["npm", "run", "start:prod"]

2. Git Action 워크플로우 설정

GitHub 저장소의 .github/workflows 디렉토리에 CI/CD 워크플로우를 설정한다.

name: CI/CD

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1

      - name: Login to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v2
        with:
          context: .
          file: ./Dockerfile
          push: true
          tags: your-dockerhub-username/your-image-name:latest

      - name: SSH Deploy to Synology NAS
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SYN_NAS_HOST }}
          username: ${{ secrets.SYN_NAS_USERNAME }}
          password: ${{ secrets.SYN_NAS_PASSWORD }}
          port: ${{ secrets.SYN_NAS_PORT }}
          script: |
            docker-compose -f /path/to/docker-compose.yml pull
            docker-compose -f /path/to/docker-compose.yml up -d
name: CI/CD

on:
  push:
    branches:
      - main
  • name: CI/CD: 워크플로우의 이름이다.
  • on: push: branches: - main: main 브랜치에 푸시될 때마다 이 워크플로우가 실행된다.
jobs:
  build:
    runs-on: ubuntu-latest
  • jobs: 워크플로우에서 실행될 작업들을 정의한다.
  • runs-on: ubuntu-latest: 작업이 실행될 가상 머신 환경을 지정한다. 여기서는 최신 Ubuntu를 사용한다.
steps:
  - name: Checkout code
    uses: actions/checkout@v2
  • name: Set up Docker Buildx: 단계의 이름이다.
  • uses: actions/checkout@v2: GitHub의 공식 액션을 사용하여 저장소의 코드를 체크아웃한다.
- name: Set up Docker Buildx
    uses: docker/setup-buildx-action@v1
  • uses: docker/setup-buildx-action@v1: Docker Buildx를 설정하는 GitHub 액션을 사용한다. Docker Buildx는 다양한 플랫폼을 대상으로 이미지를 빌드할 수 있는 도구이다.
- name: Login to Docker Hub
    uses: docker/login-action@v2
    with:
      username: ${{ secrets.DOCKER_USERNAME }}
      password: ${{ secrets.DOCKER_PASSWORD }}
  • uses: docker/login-action@v2: Docker Hub에 로그인하는 GitHub 액션을 사용한다.
  • with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }}: Docker Hub 로그인에 필요한 사용자 이름과 비밀번호를 GitHub Secrets에서 가져온다. Secrets는 민감한 정보를 안전하게 저장하고 사용할 수 있도록 도와준다.
- name: Build and push Docker image
    uses: docker/build-push-action@v2
    with:
      context: .
      file: ./Dockerfile
      push: true
      tags: your-dockerhub-username/your-image-name:latest
  • uses: docker/build-push-action@v2: Docker 이미지를 빌드하고 푸시하는 GitHub 액션을 사용합니다.

  • with: context: . file: ./Dockerfile push: true tags: your-dockerhub-username/your-image-name:latest:

    	`context`: .: Docker 빌드를 위한 컨텍스트 디렉토리이다. 여기서는 현재 디렉토리를 사용한다.
    	`file`: ./Dockerfile: Dockerfile의 경로이다.
    	`push`: true: 빌드된 이미지를 Docker Hub에 푸시할지 여부를 나타낸다.
    	`tags`: your-dockerhub-username/your-image-name:latest: Docker 이미지의 태그를 지정한다. your-dockerhub-username과 your-image-name을 실제 Docker Hub 사용자 이름과 이미지 이름으로 대체해야 한다.
  - name: SSH Deploy to Synology NAS
    uses: appleboy/ssh-action@master
    with:
      host: ${{ secrets.SYN_NAS_HOST }}
      username: ${{ secrets.SYN_NAS_USERNAME }}
      password: ${{ secrets.SYN_NAS_PASSWORD }}
      port: ${{ secrets.SYN_NAS_PORT }}
      script: |
        docker-compose -f /path/to/docker-compose.yml pull
        docker-compose -f /path/to/docker-compose.yml up -d
  • uses: appleboy/ssh-action@master: SSH를 통해 원격 서버에 명령을 실행할 수 있는 GitHub 액션을 사용한다.

  • with: host: ${{ secrets.SYN_NAS_HOST }} username: ${{ secrets.SYN_NAS_USERNAME }} password: ${{ secrets.SYN_NAS_PASSWORD }} port: ${{ secrets.SYN_NAS_PORT }} script: | docker-compose -f /path/to/docker-compose.yml pull docker-compose -f /path/to/docker-compose.yml up -d:

    	`host`: Synology NAS의 호스트 주소를 GitHub Secrets에서 가져온다.
    	`username`: Synology NAS의 사용자 이름을 GitHub Secrets에서 가져온다.
    	`password`: Synology NAS의 비밀번호를 GitHub Secrets에서 가져온다.
    	`port`: Synology NAS의 SSH 포트를 GitHub Secrets에서 가져온다.
    	`script`: 실행할 스크립트를 정의한다. 여기서는 Docker Compose를 사용하여 최신 이미지를 가져오고(pull), 애플리케이션을 실행(up -d)한다. docker-compose.yml 파일의 실제 경로로 /path/to/docker-compose.yml을 대체해야 한다.

전체 프로세스

  • main 브랜치에 코드가 푸시되면 워크플로우가 시작된다.

  • GitHub Actions는 코드를 체크아웃한다.

  • Docker Buildx가 설정된다.

  • Docker Hub에 로그인한다.

  • Docker 이미지를 빌드하고 Docker Hub에 푸시한다.

  • SSH를 통해 Synology NAS에 접속하여 Docker Compose를 실행, 애플리케이션을 배포한다.

profile
RECORD DEVELOPER

0개의 댓글