Jenkins 구축 과정을 정리하였다.
AWS 아키텍처

본 프로젝트에서는 Jenkins EC2가 프라이빗 서브넷에 위치해 있어 외부에서 직접 접근할 수 없다.
따라서 퍼블릭 서브넷에 위치한 Bastion Host를 경유하여 Jenkins에 접근하였다.
Jenkins Web UI(8080)는 SSH 포트 포워딩 방식으로 접근한다.
1. 키 페어 권한 설정
키 페어가 존재하는 경로로 이동해 아래 명령어로 권한을 설정한다.
SSH는 개인 키 파일이 과도한 권한을 가지고 있으면 보안 위험으로 판단하여 접속을 거부하기 때문에 권한 제한은 필수적이다.
cmod 400 Bastion_키 페어.pem
chmod 파일의 접근 권한을 변경하는 명령어
4000 소유자만 읽기 권한을 가짐, 그룹 및 기타 사용자에게는 모든 권한 제거
2. Jenkins EC2 키를 Bastion Host로 전송
로컬PC에서는 Jenkins EC2에 직접 접근이 불가능하기 때문에, Jenkins 접속에 필요한 키 파일을 Bastion Host로 전달한다.
scp -i Bastion_키 페어.pem Jenkins_키 페어.pem ec2-user@Bastion_IP:/home/ec2-user/
scp SSH 기반의 파이 전송 명령어
-i Bastion_키 페어.pem Bastion Host 접속 시 사용되는 키 페어
Jenkins_키 페어.pem Jenkins EC2 접속용 키
ec2-user@Bastion_IP 파일을 전송할 Bastion Host
/Home/ec2-user/ Bastion Host 내 파일이 저장될 경로
3. Bastion Host 접속
ssh -i Bastion_키페어.pem ec2 user@Bastion_IP
ssh 원격 서버에 안전하게 접속하기 위한 명령어

4. Jnekins EC2 접속
ssh -i Jenkins_키 페어.pem ec2-user@Jenkins_IP
ec2-user Amazon Linux 기반 EC2의 기본 사용자 계정
Jenkins_IP Jenkins EC2 인스턴스의 IP 주소

Jenkins 설치 및 실행 (Docker 기반)
본 프로젝트에서는 Jenkins를 EC2에 직접 설치하지 않고, Docker 컨테이너 형태로 실행하였다.
1. Jenkins 서버에서 Docker 설치
Jenkins 컨테이너 실행을 위해, Jenkins 서버(EC2)에 Docker를 설치한다.
Jenkins EC2 인스턴스 내에서 아래 명령어를 실행한다. (개별적으로 넣어도 되고 한 번에 다 넣어도 됨)
sudo yum update -y # 시스템 패키지 정보를 최신 상태로 업데이트
sudo dnf install docker -y # Docker 설치
sudo systemctl enable docker # EC2 재부팅 시 Docker 자동으로 실행되도록 설정
sudo systemctl start docker # Docker 데몬 즉시 실행
sudo usermod -aG docker ec2-user # ec2-user를 docker 그룹에 추가 (sudo 없이 Docker 명령어 사용 가능, SSH 재접속 필요)
docker --version # Docker 정상 설치 여부 확인
2. Docker Compose 설치
# Docker Compose 바이너리 다운로드
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 실행 권한 부여
sudo chmod +x /usr/local/bin/docker-compose
# Docker Compose 설치 확인
docker-compose version
3. Jenkins Dockerfile 작성
Jenkins 실행에 필요한 도구(Docker CLI, Maven)를 포함한 커스텀 Jenkins 이미지를 생성한다.
mkdir -p ~/jenkins-docker # Jenkins Docker 관련 파일을 관리할 디렉토리 생성
cd ~/jenkins-docker
cat <<'EOF' > Dockerfile # Dockerfile 생성
# Dockerfile
FROM jenkins/jenkins:lts # Jenkins 공식 LTS(Long Term Support) 이미지
USER root # root 권한으로 전환 (패키지 설치 목적)
# Docker CLI & Maven 설치
RUN apt-get update && \
apt-get install -y apt-transport-https ca-certificates curl gnupg2 lsb-release git && \
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
https://download.docker.com/linux/debian $(lsb_release -cs) stable" \
> /etc/apt/sources.list.d/docker.list && \
apt-get update && apt-get install -y docker-ce-cli maven && \
apt-get clean && rm -rf /var/lib/apt/lists/*
USER jenkins # 일반 사용자로 복귀
EXPOSE 8080 # Jenkins Web UI 포트
EOF
4. Jenkins 이미지 빌드 및 데이터 디렉토리 생성
# Dockerfile 기반 Jenkins 커스텀 이미지 생성 (my-jenkins:custom)
docker build -t my-jenkins:custom .
# Jenkins 데이터 디렉토리 생성
mkdir -p ~/jenkins_home
sudo chown -R 1000:1000 ~/jenkins_home
5. Jenkins 컨테이너 실행
docker run -d \
--name jenkins \ # 컨테이너 이름 지정 (jenkins)
-p 8080:8080 -p 50000:50000 \ # Jenkins Web UI 포트
-v ~/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
--restart unless-stopped \ # 서버 재부팅 시 Jenkins 자동 실행
my-jenkins:custom
7. Jenkins 초기 비밀번호 확인
Jenkins 최초 접속 시 필요한 관리자 초기 비밀번호를 출력해 확인한다.
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
8. Jenkins Web UI 접속
브라우저에서 아래 주소로 접속한다.
http://Public_EC2_IP:8080
초기 비밀번호 입력 후 Jenkins 설정을 완료하면 CI/CD 파이프라인 구성이 가능하다.

