[나만무] github actions CD 배포

Woody Jo·2025년 8월 31일

kjungle

목록 보기
27/31

CD

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

해주면 실제 서버에도 용량이 늘어난 것을 확인 가능.


32번째에 성공


3000 portmain web 서버인데 3000번, 30001번 둘 다 안됨.

왜왜왜왜왜왜
왜왜왜왜왜왜?

  1. 우리가 일반적으로 로컬에서 사용하는 것은 개발모드, 배포하기 위해선 배포 모드(production)가 있다는 것을 빨리 인지하지 못함.
  2. Dockerfilepackage.jsonscripts를 copy하여 사용한다는 것을 빨리 인지하지 못함.
    (코드에 떡하니 COPY 가 있음에도.....)
  3. nextproduction mode에서 최적화된 환경에서 동작할 수 있도록 npm run build 한다고 함.
    (ubuntu에서 docker-compose logs next로 로그를 확인했을 때 npm run build 이야기를 함. 하지만 잘 이해하지 못했는데 그런 이야기였군....?)

그래서 이전에는 npm run buildDockerfile에 추가하지 않아 계속 실행되지 않음.

"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 . ."는 현재 디렉토리의 모든 파일을 도커 이미지 작업 디렉토리로 복사하라는 의미

  1. .env.production에 key들을 제공하지 않음.
    CD.yml
      - 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 세팅
  • github secrets 세팅
  • EC2 인스턴스에 필요한 Docker 및 AWS CLI 설정
  • docker를 활용했기에 docker와 package.json, github actions yml 파일 코드 이해 등

해야 할게 굉장히 많았고, 그래도 한 번 해보면서 AWS, docker, github actions, package.json 등에 대해 조금 더 알아가는 시간이었음.

물론, 아직 해야할게 많다.

  • 보안측면: .env 파일에만 의존하지 않고 다른 secrets 키를 사용할 수 있다고 한다.
  • 운영측면: 어떻게 모니터링 할 것인가? (healthcheck)
    어떻게 리소스 제한할 것인가?
    개발 모드와 배포 모드 환경을 분리하는게 더 나을까?
    코드 리팩토링은?

여러 가지 측면에서 아직 알지 못하는 것, 배워야 할 것들이 꽤 많은 듯 하다.

profile
developer

0개의 댓글