CI/CD 에는 다양한 도구가 있지만 요즘 저는 github actions을 제일 많이 사용하는 것 같습니다.
러닝커브도 높지 않고, 보통 개발에 git을 많이 사용하니 세팅하기 위해 다른 관리 포인트를 두지 않아도 되기 때문에 좋은 것 같습니다.
장단점은 간단하게 정리해두었습니다.
[CI/CD] 개발자를 위한 CI/CD 도구의 종류
CI/CD 란? CI(Continuous Integration)는 소프트웨어 구축, 테스트 및 게시 프로세스의 자동화를 의미합니다. CD(Continuous Deployment or Continuous Delivery)는 배포 자동화를 의미합니다. 즉, CI/CD는 코드 변경에 대
zsunn.tistory.com
기본적인 세팅 플로우는 동일하지만, 사용할 서버에 따라서 세부내용이 달라집니다! (참고만 해주세요)
저는 github actions와 함께 AWS S3 + EC2를 사용해서 배포해보도록 하겠습니다.
(AWS ECR + Lambda로도 배포했었는데 그건 다음에 정리해서 올릴게요~)
CI/CD 플로우를 정리하자면 이렇게 순서대로 진행이 됩니다
1. github에서 branch에 push
2. actions에서 workflows 파일 read
3. AWS S3 프로젝트 zip 파일 업로드
4. AWS EC2에 접근
5. EC2 서버 내부에서 deploy shell 파일 실행
1. AWS ACCESS KEY 발급
AWS IAM 들어가서 내가 사용할 사용자를 선택합니다.
그럼 다음과 같이 나오는데 여기서 액세스 키 만들기를 선택합니다.
AWS 애플리케이션에 연결시킬 거라서 선택 후 생성해 주면 아래 두 개의 키가 생성이 됩니다.
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
다시 확인할 수 없으니 바로 다운로드하고 저장해 놓으시고
2. github 레포지토리의 Settings > Secrets and variables > Actions
발급받은 키들을 저장합니다.
3. S3 버킷 만들기
AWS S3 들어가서 버킷 만들기 해주면 끝입니다.
4. CodeDeploy 그룹 만들기
애플리케이션 생성 > 배포 그룹 생성
5. workflows 파일 생성
프로젝트 디렉토리에서
.github > workflows > deploy.yml
name: Deploy to Dev EC2 server
on:
push:
branches: [ develop ]
env:
AWS_REGION: ap-northeast-2
APP_NAME: APP_NAME
DEPLOY_KEY: DEPLOY_KEY
DEPLOY_GROUP: DEPLOY_GROUP
permissions:
contents: read
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
steps:
- name: Checkout
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: ${{ env.AWS_REGION }}
- name: Upload to S3
run: aws deploy push --application-name ${{ env.APP_NAME }} --ignore-hidden-files --s3-location s3://${{ env.APP_NAME }}/${{ env.DEPLOY_KEY }}/$GITHUB_SHA.zip --source .
- name: Deploy to EC2
run: aws deploy create-deployment --application-name ${{ env.APP_NAME }} --file-exists-behavior OVERWRITE --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name ${{ env.DEPLOY_GROUP }} --s3-location bucket=${{ env.APP_NAME }},bundleType=zip,key=${{ env.DEPLOY_KEY }}/$GITHUB_SHA.zip
6. deploy.sh 파일 생성
scripts > deploy.sh (위치는 자유)
#!/bin/bash
APP_NAME={프로젝트 이름}
REPOSITORY=/home/ec2-user/{프로젝트 폴더 이름}
cd $REPOSITORY
APP_LOG=$REPOSITORY/logs/application.log
source /home/ec2-user/.bash_profile
echo "현재 환경: $NODE_ENV" >> $APP_LOG
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
# 캐시 정리
echo "Cleaning cache..." >> $APP_LOG
sudo rm -rf dist/ node_modules/ package-lock.json
# 의존성 패키지 설치
echo "Installing dependencies..." >> $APP_LOG
npm install
# 애플리케이션 빌드
echo "Building application..." >> $APP_LOG
npm run build
# 이전 PM2 프로세스 종료
echo "Stopping previous application instance..." >> $APP_LOG
pm2 stop $APP_NAME || true
pm2 delete $APP_NAME || true
# 새로운 프로세스 시작
echo "Starting application..." >> $APP_LOG
pm2 start ecosystem.config.js
# PM2 프로세스 저장
pm2 save
저는 pm2를 사용해서 서버를 띄우고 있어서 npm으로 재시작 후 pm2 도 다시 재시작하는 명령이 필요해요.
7. appspec.yml 파일 생성
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user/{프로젝트 폴더 이름}
overwrite: yes
permissions:
- object: /
owner: ec2-user
group: ec2-user
hooks:
ApplicationStart:
- location: scripts/deploy.sh
timeout: 600
runas: ec2-user
appspec 파일까지 만들었으면 이제 끝인데요
자 이제 push를 하고 진행이 완료되는지 확인해 볼게요!
github actions는 완료 됐습니다!
만약 오류 나서 실패했다면 메시지 보고 수정하시면 돼요
그런 다음 CodeDeploy에 배포를 확인해 보면 하나가 떠있을 거예요!
여기서 View events를 눌러보시면 자세히 볼 수 있어요
이렇게 각 이벤트별 성공 여부를 알 수 있고 어디서 실패했는지 알 수 있어요
대신 실패 했을 경우 에러 메시지가 친절하진 않아서 헤맬 수 있습니다 ㅠㅠ
(제가 그랬거든요..)
모두 배포 성공하세요~
'Backend > AWS' 카테고리의 다른 글
[AWS] EC2 서버 메모리 부족 - 서버 가상 메모리 설정 (Swap) (2) | 2024.01.30 |
---|---|
[AWS] Lambda + SQS로 카카오 알림톡 서비스 구현하기 (1) (0) | 2024.01.22 |
[Jenkins + EC2] 서버 인프라 세팅 (0) | 2023.12.20 |
[AWS] Lambda + SQS로 카카오 알림톡 서비스 구현하기 (0) | 2023.06.30 |
[AWS SQS] Nestjs로 SQS 전송, 수신 구현하기 (0) | 2023.06.14 |