[CI/CD] Git Action으로 배포 자동화

김지엽·2024년 5월 31일
0
post-thumbnail
post-custom-banner

1. EC2 SSH 키 생성

EC2 서버에 접속

$ ssh -i "path-to-your-ec2-key.pem" ubuntu@your-ec2-public-ip

SSH 키 생성

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

공개키 확인

$ cat ~/.ssh/id_rsa.pub

개인키 확인

$ cat ~/.ssh/id_rsa

공개 키 및 개인 키의 값이 올바르게 저장되었음에도 권한 에러(Permission denied)가 발생한다면 "cat ~/.ssh/authorized_keys" 을 통해서 파일 내용이 공개 키의 내용과 일치하는지 확인 후 일치하지 않는다면 공개 키의 내용을 그대로 복사한다.

2. Github 세팅

공개키 추가

  • Settings -> Deploy keys -> Add deploy key
  • 공개 키 (id_rsa.pub)의 내용을 복사하여 붙여넣습니다.
  • Allow write access를 체크하고 Add key를 클릭합니다.

개인키 및 서버 정보 추가

  • Settings -> Secrets and variables -> Actions -> New repository secret
  • SSH_PRIVATE_KEY - 개인키, SERVER_USER - 서버 유저, SERVER_HOST - 서버 호스트 내용 저장

3. GitHub Actions 워크플로우 설정

.github/workflows/ci-cd.yml

name: CI/CD Pipeline

on:
    push:
        branches:
            - main
    pull_request:
        branches:
            - main

jobs:
    build:
        runs-on: ubuntu-latest

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

            - name: Set up Node.js
              uses: actions/setup-node@v2
              with:
                  node-version: "20"

            - name: Install dependencies
              run: npm install

            - name: Build project
              run: npm run build

    deploy:
        runs-on: ubuntu-latest
        needs: build

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

            - name: Add SSH key
              uses: webfactory/ssh-agent@v0.5.3
              with:
                  ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}

            - name: Deploy to server
              run: |
                  ssh -o StrictHostKeyChecking=no ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} 'bash -s' < ./deploy.sh

deploy.sh

#!/bin/bash

# 로그 파일 설정
LOG_FILE="$HOME/deploy.log"
exec > >(tee -i $LOG_FILE)
exec 2>&1

# NVM 초기화
export NVM_DIR="$HOME/.nvm"
if [ -s "$NVM_DIR/nvm.sh" ]; then
    source "$NVM_DIR/nvm.sh"
else
    echo "NVM is not installed. Installing NVM..."
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
    source "$NVM_DIR/nvm.sh"
fi

# Node.js 설치 확인 및 설치
if ! command -v node &> /dev/null
then
    echo "Node.js is not installed. Installing Node.js...."
    nvm install --lts
fi

# 디렉토리 확인 및 생성
if [ ! -d "/home/ubuntu/nest-template" ]; then
    echo "Creating directory /home/ubuntu/nest-template..."
    mkdir -p /home/ubuntu/nest-template || { echo "Failed to create directory"; exit 1; }
fi

# 서버로 이동
cd /home/ubuntu/nest-template || { echo "Directory does not exist"; exit 1; }

# Git 저장소 업데이트
echo "Pulling latest code from GitHub..."
git pull git@github.com:wlduq0150/nest-template.git main || { echo "Failed to pull code from GitHub"; exit 1; }

# 종속성 설치
echo "Installing dependencies..."
npm install || { echo "Failed to install dependencies"; exit 1; }

# 빌드
echo "Building the application..."
npm run build || { echo "Failed to build the application"; exit 1; }

# 애플리케이션 재시작
echo "Restarting the application with PM2..."
pm2 restart all || { echo "Failed to restart the application"; exit 1; }

echo "Deployment completed successfully."

4. Ec2 기본 세팅

서버가 원활하게 실행할 수 있도록 최초 세팅을 끝내면 이제 main 브랜치의 변화를 감지해 자동으로 배포가 된다.

profile
욕심 많은 개발자
post-custom-banner

0개의 댓글