본문 바로가기
개념 공부/Infra, CICD

[CI/CD] Jenkins란 무엇인가

by clean01 2024. 5. 4.

Jenkins Pipeline이 뭘까?

Jenkins Pipeline이란 CD(continuous delivery)를 구축해주는 플러그인의 집합입니다.

CD(Continuous Delivery) 파이프라인이란 개발자가 버전 컨트롤을 하면 그 새로운 버전을 바로 유저에게 전달하는 프로세스를 의미합니다.
이 프로세스에는 여러 단계의 테스트와 배포가 포함 된다고 합니다.
파이프라인은 파이프라인 도메인 별 언어(DSL) 구문을 통해 "코드로" 단순하거나 복잡한 파이프라인을 모델링하기 위한 확장 가능한 도구 세트를 제공합니다.

Jenkins Pipeline을 코드로 작성한 것이 Jenkinsfile입니다. (Pipeline-as-code)

agent: Declarative pipeline에서 쓰이는 구문으로 전체 파이프라인에 대한 실행자 및 작업 공간을 할당하도록 지시합니다.
stage: 파이프라인의 stage를 나타냅니다. Scripted pipeline에서는 필수는 아닙니다.
steps: Declarative pipeline에서 쓰이는 구문
sh: shell command를 실행하는 pipeline step.
junit: 테스트 리포트를 전달하는 파이프라인 스텝

파이프라인 문법 글


Jenkins

다섯 가지 핵심 키워드로 젠킨스를 요약할 수 있다.

  • Build: 빌드 자동화. 젠킨스가 빌드를 성공한 뒤 실행 파일을 만들어준다.
  • Test: 테스트 자동화. 테스트 코드를 작성했다면 테스트 또한 자동으로 진행 가능하다.
  • Deployment: 배포 자동화. 빌드 단계에서 만들어진 실행 파일을 배포할 수 있다.
  • Plugin: Jenkins에는 1000가지 이상의 플러그인이 존재한다. 그 중 가장 자주 쓰이는 것은 Credentials Plugin이다.
  • Pipeline: Jenkins에게 명령하는 작업 명세서를 의미한다.

Jenkins Work Flow

  1. 깃에서 소스코드를 가져온다.
  2. 젠킨스가 서버에서 빌드 및 테스트를 진행한다.
  3. 실행 가능한 파일(jar)를 만든다.
  4. 파일을 운영서버로 던진다.
  5. 스크립트를 실행 시킨다.

Jenkins 실제 사용법

웹 서비스 프로젝트를 로컬 PC에서 개발이 끝난 후 테스트 서버에 올리려고 한다고 가정해보자.

  1. 먼저 내 PC에서 소스를 빌드해야한다. maven 혹은 gradle로 빌드를 진행하게 될 것이다.
  2. 빌드가 진행되면서 작성했던 테스트 코드를 수행하고 빌드가 완료된다.
  3. 다음으로 완료된 파일을 테스트 서버에 FTP를 통해 업로드 한다.
  4. 그러나 시작 명령어가 작성된 쉘 스크립트 파일은 FTP에서 실행할 수 없으니 ssh로 다시 테스트 서버에 접속한다.
  5. 테스트 서버에 접속하여 서버를 시작하는 쉘 스크립트 파일을 실행한다.
docker logs jenkins

Jenkins Pipeline Concepts

젠킨스의 파이프라인 주요 항목

  • Pipeline
  • Node
  • Stage
  • Step

Pipeline

  • 애플리케이션의 빌드, 테스트 및 배포 단계를 포함하는 전체 빌드 프로세스를 정의
  • pipeline블록은 Jenkinsfile의 시작 지점에 선언해야합니다.
  • pipeline블록은 선언형 파이프라인 구문의 핵심 부분입니다.

node

  • node 블록은 스크립트형 파이프라인 구문의 핵심입니다.
  • Jenkinsfile의 시작 지점에 선언해야 합니다.

stage

  • stage블록은 전체 파이프라인 단계를 통해 수행되는 작업의 하위 집합을 나타냅니다.
  • 전체 파이프라인 흐름에서 특정한 시점에 실행이 필요한 것들을 묶을 수 있습니다.

step

  • 단일 작업을 나타내며, 특정 시점에서 수행할 작업을 알려줍니다.

선언형 파이프라인 문법

  • 선언형 파이프라인을 이용해서 Jenkinsfile을 작성하기 위한 문법에 대해서 알아보겠습니다.
  • Groovy 구문과 동일한 규칙을 따르지만 몇 가지 예외 사항이 있습니다.
    • 시작은 pipeline{}으로 해야합니다.
    • 명령문 구분 기호로 세미콜론이 없습니다.
    • 블록은 sections, directives, steps 등 할당문으로 구성되어야 합니다.
    • 속성 참조문은 인자값이 없습니다. (input())

sections

  • sectionsdirectivessteps를 1개 이상 포함하는 코드로 구성되어 있습니다.
  • sections의 포함되는 항목은 다음과 같습니다.
    • agent
    • post
    • stages
    • steps

agent

  • pipeline 또는 stage에서 조건부로 사용할 수 있는 하나의 구간입니다.
  • 선언형 파이프라인 구문에서 사용 가능합니다.
  • 사용할 수 있는 종류는 다음과 같습니다.
    • any
    • none
    • label
    • docker
    • kubernetes
    any
    • 사용 가능한 agent에서 pipeline 또는 stage에 상관없이 실행할 수 있습닏.
    none
    • pipeline 블록의 최상위 레벨에 적용되는 경우 전체 pipeline의 실행에 전역 agent가 할당되지 않으면, 각 단계마다 agent를 포함하고 있어야 합니다.
    • 활용해볼 수 있는 부분으로는 여러 서버에서 pipeline 또는 stage 단계를 진행해야 되는 경우 해당 기능을 사용하면 됩니다.
    label
    • 제공된 label이 있는 환경에서 사용 가능합니다.
      agent { label 'my-defined-label' }
    docker
    • Docker Registry 사용 및 Dockerfile 사용 가능합니다.
    kubernetes
    • k8s 클러스터에 배포된 파드 내부에서 pipeline을 실행합니다.
    post
    • pipeline 또는 stage에서 조건부로 사용할 수 있는 하나의 구간입니다.
    • Job의 빌드 후처리 동작에 대해서 상세 설정을 할 수 있습니다.
    • post에서 제공하는 옵션들은 다음과 같습니다.
      • always
      • changed
      • fixed
      • regression

Reference