next.js 프로젝트
next.js app을 jenkins + harbor + docker 조합으로 ubuntu 서버에 배포 하는 설정입니다.
jenkins에 설정된 github branch에 머지 되면 jenkins에서 shell이 실행되도록 합니다.
next.js 앱을 빌드하고 도커 이미지로 빌드합니다.
1. Dockerfile 작성
docker 이미지로 빌드될 명령어
# 기본 이미지 설정
FROM node:18
# 작업 디렉토리 설정
WORKDIR /app
# 의존성 파일 복사
COPY package.json yarn.lock ./
# 의존성 설치
RUN yarn install --frozen-lockfile
# 애플리케이션 파일 복사
COPY . .
# Next.js 빌드
RUN yarn build
# 애플리케이션 실행
CMD ["yarn", "start"]
2. dockerbuild.sh 작성
jenkins에서 실행될 shell file입니다.
#!/bin/bash
TAG=$1
ENV=$2
DOCKER_IMAGE="nextjs-client"
# Harbor의 도메인과 프로젝트 이름을 설정합니다.
HARBOR_DOMAIN="harbor.com"
HARBOR_PROJECT="nextjs"
# Robot 계정 토큰을 설정합니다. 실제 토큰으로 교체해야 합니다.
ROBOT_TOKEN=""
ROBOT_NAME=""
# 로그인을 수행합니다.
docker login $HARBOR_DOMAIN -u $ROBOT_NAME -p $ROBOT_TOKEN
docker build -t $DOCKER_IMAGE:$TAG .
if [ $? -ne 0 ]; then
echo "Failed docker build"
exit 1
fi
docker tag $DOCKER_IMAGE:$TAG $HARBOR_DOMAIN/$HARBOR_PROJECT/$ENV:$TAG
docker push $HARBOR_DOMAIN/$HARBOR_PROJECT/$ENV:$TAG
if [ $? -ne 0 ]; then
echo "Failed docker push: ${DOCKER_IMAGE}"
exit 1
fi
# 로그아웃을 수행합니다.
docker logout $HARBOR_DOMAIN
1. jenkins shell에서 docker image tag와 환경(dev / stage / live)를 전달받습니다.
2. harbor 도메인 / 프로젝트 / 토큰을 입력합니다.
3. harbor 도메인으로 도커 로그인을 합니다. - 도커가 harbor에 연동된 도커 레지스트리로 등록 되도록
4. 도커 빌드를 실행
5. 빌드된 도커 이미지에 태그를 작성하고 푸시 합니다. ( 해당 규격은 harbor 규칙에 따름.)
6. 로그 아웃 후 종료
jenkins 서버에서 도커 이미지 빌드 후 harbor ( 도커레지스트리) 로 push 합니다.
원격서버에 shell file을 전송해서 harbor에서 docker image를 pull 받고 docker container를 실행하도록 합니다.
3. docker pull sh 작성
원격 서버에 복사해서 전송할 shell file 입니다.
#!/bin/bash
TAG=$1
ENV=$2
DOCKER_IMAGE="nextjs-client"
# Harbor의 도메인과 프로젝트 이름을 설정합니다.
HARBOR_DOMAIN="harbor.com"
HARBOR_PROJECT="nextjs"
# Robot 계정 토큰을 설정합니다. 실제 토큰으로 교체해야 합니다.
ROBOT_TOKEN=""
ROBOT_NAME=""
docker ps | grep $HARBOR_DOMAIN/$HARBOR_PROJECT/$ENV | awk '{print $1}' | xargs -r docker stop
docker ps | grep $HARBOR_DOMAIN/$HARBOR_PROJECT/$ENV | awk '{print $1}' | xargs -r docker rm
# 로그인을 수행합니다.
docker login $HARBOR_DOMAIN -u $ROBOT_NAME -p $ROBOT_TOKEN
docker pull $HARBOR_DOMAIN/$HARBOR_PROJECT/$ENV:$TAG
if [ $? -ne 0 ]; then
echo "Failed docker pull: ${DOCKER_IMAGE}"
exit 1
fi
docker run -d -p 3000:3000 $HARBOR_DOMAIN/$HARBOR_PROJECT/$ENV:$TAG
# 로그아웃을 수행합니다.
docker logout $HARBOR_DOMAIN
1. build sh 과 마찬가지로 harbor 도메인 입력
2. 현재 실행중인 도커 컨테이너 종료 및 삭제 합니다. - TAG는 젠킨스에서 임의로 전달받기 때문에 현재 실행중인 도커의 TAG를 알 수 없습니다. 때문에 위와 같이 이미지 이름으로 도커 컨테이너를 찾도록 했습니다.
3. harbor 로그인 후 앞서 빌드한 도커 이미지를 pull 받습니다.
4. 해당 도커 이미지를 서버 설정에 맞게 실행합니다.
원격서버에 docker를 실행해서 next.js 앱을 구동합니다.
2. jenkins에서 실행할 shell 작성
echo 'start nextjs dev deploy'
sudo sh ./dockerbuild.sh $BUILD_ID dev
echo 'complete nextjs dev deploy'
sudo scp -i ~/.ssh/key.pem ./dockerpull.sh 원격서버:/workspace/nextjs
sudo ssh -i ~/.ssh/key.pem 원격서버 /workspace/nextjs/dockerpull.sh $BUILD_ID dev
젠킨스에서 실행할 shell 입니다.
젠킨스 빌드ID를 환경변수로 전달해서 TAG로 지정하도록 설정했습니다.
추후 백업 기능 등을 작성할떄 TAG로 구분하도록 할 예정 입니다.
앞서 작성한 shell을 통해서
1. docker build
2. 배포할 원격 서버에 ssh로 dockerpull.sh shell 파일 전송
3. 젠킨스에서 환경변수 전달 및 해당 shell 파일 전송
여러번의 시행착오 끝 일단 배포는 되게 했습니다.
조금 더 낫거나 쉬운 방법이 있다면 알려주시면 감사합니다.
궁금한점은 댓글달면 답변 드리도록 하겠습니다.
'개발관련' 카테고리의 다른 글
how to vscode highlight HTML code syntax inside a string (0) | 2024.10.30 |
---|---|
도커 볼륨 마운트 -v,--volume 컨테이너 경로를 호스트 경로 링크 마운트 하는 방법 (0) | 2024.02.28 |
실무에 바로 써먹는 실용적인 도커 사용설명서 (0) | 2024.01.23 |
도커 CLI 실행 방법 도커 포트 설정 방법 (1) | 2024.01.21 |
Windows에서 개발 환경 세팅 하기 WSL 설치 및 사용법 (1) | 2023.10.30 |