본문 바로가기
CI·CD

[CI/CD] Jenkins 기본 사용하기

by okms1017 2024. 12. 8.
728x90

✍ Posted by Immersive Builder  Seong

 

 

Jenkins 기본 사용하기 

작업 소개

작업은 프로젝트, Job, Item 3가지 유형의 지시 사항을 포함합니다. 

 

  • Trigger : 작업을 수행하는 시점 
    • 작업 수행 태스크가 언제 시작될 지를 지시합니다.
  • Build Step : 작업을 구성하는 단계별 태스크
    • 특정 목표를 수행하기 위해 태스크를 단계별 Step으로 구성할 수 있습니다. 
  • Post-build action : 빌드 후 조치 
    • 태스크가 완료되고 수행할 명령을 지시합니다. 
    • 예를 들어 작업의 결과(성공 또는 실패)를 사용자에게 알려주는 후속 동작이나, 자바 코드를 컴파일한 후 생성된 클래스 파일을 특정 위치로 복사하는 등 후속 조치를 구성할 수 있습니다. 

 


Item 생성하기

새 Item(first)을 생성하고 Freestyle project를 클릭합니다. 'Build Steps' 탭으로 이동하여 Execute shell을 선택하고 아래와 같이 명령어를 입력합니다. "docker check"라는 문구를 화면에 출력하고 test.txt 파일에 저장하는 것과 실행 중인 도커 컨테이너 목록을 출력하는 명령어입니다. 

 

 

빌드를 실행하여 대시보드에서 콘솔 출력을 확인합니다. "docker check"라는 문구와 실행 중인 컨테이너 목록이 문제 없이 출력됨을 확인할 수 있습니다. 

 

 

그리고 Item에 대한 워크스페이스가 생성되고 작업 결과물이 해당 워크스페이스에 저장됩니다. 

 

 


Gogs Repository 자격 증명 설정

소스 코드를 Gogs 저장소로부터 가져오기 위해 자격 증명을 설정합니다. 'Jenkins 관리' 탭으로 이동하여 Credentials를 신규 생성합니다. Kind는 Username with password로 선택합니다. Username은 devops로 입력하고, Password에는 Gogs 저장소에서 발행한 토큰값을 입력해줍니다. 그리고 ID에 gogs-dev-app을 입력하여 자격 증명을 설정합니다. 설정한 자격 증명은 Job, Item 등에서 가져다 사용할 수 있습니다.  

 

 


매개변수를 포함하여 Item 생성하기 

두 번째 Item(second)을 생성하고 Freestyle project를 클릭합니다. "이 빌드에는 매개변수가 있습니다"를 체크하여 String Parameter를 추가합니다. 매개변수명은 FirstPara로 입력하고, Value 값은 CICD로 입력합니다(key-value).

 

 

