본문 바로가기
DevOps/CI.CD

Jenkins 소개 및 Kubernetes에 설치

by 비어원 2023. 11. 7.
728x90

Jenkins

Jenkins는 소프트웨어 빌드, 테스트 및 배포와 관련된 모든 종류의 작업을 자동화 하는 데 사용하는 독립형 오픈소스 자동화 서버이다. 보통은 Jenkins를 CI / CD 도구로 잘 알려져 있으며, 회사와 같이 여러 조직에서 사용하기 좋다.

 

2023.11.04 - [DevOps/CI.CD] - CI / CD란 무엇일까?

 

CI / CD란 무엇일까?

CI / CD 개발자가 애플리케이션을 개발하고나면 애플리케이션을 실제 서버로 배포해야 한다. 보통 배포를 할 때는 애플리케이션을 빌드하고, 작성한 테스트코드를 돌려서 테스트를 진행한 후 모

beer1.tistory.com

 

Jenkins 기능

 

Jenkins의 기능은 여러가지가 있다.

  • Jenkins Job을 사용하여 스크립트 실행
  • Jenkins Job 시각화 (성공 / 실패 / 로그 등)
  • Job Scheduling
  • Git과 같은 SCM (Source code management) 과의 연동
  • 시크릿 데이터 저장소 제공
  • CI / CD 파이프라인 작성 시 필요한 여러 도구에 대한 플러그인 제공
  • Job을 실행시키는 추가 에이전트 관리

 

설치 (on K8S)

Jenkins는 Linux, Mac OS, Docker, Kubernetes 등 다양한 환경에서 Jenkins를 설치할 수 있도록 환경별로 설치 방법을 제공해주고 있다. 나는 쿠버네티스를 좋아하기 때문에 쿠버네티스 환경에서 Helm을 사용하여 Jenkins를 설치해보겠다.

 

나머지 방식은 공식 홈페이지를 참고해보자.

https://www.jenkins.io/doc/book/installing/

 

 

Kubernetes

Jenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their software

www.jenkins.io

 

helm repo 추가

일단 Jenkins 차트가 저장된 레포지토리를 등록해야 한다.

$ helm repo add jenkinsci https://charts.jenkins.io
$ helm repo update

 

values.yaml 받아오기

그리고 기본으로 제공하는 values.yaml 파일을 다운로드 받은 후 values.yaml을 구성하자. --set 옵션으로 설정을 추가하는 방법도 좋지만 values.yaml 파일을 저장하여 구성하는 것이 변경 관리에 좋고, 잘 작성된 차트의 values.yaml 파일 안에는 주석으로 파라미터에 대한 설명도 같이 기입되어 있어서 커스터마이징하기 좋다.

$ helm show values jenkinsci/jenkins > values.yaml

 

values.yaml 구성하기

helm으로 Jenkins를 설치하기 전에 values.yaml을 구성하여 ingress와 Persistence Volume을 환경에 맞게 설정해야 한다.

controller:
  ingress:
    enabled: true 
    annotations:
      kubernetes.io/ingress.class: "nginx"
    hostName: jenkins.beer1.com

persistence:
  enabled: true
  existingClaim: jenkins-local # Static provisioning
  # storageClass: ${storage-class-name} # Dynamic provisioning
  size: "8Gi"
  • controller.ingress.hostName: ingress를 사용하는 경우 접근할 호스트 이름을 명시한다.
  • persistence.existingClaim: Static provisioning 방식으로, 이미 만들어놓은 PVC가 있다면 해당 PVC 이름을 넣어주면 된다.
  • persistence.storageClass: Dynamic provisioning 방식으로, 연동할 스토리지 프로바이더가 있다면 StorageClass를 생성한 후 persistence.storageClass에 해당 스토리지 클래스 이름을 넣어서 동적으로 프로비저닝 하면 된다.

 

helm install

Persistence Volume과 Ingress 설정을 마쳤다면 helm install 명령어로 젠킨스를 설치하자.

$ helm install jenkins jenkinsci/jenkins -f jenkins/values.yaml -n jenkins

 

Jenkins 접속

