Jenkins pipeline 사용해보기

twoStones·2022년 1월 12일
2

젠킨스

목록 보기
9/11
post-thumbnail

Jenkins pipeline 이 뭐냐?

  • 젠킨스의 플러그인들 중 하나. 그러니까 플러그인
    • 어떤 역할을 해주는 플러그인이냐?
      • 연속적인 이벤트 또는 Job의 그룹을 실행시킬 수 있다고 한다. 그러니까 하나의 Job에서 여러 가지 일들을 할 수 있도록 도와주는거?

왜 필요한거지?

  • 단순한 Job들이 많아지는 경우 Job을 관리하기가 힘들어진다고 함. 그럴 것 같다
  • 이걸 파이프라인으로 작성하여 하나의 Job으로 묶으면 관리도 편해지고 진행 상황도 알 수 있고 직관적인 파익이 가능하다고 함
  • 젠킨스 공식 사이트에서의 소개하는 Jenkins 파이프라인에서 쉽게 모델링할 수 있는 CD 시나리오의 예

Pipeline Concept

  • Pipeline
  • Agent/Node
  • Stage
  • Step

어떻게 하는거야?

  • pipeline 전용 DSL(Domain-Specific Language)로 작성된 스크립트 코드를 작성하면 됨
  • Jenkinsfile 이라는 곳에다가 DSL 문법으로 뭔가를 작성하면 젠킨스가 그걸 실행함

파이프라인은 어떻게 만드는거니?

3가지 있다고 함

  • WEB UI를 통ㅇ해서 Job 구성에서 직접 스크립트 코드 작성
  • SCM을 이용해서 Jenkinsfile 에 스크립트 코드 작성 - github에 jenkinsfile을 만들어 두고 그걸 땡겨와서 젠킨스가 실행
  • Blueocean 플러그인으로 UI를 통해서 스크립트 코드 작성 - github에서 관리

Jenkins 파일은 어떻게 작성하니?

공식문서

2가지 타입으로 작성이 가능

  • 2가지 타입 모두 Groovy Script로 작성
  • Declarative Pipeline : 쉽게 작성이 가능, Groovy 문법 기반인데 몰라도 작성 가능하다고 함
    • 최상단에 pipeline 이라고 되어 있으면 declarative 문법으로 작성된 것
  • Scripted Pipeline : Groovy 문법 기반, Declarative 보다 효과적이고 많은 기능으로 포함해서 작성 가능한데 어렵다고 함.
    • 최상단에 node 지시어가 있으면 scripted 문법으로 작성된 것
  • 위 2개 문법을 짬뽕으로 사용할 수는 없음
  • 장단점은 https://jojoldu.tistory.com/356?category=777282 를 참조

Groovy 문법은 뭐야?

잘 모르겠고 Scripted Pipeline 으로 일단 해 보자

작성할 때 알아야하는 Directive(지시어)를 먼저 알아보자

  • node : script 파이프라인을 실행하는 젠킨스 에이전트, 최상단에 선언해야 함, 젠킨스 마스터가 관리하는 서버? 프로그램? 정도로 이해됨
  • dir : 명령을 수행할 디렉토리(폴더) 정의
  • stage : 파이프라인 각 단계를 얘기하며, 이 단계에서 어떤 작업을 할 지 선언하는 곳, 그러니까 작업 내용을 작성하는 곳
  • git : git 원격 저장소에서 프로젝트 clone
  • sh : unix 환경에서 실행할 명령어 실행, 윈도우에서는 bat
  • def : groovy 변수, 함수 선언 javascript로 치면 var

아래와 같은 포맷으로 작성

node('worker') {
    stage('source') {
        // 스테이지에서 수행할 코드 작성

샘플

jenkins에 job 등록하기(Webhook과 Poll SCM) 에서 사용한 깃허브 레파지토리를 그대로 사용한다는 가정

pipeline {
    agent any
    
    stages() {
        stage('git clone') {
            steps() {
                git 'https://github.com/leeseok0916/jenkinsTest.git'
            }
        }
        
        stage('Test') {
            steps {
                echo 'Testing..'
            }
        }
        
        stage('execute sh') {
            steps {
                sh "chmod 774 ./project.sh"
                sh "./project.sh"
            }
        }        
    }
}

혹은
node {
    stage('git clone') {
        git 'https://github.com/leeseok0916/jenkinsTest.git'
    }
    stage('Test') {
        echo 'Testing....'
    }
    stage('execute sh') {
		sh "chmod 774 ./project.sh"
        sh "./project.sh"
    }
}

Flow Control

node {
    stage('Example') {
        if (env.BRANCH_NAME == 'master') {
            echo 'I only execute on the master branch'
        } else {
            echo 'I execute elsewhere'
        }
    }
}
  • try/catch/finally 예외 처리 가능
node {
    stage('Example') {
        try {
            sh 'exit 1'
        }
        catch (exc) {
            echo '무엇인가 잘못됐어....'
            throw
        }
    }
}

Pipeline을 만들어보자

Web UI에서 Jenkinsfile을 작성

  • 젠킨스 대시보드에서 새로운 Item 선택 => 아이템 이름 쓰고 Pipleline 선택
  • 설명 작성하고 Pipleline 탭 선택 => Definition에서 Pipeline script 선택 => 위에 샘플로 작성한 스크립트 넣고 저장
  • Build Now 클릭해서 빌드 해봄

    - Pipeline Syntax 를 클릭해보면 입력값들 작성하면 문법을 만들어 주는 기능을 사용할 수 있다

SCM을 이용해서 Jenkinsfile을 작성

  • 테스트할 레파지토리에 Jenkinsfile을 생성하고 위의 샘플 코드를 작성해하고 push해 두자
  • 젠킨스 대시보드에서 새로운 Item 선택 => 아이템 이름 쓰고 Pipleline 선택
  • Definition에서 Pipeline script from SCM 선택 => SCM 항목에서 Git 선택 => 원격 저장소 넣어주고 => Credentials 에서 계정 선택 => Branches to build 에서 master 브랜치 작성 => Script Path 에서 Jenkinsfile 위치 작성, 최상단에 파일을 뒀으면 디폴드로 놔둬도 된다
  • Build Triggers 항목에서 GitHub hook trigger for GITScm polling 체크해야 마스터 브랜치에 push 됐을 때 빌드 된다
  • Build Now를 클릭해서 최초 1회는 빌드를 해줘야 한다
  • 아무 파일 생성하거나 수정해서 원격 저장소의 마스터 브랜치에 push 하고 빌드되는지 확인

참고

profile
일단 작성

0개의 댓글