Jenkins 따라잡기 [1] - Jenkins란?

김진성·2021년 10월 12일
4

Jenkins

목록 보기
1/2
post-custom-banner

Jenkins란?

많은 IT 영역에서 DevOps의 역할이 점점 커지고 있는데 그 중심에 있는 Jenkins에 대해서 알아보도록 하겠다. Jenkins는 흔히 CI 툴로 많이 사용되었지만 요새는 점점 CD 영역으로 확대되면서 CI/CD 전반적인 흐름을 관장하는 툴로 성장하게 되었다. 기본적인 언어는 Java 베이스로 Spring 서버를 만들고 연동하기에는 좋은 툴이다.

Jenkins는 "나이틀리 빌드(Nightly Build)를 망가뜨리지 말라!" 는 소프트웨어 개발 조직의 기본규칙에서 나왔다. Jenkins가 나오기 전에는 코드를 커밋하기 전에 로컬 머신 상에서 조심스럽고 성공적으로 빌드해 테스트 하는 것으로 나이틀리 빌드를 망가뜨리지 않았다. 개발 작업에서 빌드를 계속 깨지 않고 해야했기에 제한 요소가 많았지만 Jenkins는 이러한 제한을 깨뜨리고 지금까지도 잘 사용되고 있다.

Jenkins 사용처

  1. 어플리케이션 및 인프라에서의 지속적인 통합(CI)
  2. Jenkins 파이프라인을 통한 서로 다른 환경에 어플리케이션을 배포하도록 지속적으로 전달(CD)
  3. 인프라 요소 배포 및 관리
  4. Jenkins 작업 운용 배치
  5. 백업/정리/실행과 같은 운영 실행

Jenkins 구조

Jenkins는 3가지의 중요한 요소들로 구성되어 있다.

  1. Jenkins Master Node
  2. Jenkins Agent Nodes/Clouds
  3. Jenkins Web Interface

Jenkins Master (Server)

Jenkins 서버이자 Master node는 Jenkins Pipeline으로 정의된 모든 흐름을 관장하는 컨트롤 서버라고 할 수 있다. Jenkins Slave들에게 각각의 할 일을 정해주고 분배한다.

Jenkins 작업

추후에 알게 될 Jenkins 파이프라인에 대해서 설명을 하겠지만 Jenkins는 아래와 같은 작업을 진행한다.

  1. Git에서 푸시되어 받은 자료를 Git Hook을 통해 정기적으로 Jenkins가 확인함
  2. Jenkins 테스트 과정을 다양한 Jenkins Slave에서 실행시키면서 독자적인 테스트 환경을 만듬
  3. 따라서, Jenkins Slave를 통해 얻은 결과물을 Jenkins Master가 받아 테스트를 보고함

Jenkins 버전이 업그레이드 되면서 Slave -> Agent라는 명칭으로 변경되었다.

Jenkins 플러그인

플러그인은 우리가 VSC를 쓸 때도 알겠지만 가볍게 다른 개발 툴과 연동하기에는 매우 좋다. Jenkins에도 플러그인이 있는데 대표적으로 AWS와 연동할 수 있는 Plugin이 존재한다. 우리가 S3 버킷을 저장소로 두고 Jenkins와 연동을 한다고 하면 단순히 AWS CLI 플러그인만 연동하면 끝이다.

예시) Jenkins에 AWS S3 연동

s3Upload(file:'file.txt', bucket:'my-bucket', path:'path/to/target/file.txt')
s3Upload(file:'someFolder', bucket:'my-bucket', path:'path/to/targetFolder/')

연동한 플러그인 파일들은 /var/lib/jenkins 폴더 아래에서 확인할 수 있다.

Jenkins 전역 보안(Global Security)

Jenkins는 주로 3가지 타입의 인증 방법이 존재한다.

  1. Jenkins 자체 유저 DB : Jenkins 자체적으로 운영되는 DB 내 유저 정보로 XML 파일로 구성됨
  2. LDAP 통합 : LDAP에다가 Server/User/Group/Manager 정보들을 기입해 사용
  3. SSO(Single Sign-On) 사용 : 보안 보장 마크업 언어(SAML)을 활용해 구글 클라우드나 Azure와 같은 사용자 인증 정보로 로그인함

Jenkins 자격(Credentials)

우리가 Jenkins 파이프라인을 구축할 때 다른 클라우드 계정, 서버, DB에 연결하는 경우가 있다. 그런 경우 연결 시 보안에 필요한 정보들을 Jenkins에 저장할 수 있다. 아래의 중요 정보들은 $JENKINS_HOME/secrets 폴더에 존재해 추후 백업도 할 수 있다.

  1. Secret text
  2. Username & Password
  3. SSH keys

Jenkins Nodes/Clouds

Jenkins는 다수의 Agent Node(Linux/Windows)나 Clouds(Docker, Kybernetes)를 두고 작업을 진행한다.

Jenkins 전역 세팅(Global Settings)

Jenkins Global Configuration을 활용해 우리가 전에 사용한 플러그인이나 정보들을 가져올 수 있다.

Jenkins 로그(Logs)

Jenkins는 작업 로그/플러그인 로그/웹훅 로그 등의 정보를 포함한 모든 서버의 정보를 제공해준다.

Jenkins Agent

Jenkins Agent는 Jenkins Master Node가 작업을 시켰을 때 일을 하는 Node라고 볼 수 있다. Master Node에서 작업을 발생시키면 실제 작업이 Agent Node위에서 작동되지만 Agent 없이 Master 만으로도 작업을 진행할 수 있다. 그러나 이 경우 작업들이 서로 겹치며 충돌이 발생될 수 있기에 권장하는 방법은 아니다.

Jenkins Agent 유형

  1. Agent Nodes : 윈도우/리눅스와 같은 서버로 개별 Script를 작성해 서버 위에서 Jenkins 실행과 정지를 조절한다. 보통 밤이나 주말에 작업이 진행된다.
  2. Agent Clouds : Dynamic Agent라고 불리며 우리가 작업을 하고 컨테이너로 배포하고 완성하는 작업에 사용되고 인프라에 따라 사용량이 지불되기에 돈을 아낄 수 있다는 장점이 있다.

Jenkins Master-agent 연결(Connectivity)

Master와 Agent를 연결하는 방법에는 두가지 방법이 있다.

  1. SSH : SSH 프로토콜을 사용해서 Agent에 연결하는 것으로 Master에서 연결이 시작되고 보통 Master와 Agent 간의 22 port를 넘어 연결한다.
  2. JNPL 방법 : JNPL(Java Network Launch Protocol)을 50000 포트에서 사용해 Agent로 부터 연결하는 작업으로 미리 Master 방화벽을 열어놓아야 가능하다.

Jenkins Data

Jenkins Data는 주로 /var/lib/jenkins에 저장된다. 작업/플러그인 config 파일이나 보안 및 노드 정보를 담고 있으며 Jenkins로의 정보 이전이 쉽게 설계 되어 있다.

Jenkins Web Interface

Jenkins 2.0은 "Jenkins Blue Ocean"으로 불리는 웹 인터페이스를 제공해준다.

지금까지 Jenkins의 개념과 구조에 대해서 알아봤다. 다음에는 실제로 실습을 해보면서 Jenkins를 익혀보도록 하겠다.

profile
https://medium.com/@jinsung1048 미디엄으로 이전하였습니다.
post-custom-banner

0개의 댓글