https://dev.to/appfleet/building-docker-images-to-docker-hub-using-jenkins-pipelines-71m

 

Jenkins를 이용해 docker 이미지를 빌드하는 방법에 대해 알아봅니다.

 

 

 

0. Jenkins 및 docker 설치.

 

들어가기 앞서 jenkins와 docker를 미리 준비합니다.

 

 

 

1. Github 저장소 생성

 

가장 먼저 jenkins에서 빌드할 Github 저장소를 생성해 줍니다. 저장소에는 도커 이미지로 빌드할 때 사용될 dockerfile이 포함되어야 합니다.

 

Github 저장소는 다음을 참고해 주시기 바랍니다: JenkinsDockerPipeline

 

TheFatDuck/JenkinsDockerPipeline

Contribute to TheFatDuck/JenkinsDockerPipeline development by creating an account on GitHub.

github.com

 

dockerfile은 설명할 내용이 없으며 Jenkinsfile은 뒤에서 설명하도록 하겠습니다.

 

 

 

2. 빌드 환경 구성.

 

Jenkins에서 Docker 이미지를 빌드하기 위해선 별도의 플러그인이 필요합니다. Jenkins 플러그인 설치 페이지로 이동 후 "Docker Pipeline" 플러그인을 설치합니다.

 

 

다음으론 Docker Registry의 인증 정보를 등록해 줄 차례입니다. Global Credential 페이지로 이동 후 Add Credentials를 클릭해 인증 정보를 등록합니다.

 

 

전 이전에 생성한 Harbor의 인증정보를 입력했습니다.

 

 

다음은 git을 이용하기 위한 설정입니다. 먼저 Jenkins가 설치된 서버에 git이 없다면 설치합니다.

 

$ sudo apt-get install git

 

그 후 git exe 경로를 확인합니다.

 

$ gut --exec-path

 

Jenkins의 Global tool configuration 페이지로 이동해 Git 항목을 확인한 경로로 수정해 줍니다.

 

 

다음은 도커 사용 권한입니다. 기본적으로 Jenkins에서 바로 docker.sock를 사용할 순 없습니다. 다음 명령어로 권한을 부여해 주세요.

 

$ sudo chmod 666 /var/run/docker.sock

 

 

 

3. Jenkins 아이템 생성

 

이제 Jenkins Pipeline을 사용해 실제 빌드를 진행해 보도록 하겠습니다. "새로운 Item"을 클릭해 "Pipeline"을 선택하고 새로운 아이템을 만듭니다.

 

 

저장소를 확인해 보셨다면 내부에 ${env.BUILD_NUMBER}를 확인할 수 있습니다. 이 값을 태그로 이용할 것이며 해당 값은 빌드할 때 함께 넘겨줍니다. 이를 위해 매개변수를 정의합니다.

 

 

다음은 파이프 라인 관련 설정입니다. 파이프라인 설정은 다음과 같이 설정하시면 됩니다.

 

 

"Pipeline script from SCM"을 선택한 뒤 SCM은 git을 고르고 리포지토리 주소를 입력하면 됩니다. 해당 리포지토리 내의 "Jenkinsfile"을 파이프라인 스크립트로 사용하겠다는 의미를 가집니다.

 

"Build with parameter"를 클릭해 BUILD_NUMBER를 입력한 뒤 빌드하면 파이프라인을 통해 빌드되는 것을 확인할 수 있습니다.

 

 

이제 Jenkinsfile을 확인해 봅시다.

 

node {
  stage('========== Clone repository ==========') {
    checkout scm
  }
  stage('========== Build image ==========') {
    app = docker.build("jenkins-docker-pipeline/my-image")
  }
  stage('========== Push image ==========') {
    docker.withRegistry('YOUR_REGISTRY', 'YOUR_CREDENTIAL') {
      app.push("${env.BUILD_NUMBER}")
      app.push("latest")
    }
  }
}

 

업로드된 Jenkinsfile은 Scripted pipeline을 위한 스크립트입니다. 다른 방식으로 Declarative pipeline을 위한 방식도 있으나 이 글에선 설명하지 않도록 하겠습니다.

 

파이프라인은 세 스테이지로 동작합니다.

1. SCM에서 소스코드를 체크아웃받습니다.

2. dockerfile을 이용해 "jenkins-docker-pipeline/my-image"라는 이름으로 이미지를 빌드합니다. 

   Jenkinsfile에서 push 할 때 이미지 태그를 설정하므로 여기선 이미지 이름만 설정합니다.

3. DockerRegistry에 Credential을 이용해 이미지를 push 합니다. 

   여기서 앞서 정의한 BUILD_NUMBER가 사용되며 자동으로 latest 태그의 이미지도 함께 push 됩니다.

 

예를 들어 BUILD_NUMBER에 0.0.1을 입력하고 빌드하면 jenkins-docker-pipeline/my-image:0.0.1과 jenkins-docker-pipeline/my-image:latest가 push 됩니다.

 

 

 

 

 

 

반응형

+ Recent posts