[숏폼 프로젝트] 도커 + GitHub Actions CI/CD 연결

Manta·2024년 12월 2일
0

숏폼

목록 보기
6/7

👾GitHub Actions 를 선택한 이유

GitHub Actions를 선택하는 이유는 다양한 자동화 기능과 GitHub 플랫폼과의 통합성 때문입니다.

GitHub과의 완벽한 통합

  • GitHub Actions는 GitHub 저장소와 직접 연동되어 CI/CD 워크플로우를 간편하게 설정할 수 있습니다.
  • Pull Request, Commit, Issue 이벤트와 같은 GitHub 이벤트를 트리거로 사용할 수 있어 코드 변경 시 자동으로 테스트, 빌드, 배포가 이루어집니다.

자동화된 CI/CD

  • Continuous Integration (CI): 코드 변경 사항을 자동으로 테스트하고 빌드하여 오류를 조기에 발견할 수 있습니다.
  • Continuous Deployment (CD): 특정 브랜치에 코드가 머지되면 자동으로 애플리케이션을 배포할 수 있습니다.

비용 효율성

  • GitHub Actions는 공용 저장소에서는 무료로 사용할 수 있으며, GitHub 팀/엔터프라이즈 플랜에서는 일정한 크레딧이 제공되어 추가적인 비용 절감 효과가 있습니다.

🐋Docker 란?


도커(Docker)는 애플리케이션을 컨테이너(Container)라는 단위로 패키징하고 실행할 수 있도록 도와주는 오픈 소스 플랫폼입니다. 컨테이너를 사용하면 애플리케이션과 해당 실행 환경을 독립적으로 묶어 어디서든 일관되게 실행할 수 있습니다.

컨테이너는 애플리케이션과 함께 필요한 모든 라이브러리, 종속성, 설정을 포함하는 가벼운 실행 환경입니다. 이를 통해 애플리케이션은 어떤 환경에서도 동일하게 작동할 수 있습니다.

Dockerfile 작성

FROM node:20-alpine

WORKDIR /var/app
RUN mkdir -p /var/app
COPY . .

RUN npm install
RUN npm run build

EXPOSE 3000
CMD ["npm", "run", "start"]

.dockerignore 작성

node_modules
.git
dist

Docker Compose 설정 파일

일단 로컬에서 도커로 실행을 한 후에 PostgreSQL과 서버가 잘 연결이 되어있는지 테스트를 하기 위해서 작성을 했습니다.

version: '3'

services:
  db:
    image: postgres:17
    restart: always
    environment:
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_USER=${DB_USERNAME}
      - POSTGRES_DB=${DB_NAME}
    container_name: postgresDB
    volumes:
      - ./postgresql-data:/var/lib/postgresql/data
    ports:
      - '5432:5432'
    healthcheck:
      test: ['CMD', 'pg_isready', '-U', 'postgres']
      interval: 10s
      retries: 5

  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: app
    environment:
      - DB_HOST=host.docker.internal
      - DB_PORT=5432
      - DB_USER=${DB_USERNAME}
      - DB_PASSWORD=${DB_PASSWORD}
      - DB_NAME=${DB_NAME}
      - PORT=${PORT}
    ports:
      - '3000:3000'
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - ./src:/app/src

CI/CD 파이프라인 구축

CI/CD(Continuous Integration/Continuous Deployment)는 개발 프로세스를 자동화하고, 빠른 배포 및 테스트를 가능하게 합니다.

name: CI/CD Pipeline

on:
  push:
    branches: ['dev']
  pull_request:
    branches: ['dev']

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
      - name: Use Node.js 20.x
        uses: actions/setup-node@v4
        with:
          node-version: 20.x
          cache: 'npm'
      - run: npm ci
      - run: npm test

  build-and-push:
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'

    steps:
      - uses: actions/checkout@v4

      - name: Build Docker image
        run: |
          docker build -t my-app .

      - name: Push Docker image to Docker Hub
        env:
          DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
          DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
        run: |
          docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
          docker tag my-app $DOCKER_USERNAME/my-app:latest
          docker push $DOCKER_USERNAME/my-app:latest
  1. Docker 이미지 빌드
    Node.js 애플리케이션을 Docker 이미지로 생성합니다.

  2. Docker Hub 푸시

    • Docker 이미지를 Docker Hub에 푸시합니다.
    • GitHub Secrets를 활용하여 민감한 정보를 안전하게 관리합니다.

현재는 AWS와의 연결을 구현하지 않은 상태 입니다. 다음 블로그 작성 시 해당하는 글을 작성 하겠습니다.

작동 원리

  1. 테스트 자동화

    • dev 브랜치로 코드를 푸시하거나 PR을 생성하면 테스트가 자동으로 실행됩니다.
  2. CI/CD 파이프라인 실행

    • main 브랜치에 푸시가 발생하면 Docker 이미지를 빌드하고 Docker Hub에 푸시합니다.
    • 이를 통해 배포 프로세스가 간소화됩니다.
profile
공부할게 너무 만타🫠

0개의 댓글