Jenkins
- CI/CD를 위한 오픈 소스 도구로, 소프트웨어 개발 생명주기를 자동화함
- 빌드, 테스트, 배포 프로세스를 자동화하여 소프트웨어 품질과 개발 생산성을 높일 수 있음
- 다양한 플러그인을 지원하여 사용자가 필요에 맞게 플러그인을 통합하여 CI/CD 환경을 확장할 수 있음
다양한 플러그인을 사용하여 파이프라인을 구성하면 구성이 복잡해질 수 있고, 이에 따른 버전 호환성 및 보안 사항 등을 고려해야 하기 때문에 유지 보수에 어려움을 겪을 수 있음. 따라서 환경에 필요한 플러그인을 잘 선택하여 사용하는 것이 중요함.
Jenkins는 Java Runtime Environment에서 동작 한다!
Jenkins 동작 구조
- Master/Slave 구조로 동작
- Master는 controller라고 불리며, 작업 스케줄링/slave 관리 및 모니터링을 포함하여 다양한 작업 관리
- Slave는 agent라고 불리며, 실제 파이프라인 작업을 수행
SCM(Source Code Management)
- Jenkins는 코드가 보관되어 있는 저장소의 코드 변경사항을 감지하여 자동으로 파이프라인을 수행할 수 있음
- Git 저장소에는 소스 코드 뿐 아니라 Jenkins 스크립트 실행 시 필요한 'Jenkinsfile'과 Kubernetes 배포에 필요한 'Helm Chart'와 같은 파일들도 보관될 수 있음
CI(Continuous Integration)
- 파이프라인이 실행되면 Agent를 통해 파이프라인 스크립트에 정의된 작업이 실행됨
- ex) 소스코드 빌드, 코드 검증 테스트, 도커 이미지 빌드, 도커 이미지 검증 등
CD(Continuous Deployment)
- 파이프라인에서 정의한 배포 작업에 따라 애플리케이션은 쿠버네티스 환경에 배포됨
- 배포는 Jenkins가 아닌, 쿠버네티스 환경에서 널리 사용되는 ArgoCD와 같은 도구를 활용하여 수행될 수도 있음
Jenkins CI/CD 과정
- 로컬에서 개발자가 개발한후 공유 레포지토리에 커밋 및 푸시
- 젠킨스가 이를 인지하여 변경된 소스코드와 기존코드와 함께 빌드 및 테스트
- 빌드가 성공할 경우 빌드한 파일을 배포 서버로 전송
- 만약 빌드 및 테스트를 실패할 경우 로그를 남기고 종료
Jenkins의 대표적인 Plugins
- Credentials Plugin : 각종 리소스에 접근하기 위해서는 여러가지의 중요한 정보(key)들을 저장해주는 플러그인
- Git Plugin : jenkins에서 git 소스코드를 가져와서 빌드할수 있게 도와주는 플러그인
- Pipeline : 연속적인 작업들을 젠킨스에서 하나의 파이프라인(작업)으로 묶어서 관리할수 있게 만드는 플러그인
- Docker plugin, Docker Pipeline : Docker agent를 사용하고 jenkins에서 도커를 사용하기 위한 플러그인
Jenkins는 단지 서버이기 때문에 각종 리소스에 접근하기 위해서는 여러가지의 중요한 정보들
ex) AWS token, Git access Token, secret key, ssh등이
이 필요하고, 이러한 중요한 정보들을 저장해주는 플러그인이 Credentials Plugin!!
Jenkins Pipeline
- 연속적인 이벤트 혹은 Job의 그룹
- CI/CD 파이프라인을 젠킨스에 구현하기 위한 일련의 플러그인의 집합이자 구성
- Pipeline 작성 시 Declarative와 Scripted 2가지 작성 방식이 있음
Declarative방식이 Scripted방식보다 더 풍부한 구문 기능을 제공하며 간편하게 작성할수 있음!!
Jenkins Pipeline 주요 항목
- Pipeline
- 빌드, 테스트, 배포 단계를 포함하는 전체 빌드 프로세스를 정의
- 선언형 파이프라인구문의 핵심 부분
- Jenkinsfile의 시작 지점에 선언
- Node
- 스크립트형 파이프라인 구문의 핵심 부분
- Jenkinsfile의 시작 지점에 선언
- Stage
- 전체 파이프라인 단계를 통해 수행되는 작업의 하위 집합을 의미
- ex. jenkins 파이프라인을 빌드 -> 테스트 -> 배포라 한다면 빌드, 테스트, 배포가 각 Stage를 의미
- Step : 하나의 stage안에 작업을 정의하는 부분
선언형 파이프라인 문법
//Jenkinsfile
pipeline {
agent any //Agent Sections
stages { //Stages Sections
stage('Prepare') { //Steps
agent any
steps {
...
}
post { //Post Section
failure{
error "Fail Cloned Repository"
}
}
}
stage('Build') {
agent any
steps{
...
}
post{
failure{
error 'Fail Build'
}
}
}
}
}
Pipeline
- pipeline은 최상위 레벨이 되어야하며, { }으로 정의
- 파이프라인을 정의하기 위해서는 반드시 pipeline을 포함해야 함
- pipeline은 Section, Directives, Steps 또는 assignment 문으로만 구성
pipeline {
/* insert Declarative Pipeline here */
}
Section
1) agent
- 파이프라인 스크립트를 실행할 executor를 지정
- agent를 추가할 경우 Jenkins는 해당 agent를 설정
- any, none, label, node, docker, dockerfile, kubernetes를 파라미터로 포함할 수 있음
- agent는 pipeline의 최상위에 포함되어야 하며, agent가 none으로 작성되었을 경우 stage에 포함되어야 함
- agent none이 pipeline의 최상위에 정의되어 있을 경우 stage는 각각 agent를 포함해야 함
# docker
agent {
docker {
image 'myregistry.com/node'
label 'my-defined-label'
registryUrl 'https://myregistry.com/'
registryCredentialsId 'myPredefinedCredentialsInJenkins'
}
}
# dockerfile
agent {
dockerfile {
filename 'Dockerfile.build'
dir 'build'
label 'my-defined-label'
registryUrl 'https://myregistry.com/'
registryCredentialsId 'myPredefinedCredentialsInJenkins'
}
}
# agent가 적용 된 JenkinsFile Sample
pipeline {
agent none
stages {
stage('Example Build') {
agent { docker 'maven:3-alpine' }
steps {
echo 'Hello, Maven'
sh 'mvn --version'
}
}
stage('Example Test') {
agent { docker 'openjdk:8-jre' }
steps {
echo 'Hello, JDK'
sh 'java -version'
}
}
}
}
2) post
- 특정 스테이지 이전/이후에 실행될 condition 블록
- always, changed, fixed, regression, aborted, failure, success, unstable, unsuccessful, cleanup 등의 상태를 정의할 수 있음
- 일반적으로 post는 pipeline의 끝에 배치
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
post {
always {
echo 'I will always say Hello again!'
}
}
}
3) stages
- 하나 이상의 stage(어떤 일을 처리할것인가)에 대한 모음을 정의 (ex. git clone, build, test, devlop)
- pipeline 블록 안에서 한번만 실행 될 수 있음
- stages 내부에서는 여러 stage를 포함할 수 있음
4) steps
- stage 내부에서 실행되는 작업을 정의
pipeline {
agent any
stages {
stage('Prepare') {
steps {
echo 'prepare'
}
}
stage('Build') {
steps {
echo 'build'
}
}
stage('Check output') {
steps {
echo 'output check'
}
}
}
post {
success {
echo "Success"
}
failure {
echo "Failure"
}
always {
echo "Always"
}
}
}
Directives
파이프라인의 config 설정값
1) environment
- 파이프라인 혹은 스테이지 내부에서 쓰일 환경변수 정의
- environment 최상위에 정의할 경우 pipeline 모든 단계에 환경 변수가 적용
- stage 내부에 정의한 환경 변수는 해당 stage에서만 유효
- key-value 형태로 파이프라인 내부에서 사용할 환경 변수로 선언할 수 있음
pipeline {
agent any
environment {
CC = 'clang'
}
stages {
stage('Example') {
environment {
AN_ACCESS_KEY = credentials('my-prefined-secret-text')
}
steps {
sh 'printenv'
}
}
}
}
2) options
- 전체 파이프라인에 대해서 적용할 수 있는 기능들
- pipeline에서 한번만 정의 할 수 있음
pipeline {
agent any
options {
timeout(time: 1, unit: 'HOURS')
}
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
}
retry() : pipeline이 실패하면 몇 번 재시도를 할 지 정함
buildDiscarder() : 최근에 실행된 빌드의 console output과 artifacts를 몇 개를 유지할 지 지정
disableConcurrentBuilds() : 동시에 여러개의 빌드하는 것을 방지
disableResume() : Jenkins가 다시 시작했을 경우 자동으로 시작하는 것을 방지
timeout() : pipeline 빌드시에 timeout을 걸고, 만약 해당 시간을 초과한 경우 FlowInterruptedException을 발생시킴
parallelsIsAlwaysFailFast() : Parallel 스테이지중 하나가 실패하는 경우에는 다른 parallel 스테이지도 멈추고 해당 Build의 상태를 실패로 바꿈
3) parameters
- 파이프라인 실행시에 받을 파라미터
- string, text, booleanParam, choice, password 등을 정의할 수 있음
- parameters는 pipeline에서 한번만 정의할 수 있음
4) triggers
- 어떤 형태로 트리거 되는지 정의
- cron, pollSCM, upstream 등 여러 방식으로 트리거를 구성할 수 있음
5) tools
- 자동 설치나 Path에 추가할 도구를 정의
- agent none으로 지정된 경우 무시됨
- maven, jpk, gradle 지원
pipeline {
agent any
tools {
maven 'apache-maven-3.0.1'
}
stages {
stage('Example') {
steps {
sh 'mvn --version'
}
}
}
}
'DevOps' 카테고리의 다른 글
[Docker] Docker rootless 설치 (0) | 2024.03.21 |
---|---|
[Jenkins] Agent Node 추가 (0) | 2024.03.20 |
[Docker] Docker 정리 (0) | 2024.02.28 |
CI/CD(지속적 통합/배포) 정리 (0) | 2024.02.28 |
[Git] cherry-pick (0) | 2023.12.01 |