많은 IT 영역에서 DevOps의 역할이 점점 커지고 있는데 그 중심에 있는 Jenkins에 대해서 알아보도록 하겠다. Jenkins는 흔히 CI 툴로 많이 사용되었지만 요새는 점점 CD 영역으로 확대되면서 CI/CD 전반적인 흐름을 관장하는 툴로 성장하게 되었다. 기본적인 언어는 Java 베이스로 Spring 서버를 만들고 연동하기에는 좋은 툴이다.
Jenkins는 "나이틀리 빌드(Nightly Build)를 망가뜨리지 말라!" 는 소프트웨어 개발 조직의 기본규칙에서 나왔다. Jenkins가 나오기 전에는 코드를 커밋하기 전에 로컬 머신 상에서 조심스럽고 성공적으로 빌드해 테스트 하는 것으로 나이틀리 빌드를 망가뜨리지 않았다. 개발 작업에서 빌드를 계속 깨지 않고 해야했기에 제한 요소가 많았지만 Jenkins는 이러한 제한을 깨뜨리고 지금까지도 잘 사용되고 있다.
Jenkins는 3가지의 중요한 요소들로 구성되어 있다.
Jenkins 서버이자 Master node는 Jenkins Pipeline으로 정의된 모든 흐름을 관장하는 컨트롤 서버라고 할 수 있다. Jenkins Slave들에게 각각의 할 일을 정해주고 분배한다.
추후에 알게 될 Jenkins 파이프라인에 대해서 설명을 하겠지만 Jenkins는 아래와 같은 작업을 진행한다.
Jenkins 버전이 업그레이드 되면서 Slave -> Agent라는 명칭으로 변경되었다.
플러그인은 우리가 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는 주로 3가지 타입의 인증 방법이 존재한다.
우리가 Jenkins 파이프라인을 구축할 때 다른 클라우드 계정, 서버, DB에 연결하는 경우가 있다. 그런 경우 연결 시 보안에 필요한 정보들을 Jenkins에 저장할 수 있다. 아래의 중요 정보들은 $JENKINS_HOME/secrets 폴더에 존재해 추후 백업도 할 수 있다.
Jenkins는 다수의 Agent Node(Linux/Windows)나 Clouds(Docker, Kybernetes)를 두고 작업을 진행한다.
Jenkins Global Configuration을 활용해 우리가 전에 사용한 플러그인이나 정보들을 가져올 수 있다.
Jenkins는 작업 로그/플러그인 로그/웹훅 로그 등의 정보를 포함한 모든 서버의 정보를 제공해준다.
Jenkins Agent는 Jenkins Master Node가 작업을 시켰을 때 일을 하는 Node라고 볼 수 있다. Master Node에서 작업을 발생시키면 실제 작업이 Agent Node위에서 작동되지만 Agent 없이 Master 만으로도 작업을 진행할 수 있다. 그러나 이 경우 작업들이 서로 겹치며 충돌이 발생될 수 있기에 권장하는 방법은 아니다.
Master와 Agent를 연결하는 방법에는 두가지 방법이 있다.
Jenkins Data는 주로 /var/lib/jenkins에 저장된다. 작업/플러그인 config 파일이나 보안 및 노드 정보를 담고 있으며 Jenkins로의 정보 이전이 쉽게 설계 되어 있다.
Jenkins 2.0은 "Jenkins Blue Ocean"으로 불리는 웹 인터페이스를 제공해준다.
지금까지 Jenkins의 개념과 구조에 대해서 알아봤다. 다음에는 실제로 실습을 해보면서 Jenkins를 익혀보도록 하겠다.