From 7ec8dd317afdb5a34f049905a69ad654f3095adf Mon Sep 17 00:00:00 2001 From: minij02 Date: Sat, 23 May 2026 22:48:28 +0900 Subject: [PATCH 1/2] =?UTF-8?q?ci:=20=EB=B0=B0=ED=8F=AC=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=B4=ED=94=84=EB=9D=BC=EC=9D=B8=20=EC=9D=B4=EC=A4=91=20?= =?UTF-8?q?=EB=B9=8C=EB=93=9C=20=EC=A0=9C=EA=B1=B0=20+=20Docker=20prune=20?= =?UTF-8?q?=EC=99=84=ED=99=94=20(#499)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit EC2에서 pnpm install + prisma generate + tsc build를 한 번, Docker 컨테이너 빌드 안에서 또 한 번 수행하던 이중 빌드를 제거. Dockerfile이 이미 멀티스테이지(base/deps/builder/runner)로 install/generate/build를 모두 수행하므로 EC2 빌드 단계는 완전히 중복이었음. ### deploy-develop.yml / deploy-main.yml 공통 - "Install, Generate & Build on server" 단계 삭제 (~80초 절감) - Prisma 마이그레이션은 npx로 prisma CLI를 1회 다운로드해 실행 (컨테이너 runtime엔 prisma가 devDep로 prune되어 없음 — npx가 가장 단순) ### deploy-develop.yml만 - docker system prune -af → prune -f --filter "until=168h"로 완화 (BuildKit layer cache 보존 — 매 배포 cold build 방지) 추정 효과: 3분+ → 1분 30초 ~ 1분 50초 (40~50% 절감) --- .github/workflows/deploy-develop.yml | 23 +++++++++-------------- .github/workflows/deploy-main.yml | 15 +++++++-------- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/.github/workflows/deploy-develop.yml b/.github/workflows/deploy-develop.yml index 382094e..d9cde5e 100644 --- a/.github/workflows/deploy-develop.yml +++ b/.github/workflows/deploy-develop.yml @@ -2,7 +2,7 @@ name: deploy-dev on: push: - branches: [ develop ] + branches: [ develop ] workflow_dispatch: jobs: @@ -48,27 +48,22 @@ jobs: ${{ secrets.ENV_DEV_CONTENT }} EOF' - - name: Install, Generate & Build on server - run: | - ssh prod 'cd /opt/app-dev && pnpm install --frozen-lockfile && pnpm exec prisma generate && rm -rf dist && pnpm build' - - # 테스트 DB 마이그레이션 + # 테스트 DB 마이그레이션 (npx로 prisma CLI 1회 호출 — EC2 build 단계 없이) - name: Run Prisma DB Push (Dev) run: | ssh prod << 'EOF' set -euo pipefail cd /opt/app-dev - # .env.dev 파일을 로드하여 실행 - export $(cat .env.dev | xargs) - pnpm exec prisma db push + export $(grep -v '^#' .env.dev | xargs) + npx --yes -p prisma@^6 prisma db push EOF - # 도커 빌드 전 디스크 용량 확보 - - name: Clean up unused Docker data on EC2 + # 도커 빌드 전 디스크 정리 (7일 이상 미사용 데이터만 — BuildKit 캐시 보존) + - name: Prune stale Docker data on EC2 run: | - ssh prod 'sudo docker system prune -af' + ssh prod 'sudo docker system prune -f --filter "until=168h" || true' - # app-dev 컨테이너만 재시작 (운영 컨테이너 app, caddy는 건드리지 않음) + # app-dev 컨테이너만 빌드/재시작 (install/generate/build는 Dockerfile 멀티스테이지로 통합) - name: Deploy Docker services (Dev) run: | - ssh prod 'cd /opt/app-dev && sudo docker compose -p promptplace -f docker-compose.yml up -d --build app-dev' \ No newline at end of file + ssh prod 'cd /opt/app-dev && sudo docker compose -p promptplace -f docker-compose.yml up -d --build app-dev' diff --git a/.github/workflows/deploy-main.yml b/.github/workflows/deploy-main.yml index 289722d..2217942 100644 --- a/.github/workflows/deploy-main.yml +++ b/.github/workflows/deploy-main.yml @@ -6,7 +6,7 @@ on: workflow_dispatch: jobs: - deploy: + deploy: runs-on: ubuntu-latest permissions: contents: read @@ -53,23 +53,22 @@ jobs: ${{ secrets.ENV_CONTENT }} EOF' - - name: Install, Generate & Build on server - run: | - ssh prod 'cd /opt/app-backup && pnpm install --frozen-lockfile && pnpm exec prisma generate && rm -rf dist && pnpm build' - + # Prisma 마이그레이션 (npx로 prisma CLI 1회 호출 — EC2 build 단계 없이) - name: Run Prisma migrations (deploy) if: steps.paths-filter.outputs.prisma == 'true' run: | ssh prod << 'EOF' set -euo pipefail cd /opt/app-backup - pnpm exec prisma migrate deploy + export $(grep -v '^#' .env | xargs) + npx --yes -p prisma@^6 prisma migrate deploy EOF - name: Stop and Remove old containers run: | ssh prod 'cd /opt/app-backup && sudo docker rm -f myapp || true && sudo docker rm -f caddy || true' + # Docker 빌드/배포 (install/generate/build는 Dockerfile 멀티스테이지로 통합) - name: Deploy Docker services - run: | - ssh prod 'cd /opt/app-backup && sudo docker compose -p promptplace -f docker-compose.yml up -d --build app caddy' \ No newline at end of file + run: | + ssh prod 'cd /opt/app-backup && sudo docker compose -p promptplace -f docker-compose.yml up -d --build app caddy' From 8dcafaa27f2022e366ff88a35bcbb25cc7fc6eda Mon Sep 17 00:00:00 2001 From: minij02 Date: Sat, 23 May 2026 22:48:42 +0900 Subject: [PATCH 2/2] =?UTF-8?q?ci:=20.dockerignore=20=EB=B3=B4=EA=B0=95=20?= =?UTF-8?q?=E2=80=94=20=EB=B9=8C=EB=93=9C=20context=20=ED=81=AC=EA=B8=B0?= =?UTF-8?q?=20=EC=B6=95=EC=86=8C=20(#499)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존 .dockerignore에 누락된 항목 추가: - .github (워크플로 파일은 컨테이너에 불필요) - *.log (npm-debug 외 일반 로그 패턴) - *.md / docs (README 외 다른 문서) - tests / __tests__ / *.test.ts / *.spec.ts (테스트) - .vscode / .idea (IDE 설정) - swagger.json (컨테이너 빌드 시 재생성) - .env.local / .env.*.local Docker 빌드 컨텍스트 전송 크기와 layer 캐시 무효화 빈도 감소. --- .dockerignore | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 8399d2f..ad980b9 100644 --- a/.dockerignore +++ b/.dockerignore @@ -7,12 +7,16 @@ coverage # 깃 관련 파일 .git .gitignore +.github # 환경 변수 .env .env.dev +.env.local +.env.*.local # 로그 파일 +*.log npm-debug.log yarn-error.log pnpm-debug.log @@ -27,4 +31,19 @@ docker-compose.yml .dockerignore # 빌드에 필요 없는 파일 -README.md \ No newline at end of file +README.md +*.md +docs + +# 테스트/임시 파일 +tests +__tests__ +*.test.ts +*.spec.ts + +# IDE 설정 +.vscode +.idea + +# Swagger 산출물 (컨테이너 빌드 시 재생성) +swagger.json