IT 지식

[Jenkins] Jenkins Docker 컨테이너에서 Docker를 사용해 Git 소스 배포하기

TaeHuiLee 2024. 11. 16. 19:25
반응형
이전 포스팅에서 다뤘던 [ Jenkins CI/CD 환경 구축하기 ] 내용을 참고하시면, 이번 주제에 대한 배경 지식이나 기초 정보를 확인하실 수 있습니다!

 

 

[Jenkins] CI/CD 환경 구축하기

🚀 Jenkins로 CI/CD 환경 구축하기 - 기본 플러그인 소개부터 설치까지!개발이나 DevOps를 처음 시작한 분이라면 지속적 통합과 지속적 배포(Continuous Integration/Continuous Deployment, CI/CD) 자동화 도구로 Jen

tae-hui.tistory.com

 

 


🐳 Jenkins Docker 컨테이너에서 Docker를 사용해 Git 소스 배포하기

JenkinsDocker 컨테이너로 실행하면서 내부에서 호스트의 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 초기 설정

  1. Jenkins 설치 후 초기 설정
    • 브라우저에서 Jenkins에 접속합니다: http://<호스트 IP>:28080.
    • 초기 관리자 비밀번호는 컨테이너 로그에서 확인할 수 있습니다. 
    • docker logs jenkins-container
    • Jenkins UI에서 플러그인을 설치하고, 관리 계정을 생성합니다.
  2. 필수 플러그인 설치
    • Jenkins 대시보드 → Manage JenkinsManage PluginsAvailable 탭에서 다음 플러그인을 설치하세요:
      • Git Plugin
      • Docker Pipeline
      • SSH Pipeline Steps
[https://github.com/taehui8260/jenkins-plugins]해당 Github Repository에서 유용한 필수 플러그인을 직접 다운 후 적용할 수 있습니다.
  1. 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. 주요 단계 설명

  1. GitHub에서 코드 가져오기
    • git 명령어를 사용하여 GitHub의 소스를 Jenkins 워크스페이스로 가져옵니다.
  2. Maven 빌드
    • mvn clean package 명령어로 프로젝트를 빌드합니다. Maven 설정은 Jenkins Tools에서 관리합니다.
  3. Docker 빌드
    • docker build 명령어로 프로젝트의 Docker 이미지를 생성합니다.
  4. Docker 푸시
    • 생성된 이미지를 Docker Hub로 푸시합니다. Credential을 안전하게 관리하기 위해 withCredentials를 사용합니다.
  5. Docker 배포
    • Docker 컨테이너를 실행하여 배포합니다.

🌟 5. Jenkins Job 생성 및 실행

  1. Jenkins 대시보드에서 New ItemPipeline 선택.
  2. Pipeline Script from SCM 설정:
    • SCM: Git
    • Repository URL: https://github.com/사용자명/레포지토리명.git
    • Credentials: GitHub Access Token 선택.
  3. Jenkins Job 실행 후, 단계별 로그를 확인하고 Docker Hub 및 컨테이너 상태를 점검합니다.

🌟 6. 추가 팁

  1. Docker Volume 활용
    • 컨테이너 내부 데이터의 영속성을 위해 볼륨을 적절히 설정하세요.
  2. Credential 보안 관리
    • Jenkins의 Credential Store를 사용해 민감한 정보를 안전하게 관리합니다.
  3. 자동화 향상
    • Jenkins Pipeline에 알림 설정(Slack, Email)을 추가하여 빌드 및 배포 상태를 실시간으로 확인할 수 있습니다.

📝 요약

  1. Jenkins Docker 컨테이너 설정
    • 호스트의 Docker 소켓을 마운트하여 내부에서 Docker를 사용할 수 있도록 설정합니다.
  2. GitHub와 Docker 연동
    • Jenkinsfile을 통해 GitHub에서 코드를 가져오고, Docker 이미지를 빌드하여 Docker Hub에 푸시한 후 배포합니다.
  3. 자동화된 CI/CD 파이프라인
    • Jenkins를 활용해 빌드, 분석, Docker 작업, 배포까지 자동화된 워크플로우를 구현합니다.

Docker와 Jenkins를 통합하여 손쉽게 CI/CD 환경을 구축할 수 있습니다!

반응형