Jenkins

Jenkins Pipeline을 사용하여 이미지 빌드 및 푸시 해보기 (Github, Harbor)

황동리 2024. 5. 9. 16:08
반응형

이번엔 Jenkins를 사용해서 이미지를 빌드 및 푸시를 해보도록 하겠습니다.

우선 Jenkins를 설치해줍니다.

Jenkins 설치

저는 docker-compose를 사용해서 설치를 했기 때문에 docker compose부터 설치 해보도록 하겠습니다.

참고
https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository
https://docs.docker.com/compose/install/linux/

 

먼저 Docker 부터 설치를 해줍니다. (OS는 Ubuntu 20.04를 사용하였습니다.)

# apt install -y docker.io

그리고 docker compose를 설치하는데, 하기 전에 apt repository부터 잡아줍니다.

공식 GPG key 추가
# apt-get update
# apt-get install ca-certificates curl
# install -m 0755 -d /etc/apt/keyrings
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
# chmod a+r /etc/apt/keyrings/docker.asc

apt 패키지 매니저가 사용할 repository 추가
# echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
# apt-get update

 

이제 docker-compose-plugin을 설치해줍니다.

# apt-get update
# apt-get install docker-compose-plugin

 

이렇게 되면 docker compose를 사용할 준비가 완료되었습니다.

이제 Jenkins를 설치해보도록 하겠습니다.

docker-compose.yml

version: '3.9'

services:
  jenkins:
    image: 'jenkins/jenkins:lts'
    container_name: jenkins
    restart: always
    user: root
    ports:				# 호스트Port:컨테이너Port
      - 80:8080
      - 50000:50000
    volumes:			# 호스트Path:컨테이너Path
      - /data/jenkins_home:/var/jenkins_home
      - /data/daemon.json:/etc/docker/daemon.json
      - /var/run/docker.sock:/var/run/docker.sock

위의 yaml 파일에서 몇가지만 설명을 하자면,

  • Jenkins가 실행되게되면 컨테이너 안의 /var/jenkins_home 디렉터리에 데이터가 쌓이기 때문에, 호스트Path를 지정해서 볼륨을 잡아준다.
  • daemon.json 파일에는 docker login, pull 을 할 때, insecure-registry를 해주기 위해 넣어준다.
daemon.json 파일의 내용
{
	"insecure-registries":["harbor의 도메인 주소","harbor 서버의 IP"]
}

 

이제 docker-compose.yml 파일을 실행해준다.

# docker compose up -d

 

그러면 아래와 같이 초기 비밀번호를 넣어주고

 

Install suggested plugins을 설치해준다.

 

그 후 계정을 생성해주고 로그인을 해주면 된다.

 

Pipeline 사용하기 위한 설정 준비

먼저 필요한 plugin을 설치해줍니다.

 

Jenkins 관리 > Plugins > Available plugins에서 Docker Pipeline 플러그인을 설치해줍니다.

 

그리고 Pipeline item을 생성을 합니다.

 

Github에서 Private Repository를 생성하고 token을 받아주는 과정은 아래를 참고하여 보시면 됩니다.

2024.05.03 - [Git] - GitHup Private Repository에 파일 올리기

token을 받아주면 Jenkins에서 credential를 생성해줍니다.

Jenkins 관리 > Credentials > add Credential

 

그 후 Pipeline 구성에서 Pipeline script from SCM으로 변경해줍니다.

Pipeline 구성


그리고 Pipeline 코드를 작성한 파일의 이름을 Jenkinsfile로 지정해줍니다.

 

Jenkins 컨테이너 안에 docker 설치

Pipeline 코드를 작성하고 빌드를 할 때, docker 명령어를 사용하는데, Jenkins 컨테이너 안에
docker 데몬이 없으면 docker: not found 오류가 나옵니다.

따라서 저는 Jenkins 컨테이너 안에 docker를 설치를 해주었습니다.

docker 설치

먼저 jenkins 컨테이너 접속
# docker exec -it jenkins /bin/bash

docker 데몬 설치
# curl https://get.docker.com/ > dockerinstall && chmod 777 dockerinstall && ./dockerinstall

Pipeline 코드 작성

이제 Pipeline 코드를 작성하여 위에서 생성한 github repository에 Jenkinsfile 이라는 이름으로 필요한 파일들과 함께 올려주면 됩니다.

Jenkinsfile

pipeline {
    agent any
    environment {
        DOCKER_REGISTRY = "<harbor 주소>"
        DOCKER_IMAGE = "<harbor에 올릴 이미지 이름>"
        DOCKER_CREDENTIALS_ID = "<harbor 로그인 할 때 필요한 credential>"
    }

    stages {
        stage('Build') {
            steps {
                script {
                    // Build Docker image
                    docker.build "${DOCKER_IMAGE}:v${env.BUILD_NUMBER}"
                }
            }
        }
        stage('Push') {
            steps {
                script {
                    // Login to Harbor registry
                    docker.withRegistry("${DOCKER_REGISTRY}", "${DOCKER_CREDENTIALS_ID}") {
                        // Push the Docker image
                        docker.image("${DOCKER_IMAGE}:v${env.BUILD_NUMBER}").push("v${env.BUILD_NUMBER}")
                    }
                }
            }
        }
    }
}

 

이런 저런 오류들을 해결하다보니 저는 16번의 빌드 끝에 성공하였습니다.

 

이상 입니다.

반응형

'Jenkins' 카테고리의 다른 글

Helm을 사용하여 Jenkins 설치해보기  (1) 2024.04.19