stages:
예시 파이프라인 구조
image: node:20-alpine
stages:
- setup
- test
- build
- deploy
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- .npm/
- node_modules/
- .next/cache/
variables:
SERVER_USER: "ubuntu"
TEST_SERVER_HOST: "111.111.111.111"
RELEASE_SERVER_HOST: "111.111.111.111"
install_job:
stage: setup
only:
- dev
- main
script:
- echo "패키지 설치를 시작합니다..."
- npm ci --cache .npm --prefer-offline
- echo "패키지 설치 완료!"
lint_test_job:
stage: test
only:
- dev
- main
script:
- echo "코드 스타일 및 타입을 검사합니다..."
- npm run lint
- echo "검사 통과!"
build_job:
stage: build
only:
- dev
- main
script:
- echo "[Client] 빌드를 시작합니다..."
- rm -rf .next
- echo "빌드용 환경변수 파일 생성 중..."
- |
if [ "$CI_COMMIT_BRANCH" = "dev" ]; then
echo "NEXT_PUBLIC_API_BASE_URL=https://www.abc~" > .env.production
elif [ "$CI_COMMIT_BRANCH" = "main" ]; then
echo "NEXT_PUBLIC_API_BASE_URL=https://www.bcd~" > .env.production
else
echo "지원하지 않는 브랜치입니다: $CI_COMMIT_BRANCH"
exit 1
fi
- echo "NEXT_PUBLIC_NICE_CLIENT_KEY=${NEXT_PUBLIC_NICE_CLIENT_KEY}" >> .env.production
- echo "생성된 .env.production 확인"
- cat .env.production
- npm run build
- echo "파일 압축 중..."
- tar -czf deploy.tar.gz .next public package.json package-lock.json next.config.ts .env.production
artifacts:
paths:
- deploy.tar.gz
expire_in: 1 hour
deploy_test_job:
stage: deploy
only:
- dev
variables:
TARGET_DIR: "/home/ubuntu/"
dependencies:
- build_job
before_script:
- apk add --no-cache openssh-client sshpass
script:
- echo "테스트 서버로 전송 중 (${TEST_SERVER_HOST})..."
- sshpass -p "$TEST_SERVER_PASSWORD" scp -o StrictHostKeyChecking=no deploy.tar.gz ${SERVER_USER}@${TEST_SERVER_HOST}:${TARGET_DIR}
- echo "테스트 서버에서 압축 해제 및 배포 실행..."
- |
sshpass -p "$TEST_SERVER_PASSWORD" ssh -o StrictHostKeyChecking=no ${SERVER_USER}@${TEST_SERVER_HOST} << EOF
cd ${TARGET_DIR}
echo "기존 파일 삭제 중..."
rm -rf .next public
echo "압축 해제 중..."
tar -xzf deploy.tar.gz
echo "압축 파일 삭제..."
rm -f deploy.tar.gz
echo "현재 서버 파일 목록:"
ls -al
echo "deploy.sh 확인:"
ls -al deploy.sh || true
echo "배포 스크립트 실행..."
bash -l deploy.sh
EOF
- echo "[Client] 테스트 서버 배포가 완료되었습니다!"
deploy_release_job:
stage: deploy
only:
- main
variables:
TARGET_DIR: "/home/ubuntu/"
dependencies:
- build_job
before_script:
- apk add --no-cache openssh-client
- mkdir -p ~/.ssh
- cp "$AWS_SSH_KEY" ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ssh-keyscan -H "${RELEASE_SERVER_HOST}" >> ~/.ssh/known_hosts
script:
- echo "릴리즈 서버로 전송 중 (${RELEASE_SERVER_HOST})..."
- scp -o StrictHostKeyChecking=no deploy.tar.gz ${SERVER_USER}@${RELEASE_SERVER_HOST}:${TARGET_DIR}
- echo "릴리즈 서버에서 압축 해제 및 배포 실행..."
- |
ssh -o StrictHostKeyChecking=no ${SERVER_USER}@${RELEASE_SERVER_HOST} << EOF
cd ${TARGET_DIR}
echo "기존 파일 삭제 중..."
rm -rf .next public
echo "압축 해제 중..."
tar -xzf deploy.tar.gz
echo "압축 파일 삭제..."
rm -f deploy.tar.gz
echo "현재 서버 파일 목록:"
ls -al
echo "deploy.sh 확인:"
ls -al deploy.sh || true
echo "배포 스크립트 실행..."
bash -l deploy.sh
EOF
- echo "[Client] 릴리즈 서버 배포가 완료되었습니다!"
- |
if [ "$CI_COMMIT_BRANCH" = "dev" ]; then
echo "NEXT_PUBLIC_API_BASE_URL=https://www.abc~" > .env.production
echo "NEXT_PUBLIC_BASE_PATH=/경로" >> .env.production
elif [ "$CI_COMMIT_BRANCH" = "main" ]; then
echo "NEXT_PUBLIC_API_BASE_URL=https://www.bcd~" > .env.production
else
echo "지원하지 않는 브랜치입니다: $CI_COMMIT_BRANCH"
exit 1
fi
=> dev 브랜치에서만 .env.production에 NEXT_PUBLIC_BASE_PATH=/경로 를 추가함
import type { NextConfig } from "next";
const basePath = process.env.NEXT_PUBLIC_BASE_PATH || "";
const nextConfig: NextConfig = {
basePath,
};
export default nextConfig;