System Engineering/CI, CD

CI/CD #18. 젠킨스 harbor 연동 및 push 하기

ZunoXI 2021. 12. 15.

 

 

 

개요

젠킨스 harbor 연동 및 push 하기

Jenkins with Harbor

이전 포스팅에서 Harbor를 설치하고 원격지에서 접근하는 방법에 대해서 기술했다. 이번 포스팅에서는 원격지, 특히 쿠버네티스 환경에 배포하기 앞서 Jenkins에서 소스코드 빌드후 docker이미지 빌드 과정이 있다. 이때 기존 docker hub로 이미지파일을 push하는것과 달리 이전 포스팅에서 설치한 harbor로 제작된 이미지를 push하는 방법에 대해 기술한다.

 

 

 

 


 

 

 

 

1. jenkins 서버 인증서 설치

 

앞선 포스팅에서도 언급했지만 기본적으로 원격 서버에서 harbor를 접근하려면 접근을 시도하는 원격 서버의 로컬 도커에 인증서가 등록되어있어야 한다. 적용방법은 Harbor에 login 하려는 각 서버의 /etc/docker/certs.d/도메인명 위치에 crt, key 파일을 위치시킨 후 systemctl restart docker를해주면 된다. 

 

ex ) harbor의 domain명이 mydomain.com인 경우

$ mkdir /etc/docker/certs.d/mydomain.com
$ cp ~~.crt /etc/docker/certs.d/mydomain.com/
$ cp ~~.key /etc/docker/certs.d/mydomain.com/
$ systemctl restart docker

 

 

Verify repository client with certificates

 

docs.docker.com

 

 

 

 

 

 

 

2. Jenkins Credential 생성

 

 

Jenkins가 CI/CD 파이프라인을 수행하는 과정에서 harbor에 접근할 수 있게끔 사전에 Credentials를 설정해줘야한다.

 

Jenkins 관리 > Manage Credentials 클릭

 

 

새로운 Credentials를 만든다.

 

 

Global Credenitals를 클릭 > 왼쪽 메뉴에서 Add Credentials를 클릭

 

 

 

ID는 나중에 파이프라인내에서 인식할 수 있는 credentials의 ID이기에 harbor로 기입하고 username은 구축한 harbor의 계정, pw는 말그대로 harbor계정의 pw를 입력한다. Description은 harbor credentials라는것을 이해할 수 있게끔 임의로 작성해준다.

 

 

 

credentials이 생성되었다.

 

 

 

 

 

 

 

 

3. Jenkinsfile 수정

 

 

환경에따라 쿠버네티스가 아닌 일반 SSH 서버에 배포할 수 있고, 서버 배포 이전까지만 진행하는 경우도 있겠다. 필자의 환경은 git에서 소스커밋이후 jenkins에서 spring war 빌드, sonarqube테스트, docker 빌드 및 저장소 push 이후에 쿠버네티스에서 실행을 시켜주는 파이프라인을 사용하고 있다.

 

 

따라서 젠킨스 GUI 환경에서 옵션 설정을하는것이 아닌 Jenkinsfile라는 파일을 통해 파이프라인을 stage별로 관리하고 있다. (jenkinsfile을 사용하는 방법은 링크의 포스팅을 참고)

 

CI/CD #12. Jenkins(젠킨스)를 이용한 Kubernetes(쿠버네티스) 배포

개요 jenkins를 이용하여 kubernetes 클러스터에 배포 jenkins kubernetes deploy 지난 포스팅에서는 jenkins의 SSH plugin을 이용하여 원격 서버에 배포를 해봤다. 사실 cicd자체를 쓰는 환경 자체가 devops 혹..

zunoxi.tistory.com

 

 

 

jenkinsfile의 full 버전은 위 링크에서 확인하면 될 것 같고, docker build와 push차원에서 확인해보자면 그 비교는 아래와 같다. 

 

■ docker hub의 id : cross9308, yf라는 프로젝트에 올리는경우

    - docker hub용 Jenkins Credentials : dockerhub

    - tag는 latest 버전으로 push

 

    stage('Build image'){
        app = docker.build("cross9308/yf")
    }

    stage('Push image') {
        docker.withRegistry('https://registry.hub.docker.com', 'dockerhub') {
            app.push("${env.BUILD_NUMBER}")
            app.push("latest")
        }
    }

 

■ harbor의 id : 1522274, fe라는 프로젝트에 ver이미지를 올리는경우(harbor 사용의 경우에는 이미지명도 지정필요)

    ㄴ 당연히 harbor에 프로젝트 fe에 ver라는 이미지용 레포지토리가 사전에 만들어져 있어야한다. 

    ㄴ docker tag에는 mydomain.com이라는 도메인명이 가장 앞에 붙어야한다.

    - harbor용 Jenkins Credentials : harbor

    - tag는 latest 버전으로 push

 

stage('Build image'){
        app = docker.build("mydomain.com/fe/ver")
    }

    stage('Push image') {
        docker.withRegistry('https://mydomain.com', 'harbor') {
            app.push("${env.BUILD_NUMBER}")
            app.push("latest")
        }
    }

 

 

이렇게 설정 후 jenkins의 빌드 트리거를 작동시켜보자.

 

 

 

 

 

정상적으로 이미지가 push 된것까지 확인이 된다면 완료.

(너무나 당연하게도 jenkins서버와 harbor간의 방화벽은 반드시 오픈되어있어야한다..)

 

 


 

구축한다고 삽질을 꽤 많이 했습니다. 혹시나 다른 결과나 오류가 발생한다면 댓글이나 메일로 알려주세요. 함께 확인해보겠습니다 :)

 

반응형

댓글