Docker 내부에 jenkins로 Git과 자동배포 하는 방법을 알아보자!!
들어가며
이번 포스팅에서는 Git에서 push가 일어났을때일어났을 때 jenkins가 리파지토리를 감시하다가 push가 일어났을 때 빌드하고 자동으로 docker로 실행하는 방법을 알아보겠습니다.
구성도
로컬에서 간단하게 구축하기 위해서 간단하게 그려봤습니다. dockerfile로 할예정입니다. 또한 DB는 따로 관리해야 판단했기 때문에 개별적으로 MySQL컨테이너를 띄어놓았습니다.
프로젝트환경
springboot -version : 2.7.4
bulid : gradle 8.5
java -version : openjdk-17
IDE : IntelliJ _Ultimate
OS : Windows10 Pro
Docker에 Jenkins 설치하기
Docker Demon을 실행합니다. (Docker desktop 있다면 실행)
docker pull jenkins/jenkins:2.439-jdk17
입력하여 도커허브에서 이미지를 다운로드합니다.
이미지를 보면 2.439-jdk17 버전이 다운로드한 걸 볼 수 있습니다.
docker run -d -p 8000:8080 -v C:\Tools\blogjenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock --name blog-jenkins -u root jenkins/jenkins:2.439-jdk17
다음 명령어를 도커 컨테이너에 jnekins 띄어줍니다.
-run : 도커컨테이너 실행
-d : 백그라운드에서도 실행될 수 있게 한다.
-p :포트포워딩을 통해 8000번으로 변경해 준다.
-v : 저장되는 정보를 현재 로컬 pc에 저장하기 위해서 마운트 한다.(첫 번째)
소켓을 통해서 젠킨스 내부에서도 docker 데몬 없이도 실행하게 하며 공유해서 동일한 환경에서 도커를 실행하게 한다.(두 번째)
-u : root로 설정한다.(작성 안 할 시 jenkins 컨테이너 내부에 도커를 설치해야 하는데 패키지를 다운할 때 매우 귀찮아서 작성함..)
나머지 설치방법은 다음글을 참고해 주세요!
[Jenkins] jdk-17을 사용한 Jenkins 다운로드 방법 및 플러그인 설치오류 해결방법
Jenkins을 다운로드하여보자!! 다운로드 방법 젠킨스. war 다운로드이동하기 해당 페이지로 이동해 2.7.1 다운로드하자 그러면 jenknins.war 파일이 다운로드하여진 것을 볼 수 있다. 저는 C:\Blog\ 디렉터
back-stead.tistory.com
Jenkins 내부에 Docker 설치하기
Jenkins가 docker 이미지를 빌드하고 docker 컨테이너에 뛰우기 위해서는 jenkins 내부에 설치해야 한다.
(안 그러면 notfound Docker 오류가 발생하는데 나는 jenkins 내부에 설치해서 해결했다.)
1). docker exec -it [컨테이너 ID] /bin/bash
2). apt-get update
3). apt-get install sudo
4). echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-
keyring.gpg] https://download.docker.com/linux/debian $(grep VERSION_CODENAME /etc/os-release | cut -d'=' -f2) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
5). sudo apt-get install gnupg2
6). curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
7). sudo apt-get update
8). sudo apt-get install docker-ce docker-ce-cli containerd.io
9). sudo docker --version
사진과 같이 버전정보가 나온다면 성공적으로 설치가 된 것입니다.
MySQL 설치방법
설치방법은 다음 포스팅을 참고해서 실행주시 길 바랍니다.
Jenkins가 DB까지 시작하는 것은 좋지 않은 CI/CD라고 판단해서 DB는 따로 관리하도록 했습니다.
[Docker] 도커로 만든 MySQL을 MySQL Workbench로 연동하는 방법 및 볼륨 사용하기
MySQL을 연동해 보자 그리고 Volume을 사용해 보자 들어가며 데이터베이스를 Docker 컨테이너에 올리고 워크벤치를 통해 원격으로 접속하는 방법에 대해 살펴보겠습니다. 또한 Docker의 지정된 볼륨과
back-stead.tistory.com
Git Token 만들기
Git- Settings-Developer Settings-Personal access tokens (classic) -New personal access token (classic) 클릭
생성 후 만들어진 토큰 값을 메모장이나 복사해 둡니다.
Jenkins 파이프라인 구성하기
유저정보-Credentials 클릭
(global)
Add Credentials 클릭
kin : Useranme with password 선택
Username : GIt 닉네임을 작성
Password : 이전에 발급받은 토큰값을 저장
ID : 사용할 키이름(아무거나 작성가능)
젠킨스 메인페이지로 이동후 New Item 클릭
사용할 프로젝트명 입력
Pipeline 선택 후 OK로 생성
GitHub project 클릭 후 사용할 리파지토리 주소 입력
GitHub hook trigger for GITScm polling : 선택해 push가 일어났을 때 자동 빌드하게 한다.
Pipeline script 작성
pipeline Syntax 클릭 후
Sample Step : check out.... 클릭 SCM : Git 선택 Repositoryt URL : 사용할 깃 리파지토리 주소 Credentials : 이전에 만들었던 Credentials 사용 Branch Specifier : 사용 중인 브랜치명 Generate Pipeline Script : 스크립트를 생성해 만들어진 스크립트 복사
Pipeline script 작성
pipeline{
agent any
tools{
gradle 'Gradle 8.5'
}
stages{
stage('빌드할 파이프라인 명'){
steps{
// 전에 만들었던 깃 스크립트 복사//
sh 'gradle clean build'
}
}
stage('사용할 도커 이미지 빌드 파이프라인 명'){
steps{
script{
sh 'docker build -t 도커허브 리파지토리주소 .'
}
}
}
stage('도커허브에 로그인 이미지 푸쉬할 파이프라인 명'){
steps{
script{
//깃에서 만든것처럼 도커 허브 자격증명 파일 생성후 스크립트 생성 {
sh "docker login -u keuye0638 -p ${자격증명으로 만든 변수 사용}"
}
sh 'docker push [만든 이미지명]'
}
}
}
stage('도커 컨테이너에 실행할 파이프라인 명'){
steps{
script{
sh 'docker rm -f [컨테이너 명] || true' // 현재 동일한 컨테이너가 있다면 삭제후 실행
sh ' docker run -d -p 8001:8080 --network [만든 네트워크명] --name [사용할 컨테이너명] [만들어논 도커이미지명]'
}
}
}
}
}
모든 값을 설정하고 저장 클릭
만든 프로젝트로 이동후 지금 빌드를 클릭(빌드하기 전에 Mysql컨테이너가 실행 중이야 합니다.)
성공하면 다음과 같이 초록색이 나오게 되며
다음과 같이
image와 container이 정상적으로 올라오는 것을 볼 수 있습니다.
Git Webhook설정
사용할 Git 리파지토리 이동후 Setting 클릭
Palload URL의
"https://[젠킨스 주소]/github-webhook/"
입력 후에 JSON타입 선택 후 저장하면 끝이다.
이제 코드를 수정하고 PUSH 해보자
그럼 JENKINS는 PSUH 기록을 감지해 자동으로 실행되는 것을 볼 수 있다.
Hook Log를 보면 다음과 같이 뜨는 것을 볼 수 있다.
정리
이번에는 로컬 서버에서의 구축을 살펴봤습니다. 그러나 현재 상황에서 바로 배포한다면 매우 위험한 방법입니다. 왜냐하면 YAML 파일에 민감한 정보가 그대로 노출되어 있어서, 악의적인 사용자가 이를 이용할 수 있기 때문입니다. 다음에는 이러한 정보들을 젠킨스의 Credentials을 활용하여 빌드할 때 동적으로 변경하는 방법에 대해 알아보겠습니다.
'Devops' 카테고리의 다른 글
[Git] git 실수로 올린 commit 및 push 취소 및 add 취소하는 방법 (1) | 2024.03.08 |
---|---|
[Git] Git bash CLI 명령어 모음 (0) | 2024.03.03 |
[Jenkins] "String Parameter"와 "Secret File"을 활용하여 YAML 및 Properties 파일의 민감한 정보 보호하기 (0) | 2024.02.27 |
[Jenkins] 젠킨스를 이용해 Git의 변경내용을 자동 빌드 (1) | 2024.02.24 |
[Jenkins] 젠킨스와 CI/CD란 무엇인가? (0) | 2024.02.24 |