danbibibi
article thumbnail
Published 2024. 2. 29. 00:25
[Jenkins] Jenkins 정리 DevOps

1. Jenkins

  • CI/CD를 위한 오픈 소스 도구로, 소프트웨어 개발 생명주기를 자동화함
  • 빌드, 테스트, 배포 프로세스를 자동화하여 소프트웨어 품질과 개발 생산성을 높일 수 있음
  • 다양한 플러그인을 지원하여 사용자가 필요에 맞게 플러그인을 통합하여 CI/CD 환경을 확장할 수 있음

다양한 플러그인을 사용하여 파이프라인을 구성하면 구성이 복잡해질 수 있고, 이에 따른 버전 호환성 및 보안 사항 등을 고려해야 하기 때문에 유지 보수에 어려움을 겪을 수 있음. 따라서 환경에 필요한 플러그인을 잘 선택하여 사용하는 것이 중요함.
Jenkins는 Java Runtime Environment에서 동작 한다!

 

1.1. Jenkins 동작 구조

  • Master/Slave 구조로 동작
  • Mastercontroller라고 불리며, 작업 스케줄링/slave 관리 및 모니터링을 포함하여 다양한 작업 관리
  • Slaveagent라고 불리며, 실제 파이프라인 작업을 수행


SCM(Source Code Management)
- Jenkins는 코드가 보관되어 있는 저장소의 코드 변경사항을 감지하여 자동으로 파이프라인을 수행할 수 있음
- Git 저장소에는 소스 코드 뿐 아니라 Jenkins 스크립트 실행 시 필요한 'Jenkinsfile'과 Kubernetes 배포에 필요한 'Helm Chart'와 같은 파일들도 보관될 수 있음

CI(Continuous Integration)
- 파이프라인이 실행되면 Agent를 통해 파이프라인 스크립트에 정의된 작업이 실행됨
- ex) 소스코드 빌드, 코드 검증 테스트, 도커 이미지 빌드, 도커 이미지 검증 등

CD(Continuous Deployment)
- 파이프라인에서 정의한 배포 작업에 따라 애플리케이션은 쿠버네티스 환경에 배포됨
- 배포는 Jenkins가 아닌, 쿠버네티스 환경에서 널리 사용되는 ArgoCD와 같은 도구를 활용하여 수행될 수도 있음

 

1.2. Jenkins CI/CD 과정

  1. 로컬에서 개발자가 개발한후 공유 레포지토리에 커밋 및 푸시
  2. 젠킨스가 이를 인지하여 변경된 소스코드와 기존코드와 함께 빌드 및 테스트
  3. 빌드가 성공할 경우 빌드한 파일을 배포 서버로 전송
  4. 만약 빌드 및 테스트를 실패할 경우 로그를 남기고 종료

 

1.3. 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!!

 

1.4. Jenkins Pipeline

  • 연속적인 이벤트 혹은 Job의 그룹
  • CI/CD 파이프라인을 젠킨스에 구현하기 위한 일련의 플러그인의 집합이자 구성
  • Pipeline 작성 시 DeclarativeScripted 2가지 작성 방식이 있음
Declarative방식이 Scripted방식보다 더 풍부한 구문 기능을 제공하며 간편하게 작성할수 있음!!

 

1.5. Jenkins Pipeline 주요 항목

  1. Pipeline
    • 빌드, 테스트, 배포 단계를 포함하는 전체 빌드 프로세스를 정의
    • 선언형 파이프라인구문의 핵심 부분
    • Jenkinsfile의 시작 지점에 선언
  2. Node
    • 스크립트형 파이프라인 구문의 핵심 부분
    • Jenkinsfile의 시작 지점에 선언
  3. Stage
    • 전체 파이프라인 단계를 통해 수행되는 작업의 하위 집합을 의미
    • ex. jenkins 파이프라인을 빌드 -> 테스트 -> 배포라 한다면 빌드, 테스트, 배포가 각 Stage를 의미
  4. Step : 하나의 stage안에 작업을 정의하는 부분

 

1.6. 선언형 파이프라인 문법

<bash />
//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 Syntax

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

www.jenkins.io

 

1.6.1. Pipeline

  • pipeline은 최상위 레벨이 되어야하며, { }으로 정의
  • 파이프라인을 정의하기 위해서는 반드시 pipeline을 포함해야 함 
  • pipeline은 Section, Directives, Steps 또는 assignment 문으로만 구성
<shell />
pipeline { /* insert Declarative Pipeline here */ }

 

1.6.2. Section

1) agent

  • 파이프라인 스크립트를 실행할 executor를 지정
  • agent를 추가할 경우 Jenkins는 해당 agent를 설정
  • any, none, label, node, docker, dockerfile, kubernetes를 파라미터로 포함할 수 있음
  •  agent는 pipeline의 최상위에 포함되어야 하며, agent가 none으로 작성되었을 경우 stage에 포함되어야 함
  •  agent none이 pipeline의 최상위에 정의되어 있을 경우 stage는 각각 agent를 포함해야 함
<bash />
# 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의 끝에 배치
<bash />
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 내부에서 실행되는 작업을 정의
<bash />
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" } } }

 

1.6.3. Directives

파이프라인의 config 설정값

 

1) environment

  • 파이프라인 혹은 스테이지 내부에서 쓰일  환경변수 정의
    • environment 최상위에 정의할 경우 pipeline 모든 단계에 환경 변수가 적용
    • stage 내부에 정의한 환경 변수는 해당 stage에서만 유효
  • key-value 형태로 파이프라인 내부에서 사용할 환경 변수로 선언할 수 있음
<bash />
pipeline { agent any environment { CC = 'clang' } stages { stage('Example') { environment { AN_ACCESS_KEY = credentials('my-prefined-secret-text') } steps { sh 'printenv' } } } }

 

2) options

  • 전체 파이프라인에 대해서 적용할 수 있는 기능들
  • pipeline에서 한번만 정의 할 수 있음
<bash />
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의 상태를 실패로 바꿈
 

Pipeline Syntax

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

www.jenkins.io

 

3) parameters

  • 파이프라인 실행시에 받을 파라미터
  • string, text, booleanParam, choice, password 등을 정의할 수 있음
  • parameters는 pipeline에서 한번만 정의할 수 있음

 

4) triggers

  • 어떤 형태로 트리거 되는지 정의
  • cron, pollSCM, upstream 등 여러 방식으로 트리거를 구성할 수 있음

 

5) tools

  • 자동 설치나 Path에 추가할 도구를 정의
  • agent none으로 지정된 경우 무시됨
  • maven, jpk, gradle 지원
<bash />
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
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로