Jenkins는 CI/CD를 제공하는 오픈소스 자동화 도구이다.

다양한 플러그인을 제공하여 사용할 수 있고 파이프라인을 통한 소프트웨어 빌드, 테스트 및 배포를 지원한다.

여러 플러그인을 제공하니 편리하게 사용할 수 있는데, 예를 들어 Git과 연동하고 특정 조건을 걸면 레포지토리에 push 또는 merge할 때마다 젠킨스 파이프라인을 구동시킬 수 있다. 또는 크론을 이용해서 특정 주기마다 파이프라인을 구동시킬 수 있다.

먼저 단순하게 Execute shell로 젠킨스에서 Command 동작이 잘 이루어지는지 확인해 본다.

Freestyle project로 Item을 생성한다.

image

나머지는 별다른 설정없이 Build Steps에 간단한 명령어를 입력하고 빌드를 돌리면

image 1

Console Output에서 빌드 성공한 출력을 확인할 수 있다.

image 2

이는 젠킨스 컨테이너 내부에 접속하여 명령어를 실행하는 것과 동일하다

image 3

또한 내부에 프로젝트가 잘생성되었는지도 확인할 수 있다

image 4

두 번째 실습에 앞서 gogs에 대한 credentials를 설정해 준다. 초기화면에서 Jenkins 관리 > Credentials > Globals에 들어오면 credential을 추가할 수 있다.

이는 Jenkins가 스크립트에서 gogs-dev-app이라는 id를 통해 지금 설정한 credentials를 활용할 수 있다. Jenkins에서 gogs 레포지토리에 접근하기 위함이다.

image 5

두 번째 Item을 만들어서 파라미터+git+스크립트를 사용하는 빌드 과정을 만든다.

String Parameter를 통해 매개변수를 지정할 수 있다.

image 6

gogs 레포지토리는 git을 체크하고 설정해 줄 수 있는데, 내 레포지토리를 입력하고 Credentials를 선택하면 바로 인증된다. 브랜치는 main 브랜치이다.

image 7

마지막 Excute shell에 파라미터 값을 찍고 레포지토리에 올라와있는 VERSION 파일을 확인해 보면 파라미터 값을 찍는지와 git 레포와 연동이 잘되었는지 확인할 수 있다.

image 8

파라미터와 함께 빌드를 누르면 매개변수를 빌드 시마다 변경해서 사용할 수 있다.

image 9

Console Output에서 확인하면 gogs-dev-app이라는 credential을 통해 내 원격 레포지토리에 접근 로그가 확인된다.

image 10

젠킨스 내부 서버에서 확인해 보면 원격 레포에 올라가 있는 파일을 전부 받아왔다.

image 11

젠킨스 웹의 작업공간에서도 직관적으로 확인할 수 있다.

image 12

마지막으로 도커허브와 연동해서 빌드된 컨테이너 이미지를 도커허브에 push하는 과정도 실습해 본다

우선 메인페이지 > Jenkins 관리 > Plugins에서 아래 세 가지 플러그인을 설치해 준다

  • Pipeline Stage View: 각 빌드 단계 과정을 시각화해 주는 플러그인
  • Docker Pipeline: docker build, push와 같은 명령어를 실행시켜 주는 플러그인
  • Gogs: gogs 웹훅 플러그인

image 13

세 가지 다 설치해 주었고 이 플러그인은 Jenkins를 재시작해 주지 않아도 바로 사용 가능하다

이제 도커허브를 사용하기 위해 git과 동일하게 credentials부터 생성해 준다.

image 14

이제 New Item으로 파이프라인을 실행시켜 보자

image 15

아래 파이프라인은 Checkout → Read VERSION → Docker Build and Push 단계로 구성되어 있다

pipeline {
    agent any
    environment {
        DOCKER_IMAGE = '6ain/dev-app' // Docker 이미지 이름
    }
    stages {
        stage('Checkout') {
            steps {
                 git branch: 'main',
                 url: 'http://192.168.219.100:3000/devops/dev-app.git',  // Git에서 코드 체크아웃
                 credentialsId: 'gogs-dev-app'  // Credentials ID
            }
        }
        stage('Read VERSION') {
            steps {
                script {
                    // VERSION 파일 읽기
                    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') {
                        // DOCKER_TAG 사용
                        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."
        }
    }
}
  • environment: Docker 이미지 이름을 내 도커허브 레포지토리에 맞게 지정해 준다.
  • stage(‘Checkout’): git checkout 과정인데 git에 대한 자격증명과 url을 설정해 주면 해당 레포에서 소스를 젠킨스서버로 가져올 수 있다

    image 16

  • stage(‘Read VERSION’): 저장소에서 가져온 소스들 중 버전파일을 확인한다

    image 17

  • stage(‘Docker Build and Push’): Docker Pipeline 플러그인을 빌드 및 푸시를 진행한다
    • docker.withRegistry: 도커허브에 로그인한다

      image 18

    • docker.build: 도커 이미지를 빌드한다

      image 19

    • appImage.push(): 빌드된 이미지를 도커허브에 푸시한다

      image 20

  • post: 마지막으로 성공 혹은 실패에 따라 다른 메세지를 출력할 수 있다.

    image 21

파이프라인을 실행시키면 설치했던 Pipeline Stage View 플러그인 덕분에 단계별로 한눈에 볼 수 있다

image 22

실패한 내역은 도커허브 credential에서 패스워드가 틀렸었고 이는 Console Output에서 로그를 통해 확인 가능하다

image 23

최종적으로 도커허브에 들어와서 이미지가 잘저장됐는지 확인할 수 있고

image 24

호스트에서도 해당 이미지가 저장되어 있는지 확인할 수 있다

image 25

Categories:

Updated:

Leave a comment