https://velog.io/@ckdwns9121/Github-Action을-이용해-AWS-Lightsail-CICD-파이프라인-구축하기-1편
https://velog.io/@ckdwns9121/Github-Action을-이용해-AWS-Lightsail-CICD-파이프라인-구축하기-2편






해당 .pem을 cat으로 열어서 저장해놓기 (---BEGIN RSA PRIVATE KEY---- 부터 제일 마지막 ---END RSA PRIVATE KEY--- 을 포함한 값까지!)
아래의 경우 맨 마지막에 보이는 %는 포함시키면 안된다 (이거 때문에 오류가

chmod 400 CICDTEST.pem

sudo apt-get update && sudo apt-get install awscli

aws --version

aws configure

CI/CD를 적용할 리포지토리의 Settings > Secrets and variables > Actions 클릭

이후 키 등록
예시)
Name: AWS_ACCESS_KEY_ID
Secret: IAM 콘솔에서 발급 받은 ACCESS_ID


CI/CD를 적용할 리포지토리의 Actions > set up a workflow yourself 클릭

아래 코드 복붙
name: CI CD
on:
push:
branches: ['main']
pull_request:
branches: ['main']
env:
LIGHTSAIL_SSH_KEY: ${{ secrets.LIGHTSAIL_SSH_KEY }}
LIGHTSAIL_HOST: ${{ secrets.LIGHTSAIL_HOST }}
LIGHTSAIL_USERNAME: bitnami
AWS_REGION: ap-northeast-2
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: 소스 코드 체크아웃
uses: actions/checkout@v3
- name: Node.js 설정
uses: actions/setup-node@v3
with:
node-version: 20 // 원하는 버전 선택
- name: 의존성 설치
run: sudo npm install
- name: 빌드
run: sudo npm run build
- name: AWS 자격 증명 설정
uses: aws-actions/configure-aws-credentials@v3
with:
aws-region: ${{ env.AWS_REGION }}
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- name: SSH 키 설정
run: |
mkdir -p $HOME/.ssh
echo "${{ secrets.LIGHTSAIL_SSH_KEY }}" > $HOME/.ssh/deploy_key
chmod 600 $HOME/.ssh/deploy_key
eval $(ssh-agent -s)
ssh-add $HOME/.ssh/deploy_key
ssh-keyscan -H ${{ secrets.LIGHTSAIL_HOST }} >> $HOME/.ssh/known_hosts
- name: 기존 디렉토리 정리 및 권한 설정
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.LIGHTSAIL_HOST }}
username: ${{ env.LIGHTSAIL_USERNAME }}
key: ${{ secrets.LIGHTSAIL_SSH_KEY }}
script: |
sudo rm -rf /home/bitnami/test-cicd // test-cicd를 자신의 프로젝트명으로 수정! sudo mkdir -p /home/bitnami/test-cicd
sudo chown -R bitnami:bitnami /home/bitnami/test-cicd // test-cicd를 자신의 프로젝트명으로 수정!
sudo chmod -R 755 /home/bitnami/test-cicd // test-cicd를 자신의 프로젝트명으로 수정!
- name: 애플리케이션 파일 배포
uses: appleboy/scp-action@master
with:
host: ${{ secrets.LIGHTSAIL_HOST }}
username: ${{ env.LIGHTSAIL_USERNAME }}
key: ${{ secrets.LIGHTSAIL_SSH_KEY }}
source: 'dist/,package.json,package-lock.json'
target: '/home/bitnami/test-cicd' // test-cicd를 자신의 프로젝트명으로 수정!
strip_components: 0
overwrite: true
- name: PM2 프로세스 재시작
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.LIGHTSAIL_HOST }}
username: ${{ env.LIGHTSAIL_USERNAME }}
key: ${{ secrets.LIGHTSAIL_SSH_KEY }}
script: |
cd /home/bitnami/test-cicd // test-cicd를 자신의 프로젝트명으로 수정!
sudo npm ci --production
sudo pm2 restart main || sudo pm2 start dist/main.js --name main

