Jenkins의 개념

구본식·2023년 1월 11일
0
post-thumbnail

Jenkins란

젠킨스란 소프트웨어 개발시 지속적인 통합(Continuous integration)을 제공해주는 도구이다. 더불어 지속적인 배포환경까지 구축할수 있는 도구 있다.

젠킨스와 같은 CI 도구들이 나오기전에는 일정시간동안 빌드를 실행하는 방식이 일반적이였다. 특히 개발자들이 당일 작성한 소스코드들이 커밋이 되는 심야 시간대에 이러한 빌드 타이머가 집중적으로 실행되었는데 이것을 Nightly-Build라고 한다.

Jenkins는 빌드, 테스트, 배포 프로세스를 자동화하여 개발자의 시간 절약과 개발 생산성을 높일수 있다. 게다가 SVN,Git과 같은 버전관리 시스템과 연동하여 커밋을 감지하면 빌드가 작동되도록 설정도 할수 있다.


장점

  1. 프로젝트 표준 컴파일 환경에서 컴파일 오류 검출
  2. 자동화 테스트 수행
  3. 정적 코드 분석에 의한 코딩 규약 순수 여부 체크
  4. 프로파일링 툴을 이용한 소스변경에 따른 성능 변화 감지
  5. 결합 테스트 환경에 대한 배포 작업

젠킨스의 CI/CD 과정

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

젠킨스의 대표적인 Plugins

  • Credentials Plugin

    • Jenkins는 단지 서버이기 때문에 각종 리소스에 접근하기 위해서는 여러가지의 중요한 정보(key)들이 필요하다.
      ex. 리소스로는 클라우드 리소스등에 대한 ssh접근을 의미한다.
    • AWS token, Git access Token, secret key, ssh등이 정보에 포함된다
    • 이러한 중요한 정보들을 저장해주는 플러그인이다.
  • Git Plugin

    • jenkins에서 git에 대한 소스코드를 가져와서 빌드할수 있게 도와주는 플러그인
  • Pipeline

    • 연속적인 작업들을 젠킨스에서 하나의 파이프라인(작업)으로 묶어서 관리할수 있게 만드는 플러그인이다.
  • Docker plugin ans Docker Pipeline

    • Docker agent를 사용하고 jenkins에서 도커를 사용하기 위한 플러그인

      지금은 Docker를 사용하지 않아 해당 플러그인을 사용하지 않았는데 추후 Docker를 적용할때 사용해봐야겠다.🤣


젠킨스의 파이프라인

젠킨스 파이프라인이란?
CI/CD 파이프라인을 젠킨스에 구현하기 위한 일련의 플러그인의 집합이자 구성

젠킨스의 Pipeline을 작성하는데 Declarative, Scripted 방식이 있다. 이 두가지는 문법적인 차이점이 있다. Declarative방식이 Scripted방식보다 더 풍부한 구문 기능을 제공하며 간편하게 작성할수 있다.

Jenkins Pipeline의 주요항목

  • Pipeline

    • 빌드, 테스트, 배포 단계를 포함하는 전체 빌드 프로세스를 정의한다.
    • 선언형 파이프라인(Declarative Pipeline) 구문의 핵심 부분
    • Jenkinsfile의 시작 지점에 선언
  • Node

    • 스크립트형 파이프라인 구문의 핵심 부분
    • Jenkinsfile의 시작 지점에 선언
  • Stage

    • 전체 파이프라인 단계를 통해 수행되는 작업의 하위 집합을 의미한다.
      ex. jenkins 파이프라인을 빌드->테스트->배포라 한다면 빌드,테스트,배포가 각 Stage를 의미한다.
  • Step

    • 하나의 stage안에 작업을 정의하는 부분

선언형 파이프라인(Declarative Pipeline) 문법

Jenkinsfile을 작성하는 문법이다. Groovy문법과 비슷하지만 약간의 차이점이 있다.
선언형 파이프라인 문법은 인터넷에 검색해보면 잘 나오기 때문에 큰틀의 개념을 정리할 것이다.

//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의 Sections의 구성 - Sections에 아래의 항목들이 포함된다.

    • Agent Section: 여러 slave를 두고 작업을 할때 어떤 젠킨스가 일을 할지 정의

    • Post Section: 각 스테이지가 끝난후 후속 조치기능을 정의 (ex.Success, Failure, always, cleanup)

    • Stages Section: 어떤 일을 처리할것인가에 대한 Stage 정의(ex. git clone, build, test, devlop)

    • Steps: 스테이지안에서 실행할 작업을 정의

    • Declaratives
      : Environ ment (파이프라인 및 stage scope의 환경변수 설정)
      : Parameter (파이프라인 실행시에 받을 파라미터)
      : Triggers (어떤 형태로 트리거 되는지 정의)
      : When (언제 실행되는지 정의)

    각 항목에 세부적인 문법, 옵션도 다양하게 존재하지만 이 부분은 필요에 따라 찾아보면 될거 같다.


Jenkins Freestyle Project vs Pipeline Project

젠킨스에서 Pipeline은 한곳에서 작업을 시작해서 일렬로 혹은 여러갈래(병렬처리)로 뻗어나갔다가 다시 한곳으로 모이면서 마무리되는 작업의 흐름입니다.

Freestyle project 방식은 앞서 말했던 정의한 파이프라인이 사실 일렬로만 처리되는 Pipeline 입니다.
그렇기 때문에 파이프라인의 구조를 마음대로 바꿀수 없고 커스텀마이징 또한 할수 없습니다.
예를 들어 한프로젝트에서 2곳의 git repository에 접근하여야 되는 상황에서 Freestyle project은 접근 방법을 지원하지 않고 한곳에서만 인증을 받아 clone을 할수 있습니다.
그치만 진입장벽 측면, 참고할자료가 많은 측면에서는 Freestyle project가 좋다고 합니다.

저는 처음에 Jenkins에 대해서 공부하고 연습해볼때는 Freestyle project를 사용해보았지만 이번에는 Pipeline project를 이용하여 Jenkins Pipeline을 구축한 내용을 정리해보겠습니다.

profile
백엔드 개발자를 꿈꾸며 기록중💻

0개의 댓글