개발/개발로그

[Matchstick Puzzle] Github Actions 자동배포 #001

seungho-dev 2025. 2. 14. 20:15

💁🏻 CI/CD?

CI/CD(Continuous Integration / Continuous Deployment)는 소프트웨어 개발과 배포를 자동화하는 프로세스를 의미하는데 머지, 테스트, 빌드과정이 여기 포함된다. 오늘은 우선  github에서 제공하는 actions 기능을 사용해 main branch에 push 했을 때 aws에 접속하여 빌드하고 서비스를 재시작하는 워크플로우를 만들어 보려고한다.

👨🏻‍💻 Action?

Github Actions의 작업단위로 /.github/workeflows 디렉터리 내에서 *. yml 확장자로 만들 수 있다. 쉽게 설명하자면 ec2와 같은 가상컴퓨터가 레파지토리에 대한 다양한 이벤트(push, pull_request, issues 생성..)에 대해 YAML파일로 정의된 작업을 자동으로 실행할 수 있게 해 준다.

 

👩🏻‍🚀 Workflow&Secrets

우선 AWS EC2 서버에 접근할 수 있도록 키와 정보들을 GitHub Secets 설정에 추가해보자.

Setting -> Secrets and variables -> Actions -> New repository secret

Name 설명
AWS_ACCESS_KEY_ID AWS IAM 사용자의 액세스 키
AWS_SECRET_ACCESS_KEY AWS IAM 사용자의 비밀 키
AWS_REGION EC2가 위치한 리전 (예: ap-northeast-2)
EC2_HOST EC2의 퍼블릭 IP 주소
EC2_USERNAME EC2에 접속할 사용자 이름
SSH_PRIVATE_KEY EC2에 접속할 개인 키

위와 같이 설정해 주었다.

 

이제 deploy.yml 파일을 작성하자

name: Deploy to AWS EC2

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest

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

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}

      - name: Deploy to EC2
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USERNAME }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            cd ~/app              # EC2에서 프로젝트 폴더로 이동
            git pull origin main  # 최신 코드 가져오기
            npm install           # 의존성 설치
            npm run build         # 빌드 실행
            pm2 restart all       # 애플리케이션 재시작
  • name: 식별과 관리를 위한 이름 지정
  • on: 트리거 조건 (push, pull_request, schedule 등)
  • jobs: 하나 이상의 작업 정의
  • runs-on: 실행 환경 지정 (ubuntu, windows, macos 등)
  • steps: 순차적으로 실행할 작업 단계들
  • uses: 미리 만들어진 액션 사용
  • with: 액션에 전달할 매개변수들
  • script: 실행할 셸 명령어들

커밋해보니 잘 동작하는것 같다.