젠킨스
네이버 클라우드 플랫폼에서 포트 열어주기

젠킨스 설치하기
docker run \\
--name jenkins_1 \\
-p 8081:8080 \\
-e TZ=Asia/Seoul \\
-v /docker_projects/jenkins_1/var/jenkins_home:/var/jenkins_home \\
-v /var/run/docker.sock:/var/run/docker.sock \\
-v /docker_projects/jenkins_1/data:/data \\
-u root \\
-d \\
--restart unless-stopped \\
jenkins/jenkins:lts
--name jenkins_1 : 컨테이너의 이름을 "jenkins_1"로 지정
-p 8081:8080 : 호스트의 8081 포트와 컨테이너의 8080 포트를 매핑
-e TZ=Asia/Seoul : 컨테이너 내부에서 사용할 타임존을 "Asia/Seoul"로 설정
-v docker_projects/jenkins_1/var/jenkins_home:/var/jenkins_home : 호스트의 /docker_projects/jenkins_1/var/jenkins_home 경로와 컨테이너의 /var/jenkins_home 경로를 볼륨 매핑 / Jenkins 설정과 데이터를 영구적으로 보관
-v /var/run/docker.sock:/var/run/docker.sock : 호스트의 Docker 소켓 파일(/var/run/docker.sock)을 컨테이너 내부의 동일한 경로에 바인드 (Docker 명령을 컨테이너에서 실행가능)
-v /docker_projects/jenkins_1/data:/data : 호스트의 /docker_projects/jenkins_1/data 경로와 컨테이너의 /data 경로를 볼륨 매핑 / Jenkins 작업 데이터를 영구적으로 보관
-u root: 컨테이너 내부에서 root 사용자로 실행
-d: 컨테이너를 백그라운드에서 실행 (데몬)
--restart unless-stopped : 컨테이너가 비정상적으로 종료되었을 때 자동으로 재시작
jenkins/jenkins:lts : 사용할 Docker 이미지를 jenkins/jenkins:lts로 지정
젠킨스 로그인
초기 비밀번호 확인
docker exec jenkins_1 cat /var/jenkins_home/secrets/initialAdminPassword


JDK Update
docker exec -it jenkins_1 bash
apt-get update
apt-get install openjdk-17-jdk -y
젠킨스 컨테이너 내에 Docker 설치
docker exec -it jenkins_1 bash
apt-get update -y
apt-get install -y ca-certificates curl gnupg lsb-release
mkdir -p /etc/apt/keyrings
rm /etc/apt/keyrings/docker.gpg
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install -y docker-ce docker-ce-cli docker-compose-plugin
apt-get update -y : 패키지 업데이트
apt-get install -y ca-certificates curl gnupg lsb-release : Docker 설치를 위해 종속성 패키지 설치
mkdir -p /etc/apt/keyrings : /etc/apt/keyrings 경로에 디렉토리를 생성 (APT 패키지 매니저의 키링(keyring) 파일을 저장하기 위한 공간)
rm /etc/apt/keyrings/docker.gpg : /etc/apt/keyrings/docker.gpg 파일을 삭제 (Docker의 공식 GPG 키를 저장하기 위한 용도)
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg : Docker의 공식 GPG 키를 다운로드하여 /etc/apt/keyrings/docker.gpg 파일로 저장(GPG 키는 APT가 Docker의 패키지를 신뢰할 수 있는지 확인하는 데 사용)
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null : Docker의 APT 저장소 정보를 /etc/apt/sources.list.d/docker.list 파일에 저장 (Docker 관련 패키지를 설치)
apt-get update : 패키지 업데이트
apt-get install -y docker-ce docker-ce-cli docker-compose-plugin : Docker와 Docker Engine 및 Docker Compose의 구성 요소 설치
젠킨스에서 Pipeline 생성

Credentials을 이용해 secret.yml 자동 업로드
- Credentials : 보안 관련 정보를 저장하고 관리하기 위한 기능
- 원격 Git 저장소에서 코드를 가져올 때 인증 정보를 사용하거나, 도커 레지스트리에 이미지를 푸시할 때 인증 정보를 사용

파이프 라인 작성

빌드 성공

Github Webhooks 설정

젠킨스 트리거 설정

자동배포 성공
Git push 트리거 생성

젠킨스 자동 빌드 실행

☠️ 배포 작업중 막혔던 내용
🤯 openjdk-17-jdk

JDK를 Doker에서는 설치를 해줘서 왜 안되지 하면서 계속 JDK 삭제하고 다시 설치하고, 또 환경변수 설정이 잘못됐나 확인하며 시간을 많이 보냈다.
😏 해결 방법
- 젠킨스에서 JDK를 사용하기 위해서는 설정을 해줘야 한다.
- 젠킨스 관리 페이지에 로그인합니다.
- 좌측 메뉴에서
"시스템 설정"을 선택합니다.
- JDK 섹션으로 스크롤하거나
"JDK installations..." 링크를 클릭합니다.
"Add JDK" 버튼을 클릭하여 새로운 JDK 설정을 추가합니다.
- JDK 설정 페이지에서 다음 정보를 입력합니다:
- "Name": JDK의 이름을 지정합니다. (예: JDK 11)
- "JAVA_HOME": JDK의 설치 경로를 입력합니다.
- 저장을 클릭하여 JDK 설정을 저장합니다

🤯 Docker Rm Fail

- 처음 빌드 할경우
Docker Rm은 정상 작동한다. 하지만 이후 Build Docker Images 에서 실패를 할경우 다시 재빌드를 하게 되면 이전에 Docker Rm에서 이미 이미지와 컨테이너가 삭제 되었기 때문에 삭제할게 없어서 에러가 발생한다.
😏 해결방안
- 수동으로 도커이미지와 도커컨테이너를 만들어주고 빌드를 돌린다.
- 파이프라인에서 도커이미지, 도커컨테이너가 있으면 삭제하고 없으면 넘어간다 라는 파이프라인 코드를 작성해 준다. (추후 도전예정)
🤯 Build Docker image

- 도커 이미지 빌드에서 오류가 났다. 분명 리눅스 환경에서는 명령어가 잘 수행하지만 빌드에서는 실패를 했다. 원인을 찾다보니
Dockerfile을 찾을수 없다고 한다. 하지만 분명 리눅스 환경에서 도커파일을 설치했는데 의문이 들었다. 그래서 도커파일을 못찾는 줄 알고 경로를 설정하거나 절대경로를 설정해도 원인을 찾을수 없었다.
😏 해결방안
- 깃 레포지터리에
Dockerfile을 따로 만들어 주어야 한다. 리눅스환경에 도커파일이 있으면 될줄 알았지만 아니였다. 파이프라인은 도커 -> 젠킨스 컨테이너 -> 젠킨스내부의 도커 에서 실행되기 떄문이다.
🤯 Githook

Payload URL 정보가 잘못됐다고 한다. 원인을 몰라서 http -> https도 바꿔보고 포트를 8080으로 바꿔보고 해봐도 되지않았다.
😏 해결방안
