return이 그대로 커밋·배포되어 이후 단계가 실행되지 않음.test → build → deploy 표준화sandbox-*)gitlab/gitlab-runner(executor: docker)SSH_PRIVATE_KEY(Masked/Protected 권장)~/.ssh/authorized_keys 등록, 권한(~/.ssh 700, authorized_keys 600)output: 'standalone' (서버에서 pnpm install 없이 실행 가능)project-sandbox (예: 포트 4400)pm2 reload --only project-sandbox트리거 정책:
sandbox-*태그 푸시 시 개인 샌드박스 파이프라인만 작동
SSH_PRIVATE_KEY, DEPLOY_HOST, DEPLOY_USER, DEPLOY_PATHproject_sandbox 로 제한(내 잡에서만 노출)module.exports = {
apps: [
// ...기존 앱들
{
name: 'project-sandbox',
cwd: '/home/project/sandbox/.next/standalone',
script: 'server.js',
exec_mode: 'cluster',
instances: 1, // 처음엔 1로 안정화 후 scale
env: {
NODE_ENV: 'production',
PORT: 4400,
HOST: '0.0.0.0',
HOSTNAME: '0.0.0.0',
},
},
],
};
unit_test:
stage: test
image: node:20
rules:
- if: '$CI_COMMIT_TAG =~ /^sandbox-/'
before_script:
- corepack enable
- corepack prepare pnpm@8.14.1 --activate
- pnpm install --frozen-lockfile
script:
- pnpm --filter kream run test -- --reporter=default
build_project_sandbox:
stage: build
image: node:20
needs: ["unit_test"]
rules:
- if: '$CI_COMMIT_TAG =~ /^sandbox-/'
before_script:
- corepack enable
- corepack prepare pnpm@8.14.1 --activate
- pnpm install --frozen-lockfile --prod=false
script:
- pnpm -w build --filter kream
artifacts:
expire_in: 3 days
paths:
- project/.next/standalone
- project/.next/static
- project/public
deploy_project_sandbox:
stage: deploy
image: alpine:3.20
needs: ["build_project_sandbox"]
dependencies: ["build_project_sandbox"]
environment:
name: project_sandbox
rules:
- if: '$CI_COMMIT_TAG =~ /^project-/'
before_script:
- apk add --no-cache openssh-client rsync
- mkdir -p ~/.ssh && echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa
- ssh-keyscan -H "$DEPLOY_HOST" >> ~/.ssh/known_hosts
script:
- ssh $DEPLOY_USER@$DEPLOY_HOST "mkdir -p $DEPLOY_PATH/.next/standalone $DEPLOY_PATH/.next/static $DEPLOY_PATH/public"
- rsync -az --delete project/.next/standalone/ $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH/project/.next/standalone/
- rsync -az --delete project/.next/static/ $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH/project/.next/static/
- rsync -az --delete project/public/ $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH/project/public/
# 중앙 관리 에코시스템 파일 재로드
- ssh $DEPLOY_USER@$DEPLOY_HOST "pm2 reload /home/project/source/ecosystem.config.js --only project_sandbox || pm2 start /home/sdd_it/KREAM_Web/source/ecosystem.config.js --only project_sandbox"
docker-ce 설치 → 서비스 활성화 /srv/gitlab-runner/config, /var/run/docker.sock 마운트 docker, 기본 이미지=node:20 SSH_PRIVATE_KEY, DEPLOY_HOST, DEPLOY_USER, DEPLOY_PATH (scope=project_sandbox) output: 'standalone' project-sandbox 등록, pm2 reload --only project-sandbox git tag sandbox-YYYY.MM.DD-N → git push origin sandbox-YYYY.MM.DD-N pm2 status/logs, 포트 리슨(예: 4400), curl -I http://127.0.0.1:4400/ ecosystem.config.js vs DEPLOY_PATH 혼동 EADDRINUSE: 중복 기동 → scale 1/reload 전략 undefined 필터, 정적 경로 matcher 제외