name: CI CD
# main 브랜치에 push 또는 pull request 발생 시 워크플로우 실행
on:
push:
branches: ['main']
pull_request:
branches: ['main']
# 공통 환경 변수 정의 (GitHub Secrets 사용)
env:
LIGHTSAIL_SSH_KEY: ${{ secrets.LIGHTSAIL_SSH_KEY }}
LIGHTSAIL_HOST: ${{ secrets.LIGHTSAIL_HOST }}
LIGHTSAIL_USERNAME: bitnami
AWS_REGION: ap-northeast-2
jobs:
deploy:
runs-on: ubuntu-latest # 최신 Ubuntu 환경에서 실행
steps:
# GitHub 저장소에서 소스 코드를 체크아웃
- name: 소스 코드 체크아웃
uses: actions/checkout@v3
# Node.js 20버전 설정
- name: Node.js 설정
uses: actions/setup-node@v3
with:
node-version: 20 # 원하는 Node.js 버전
# npm 의존성 설치
- name: 의존성 설치
run: sudo npm install
# 빌드 명령 실행 (예: Next.js 앱 빌드)
- name: 빌드
run: sudo npm run build
# AWS 자격 증명 환경 설정 (Secrets에 저장된 키 사용)
- name: AWS 자격 증명 설정
uses: aws-actions/configure-aws-credentials@v3
with:
aws-region: ${{ env.AWS_REGION }}
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
# Lightsail 서버 접근을 위한 SSH 키 설정
- name: SSH 키 설정
run: |
mkdir -p $HOME/.ssh
echo "${{ secrets.LIGHTSAIL_SSH_KEY }}" > $HOME/.ssh/deploy_key
chmod 600 $HOME/.ssh/deploy_key
eval $(ssh-agent -s)
ssh-add $HOME/.ssh/deploy_key
ssh-keyscan -H ${{ secrets.LIGHTSAIL_HOST }} >> $HOME/.ssh/known_hosts
# 서버에서 기존 프로젝트 디렉토리 삭제 후 재생성, 권한 설정
- name: 기존 디렉토리 정리 및 권한 설정
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.LIGHTSAIL_HOST }}
username: ${{ env.LIGHTSAIL_USERNAME }}
key: ${{ secrets.LIGHTSAIL_SSH_KEY }}
script: |
# 기존 디렉토리 삭제 및 생성 (프로젝트명에 따라 경로 변경 가능)
sudo rm -rf /home/bitnami/test-cicd
sudo mkdir -p /home/bitnami/test-cicd
sudo chown -R bitnami:bitnami /home/bitnami/test-cicd
sudo chmod -R 755 /home/bitnami/test-cicd
# 빌드된 파일을 서버로 전송
- name: 애플리케이션 파일 배포
uses: appleboy/scp-action@master
with:
host: ${{ secrets.LIGHTSAIL_HOST }}
username: ${{ env.LIGHTSAIL_USERNAME }}
key: ${{ secrets.LIGHTSAIL_SSH_KEY }}
source: 'dist/,package.json,package-lock.json'
target: '/home/bitnami/test-cicd' # 이 경로는 프로젝트명에 맞게 수정
strip_components: 0
overwrite: true
# PM2를 통해 앱 재시작 또는 새로 시작
- name: PM2 프로세스 재시작
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.LIGHTSAIL_HOST }}
username: ${{ env.LIGHTSAIL_USERNAME }}
key: ${{ secrets.LIGHTSAIL_SSH_KEY }}
script: |
cd /home/bitnami/test-cicd # 해당 디렉토리로 이동
sudo npm ci --production # production 환경용 의존성만 설치
# main이라는 이름으로 프로세스를 재시작, 없으면 새로 실행
sudo pm2 restart main || sudo pm2 start dist/main.js --name main