Ingress에 설정한 호스트로 Jenkins에 접근을 하면 로그인 창이 뜨는데 기본적으로는 계정은 admin이고 비밀번호는 시크릿에 저장된 것을 사용하면 된다.

$ kubectl -n jenkins get secret jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 -d

 

Jenkins Job 생성하기

Jenkins를 생성하였으면 먼저 Jenkins Job을 간단하게 생성해보자. Job은 Jenkins에서 실행하는 작업의 단위이다. Job에서는 스크립트를 등록할 수 있으며, Job을 실행하는 것은 Job에 등록된 스크립트를 실행하는 것과 같다.

 

일단 New Item 버튼을 눌러서 Freestyle Job을 생성해보자.

  • Freestyle project를 선택하자.

 

  • Description을 적절히 넣어서 해당 Job이 어떤 역할을 하는지 적어두자.
  • Jenkins는 잡 실행 결과(성공/실패, 로그 등)를 저장해놓는데 Discard old builds 옵션은 실행 결과를 언제까지 저장할지 설정할 수 있다.
    • Days to keep builds는 날짜 기준으로 빌드를 저장할 때 사용한다. 현재 기준으로 몇 일 전 까지의 실행 결과를 저장한다.
    • Max # of builds to keep은 최근 N개의 실행 결과를 저장하고 나머지는 지우는 옵션이다.

 

  • Source Code Management를 Git으로 하면 Github에 저장된 스크립트를 불러올 수 있다. 이 옵션은 파이프라인을 설명할 때 다루겠다.
  • 잡에 쉘 스크립트를 작성하기 위해서는 Build StepsExecute shell으로 선택하면 쉘 스크립트를 입력하는 칸이 뜬다.

 

  • Command 하위에 실행할 쉘 스크립트를 기입하면 된다.

 

일단 Save 버튼을 누르면 잡이 생성된다.

 

Job 실행하기

일단 생성된 Job의 이름을 클릭하면 Job의 상태를 보거나 설정을 보거나 실행할 수 있는 화면이 뜬다. 여기서 Build Now를 클릭하면 Job이 실행된다.

 

Job이 실행되면 아래 화면과 같이 #1번 빌드가 히스토리에 쌓인다. 실행 중일 때는 #1은 파란색, 실행 완료되고 정상 종료되는 경우 화면과 같이 초록색으로 표시된다.

 

그리고 Job이 실행되면 Job에 설정한 스크립트를 실행시킬 Jenkins agent가 Pod형태로 생성되고 해당 Pod에서 Job 스크립트가 실행된다.

 

여기서 실행되는 파드의 컨테이너 이미지는 Helm chart에서 구성 가능하다. 기본적으로는 agent.image 에 설정된 이미지를 사용하여 agent를 띄운다. Job마다 서로 다른 Agent를 실행시키도록 구성할 수도 있다.

 

Job 실행 결과 확인하기

Job 히스토리에 #1 버튼을 클릭하면 빌드의 상태와 로그 등을 확인할 수 있다.

 

Console Output을 클릭하면 Job 실행 로그를 확인할 수 있다.

  • Job 실행은 최초에는 jenkins-0 (Jenkins Controller)에서 실행하고 Controller에서 Agent Pod를 실행시킨다.
  • Agent Pod가 실행되면 Job에서 구성한 스크립트를 실행한다.

 

마무리

Jenkins를 설치하는 방법과 간단한 Freestyle Job을 생성하여 스크립트를 실행시키는 방법에 대해 알아보았다. 그런데 아직까지 CI / CD를 구성하지는 않았다. Jenkins를 설치한다고 해서 CI / CD를 바로 구성할 수 있는 것은 아니고, Pipeline 이라는 것을 생성하여 Pipeline 안에 빌드, 테스트, 패키징, 배포 단계를 각각의 Step으로 쪼개어 스크립트를 직접 개발해야 CI / CD를 구성하는 것이 된다.

 

추후에는 Jenkins Pipeline을 구축하는 방법과 Github과 연동하는 방법, 그리고 Job에 Webhook을 설정하는 방법 등을 다뤄서 본격적으로 Jenkins를 활용하는 방법에 대해 글을 작성할 예정이다.

 

 

728x90

댓글