posts

jenkins

Oct 1, 2025 updated Oct 1, 2025 adminawsdeploymentdockerjenkins

// 젠킨스 폴더 생성 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: pw:

                                                                                                    

http://:8088

아이디: h9admin 비밀번호:

  1. 전체 구성 개요

1.	EC2 (Next.js)
	•	Docker 및 docker-compose 설치
	•	Next.js 컨테이너를 구동할 서버
2.	EC2 (Jenkins)
	•	CI/CD 빌드 서버
	•	Jenkins를 어떻게 설치할지(도커 vs 수동) 결정
3.	S3 + CloudFront
	•	React SPA 정적 파일 업로드
	•	CloudFront로 CDN 및 HTTPS 지원
  1. 단계별 구성

    2.1 AWS EC2 생성 (Next.js 배포용)

    1. 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 용)

    1. 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 접속 → 초기 설정 진행

    1. 수동으로 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 구축

  1. Jenkins 초기 설정 • :8080으로 접속 → Admin password(로그에 출력) → 플러그인 설치 • 관리자 계정 생성 • 필수 플러그인: SSH, AWS CLI, Git, Pipeline, Docker 관련 플러그인 등
  2. 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 등 접근 가능
  3. 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)

  1. S3 버킷 생성 • 예: my-react-dev-bucket, my-react-stage-bucket, my-react-prod-bucket • 정적 웹사이트 호스팅 옵션 사용(필요하면)
  2. 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 "/*"
                """
            }
        }
    }
}

}

  1. “Jenkins를 도커로 설치 vs 수동 설치” 차이
    1. Docker로 Jenkins 설치 • Jenkins를 컨테이너로 관리 • 업그레이드나 옮길 때, Docker 이미지를 pull & run하면 되므로 이식성 높음 • Jenkins 설정(플러그인, job history 등)이 /var/jenkins_home 볼륨에 영속화 • 여러 플러그인이 필요한 경우, 도커 이미지에 미리 설치 스크립트를 넣어 자동화 가능
    2. 수동(패키지) 설치 • Jenkins를 OS 레벨에서 직접 설치(yum install jenkins 등) • 서버가 부팅되면 Jenkins가 자동 구동 (systemctl) • 설치가 직관적이고, OS에서 관리가 익숙한 경우 편리 • 도커보다는 “전통적인 방식”

둘 중 성능이나 기능 차이는 크게 없습니다. • 도커: “인프라를 코드로” 관리하고 싶을 때 선호 • 수동: 간단히 “yum install”로 끝내고 싶을 때

  1. 흐름 요약

아래는 단계별 흐름을 텍스트로 간단히 정리:

  1. AWS EC2 생성 (Next.js 서버용)

    • Docker & docker-compose 설치
    • Next.js 프로젝트(도커파일, 컴포즈파일 존재)를 배치
  2. AWS EC2 생성 (Jenkins 용)

    • 도커 설치 후 Jenkins를 도커로 구동 (or 수동으로 jenkins 설치)
    • 포트 8080/22 열기
    • Jenkins 초기 설정, AWS CLI 자격 설정, SSH 키 등록
  3. S3 버킷 & CloudFront

    • S3: dev/stage/prod 용 버킷 or 폴더
    • CloudFront 설정 (배포ID, 인증서, etc.)
  4. Jenkins 파이프라인 구성

    • Next.js 파이프라인: Docker 빌드 → EC2(Next.js) SSH → docker-compose up -d
    • React 파이프라인: npm run build → aws s3 sync → cloudfront create-invalidation
  5. 실제 동작

    • dev, stage, prod 브랜치에 push
    • Jenkins가 자동으로 빌드 & 배포
    • Next.js는 EC2에 컨테이너로 띄워지고
    • React는 S3+CloudFront로 정적 파일 배포
  1. 결론 및 요약
    1. EC2(Next.js), EC2(Jenkins), **S3+CloudFront(React)**로 나누는 구성은 문제 없이 동작 가능.
    2. Jenkins를 Docker로 설치할지, OS에 직접 설치할지는 운영 편의에 따라 결정. 성능이나 기능 차이는 크지 않음.
    3. Next.js는 SSR이므로 Docker Compose로 서버 실행(포트 3000 등)
    4. React는 정적 파일이므로 빌드 결과를 S3에 업로드, CloudFront로 CDN.
    5. 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로 배포하는 스크립트를 잘 작성하는 것입니다.