'소스 코드 관리' 탭으로 이동하여 연결할 소스 저장소를 지정합니다. Gogs의 dev-app 저장소에 연결할 것이므로 저장소의 URL 주소(http://192.168.35.251:3000/devops/dev-app)를 입력합니다. 이 때, URL 주소에서 .git 을 제외해야 동작합니다. 자격 증명은 위에서 생성한 devops/******를 선택합니다. 그리고 'Build Steps' 탭으로 이동하여 Execute shell을 선택하고 아래와 같이 명령어를 입력합니다. FirstPara 매개변수의 Value 값과 Version 파일에 저장된 버전 정보를 순차적으로 출력하는 명령어입니다. 

 

 

Item을 저장하고 좌측의 '파라미터와 함께 빌드' 탭을 클릭합니다. 

 

 

Console Output을 통해 dev-app 저장소로부터 최신 소스를 가져와서 파라미터 값(CICD)과 함께 버전 정보(0.0.1)를 출력하고 있음을 확인할 수 있습니다. 

 

 

또한, second Item에 대한 워크스페이스가 별도로 생성되고 가져온 소스코드가 여기에 저장됩니다. 

 

 


Jenkins 플러그인 설치

Jenkins에서 Pipeline Stage View, Docker Pipeline, Gogs Webhook 등 필요한 플러그인을 설치할 수 있습니다. Pipeline Stage View 플러그인은 파이프라인을 빌드할 때 진행 상황을 가시적으로 보여줍니다. Docker Pipeline 플러그인은 파이프라인 관련하여 docker.withRegistry(), appImage.push() 등 다양한 기능을 제공합니다. Gogs Webhook 플러그인은 Gogs 저장소로부터 특정 이벤트로 인해 웹훅이 트리거될 때 이 웹훅을 Jenkins에서 받을 수 있도록 도와줍니다. 

 

플러그인 설치를 위해 'Jenkins 관리' 탭으로 이동하여 Plugins를 클릭합니다.  

 

 

'Available plugins' 탭으로 이동해서 각 플러그인을 검색하여 설치를 진행합니다. 3개의 플러그인 모두 설치가 완료되고나서 Jenkins 재시작이 필요 없습니다. 

 

 


Docker Hub 자격 증명 설정

Jenkins에서 빌드한 컨테이너 이미지를 Docker Hub의 프라이빗 저장소에 저장하기 위해 자격 증명을 설정합니다. Gogs 저장소 자격 증명을 설정할 때와 마찬가지로 진행합니다. 'Jenkins 관리' 탭으로 이동하여 Credentials를 신규 생성합니다. Kind는 Username with password로 선택합니다. Username은 Docker Hub의 계정(okms1017)을 입력하고, Password에는 Docker Hub의 비밀번호를 입력해줍니다. 그리고 ID에 dockerhub-credentials을 입력하여 자격 증명을 설정합니다. 설정한 자격 증명은 파이프라인에서 사용할 예정입니다. 

 

 


파이프라인(Pipeline) 

파이프라인은 Jenkins가 제공하는 기능 중 하나로, CD 파이프라인을 구현하고 통합할 때 사용하는 플러그인 스크립트 모음입니다. 

 

Pipeline

 

  • 파이프라인 장점 
    • 코드 : 어플리케이션의 CI/CD 프로세스를 코드 형식으로 작성할 수 있고, 깃허브와 연동하여 팀원과 공유 및 협업이 가능합니다. 
    • 내구성 : Jenkins 서버가 의도적으로 또는 우발적으로 재시작되더라도 문제없이 유지됩니다. 
    • 일시 중지 : 파이프라인을 실행하는 도중 사람의 승인이나 입력을 기다리기 위해 중단(대기)가 가능합니다. 
    • 다양성 : 분기나 반복, 병렬 처리와 같은 다양한 CI/CD 요구사항을 지원합니다. 
  • 파이프라인 용어
    • 파이프라인(pipeline) : 전체 빌드 프로세스를 정의하는 코드
    • 노드(node/agent) : 파이프라인을 실행하는 시스템
    • 스테이지스(stages) : 순차 작업 명세인 stage 들의 묶음
    • 스테이지(stage) : 특정 단계에서 수행되는 작업들을 정의
    • 스텝(steps) : 특정 단계에서 수행되는 단일 작업을 의미 
    • 포스트(post) : 빌드 후 조치로 스테이지 작업이 끝난 후 추가적인 스텝을 의미
    • Directive : environment, parameters, triggers, input, when
      • environment (key=value) : 파이프라인 내부에서 사용할 환경변수
      • parameters : 입력 받아야할 변수를 정의 - Type(string, text, choice, password …)
      • when : stage 를 실행 할 조건 설정
  • 파이프라인 3가지 구성 형태

1. Pipeline Script : Jenkins 대시보드에서 파이프라인을 생성하고 셸 스크립트를 직접 작성하여 빌드하는 방식입니다.  

Pipeline Script

 

2. Pipeline Script from SCM : 사전에 작성한 JenkinsFile을 형상관리 저장소에 보관하고 빌드 시작 시 파이프라인 프로젝트에서 호출하는 방식입니다. 

Pipeline Script from SCM

 

3. Blue Ocean : UI 기반으로 파이프라인을 시각적으로 구성하면 자동으로 JenkinsFile이 생성되어 실행되는 방식입니다. 

Blue Ocean

 

  • 파이프라인 2가지 구문 : 선언형 (권장) / 스크립트형 

1. 선언형 파이프라인(Declarative) : 작성 용이, 최근 문법, Step 필수

 

pipeline {
    agent any     # Execute this Pipeline or any of its stages, on any available agent.
    stages {
        stage('Build') {   # Defines the "Build" stage.
            steps {
                //         # Perform some steps related to the "Build" stage.
            }
        }
        stage('Test') { 
            steps {
                // 
            }
        }
        stage('Deploy') { 
            steps {
                // 
            }
        }
    }
}

 

2. 스크립트형 파이프라인 (Scripted) : 커스텀 용이, 복잡(난이도 ↑), Step 옵션 

 

node {          #  Execute this Pipeline or any of its stages, on any available agent.
    stage('Build') {    # Defines the "Build" stage. stage blocks are optional in Scripted Pipeline syntax. However, implementing stage blocks in a Scripted Pipeline provides clearer visualization of each stage's subset of tasks/steps in the Jenkins UI.
        //              # Perform some steps related to the "Build" stage.
    }
    stage('Test') { 
        // 
    }
    stage('Deploy') { 
        // 
    }
}

 


CI 파이프라인 생성하기  

우선 CI 파이프라인 스크립트를 작성합니다. 이 스크립트는 '소스코드 가져오기 - 버전 정보 추출 - 도커 허브 로그인 - 컨테이너 이미지 빌드 - 이미지 태깅 - 도커 허브 이미지 업로드' 등 일련의 과정을 포함하고 있습니다.   

 

pipeline {
    agent any
    environment {
        DOCKER_IMAGE = 'okms1017/dev-app' 
    }
    stages {
        stage('Checkout') {
            steps {
                 git branch: 'main',
                 url: 'http://192.168.35.251:3000/devops/dev-app.git',  
                 credentialsId: 'gogs-dev-app'  
            }
        }
        stage('Read VERSION') {
            steps {
                script {
                    def version = readFile('VERSION').trim()
                    echo "Version found: ${version}"
                    env.DOCKER_TAG = version
                }
            }
        }
        stage('Docker Build and Push') {
            steps {
                script {
                    docker.withRegistry('https://index.docker.io/v1/', 'dockerhub-credentials') {
                        def appImage = docker.build("${DOCKER_IMAGE}:${DOCKER_TAG}")
                        appImage.push()
                    }
                }
            }
        }
    }
    post {
        success {
            echo "Docker image ${DOCKER_IMAGE}:${DOCKER_TAG} has been built and pushed successfully!"
        }
        failure {
            echo "Pipeline failed. Please check the logs."
        }
    }
}

 

새 Item(CI-Pipeline)을 생성하고 Pipeline을 클릭합니다. 

 

 

 'Pipeline' 탭으로 이동하여 Pipeline script를 선택하고 아래와 같이 파이프라인 스크립트를 붙여넣습니다. 

 

 

파이프라인 빌드를 실행하면 단계별 진행상황(Stage View)을 가시적으로 확인할 수 있습니다. 

 

 

Console Output을 통해 단계별로 수행된 작업들의 로그를 확인할 수 있습니다. Gogs의 dev-app 저장소에 접근하여 최신 소스코드로 업데이트하고 VERSION 파일의 현재 버전 정보(0.0.1)를 추출했습니다. 그리고 Docker Hub 자격 증명을 통해 로그인에 성공했고, Jenkins에서 컨테이너 이미지 빌드를 진행했습니다. 빌드 이후 추출한 버전 정보를 이미지 태그로 추가하여 Docker Hub 프라이빗 저장소에 이미지 업로드를 완료한 모습입니다.    

 

 

Jenkins 컨테이너 내부에 이미지가 새로 생성된 부분과 실제 Docker Hub의 프라이빗 저장소(okms1017/dev-app)에 신규 이미지(okms1017/dev-app:0.0.1) 파일이 업로드된 것을 확인할 수 있습니다. 

 

 


다음 포스팅 보러가기 

▶ 도커 기반 어플리케이션 CI/CD 구성하기 : https://okms1017.tistory.com/114

 

[CI/CD] 도커 기반 어플리케이션 CI/CD 구성하기

✍ Posted by Immersive Builder  Seong  도커 기반 어플리케이션 CI/CD 구성하기 이번 실습은 아래와 같이 CI/CD 워크플로우를 구성하는 것이 목표입니다. 개발자가 깃 저장소에 새로운 코드를 푸시할

okms1017.tistory.com

 

 


[출처]

1) CloudNet@, CI/CD Study

728x90