jenkins
// 젠킨스 폴더 생성 mkdir ~/jenkins
// 설정 파일 생성 touch docker-compose.yml
version: "3.8"
services:
jenkins:
image: jenkins/jenkins:lts
container_name: jenkins
ports:
- "8080:8080"
- "50000:50000"
volumes:
- jenkins_data:/var/jenkins_home
# 환경 변수가 필요하면 여기에 추가 (예: TZ 등)
volumes:
jenkins_data:
@ 오류 error getting credentials - err: exec: "docker-credential-desktop": executable file not found in $PATH, out: ``
// 설정 변경 nano ~/.docker/config.json
{
"auths": {
"https://index.docker.io/v1/": {}
},
"credsStore": "desktop" // 라인 삭제
}
id:
http://
아이디: h9admin
비밀번호:
- 전체 구성 개요

1. EC2 (Next.js)
• Docker 및 docker-compose 설치
• Next.js 컨테이너를 구동할 서버
2. EC2 (Jenkins)
• CI/CD 빌드 서버
• Jenkins를 어떻게 설치할지(도커 vs 수동) 결정
3. S3 + CloudFront
• React SPA 정적 파일 업로드
• CloudFront로 CDN 및 HTTPS 지원
단계별 구성
2.1 AWS EC2 생성 (Next.js 배포용)
- EC2 생성
• 예: Amazon Linux 2 (t2.micro 등) • 키 페어, 보안 그룹 설정 (포트 22, 80, 443, 3000 등 필요에 따라 열기)
2. EC2에 Docker & docker-compose 설치 • Amazon Linux 2 예시: # 1) 패키지 업데이트 sudo yum update -y # 2) Docker 설치 sudo yum install docker -y # 3) Docker 데몬 시작 & 부팅 시 자동 실행 sudo service docker start sudo systemctl enable docker # 4) docker-compose 설치 (GitHub 릴리스 파일 이용) sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" \ -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose # 5) ec2-user를 docker 그룹에 추가 (선택) sudo usermod -aG docker ec2-user • 이후 logout → login하면 ec2-user가 docker 명령을 직접 실행 가능 3. Next.js 프로젝트 배치 • 예: /home/ec2-user/next-project 디렉토리 생성 • Git Clone(접근 권한 필요) or ZIP 업로드 등 4. Next.js 프로젝트 안에 Dockerfile, docker-compose.yml 준비 • 이후 Jenkins가 SSH로 접속해 docker-compose up -d할 예정2.2 AWS EC2 생성 (CI/CD Jenkins 용)
- EC2 생성
• Amazon Linux 2 (t2.micro 등). Jenkins 요구사항에 따라 스펙 조정 • 키 페어, 보안 그룹 (포트 22, 8080, 8081, etc. Jenkins 접근용) 2. Jenkins 설치 방법 • 옵션 A: 도커로 Jenkins 설치 (docker-compose 이용 가능) • 옵션 B: 수동 설치 (WAR 파일, yum repository 등) 3. 도커로 Jenkins 설치 (옵션 A) • 장점: Jenkins 환경(플러그인, 버전) 전부 컨테이너로 관리 → 업데이트, 이식 편리 • 단점: 도커볼륨 구성, 컨테이너 재시작 시 Jenkins 데이터 영속화에 유의
예시:
(EC2 - Jenkins용)
sudo yum update -y sudo yum install docker -y sudo service docker start sudo systemctl enable docker
docker-compose 설치는 동일
docker-compose.yml (Jenkins)
version: '3.8' services: jenkins: image: jenkins/jenkins:lts container_name: jenkins ports:
"8080:8080"
"50000:50000" # For Jenkins agent volumes:
jenkins_home:/var/jenkins_home restart: unless-stopped volumes: jenkins_home:
• docker-compose up -d → Jenkins가 8080 포트에서 실행 • 웹 브라우저로
:8080 접속 → 초기 설정 진행 - 수동으로 Jenkins 설치 (옵션 B)
• Jenkins 공식 문서에 따르면, Amazon Linux 2용 repo를 추가하고 yum install 가능 • sudo yum install java-1.8.0-openjdk -y (자바 필요) • sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo • sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key • sudo yum install jenkins -y • sudo service jenkins start • 브라우저로
:8080 접속
두 방법 중 어느 쪽을 골라도 기능상 문제는 없습니다. • 도커 설치: Jenkins 환경을 쉽게 버전 업/다운, 옮길 수 있음. • 수동 설치: 설정이 직관적, Jenkins 디렉토리 /var/lib/jenkins 등에 저장.
2.3 Jenkins 설정 & CI/CD 구축
- Jenkins 초기 설정
•
:8080으로 접속 → Admin password(로그에 출력) → 플러그인 설치 • 관리자 계정 생성 • 필수 플러그인: SSH, AWS CLI, Git, Pipeline, Docker 관련 플러그인 등 - AWS CLI 자격 증명 • Jenkins에서 aws s3 sync / cloudfront create-invalidation / EC2 SSH 등을 하기 위해 AWS Credential 설정 필요 • 방법1) Access Key / Secret Key를 Jenkins에 Credential로 등록 → 파이프라인에서 사용 • 방법2) Jenkins EC2에 IAM Role 부여(권장) → EC2 인스턴스 역할로 S3, CloudFront 등 접근 가능
- SSH Credentials • Next.js 배포 EC2로 SSH 접속하기 위해, Jenkins에 SSH key 등록 • Jenkins → “Manage Credentials” → “Add Credentials” → “SSH username with private key” • 파이프라인에서 sshagent 블록으로 활용
2.4 S3 + CloudFront 설정 (React SPA)
- S3 버킷 생성 • 예: my-react-dev-bucket, my-react-stage-bucket, my-react-prod-bucket • 정적 웹사이트 호스팅 옵션 사용(필요하면)
- CloudFront 생성 • Origin: S3 버킷 • 배포 설정: OAI(Origin Access Identity) 설정, HTTPS 인증서(ACM) 등 • 도메인 연결 시 Route53에서 CNAME 레코드 설정
결국 React 빌드 산출물을 aws s3 sync → S3에 업로드, CloudFront 통해 배포.
2.5 Next.js CI/CD: Jenkins → EC2 배포
2.5.1 Next.js 프로젝트 내 파일 구조
next-project/ ┣ docker-compose.yml ┣ Dockerfile ┣ .env.dev ┣ .env.stage ┣ .env.production ┣ package.json ┗ (소스들...)
2.5.2 Jenkins 파이프라인 예시 (Next.js)
pipeline { agent any
stages {
stage('Checkout') {
steps {
// Git repo에서 소스 받기
checkout scm
}
}
stage('Set Environment') {
steps {
script {
if (env.BRANCH_NAME == 'dev') {
env.ENV_FILE = '.env.dev'
} else if (env.BRANCH_NAME == 'stage') {
env.ENV_FILE = '.env.stage'
} else {
env.ENV_FILE = '.env.production'
}
}
}
}
stage('Build Docker Image') {
steps {
script {
// 로컬에서 빌드 후, Docker image를 레지스트리에 Push할 수도 있고,
// 또는 EC2에서 직접 빌드할 수도 있음.
// 여기서는 Jenkins 서버에서 빌드하는 예시
sh """
cd next-project
docker-compose build --build-arg ENV_FILE=${ENV_FILE}
"""
}
}
}
stage('Deploy to NextJS EC2') {
steps {
// SSH Credentials를 이용해 EC2로 접속
sshagent(credentials: ['NEXTJS_EC2_SSH']) {
sh """
ssh -o StrictHostKeyChecking=no ec2-user@<NEXTJS_EC2_IP> 'bash -s' << 'ENDSSH'
cd /home/ec2-user/next-project
git pull origin ${env.BRANCH_NAME} || true
docker-compose down || true
docker-compose up -d --build
ENDSSH
"""
}
}
}
}
}
주석 설명 • Build Docker Image: Jenkins에서 docker-compose build를 수행 (단, Jenkins EC2가 Docker를 사용할 수 있어야 함) • Deploy to NextJS EC2: • EC2에 SSH 접속 → docker-compose up -d --build • 이때, EC2에도 똑같은 docker-compose.yml, Dockerfile이 있어야 함(혹은 Git pull) • 실제론 “어디서 Docker 이미지를 빌드할지” 전략 필요: • Jenkins에서 빌드 + ECR Push → Next.js EC2에서 Pull • Next.js EC2에서 직접 빌드(ssh로 명령)
2.6 React CI/CD: Jenkins → S3 + CloudFront
2.6.1 React 프로젝트 파일 구조 (간단)
react-admin/ ┣ package.json ┣ public/ ┣ src/ ┣ .env.dev ┣ .env.stage ┣ .env.production ┗ ...
(만약 Docker로 빌드하고 싶다면 Dockerfile을 두어도 되지만, 여기서는 굳이 필요 없음)
2.6.2 Jenkins 파이프라인 예시 (React)
pipeline { agent any
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Set Environment') {
steps {
script {
if (env.BRANCH_NAME == 'dev') {
env.ENV_FILE = '.env.dev'
env.S3_BUCKET = 'my-react-dev-bucket'
} else if (env.BRANCH_NAME == 'stage') {
env.ENV_FILE = '.env.stage'
env.S3_BUCKET = 'my-react-stage-bucket'
} else {
env.ENV_FILE = '.env.production'
env.S3_BUCKET = 'my-react-prod-bucket'
}
}
}
}
stage('Install & Build') {
steps {
script {
sh """
cd react-admin
cp ${ENV_FILE} .env # CRA 기준
npm install
npm run build
"""
}
}
}
stage('Upload to S3') {
steps {
script {
// build 폴더(CRA 기준)를 S3에 업로드
sh """
aws s3 sync react-admin/build s3://${S3_BUCKET} --delete
"""
}
}
}
stage('CloudFront Invalidation') {
when {
expression { env.BRANCH_NAME == 'production' }
}
steps {
script {
sh """
aws cloudfront create-invalidation --distribution-id YOUR_CF_DIST_ID --paths "/*"
"""
}
}
}
}
}
- “Jenkins를 도커로 설치 vs 수동 설치” 차이
- Docker로 Jenkins 설치 • Jenkins를 컨테이너로 관리 • 업그레이드나 옮길 때, Docker 이미지를 pull & run하면 되므로 이식성 높음 • Jenkins 설정(플러그인, job history 등)이 /var/jenkins_home 볼륨에 영속화 • 여러 플러그인이 필요한 경우, 도커 이미지에 미리 설치 스크립트를 넣어 자동화 가능
- 수동(패키지) 설치 • Jenkins를 OS 레벨에서 직접 설치(yum install jenkins 등) • 서버가 부팅되면 Jenkins가 자동 구동 (systemctl) • 설치가 직관적이고, OS에서 관리가 익숙한 경우 편리 • 도커보다는 “전통적인 방식”
둘 중 성능이나 기능 차이는 크게 없습니다. • 도커: “인프라를 코드로” 관리하고 싶을 때 선호 • 수동: 간단히 “yum install”로 끝내고 싶을 때
- 흐름 요약
아래는 단계별 흐름을 텍스트로 간단히 정리:
AWS EC2 생성 (Next.js 서버용)
- Docker & docker-compose 설치
- Next.js 프로젝트(도커파일, 컴포즈파일 존재)를 배치
AWS EC2 생성 (Jenkins 용)
- 도커 설치 후 Jenkins를 도커로 구동 (or 수동으로 jenkins 설치)
- 포트 8080/22 열기
- Jenkins 초기 설정, AWS CLI 자격 설정, SSH 키 등록
S3 버킷 & CloudFront
- S3: dev/stage/prod 용 버킷 or 폴더
- CloudFront 설정 (배포ID, 인증서, etc.)
Jenkins 파이프라인 구성
- Next.js 파이프라인: Docker 빌드 → EC2(Next.js) SSH → docker-compose up -d
- React 파이프라인: npm run build → aws s3 sync → cloudfront create-invalidation
실제 동작
- dev, stage, prod 브랜치에 push
- Jenkins가 자동으로 빌드 & 배포
- Next.js는 EC2에 컨테이너로 띄워지고
- React는 S3+CloudFront로 정적 파일 배포
- 결론 및 요약
- EC2(Next.js), EC2(Jenkins), **S3+CloudFront(React)**로 나누는 구성은 문제 없이 동작 가능.
- Jenkins를 Docker로 설치할지, OS에 직접 설치할지는 운영 편의에 따라 결정. 성능이나 기능 차이는 크지 않음.
- Next.js는 SSR이므로 Docker Compose로 서버 실행(포트 3000 등)
- React는 정적 파일이므로 빌드 결과를 S3에 업로드, CloudFront로 CDN.
- CI/CD 파이프라인: • push → Jenkins → (Next.js: docker-compose up on EC2) & (React: s3 sync)
아래는 흐름을 간단히 표현한 Mermaid 다이어그램입니다:
flowchart LR
A((Developer)) -->|git push| B[Git Repository
(dev/stage/prod)]
B -->|Webhook or Polling| C[Jenkins CI/CD EC2]
subgraph Next.js
C -->|Docker build| D[(Jenkins)]
D -->|SSH Deploy| E[Next.js EC2<br>docker-compose up -d]
end
subgraph React SPA
C -->|npm run build| F[(Jenkins)]
F -->|aws s3 sync| G[S3 Bucket]
G -->|CloudFront Invalidate| H[CloudFront]
end
E -->|SSR Available| I((User))
H -->|SPA Available| I((User))
정리하자면, • EC2(Next.js) vs **EC2(Jenkins)**로 분리해도 전혀 문제 없으며, • Jenkins를 Docker로 설치하든 수동으로 설치하든 큰 문제는 없다. • 핵심은 CI/CD 파이프라인에서 Next.js를 Docker Compose로 배포하고, React를 S3+CloudFront로 배포하는 스크립트를 잘 작성하는 것입니다.