반응형
이전 포스팅에서 다뤘던 [ Jenkins CI/CD 환경 구축하기 ] 내용을 참고하시면, 이번 주제에 대한 배경 지식이나 기초 정보를 확인하실 수 있습니다!
🐳 Jenkins Docker 컨테이너에서 Docker를 사용해 Git 소스 배포하기
Jenkins를 Docker 컨테이너로 실행하면서 내부에서 호스트의 Docker 환경을 사용할 수 있게 설정하고, GitHub 소스를 가져와 빌드 및 배포까지 진행하는 방법을 알아보겠습니다. 이 과정에서는 Jenkins의 강력한 CI/CD 기능과 Docker를 활용한 배포 자동화를 결합합니다.
🌟 1. Jenkins 컨테이너 실행하기
먼저, Jenkins를 Docker 컨테이너로 실행하고, 호스트의 Docker 소켓을 컨테이너에 마운트하여 Docker 명령어를 사용할 수 있도록 설정해야 합니다.
🛠 Docker 명령어로 Jenkins 컨테이너 실행
docker run --rm -d -p 28080:8080 -p 50000:50000 \
-v /appdata/jenkins/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /appdata/deploy:/home/portal/deploy \
-e TZ=Asia/Seoul \
-e JENKINS_OPTS="--httpPort=8080" \
-u root \
--name jenkins-container jenkins/jenkins:lts
주요 옵션 설명
-v /var/run/docker.sock:/var/run/docker.sock
- 호스트 Docker 소켓을 마운트하여 컨테이너 내부에서 Docker 명령어를 실행할 수 있게 만듭니다.
-u root
- root 사용자로 컨테이너를 실행합니다. Jenkins 컨테이너 내부에서 Docker 명령을 실행하려면 루트 권한이 필요합니다.
-v /appdata/jenkins/jenkins_home:/var/jenkins_home
- Jenkins 데이터를 호스트 디렉토리에 저장하여 데이터가 지속됩니다.
🌟 2. Jenkins 초기 설정
- Jenkins 설치 후 초기 설정
- 브라우저에서 Jenkins에 접속합니다:
http://<호스트 IP>:28080
. - 초기 관리자 비밀번호는 컨테이너 로그에서 확인할 수 있습니다.
docker logs jenkins-container
- Jenkins UI에서 플러그인을 설치하고, 관리 계정을 생성합니다.
- 브라우저에서 Jenkins에 접속합니다:
- 필수 플러그인 설치
- Jenkins 대시보드 → Manage Jenkins → Manage Plugins → Available 탭에서 다음 플러그인을 설치하세요:
- Git Plugin
- Docker Pipeline
- SSH Pipeline Steps
- Jenkins 대시보드 → Manage Jenkins → Manage Plugins → Available 탭에서 다음 플러그인을 설치하세요:
[https://github.com/taehui8260/jenkins-plugins]해당 Github Repository에서 유용한 필수 플러그인을 직접 다운 후 적용할 수 있습니다.
- Credential 설정
- GitHub Access Token: GitHub와 연동하기 위해 Personal Access Token을 생성하고 Jenkins에 추가합니다.
- Docker Hub 계정: Docker 이미지를 푸시하기 위해 Docker Hub 계정을 Jenkins에 등록합니다.
- SSH 계정: 원격 배포 서버에 접근하기 위해 SSH 정보를 등록합니다.
🌟 3. Jenkinsfile 작성하기
이제 Jenkinsfile을 작성하여, GitHub에서 코드를 가져오고 빌드 및 Docker 작업을 수행하는 파이프라인을 설정해 보겠습니다.
Jenkinsfile 코드
pipeline {
agent any // Jenkins 노드에서 실행
environment {
GIT_REPO_URL = 'https://github.com/사용자명/레포지토리명.git'
GIT_CREDENTIALS_ID = '깃허브-크리덴셜-ID'
DOCKER_IMAGE = '사용자명/레포지토리명'
DOCKER_CREDENTIALS_ID = '도커-크리덴셜-ID'
CURRENT_DATE = sh(returnStdout: true, script: 'date +%Y%m%d%H%M').trim()
}
stages {
stage('Clone Repository') {
steps {
git branch: 'main', credentialsId: "${GIT_CREDENTIALS_ID}", url: "${GIT_REPO_URL}"
}
}
stage('Build') {
steps {
script {
def MAVEN_HOME = tool 'MAVEN_3.9.4'
sh "${MAVEN_HOME}/bin/mvn -f pom.xml clean package"
}
}
}
stage('Docker Build') {
steps {
script {
sh "docker build -t ${DOCKER_IMAGE}:${CURRENT_DATE} ."
}
}
}
stage('Docker Push') {
steps {
script {
withCredentials([string(credentialsId: "${DOCKER_CREDENTIALS_ID}", variable: 'DOCKER_PASSWORD')]) {
sh """
echo \$DOCKER_PASSWORD | docker login -u ${DOCKER_IMAGE} --password-stdin
docker push ${DOCKER_IMAGE}:${CURRENT_DATE}
"""
}
}
}
}
stage('Deploy') {
steps {
script {
sh "docker run -d --name my-app-container ${DOCKER_IMAGE}:${CURRENT_DATE}"
}
}
}
}
}
🌟 4. 주요 단계 설명
- GitHub에서 코드 가져오기
git
명령어를 사용하여 GitHub의 소스를 Jenkins 워크스페이스로 가져옵니다.
- Maven 빌드
mvn clean package
명령어로 프로젝트를 빌드합니다. Maven 설정은 Jenkins Tools에서 관리합니다.
- Docker 빌드
docker build
명령어로 프로젝트의 Docker 이미지를 생성합니다.
- Docker 푸시
- 생성된 이미지를 Docker Hub로 푸시합니다. Credential을 안전하게 관리하기 위해
withCredentials
를 사용합니다.
- 생성된 이미지를 Docker Hub로 푸시합니다. Credential을 안전하게 관리하기 위해
- Docker 배포
- Docker 컨테이너를 실행하여 배포합니다.
🌟 5. Jenkins Job 생성 및 실행
- Jenkins 대시보드에서 New Item → Pipeline 선택.
- Pipeline Script from SCM 설정:
- SCM: Git
- Repository URL:
https://github.com/사용자명/레포지토리명.git
- Credentials: GitHub Access Token 선택.
- Jenkins Job 실행 후, 단계별 로그를 확인하고 Docker Hub 및 컨테이너 상태를 점검합니다.
🌟 6. 추가 팁
- Docker Volume 활용
- 컨테이너 내부 데이터의 영속성을 위해 볼륨을 적절히 설정하세요.
- Credential 보안 관리
- Jenkins의 Credential Store를 사용해 민감한 정보를 안전하게 관리합니다.
- 자동화 향상
- Jenkins Pipeline에 알림 설정(Slack, Email)을 추가하여 빌드 및 배포 상태를 실시간으로 확인할 수 있습니다.
📝 요약
- Jenkins Docker 컨테이너 설정
- 호스트의 Docker 소켓을 마운트하여 내부에서 Docker를 사용할 수 있도록 설정합니다.
- GitHub와 Docker 연동
- Jenkinsfile을 통해 GitHub에서 코드를 가져오고, Docker 이미지를 빌드하여 Docker Hub에 푸시한 후 배포합니다.
- 자동화된 CI/CD 파이프라인
- Jenkins를 활용해 빌드, 분석, Docker 작업, 배포까지 자동화된 워크플로우를 구현합니다.
Docker와 Jenkins를 통합하여 손쉽게 CI/CD 환경을 구축할 수 있습니다!
반응형
'IT 지식' 카테고리의 다른 글
[Linux] 리눅스 환경에서 sudo 권한 실행 시 비밀번호를 묻지 않도록 설정하는 방법 (0) | 2024.11.25 |
---|---|
WSL에서 Docker 컨테이너 내부에서 외부 호출이 불가능한 문제 해결하기 (0) | 2024.11.21 |
WSL(Windows Subsystem for Linux)에서 SSH 설정하기 (10) | 2024.11.14 |
[Kubernetes] 쿠버네티스(Kubernetes)란 무엇인가 (2) | 2024.11.12 |
[Jenkins] Jenkins에서 GitHub 및 GitLab 인증 연동하기 (0) | 2024.11.09 |