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

Jenkins

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

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

 

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와 같은 도구를 활용하여 수행될 수도 있음

 

Jenkins CI/CD 과정

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

 

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 작성 시 DeclarativeScripted 2가지 작성 방식이 있음
Declarative방식이 Scripted방식보다 더 풍부한 구문 기능을 제공하며 간편하게 작성할수 있음!!

 

Jenkins Pipeline 주요 항목

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

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

www.jenkins.io

 

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의 상태를 실패로 바꿈
 

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 지원
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

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