
Continuous Delivery
언제든지 배포할 수 있는 상태로 자동화하는 것
Continuous Deployment
ex) main에 merge 되었을 때 배포를 실행하는 것
CD는 이렇게 2가지 측면으로 볼 수 있다.
내가 정리하는 글은 Deployment쪽에 조금 더 가까운거 같다.
이전 글에서 보았듯이 40번 넘게 시도했고,
AI에 의존했다.
40번 넘게 시도한 것, AI에 의존한 것은 이 부분에 대해 잘 몰랐기 때문이다.
조금 더 생각했더라면, 더 빨리 성공했을텐데 하는 아쉬운 부분이다.
어쨌든,

26번째 테스트에 첫 성공하고,
계속 실패했다.
원인은

no space left on device
디바이스 공간이 없음.

EC2 볼륨을 늘리고
# 파티션 확장
sudo growpart /dev/xvda 1
# 파일시스템 확장
sudo resize2fs /dev/xvda1
해주면 실제 서버에도 용량이 늘어난 것을 확인 가능.


3000 port가 main web 서버인데 3000번, 30001번 둘 다 안됨.
왜왜왜왜왜왜
왜왜왜왜왜왜?
그래서 이전에는 npm run build 을 Dockerfile에 추가하지 않아 계속 실행되지 않음.
"scripts": {
"dev:web": "next dev",
"dev": "next dev --turbopack",
"build": "next build --no-lint",
"start": "next start"
},
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npx prisma generate
RUN npm run build
EXPOSE 3000
CMD ["npm", "run", "start"]
참고: "COPY . ."는 현재 디렉토리의 모든 파일을 도커 이미지 작업 디렉토리로 복사하라는 의미
- name: Render .env.production for compose
run: |
cat > .env.production << 'EOF'
NODE_ENV=production
# DB(RDS)
DATABASE_URL=${{ secrets.DATABASE_URL }}
# Next 공개 환경변수 (예: API base URL)
NEXT_PUBLIC_API_BASE_URL=${{ secrets.NEXT_PUBLIC_API_BASE_URL }}
# ECR
ECR_REGISTRY=${{ secrets.ECR_REGISTRY }}
ECR_REPOSITORY_FRONTEND=${{ secrets.ECR_REPOSITORY_FRONTEND }}
ECR_REPOSITORY_SOCKET=${{ secrets.ECR_REPOSITORY_SOCKET }}
IMAGE_TAG=${{ github.sha }}
# Ports
FRONTEND_PORT=3000
BACKEND_PORT=3001
# S3
S3_BUCKET=${{ secrets.S3_BUCKET }}
S3_REGION=${{ secrets.AWS_REGION }}
S3_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }}
S3_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}
EOF
이게 무슨 말이냐면,
docker.compose.yml
services:
next:
# build는 로컬 개발용으로만 사용
image: ${ECR_REGISTRY}/${ECR_REPOSITORY_FRONTEND}:${IMAGE_TAG}
restart: unless-stopped
env_file: .env.production
ports:
- "${FRONTEND_PORT}:3000"
depends_on:
- socket
environment:
- NEXT_PUBLIC_API_URL=http://socket:3001
networks:
- app-network
# healthcheck, resources, logging 옵션 필요 시 추가
socket:
image: ${ECR_REGISTRY}/${ECR_REPOSITORY_SOCKET}:${IMAGE_TAG}
restart: unless-stopped
ports:
- "${BACKEND_PORT}:3001"
environment:
- DATABASE_URL=${DATABASE_URL}
networks:
- app-network
# WebSocket 포트/보안그룹 오픈 확인
networks:
app-network:
driver: bridge
docker-compose.yml 에서 사용하는 환경변수는 .env.production 그니까 github actions에서 생성한 CD.yml에서 만들어줄 .env.production 을 통해 넣어줄건데,
.env.production에 환경변수 몇개를 빼먹음 ㅎㅎㅎㅎㅎㅎ
그래서 필요한 환경변수들도 다 설정해주니

github actions를 활용한 자동(수동으로 했으면 진작에 끝났을) 배포 완료!
CI/CD 구축하면서 느낀점은 쉬운게 하나 없다.
해야 할게 굉장히 많았고, 그래도 한 번 해보면서 AWS, docker, github actions, package.json 등에 대해 조금 더 알아가는 시간이었음.
물론, 아직 해야할게 많다.
여러 가지 측면에서 아직 알지 못하는 것, 배워야 할 것들이 꽤 많은 듯 하다.