
환경
ec2 : ubuntu 20.0.4 lts
gradle : 7.6.1
docker : 24.0.2
생성한 Ec2에 docker 를 설치한후
docker pull jenkins/jenkins:lts-jdk11
젠킨스 이미지를 다운 받아 줍니다.
도커 컨테이너 안에서 젠킨스가 도커 명령어를 쓰기 위해서는 몇가지 추가 설정이 필요합니다.
현재 jenkins lts 버전들이 debina 11로 변경되면서 아래 링크와같이 jenkins에서 추가 설치가 필요합니다.
https://www.vultr.com/docs/how-to-install-docker-ce-on-debian-11/
편한 설치를 위해 도커 파일을 만들어 줍니다.
vim Dockerfile
FROM jenkins/jenkins:lts-jdk11
USER root
RUN apt update && \
apt -y upgrade && \
apt update && \
apt install apt-transport-https lsb-release ca-certificates curl gnupg -y && \
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" | tee /etc/apt/sources.list.d/docker.list > /dev/null && \
apt update && \
apt -y install docker-ce docker-ce-cli containerd.io && \
apt update
RUN groupadd -f docker
RUN usermod -aG docker jenkins
docker 명령어를 사용하려면 sudo를 쓰거나 루트 관리자로 들어가야 하므로
새로운 그룹을 생성해주고 jenkins를 그룹에 포함시킵니다.
groupadd -f docker
//jenkins를 위한 docker 그룹 생성
usermod -aG docker jenkins
//그룹에 유저 추가
이미지를 생성후 컨테이너를 통해 실행 시킵니다.
이때 jenkins에서 docker를 실행시키기 위해 docker의 소켓을 컨테이너와 마운팅합니다.
docker build -t jen:V1 .
//빌드를 통해 이미지를 생성합니다.
chmod 666 /var/run/docker.sock
//docker 명령어를 jenkins가 쓸수 있도록 해당 디렉토리에 권한을 부여합니다.
docker volume create jenkins-volume
//볼륨을 생성하여 jenkins의 데이터를 마운팅
docker run -d \
-p 8000:8080 \
-p 50000:50000 \
-v jenkins-volume:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
--name jen \
jen:V1
-d 백그라운드 실행
-p 포트
-v 볼륨 마운팅
--name 컨테이너 이름 지정
주소:8000 접속

docker logs jen
// 비번 확인
docker exec -it jen bash
//젠킨스 컨테이너 직접 접속
cat /var/lib/jenkins/secrets/initialAdminPassword
//비번 출력
원하시는 선택지를 고르시고 회원가입을 완료합니다. 저는 왼쪽을 선택했습니다.

3가지의 플러그인을 추가로 설치해줍니다.
jenkins 관리 → 플러그인

설치가능한 플러그인

설치할 목록은 아래와 같습니다.
자신의 github , dockerhub에 인증 정보를 추가해줍니다.

이때 깃허브의 비밀번호는 settings → devloper settings → personal access tokens
없다면 생성 해주시면 됩니다. (*만드신후 반드시 기록 해주세요 재확인 불가 )

API 서버 접속을 위한 ec2 인증키 작성
key 값에 API EC2에 접속할때 썻던 .pem 과 같은 인증키를 처음부터 끝까지 복사해서 넣으시면 됩니다.

새로운 아이템 → 파이프라인 → ok

트리거 설정

scm → git
레포지터리 url 입력후 아까 작성한 인증키를 선택

원하는 브런치 선택
돌아와서 스프링 프로젝트의 Dockerfile
임시 방편으로 db정보를 넣어주었습니다.
FROM openjdk:11
ARG JAR_FILE=./build/libs/TEST-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
COPY src/main/resources/application.yml /config/application.yml
ENTRYPOINT ["java","-jar","/app.jar","--spring.config.location=/config/"]
대망의 파이프라인 스크립트 작성
script path에 정한 이름과 같이 파일을 생성후 dockerfile과 함께 프로젝트 상단에 위치
pipeline {
agent any
environment {
imagename = "도커허브아이디/레포지터리명"
tag = "태그명"
registryCredential = '도커허브 인증키(이전에 등록했던)'
dockerImage = ''
}
stages {
stage('Bulid Gradle') {
steps {
echo 'Build Gradle'
sh """
./gradlew clean build
"""
}
post {
failure {
error 'This pipeline stops here...'
}
}
}
stage('Bulid Docker') {
steps {
echo 'Build Docker'
script {
dockerImage = docker.build imagename
}
}
post {
failure {
error 'This pipeline stops here...'
}
}
}
stage('Push Docker') {
steps {
echo 'Push Docker'
script {
docker.withRegistry('', registryCredential) {
dockerImage.push tag
}
}
}
post {
failure {
error 'This pipeline stops here...'
}
}
}
stage('SSH SERVER EC2') {
steps {
echo 'SSH'
sshagent (credentials: ['ec2 인증키']) {
sh """
ssh -o StrictHostKeyChecking=no 계정이름@주소 '
docker stop \$(docker ps -a -q) || true
docker rm \$(docker ps -a -q) || true
docker rmi \$(docker images -q) || true
docker pull ${imagename}:${tag}
docker run -d -p 9000:9000 -p 50000:50000 --name api ${imagename}:${tag}
'
"""
}
}
}
}
}
이후 빌드로 모두 초록불이 들어온다면 성공 ..
역시 제 멘토십니다