-
[SpringBoot + Docker + Jenkins + GitLab Webhook] Docker 환경에서 Jenkins 설치 GitLab Webhook 연동, Jenkins 내부에 Docker 설치하여 이미지 빌드하기프로젝트 노트 2024. 8. 19. 10:50
이번에 기존에 운용중에 있었던 Jenkins 컨테이너 서버에 추가로 배포 파이프라인을 만들면서 Docker Image Build를 하려고 했습니다.
근데 Jenkins가 깔려있는 컨테이너에서 Docker 설치를 거부하더군요..
'docker open /certs/client/ca.pem: no such file or directory' 와 같이 pem키 이슈도 발생하고..Docker를 실행하기 위해 systemctl 명령어로 Docker를 실행시켜봐도 감감무소식..
재설치를 해봐도 Docker가 설치되어있다고는 하는데 그 어디에도 Docker는 실행되고 있지 않는 참으로 환장할 이슈가 발생했습니다.
기존 Jenkins 컨테이너는 Docker Image 빌드 없이 War를 만들어 ssh로 전달해주는 방식을 적용하고 있었기에 Docker에 대한 이슈가 별도로 존재하지 않았던 것이죠.
더 이상 지체할 수가 없어서 부랴부랴 새로운 서버에 Jenkins를 다시 세팅하기 시작했습니다.
docker-compose.yml을 아래와 같이 구성합니다.
jenkins는 lts버전을 사용하며 포트는 8888번으로 접속하기 위해 포워딩을 8888:8080으로 만들어줍니다.
# docker-compose.yml version: '3.7' services: jenkins: image: jenkins/jenkins:lts container_name: jenkins user: root ports: - 8888:8080 - 50000:50000 container_name: jenkins volumes: - ./jenkins_home:/var/jenkins_home - //var/run/docker.sock:/var/run/docker.sock privileged: true restart: always
privileged를 true로 주면서 호스트 서버로의 시스템 자원 접근 권한을 부여해줍니다.
(기존 Jenkins서버에선 이 설정이 빠져있었던...)컨테이너를 띄우고 Jenkins Admin에 로그인을 합니다. 초기 비밀번호는 파일 내부에서 확인이 가능합니다.
cat /var/jenkins_home/secrets/initialAdminPassword
참고로 secrets는 root 계정으로만 접근이 가능합니다.
그리고 초기 설정에서 'Install suggested plugins' 를 선택해주면 알아서 Jenkins 설정이 진행됩니다.
이제 Jenkins 대시보드에 로그인을 하고 가볍게 배포를 위한 설정을 해줍니다.
우선 plugin을 설치해줘야 합니다.
Git과 Gitlab, GItLab API Plugin, Generic Webhook Trigger Plugin, Git Parameter 등의 Gitlab 연동 플러그인들을 다운로드 받아줍니다.
그리고 Jenkins와 Gitlab을 연동하기 위한 Gitlab Connection Token을 등록해주어야 합니다.
먼저 Gitlab의 프로젝트에 들어가 Settings > Access Tokens에서 Token을 만들어줍니다.
(여기서 여러 프로젝트를 하나의 Jenkins Gitlab Connection으로 관리하고 싶다면 Project Group을 만들어 거기에서 Access Tokens를 발급받으면 됩니다.)
발급받은 Token을 Jenkins Dashboard > Jenkins 관리 > System에 위치한 GitLab 영역에 설정해줍니다.
이렇게 하면 GitLab Connection이 만들어집니다.
이후 Jenkins Dashboard로 넘어가서 '새로운 Item'을 선택하여 'Pipeline'을 선택해줍니다.
여기서 흔히 사용되는 Item은 Freestyle과 Pipeline이 있는데, Freestyle은 GUI상에서 선택이 가능하여 좀 더 간편하게 설정이 가능한 반면, Pipeline은 조금 더 raw한 레벨의 pipeline script를 작성해야 하는 차이점이 있습니다.
저는 script를 작성하는 방식으로 하기 위해 pipeline을 선택했습니다.
들어가서 가장 먼저 선택해야 할 것은 GitLab Connection Credential설정을 해주는 것입니다.
가볍게 연결 테스트를 해보고자 하신다면 여기서 'Test Connection' 버튼을 클릭하면 테스트 하실 수 있습니다.
만약 GitLab Connection 이외 다른 Credential(Token 또는 ID/Password 방식의 인증)을 활용하시려면 아래 Add 버튼을 클릭하여 설정할 수 있습니다.
그런 다음 Build Triggers 설정을 진행해주면 됩니다.
여기서 우리가 확인해야 할 것은 GitLab webhook URL입니다. 이 URL을 GitLab의 Webhook 설정에 등록을 해주어야 합니다.
GitLab Workspace에서 Settings > Webhooks를 선택합니다.
그럼 'Add new webhook'을 클릭하고 아래처럼 설정을 해주시면 됩니다.
여기서 URL은 앞서 살펴보았던 Jenkins Webhook의 URL을 그대로 복사해주시면 됩니다.
여기서 Secret token을 입력해주어야 하는데 이 token은 Jenkins에서 발급해주는 토근으로 Build Triggers 설정부의 하단에 보면 Secret token 영역이 있고 Generate 버튼을 클릭하면 Token이 생성됩니다.
이를 Webhook 설정의 Secret token에 붙여 넣어주시면 설정은 모두 끝납니다.
이제 Jenkins와 GitLab의 연동은 모두 끝났습니다.
연결 테스트가 정상적으로 진행되었다면 이제 Pipeline Script를 작성할 차례입니다.
기본적인 Pipeline script의 문법은 아래와 같습니다.
Pipeline { agent any stages { stage('Git Clone') { steps { git brach clone... } } stage ('Build bootJar') { steps { sh './gradlew clean bootJar' } } ... } }
위와 같이 stages과 stage들의 상위이고 stage는 steps의 상위이며 steps 내부에는 실제 구동될 스크립트들이 위치하게 됩니다.
여기서 webhook에 사용될 기본 branch를 설정할 수 있습니다. 일반적으론 개발계는 develop branch를 많이 사용하죠.
그리고 여기서 docker image build를 하게 되는데, 이전 Jenkins 서버에선 여기서 문제가 발생했었습니다.
이번엔 문제점을 정확히 파악하고 다시 체크를 해보려 합니다.
우선 Jenkins 컨테이너 내부에서 Docker를 설치하고, 이 Docker가 호스트 서버의 Docker의 설정을 물고 들어가도록 세팅해줄겁니다.
간단합니다.
앞서 Jenkins docker-compose.yml파일 내에 Privileged 설정을 하였기 때문에 Docker 설치를 해주면 호스트 서버의 설정을 물고 들어가게 될겁니다.
yml에서 보면 jenkins_home과 docker.sock을 모두 설정해주었기 때문이죠.
근데 여기서 주의하셔야 할 점은 Jenkins를 설치하게 되면 컨테이너 자체는 debian linux를 사용한다는 점입니다.
항상 컨테이너 내부에 추가적으로 Docker를 설치해야 한다면 리눅스 환경부터 확인을 해야할 것 같습니다.
그렇기에 Jenkins lts 버전에서는 데비안 환경에서 Docker를 설치한다는 점을 인지하고 넘어가야 합니다.
# 1. 데비안 필요 패키지 설치 apt-get update apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common -y [# 1-1. 만약 기존에 Docker를 설치했었다면 문제가 되었던 도커를 제거 apt remove docker docker-engine docker.io containerd runc] # 2. Docker GPG Key 추가 curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - # 3. Repository 추가 add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" # 4. 패키지 업데이트 apt-get update # 5. Docker 설치! apt-get install docker-ce -y # 6. Docker 버전 확인 및 구동 docker --version docker run hello-world docker ps -a
다양한 문제가 있었지만 위와 같이 설정 후 다시 구동을 하니 정상적으로 Jenkins 내 Docker가 설치 및 구동되었으며 이미지 빌드도 문제없이 수행되는 것을 볼 수 있었습니다!
드디어 CICD의 속박에서 풀려났습니다!
'프로젝트 노트' 카테고리의 다른 글
[IntelliJ] Java Class 파일 주석 템플릿 설정하기 (0) 2024.08.18 [Spring boot + Docker + Swagger3] Ubuntu 환경의 Docker 컨테이너로 Spring boot 배포하기(with Swagger3 And jar) (0) 2024.08.08 [Spring Boot + Gradle] 외장 톰캣에 War로 배포하기 (0) 2024.08.06 [Nginx] 페이지 새로고침 시 404 Page Not Found가 뜬다면?! (0) 2024.05.20 Ubuntu Docker-Compose 설치 (0) 2024.05.14