본문 바로가기

⭐ CICD/Jenkins

Jenkins을 활용하여 Docker 이미지 빌드하기

1. Docker를 설치

2021.04.07 - [AWS/Docker (도커)] - Docker 설치(1부)

 

Docker 설치(1부)

- 이전 설치에서 알아본 jupyter에서 터미널을 연다. - 도커는 하드디스크 용량을 많이 사용할 수 있으므로 df -h를 확인하여 설치전에 용량을 확보한다. - sudo apt update를 입력하여 최신버전으로 유

may9noy.tistory.com

2. Jenkins 설치

2021.11.17 - [CI | CD] - Jenkins 설치

 

Jenkins 설치

# Jenkins을 설치하는 과정에 대해서 알아보자. Jenkins 이란 Jenkins는 Java로 빌드 된 오픈 소스 CI (Continuous Integration) 및 CD (Continuous Delivery) 도구이며, Jenkins는 기본적으로 소프트웨어 프로젝..

may9noy.tistory.com

3. Git-Hub 저장소 생성

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

2021.11.17 - [CI | CD] - Git Hub와 로컬 폴더를 연동하여 파일 올리기

 

Git Hub와 로컬 폴더를 연동하여 파일 올리기

1. 새로운 폴더를 생성한다. 2. 내 컴퓨터에 원격 저장소 가져오기 이제 Github 웹사이트에서 생성했던 저장소를 내 컴퓨터로 가져와봅시다. 로컬 저장소를 만들 디렉토리로 이동한 후 마우스 우클

may9noy.tistory.com

- 위의 모든 작업을 완료 후 jenkins으로 돌아가 다시 진행 하자.

4. 빌드 환경 구성

- jenkins에서 docker 이미지를 빌드하기 위해서는 별도의 플러그인을 설치 해야 합니다.
- jenkins 플러그인 설치 페이지로 이동 후 docker pipeline 플러그인을 설치 합니다.

- 플러그인 설치 화면 아래와 같이 모든것이 성공으로 확인되어야 정상 작동이 가능하다.

- 다음은 Docker Registry의 인증 정보를 등록합니다.
- Global Credential 페이지로 이동 후 Add Credentials를 클릭해 인증 정보를 등록합시다.

- Add Credentials를 클릭하여 신규 계정을 생성 합니다.

- 여기서 주의 할점은, 
Username : dockerhub 의 id
Password : dockerhub 의 패스워드
ID : Jenkinsfile 에서 설정할 CREDENTIAL ID

- 설정 후 계정을 성생 합니다.

5. git 사용 설정

- git을 이용하기 위한 설정을 해보겠습니다.
- 우선 Jenkins가 설치된 서버에 git이 설치되어 있지 않다면 git을 설치합니다.

sudo apt-get install git

etcsw@etcsw-Virtual-Machine:~$ sudo apt-get install git
[sudo] etcsw의 암호:
패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다
상태 정보를 읽는 중입니다... 완료
패키지 git는 이미 최신 버전입니다 (1:2.25.1-1ubuntu3.2).
git 패키지는 수동설치로 지정합니다.
0개 업그레이드, 0개 새로 설치, 0개 제거 및 71개 업그레이드 안 함.

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

git --exec-path

etcsw@etcsw-Virtual-Machine:~$ git --exec-path
/usr/lib/git-core

 - 다음으로, Jenkins에서 Global tool configuration 페이지로 이동해 Git 항목을 위의 경로로 수정해 줍니다.

- 다음으로 도커 사용 권한입니다.
- 기본적으로 Jenkins에서 바로 docker.sock를 사용할 순 없습니다. 그래서 아래와 같이 사용 권한을 주어야 합니다.

sudo chmod 666 /var/run/docker.sock

6. Jenkins 아이템 생성 및 빌드 수행

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

- 저장 후 다음 화면으로 이동하면 세부 옵션을 설정할 수 있는 화면이 나옵니다.
- 여기서, "이 빌드는 매개변수가 있습니다" 를 체크하면, 하단에 매개변수를 넣을수 있는 추가 화면이 나옵니다. 

- 매개변수 추가 클릭 > String Parameter를 클릭하여 파라미터를 추가 합니다.

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

- 파이프라인 탭으로 이동하여, 설정을 진행 합니다.
- "Pipeline script from SCM"을 선택, SCM은 git을 선택 후 리포지토리 주소를 입력하면 됩니다. 해당 리포지토리 내의 "Jenkinsfile"을 파이프라인 스크립트로 사용하겠다는 의미 입니다.
- 저장 후 다음으로 넘어 갑니다.

<소스코드 설명>

- dockerfile

FROM php:5-apache

- Jenkinsfile

node {
  stage('========== Clone repository ==========') {
    checkout scm
  }
  stage('========== Build image ==========') {
    app = docker.build("may9noy/php-apache") # 저장소
  }
  stage('========== Push image ==========') {
    docker.withRegistry('https://registry.hub.docker.com', 'may9noy') { # Jenkins Credential 정보
      app.push("${env.BUILD_NUMBER}") # 빌드 번호
      app.push("latest") # 태그 정보
    }
  }
}

파이프라인의 동작 설명
1. SCM에서 소스코드를 체크아웃받습니다.
2. dockerfile을 이용해 "may9noy/php-apache"라는 이름으로 도커 허브에 이미지를 빌드합니다. 
Jenkinsfile에서 push 할 때 이미지 태그를 설정하므로 여기선 이미지 이름만 설정합니다.
3. DockerRegistry에 Credential을 이용해 이미지를 push 합니다. 
여기서 앞서 정의한 BUILD_NUMBER가 사용되며 자동으로 latest 태그의 이미지도 함께 push 됩니다.
예를 들어 BUILD_NUMBER에 0.0.1을 입력하고 빌드하면 may9noy/php-apache:0.0.1과 may9noy/php-apache:latest가 push 됩니다.

# 빌드중인 모습

- Stage View에서 본 빌드화면

- 최종적으로 빌드하는데 24초가 걸렸으며, docker hub에 이미지가 정상적으로 생성된것을 확인 할 수 있다.

- 도커 허브 이미지 생성 확인

# 마지막으로 위의 작업을 그림으로 정리해 보면, 아래와 같다.

1. 사용자가 젠킨슨으로 이미지 빌드를 수행하도록 요청
2. 젠킨슨은 이미 구성된 파이프라인과 Jenkinsfile 에 정의된 내용으로 이미지 빌드 및 푸쉬를 수행
3. Docker hub는 앞에서 푸쉬된 이미지를 저장
4. 저장된 이미지를 사용자는 kubernetes 및 docker를 사용하여 서비스 가능

- 지금까지 Jenkins을 활용한 Docker image 빌드에 대해서 알아 보았다.
- CI/CD 파이프라인 기술들을 하나하나씩 익혀보자.

- 끝 -