728x90
문제
nest.js 어플리케이션 CICD 파이프라인 구축 중인 상황.
문제는 배포가 정상적으로 진행되었음에도 불구하고 배포된 디렉토리에는 몇몇 폴더들이 누락된 상태로 배포가 되고있었다. src 폴더는 온데간대 없고 dist 파일에는 tsconfig 파일 하나만 달랑 있는 상황이었다.
ubuntu@ip-172-31-11-171:~/build$ ls
appspec.yml nest-cli.json package-lock.json readme.md tsconfig.build.json yarn.lock
dist node_modules package.json scripts tsconfig.json
deploy.yml
name: deploy
on:
push:
branches: [main] # Workflow is triggered when you push to these branches
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-18.04 # ex) EC2 instance
strategy:
matrix:
node-version: [14.21.3]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
# What you will do after (repository code -> CI server)
steps:
- name: Checkout source code.
uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }} # install Node.js with the version you wrote above
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
- name: Check Npm -v
run: npm -v
- name: create env file
working-directory: ./
run: |
pwd
touch .env
echo NODE_SERVER_PORT=${{ secrets.NODE_SERVER_PORT }} >> .env
echo JWT_SECRET=${{ secrets.JWT_SECRET }} >> .env
echo HTTPS_PORT=${{ secrets.HTTPS_PORT }} >> .env
echo HTTP_PORT=${{ secrets.HTTP_PORT }} >> .env
echo RDS_HOST=${{ secrets.RDS_HOST }} >> .env
echo RDS_PORT=${{ secrets.RDS_PORT }} >> .env
echo RDS_USERNAME=${{ secrets.RDS_USERNAME }} >> .env
echo RDS_PASSWORD=${{ secrets.RDS_PASSWORD }} >> .env
echo RDS_DATABASE_NAME=${{ secrets.RDS_DATABASE_NAME }} >> .env
cat .env
- name: build server files
working-directory: ./
run: |
yarn
yarn run build
################## CD 구축 단계에서 추가 부분
# 명시한 파일, 폴더들을 pyramid.zip 파일로 압축
- name: zip file
run: zip -r pyramid.zip . -x "node_modules/*" "coverage/*" "src/*" "test/*" "README.md" "*.git*" # node_module 등 파일들은 제외한 나머지 모두 압축
# run: zip -r pyramid.zip ./dist ./scripts ./appspec.yml ./.env ./package.json
# S3 접근을 위한 IAM 사용자 키값등록
- name: AWS configure 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: ap-northeast-2
# S3에 압축 파일을 옮겨줌
- name: upload to S3
run: aws s3 cp --region ap-northeast-2 ./pyramid.zip s3://pyramid-build/deploy/
# AWS CodeDeploy 실행 시 가장 아랫줄 지정한 곳에 압축 파일 푼 뒤, CodeDeploy와 연결된 EC2 인스턴스에 배포
- name: deploy with AWS codeDeploy
run: aws deploy create-deployment
--application-name pyramid-test-codedeploy
--deployment-config-name CodeDeployDefault.OneAtATime
--deployment-group-name GROUP
--s3-location bucket=pyramid-build,bundleType=zip,key=deploy/pyramid.zip
# 배포 완료 후 after-deploy.sh 저장한 명령어들이 실행되면서 서버 자동 재시작
원인
S3에 업로드된 zip 파일을 보니 몇몇 폴더들이 누락되어있었다. 이는 분명 압축 과정에서 파일이 누락되었거나 경로명에 문제가 있는 것이라는 가설을 세우게 되었다.
시도1 - 실패
경로에 ./dist ./src 등을 추가 해주었다.
- name: zip file
run: zip -r pyramid.zip . ./dist ./src ./test -x "node_modules/*" "coverage/*" "src/*" "test/*" "README.md" "*.git*"
gitaction 빌드 과정에서 바로 실패해버렸다.
Run zip -r pyramid.zip . ./dist ./src ./*** -x "node_modules/*" "coverage/*" "src/*" "***/*" "README.md" "*.git*"
zip warning: first full name: ./dist/
second full name: dist/
name in zip file repeated: dist/
zip error: Invalid command arguments (cannot repeat names in zip file)
Error: Process completed with exit code 16.
이건 잘못된 것이다.
시도 2 - 성공
run: zip -r pyramid.zip ./dist ./scripts ./src ./test ./.env ./appspec.yml ./nest-cli.json ./package-lock.json ./package.json ./tsconfig.build.json ./tsconfig.json ./ -x "node_modules/*" "coverage/*" "*.git*"
명시적으로 파일들을 다 지정해주니 정상적으로 이동된다!
그런데 passport 모듈이 없다고 에러는 에러가 뜬다.
sudo npm install passport
passport 모듈을 설치해주고 앱 실행해주면 잘 작동된다.
회고
의문 점
- passport는 왜 설치하라고 뜨는 것일까?
- 지금 nestjs 앱 파일을 모두 압축한 뒤 배포 하는 이러한 CI/CD 방식이 효율적인 방법일까?
리서치를 하다보니 nest.js의 경우 실행 시 1) 앱 빌드 과정과 2) 실행 과정을 함께 실행하는데, 빌드 과정을 성능이 느린 EC2 서버에서 할 경우 소요 시간이 오래 걸린다는 문제점이 종종 제기된 것을 보았다. 그래서 아예 CI 단계에서 미리 빌드를 해준 뒤에 배포를 하는 것으로 보인다. 이 부분은 좀 더 보완할 필요가 있어 보인다.
728x90
'Log > Trouble shoot' 카테고리의 다른 글
Postgres_인덱스 적용 후 성능이 개선되지 않는 문제 (0) | 2023.03.13 |
---|---|
Troubleshoot_Ngrinder 테스트 중도 멈춤 문제 (0) | 2023.03.08 |
nestjs_EntityMetadataNotFoundError 에러 (0) | 2023.02.22 |
Express.js_body undefined 에러(파싱 문제) (0) | 2023.02.07 |
Express.js_router 경로 오타 이슈(app -> router) (0) | 2023.02.07 |
댓글