본문 바로가기

Jenkins

Jenkins - Pipeline (1) 파이프라인 만들어보기

방향성, EC2 스펙(이것은 아직은 추측), 내 컴퓨터의 OS가 Window인 이슈로 어제 하루 꼬박을 젠킨스 파이프라인 구축하는데 시간을 보냈습니다. 테스트 프로젝트를 거쳐 진행하고 있던 사이드 프로젝트 CI/CD를 마쳤습니다. 감격의 순간이니 파이프 라인 통과한걸 먼저 올려보겠습니다.

 

 

 

대략 11분 정도 걸렸는데 첫 빌드라서 젠킨스가 할 일이 많았나 봅니다. 조금 오래걸렸네요. 이후 빌드에는 젠킨스와 Gradle의 캐시 기능이 빌드 속도를 향상시킬거에요.

목차

 

  • Pipeline
  • Declarative, Scripted syntax
  • Pipeline SCM

 

CI/CD 구축 환경

Java17/ SpringBoot 3.x / Gradle / Jenkins

 

EC2 총 2대

Jenkins server t3.medium 사용 후 t2.micro 로 변경

API server t2.micro


Pipeline

파이프라인은 지속적 통합(Continuous Delivery)을 구현하는 수단을 말한다. 지속적인 통합을 위해서 보통 테스트, 빌드, 배포와 같은 일련의 과정이 필요한데요. 파이프라인에 통합을 위해 필요한 작업들을 만들어놓으면 됩니다. Jenkins에서는 파이프라인이 잘 작동할 수 있도록 많은 빌드 도구, 테스트 도구와의 연동 및 다양한 플러그인을 제공한다고 하네요.

 


Declarative/Scripted syntax

Pipeline을 작성을 위한 Jenkins에서 제공하는 문법입니다. 저는 Declarative syntax를 사용했어요. 사실 완성된 스크립트를 보면 둘 중 무엇을 사용해도 크게 다를바는 없었던 것 같습니다. Jenkins 공식 문서에 Declarative syntax 가 비교적 최근에 출시됐고 Scripted syntax에 비해 배우기 간단하다는 설명을 보고 선택했습니다.

 

한편, Scripted syntax 의 장점은 확장성과 더 많은 기능을 제공이라고 나와있어요. 실제 Syntax 페이지를 모두 본 것은 아니라서 자세하게는 모르겠습니다. 두 문법의 차이 및 장단점, 사용 방법을 알고 싶다면 Jenkins Pipeline Syntax 공식 문서를 참고하시면 좋을 것 같습니다.

 


Pipeline SCM

Jenkins에서 파이프라인을 구축할 수 있는 방법은 두 가지가 존재합니다. 한 가지는 Jenkins 파일로 직접 파이프라인을 정의하는 것이고 나머지는 SCM 방식입니다. Jenkins 공식 문서에 따르면 두 가지 각각 장단점이 있고 웬만한 기능을 제공하는 것 같습니다.

 

저와 같은 경우에는 파이프라인을 프로덕션 코드와 함께 형상 관리하고 싶어 SCM을 선택했습니다. 

이제 간단하게 파이프라인 SCM item을 만들어보겠습니다.

 

파이프라인 SCM item 만들어보기

(1) 먼저 젠킨스 웹 페이지에 들어가서 + 새로운 item을 선택합니다.

 

 

 

(2) 아이템 이름을 정하고 Pipeline 을 선택해주세요.

 

아이템 이름을 추후 젠킨스 서버의 workspace 디렉토리 내부에 폴더 명이 되니 참고해주세요. 아래와 같이 test로 아이템 이름을 정하면 jenkins/workspace/test 이렇게 디렉토리가 생성됩니다.

 

 

 

(3) Advaced Project Options 섹터에서 Pipline Definition 에서 Pipeline script from SCM을 선택합니다.

 

 

 

(4) 나머지 설정 정보를 입력해줍니다. 옵션 하나하나 살펴보겠습니다.

 

SCM : 형상 관리 시스템을 의미합니다. Github을 사용한다면 Git을 선택해주세요.

Repository URL : 아래와 같은 형식으로 CD 파이프라인을 구축할 저장소를 적어주면 됩니다.

Credentials : 해당 레포짓토리에 접근 권한을 가진 토큰을 선택해야 합니다. 여기서는 토큰 발급과 Credential 설정 설명은 생략하겠습니다.

Script Path : 파이프라인이 있는 상대 경로를 의미합니다. 한 프로젝트 내에 파이프라인 파일이 두 개 이상일 때 더욱 유용하게 사용할 수 있을 것 같습니다.

 

 

설정을 완료하고 OK를 눌러 아이템을 만들어주면 됩니다. 이후 프로젝트에 Sript Path에 설정한 경로에 파이프라인 파일을 만들어주면 됩니다. 저는 위와 같이 Jenkinsfile이라고만 적었기 때문에 루트 디렉토리 최상단 바로 하단에 해당 파일을 위치시키면 됩니다.

 

 

아래는 깃허브 저장소 소스 코드 클론, 빌드 과정을 작성한 파이프라인입니다. 설명을 주석으로 남기겠습니다.

 

pipeline {
    agent any

    environment { // jenkins 에서 설정한 credentials 들
            API_SERVER_PEM_KEY = credentials('EC2-ACCESS') // EC2 접속에 필요한 PEM key
            API_REMOTE_SERVER_IP = credentials('apiServerIP') // API 서버 IP
            TEST_PROPERTIES = credentials('testProperties') // 테스트 properties
            DEV_PROPERTIES = credentials('devProperties') // 배포될 개발 서버 properties
        }

    tools {
        gradle '7.6.1'
    }

    stages {
        stage('Checkout') { // 프로젝트 클론
            steps {
                echo 'Cloning Repository'

                git url: 'https://github.com/JxxHxxx/jenkins-start.git',
                    branch: 'main',
                    // 깃 레포짓토리와 젠킨스를 연결하는 토큰 값이 담긴 credential-id
                    credentialsId: 'x33x11-asd187-13q09b'
            }
        }
    
    
        stage('Build') { // 빌드
                steps {
                    echo 'Build'
                    dir('작업 경로') {
                        sh 'gradle build'
                    }
                }
        }
   }
}

 

이렇게 작성한 젠킨스 파이프라인을 main 브랜치에 push 합시다. 그리고 난 뒤 아이템으로 들어가서 지금 빌드를 클릭해주세요.

 

 

정상적으로 파이프라인이 실행되면 아래와 같이 Stage View에 초록불이 뜨는걸 보실 수 있습니다.

 

 

파이프라인에서 제공하는 문법을 활용되면 Jenkins 서버에 들어오지 않고 특정 이벤트가 발생할 때 자동으로 빌드가 시작되도록 할 수도 있습니다. 현재 프로젝트에서는 아직 필요한 단계가 아니기 때문에 추후 필요할 때 포스팅을 남기도록 하겠습니다. 다음 포스팅은 개인 프로젝트에 파이프라인을 구축하면서 만났던 문제에 대해 정리해보려고 합니다.