🎯 Jenkins?
Jenkins
는 소프트웨어 개발을 자동화하는 오픈소스 도구이다.
특히 CI/CD(지속적 통합/지속적 배포)를 구현하는데 사용된다.
개발자가 코드를 수정할 때마다 빌드 → 테스트 → 배포 과정을 자동화해주며,
쉽게 말해 "개발 -> 서버에 배포" 를 버튼(트리거) 한 번으로 끝내는 도구이다.Github 에서 발생하는 이벤트들을 기반으로 어떤 파이프 라인을 실행할 지 설정할 수 있으며, Github 외에도 웹훅/HTTP 호출만 보낼 수 있으면 언제든 젠킨스의 파이프 라인을 실행시킬 수 있다. 개발 환경 배포, 프로덕션 환경 배포, 온-프라미스 환경 배포 이렇게 각각의 환경이 존재하더라도 Pipeline 을 잘 구축하면 편리하고 손쉽게 배포할 수 있다.
🎯 시나리오
개발 환경, 프로덕션 환경, 온-프라미스 환경 이렇게 3가지의 환경을 구성하고 트리거로 Github-Webhook 을 사용한다. 개발 환경은 개발자들이 개발한 소스 코드를 병합하고 프로덕션 전의 환경을 의미하며 프로덕션 환경은 실 사용자들이 사용할 환경이다. 마지막으로 릴리즈 환경은 온-프라미스에 설치한다는 가정을 하여 프로젝트를 zip 파일로 압축 후 Slack 에 전송해주는 구성이다.
다시 요약하면,
Github Webhook 을 통해 젠킨스의 트리거를 나눈다.
dev-브랜치
병합시DEV_pipeline
실행
prod-브랜치
병합시PROD_pipeline
실행
release
발생시RELEASE_pipeline
실행
위의 그림과 같이 각각의 파이프 라인은 다음과 같은 기능을 수행한다.
DEV_pipeline
: 개발 서버에 프로젝트 배포
PROD_pipeline
: AWS 서버에 프로젝트 배포
RELEASE_pipeline
: 프로젝트를 빌드 후 압축 파일로 만들어 Slack 에 전송
🎯 Github Webhook
Github 저장소에서 이벤트가 발생했을 때 외부 서버로 알림을 보내주는 기능이다.
Jenkins
뿐만 아니라 이벤트가 발생했을 때 다양하게 활용할 수 있다. push
, pull
, release
issue
등과 같은 이벤트들을 통해 핸들링할 수 있으며 전송 body 를 참고하면 다양한 값들이 들어 있는 것을 확인할 수 있다.예를 들어
my-server-api
레파지토리에서 dev
브랜치에 병합이 발생한 경우 Jenkins
파이프라인을 실행하라는 트리거가 될 수 있다. (Jenkins
로 HTTP POST 요청을 보내고 결과적으로 Jenkins
의 파이프라인을 트리거하게 됨.)dev
와 prod
는 병합 이벤트가 발생할 때마다 배포 트리거가 동작하도록 구성할 예정인데, 단순 병합(배포를 원치 않는 경우)을 위해 트리거 조건에 label 을 추가해준다. Webhook 바디에 label 정보도 받을 수 있으며 특정 label 과 함께 이벤트가 발생할 때 트리거 조건으로 사용할 수 있다. label 은 기본 제공되는 것외에도 커스터마이징할 수 있다.🎯 .jenkinspipeline
파이프 라인은
Jenkins
가 수행할 작업 순서를 의미하는데 .jenkinspipeline
파일을 통해 사용자는 상황에 알맞게 파이프 라인을 정의할 수 있다. 예를 들어 빌드 → 테스트 → 도커 이미지 → 컨테이너 실행 등이 해당된다. Jenkins
내부에서 파이프라인 스크립트를 직접 작성할 수 있지만, 코드로 관리할 경우 버전 추적, 롤백 등 더 유용하다. 설치된 Jenkins
가 삭제된 경우에도 스크립트만 있으면 금방 다시 구축할 수 있다.🎯 Git SCM
원격 레파지토리에서 파이프라인 스크립트를 관리한다면,
Jenkins
가 접근할 수 있도록 권한을 설정해주어야 스크립트를 가져올 수 있다. Jenksin
는 해당 레파지토리에 특정 파일 xxx.jenkinsfile
을 읽어 파이프라인을 수행하게 된다.🎯 Production 과 Develop
개발 환경과 운영 환경을 구분하는 것은 중요하다. 운영 환경은 실제 사용자가 접속하여 사용할 환경이므로 보안과 안정성이 중요하고 각 개발자들의 결과물을 통합하는 과정이 필요하므로 개발 환경 역시 중요하다. 가능한 운영 환경과 가장 유사한 환경으로 개발 환경을 구축해 놓고 기능들을 테스트하는 것을 선호한다.
🎯 Window 와 Linux
배포할 서버의 운영체제가 중요하다. 대부분 배포 서버는 Linux 이며 개발 환경은 사용자에 따라 Window, Mac 등을 사용하는데 현재 시나리오에서는 zip 파일은 Window 에 Prod 환경은 Linux 개발 환경은 macOS 라고 가정한다.
위의 내용을 다시 총 정리한다.
- 개발자는 깃허브에 Push, Merge, Releases 등을 통해 이벤트 발생
- 발생된 이벤트를 통해 Webhook 수행
- 젠킨스는 외부 저장소에 저장된
.jenkinsfile
을 읽어온다.
.jenkinsfile
에 작성된 파이프 라인을 수행한다