젠킨스,도커를 사용해 지속적인 배포 진행하기

김준태·2023년 5월 15일
0

공부

목록 보기
7/10
post-thumbnail

젠킨스

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

젠킨스 설치하기

  • 열어 주었던 8081포트에 설치
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

# jenkins_1 컨테이너 내부로 들어가서 작업을 수행
docker exec -it jenkins_1 bash

# 패키지 관리자인 apt를 사용하여 패키지 목록을 최신 상태로 업데이트
apt-get update

# 컨테이너 내부에서 openjdk-17-jdk 패키지를 설치
apt-get install openjdk-17-jdk -y

젠킨스 컨테이너 내에 Docker 설치

# jenkins_1 bash 접속
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 키는 APTDocker의 패키지를 신뢰할 수 있는지 확인하는 데 사용)
  • 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 : DockerAPT 저장소 정보를 /etc/apt/sources.list.d/docker.list 파일에 저장 (Docker 관련 패키지를 설치)
  • apt-get update : 패키지 업데이트
  • apt-get install -y docker-ce docker-ce-cli docker-compose-plugin : DockerDocker EngineDocker Compose의 구성 요소 설치

젠킨스에서 Pipeline 생성

Credentials을 이용해 secret.yml 자동 업로드

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

파이프 라인 작성

빌드 성공

Github Webhooks 설정

젠킨스 트리거 설정

자동배포 성공

Git push 트리거 생성

젠킨스 자동 빌드 실행

☠️ 배포 작업중 막혔던 내용

🤯 openjdk-17-jdk

  • JDKDoker에서는 설치를 해줘서 왜 안되지 하면서 계속 JDK 삭제하고 다시 설치하고, 또 환경변수 설정이 잘못됐나 확인하며 시간을 많이 보냈다.

😏 해결 방법

  • 젠킨스에서 JDK를 사용하기 위해서는 설정을 해줘야 한다.
    1. 젠킨스 관리 페이지에 로그인합니다.
    2. 좌측 메뉴에서 "시스템 설정"을 선택합니다.
    3. JDK 섹션으로 스크롤하거나 "JDK installations..." 링크를 클릭합니다.
    4. "Add JDK" 버튼을 클릭하여 새로운 JDK 설정을 추가합니다.
    5. JDK 설정 페이지에서 다음 정보를 입력합니다:
    6. "Name": JDK의 이름을 지정합니다. (예: JDK 11)
    7. "JAVA_HOME": JDK의 설치 경로를 입력합니다.
    8. 저장을 클릭하여 JDK 설정을 저장합니다


🤯 Docker Rm Fail

  • 처음 빌드 할경우 Docker Rm은 정상 작동한다. 하지만 이후 Build Docker Images 에서 실패를 할경우 다시 재빌드를 하게 되면 이전에 Docker Rm에서 이미 이미지와 컨테이너가 삭제 되었기 때문에 삭제할게 없어서 에러가 발생한다.

😏 해결방안

  • 수동으로 도커이미지와 도커컨테이너를 만들어주고 빌드를 돌린다.
  • 파이프라인에서 도커이미지, 도커컨테이너가 있으면 삭제하고 없으면 넘어간다 라는 파이프라인 코드를 작성해 준다. (추후 도전예정)

🤯 Build Docker image

  • 도커 이미지 빌드에서 오류가 났다. 분명 리눅스 환경에서는 명령어가 잘 수행하지만 빌드에서는 실패를 했다. 원인을 찾다보니 Dockerfile을 찾을수 없다고 한다. 하지만 분명 리눅스 환경에서 도커파일을 설치했는데 의문이 들었다. 그래서 도커파일을 못찾는 줄 알고 경로를 설정하거나 절대경로를 설정해도 원인을 찾을수 없었다.

😏 해결방안

  • 깃 레포지터리에 Dockerfile을 따로 만들어 주어야 한다. 리눅스환경에 도커파일이 있으면 될줄 알았지만 아니였다. 파이프라인은 도커 -> 젠킨스 컨테이너 -> 젠킨스내부의 도커 에서 실행되기 떄문이다.

🤯 Githook

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

😏 해결방안

  • 수정예정

0개의 댓글