매일 업데이트
2023-09-11 13:55 11 min

가능한 가장 간단한 방법으로 설명되는 코드로서의 파이프라인

소프트웨어 개발 파이프라인: 코드로서의 파이프라인 (Pipeline as Code)

소프트웨어 개발 영역에서 CI/CD(지속적 통합/지속적 배포) 파이프라인은 코드의 빌드 및 다양한 환경으로의 배포를 자동화하는 핵심 요소입니다. 이 자동화된 프로세스는 개발 효율성을 극대화하고 오류 발생 가능성을 줄이는 데 기여합니다.

하지만, 이러한 파이프라인을 구축하고 관리하는 것 자체 또한 복잡한 과제일 수 있습니다. 여기서 '코드로서의 파이프라인(Pipeline as Code)'이라는 개념이 등장합니다. 이는 전체 CI/CD 파이프라인을 코드로 정의하는 접근 방식으로, GUI 기반의 끌어다 놓기 도구 대신 구성 파일을 사용하여 애플리케이션 코드의 빌드, 테스트 및 배포 단계를 명확하게 정의합니다.

코드로서의 파이프라인의 세부 사항과 구축 방법에 대해 알아보기 전에, 먼저 파이프라인이 소프트웨어 개발에서 어떤 의미를 가지는지 명확히 이해해 보겠습니다.

소프트웨어 개발에서 파이프라인이란?

소프트웨어 개발 파이프라인은 최신 코드 변경 사항을 가져와 일련의 자동화된 단계를 거쳐 특정 환경에 배포하는 과정을 의미합니다. 좀 더 구체적인 예를 들어 설명해 보겠습니다.

만약 3개의 마이크로서비스로 구성된 시스템에서 하나의 서비스에 새로운 기능을 추가했다고 가정해 봅시다. 이 변경 사항을 배포하기 위해서는 먼저 단위 테스트를 수행하고, 코드 스타일을 점검해야 합니다. 다음으로 코드를 빌드하고, 개발 및 스테이징 환경에 배포합니다. 마지막으로, 통합 테스트를 실행하여 다른 서비스와의 호환성을 확인합니다.

위의 모든 단계를 수동으로 진행할 수도 있지만, 이는 시간 소모적이며 오류 발생 가능성이 높습니다. 이때 파이프라인을 사용하면 이러한 단계를 자동화할 수 있습니다. 코드를 변경할 때마다 파이프라인을 실행하여 수동 단계를 생략하고 효율성을 높일 수 있습니다.

코드로서의 파이프라인의 이점

끌어다 놓기 방식의 도구를 사용하면 변경 사항을 추적하거나 표준을 유지하기 어렵고 협업을 위한 효율적인 환경을 구축하기 어렵습니다. 반면에 코드로서의 파이프라인은 소프트웨어 개발 파이프라인을 관리하는 더욱 효율적이고 유연한 방법입니다.

코드로서의 파이프라인은 일관성 유지에 도움을 주며, 자동화를 통해 반복성을 확보하고 다양한 시스템에 동일한 파이프라인을 적용할 수 있습니다. 또한 애플리케이션 코드와 마찬가지로 파이프라인 정의 코드는 팀 간의 협업을 용이하게 합니다.

#1. 일관성

텍스트 형식으로 파이프라인을 정의함으로써 단계 순서가 뒤바뀌는 것과 같은 문제가 발생하지 않도록 방지할 수 있습니다. 모든 애플리케이션의 빌드와 배포에 표준화된 워크플로우를 적용하여 일관성을 확보하고 예기치 않은 오류 발생 위험을 줄일 수 있습니다.

또한, 일관성을 통해 규정 준수 확인과 보안을 강화할 수 있습니다. 일관된 파이프라인을 통해 보안 검사와 취약성 분석을 모든 단계에서 수행하여 보안 허점을 놓치지 않도록 보장할 수 있습니다.

#2. 반복성

파이프라인을 생성하고 자동화를 설정함으로써 모든 애플리케이션 코드가 동일한 검증 단계를 거치도록 보장할 수 있습니다. 파이프라인을 실행할 때마다 코드는 일관된 빌드 및 배포 프로세스를 거치므로 각 실행에서 반복성을 유지할 수 있습니다.

#3. 협업

파이프라인을 정의하는 데 코드를 사용함으로써 협업이 쉬워집니다. 여러 팀 구성원이 애플리케이션 코드와 마찬가지로 동일한 파이프라인 정의에 기여하고 변경 사항을 추적하며, 코드 검토를 통해 모범 사례를 적용하고 잠재적인 문제를 조기에 발견할 수 있습니다.

이제 실제로 코드로서의 파이프라인을 사용하여 파이프라인을 구축하는 방법에 대해 알아보겠습니다.

Jenkins에서 코드로서의 파이프라인

CI/CD 시스템에서 젠킨스(Jenkins)는 최고의 오픈 소스 자동화 서버 중 하나로 널리 알려져 있습니다. 젠킨스는 코드 변경 사항을 통합하고, 테스트와 빌드를 자동화하며, 소프트웨어 배포를 효율적이고 안정적으로 수행할 수 있도록 돕습니다.

자동화 파이프라인에 대한 지식을 쌓고 싶거나 복잡한 엔터프라이즈 시스템을 구축해야 하는 경우, 젠킨스는 프로젝트의 요구사항을 충족할 수 있는 유연한 솔루션을 제공합니다. 젠킨스의 다양한 플러그인과 활발한 커뮤니티는 자동화를 최대한 활용하는 데 큰 도움을 줍니다.

젠킨스에서 파이프라인은 특정 순서로 정의된 다양한 플러그인 세트입니다. 사용 사례의 복잡성에 상관없이, 젠킨스는 파이프라인 DSL(Domain Specific Language) 구문을 사용하여 파이프라인을 코드로 정의할 수 있도록 지원합니다. 이 DSL은 아파치 그루비(Apache Groovy)를 기반으로 합니다.

젠킨스에서 코드로서의 파이프라인의 핵심은 젠킨스파일(Jenkinsfile)입니다. 젠킨스파일은 다양한 단계와 작업을 설명하는 코드가 포함된 텍스트 파일입니다. 이제 젠킨스파일을 사용하여 파이프라인을 코드로 생성하는 방법을 알아보겠습니다.

파이프라인을 코드로 생성하는 방법

젠킨스를 설치하고 실행한 후 웹 UI로 접속합니다. 로그인이 필요할 수도 있습니다. 로그인 후 기본 대시보드 페이지로 이동합니다. 여기에서 파이프라인 생성을 시작할 수 있습니다.

  1. 왼쪽 패널에서 "새로운 항목" 버튼을 클릭합니다.
  2. 클릭하면 다음 페이지로 이동합니다.
  3. 새 페이지에서 항목을 생성하라는 메시지가 표시됩니다.
  4. "항목 이름 입력" 필드에 이름을 입력합니다. 이 필드는 필수 입력 항목입니다.
  5. 항목 이름과 동일한 이름으로 디렉토리가 생성되므로 공백을 피하는 것이 좋습니다.
  6. "파이프라인" 옵션을 선택하고 화면 하단에 있는 "확인" 버튼을 클릭합니다.
  7. 구성 창이 나타납니다.
  8. 왼쪽 패널에서 "파이프라인" 옵션을 클릭하거나 파이프라인 섹션까지 아래로 스크롤합니다.

이제 UI에서 직접 구성할 수 있는 간단한 파이프라인을 만들어 보겠습니다.

젠킨스에서 직접 코드로 파이프라인 생성

"파이프라인" 섹션에 도달하면 코드로 첫 번째 파이프라인을 생성할 준비가 된 것입니다.

"정의" 드롭다운 메뉴에서 "파이프라인 스크립트" 옵션을 선택합니다. 그 아래에 파이프라인을 코딩할 수 있는 스크립트 영역이 있습니다. 젠킨스는 여기에서 작성된 스크립트를 저장하고 관리합니다.

젠킨스에서는 선언적 구문과 스크립트 구문, 두 가지 코딩 스타일을 선택할 수 있습니다. 선언적 구문은 사용하기 쉽고 간단한 파이프라인에 적합한 반면, 스크립트 구문은 고급 사용자와 복잡한 흐름을 설계하는 데 적합합니다.

다음 코드 조각은 선언적 구문을 사용하여 코드 빌드, 테스트, 배포의 세 단계로 구성된 간단한 파이프라인을 생성하는 예시입니다.

pipeline {
    agent any

    stages {
        stage('Build Code') {
            steps {
                echo 'This is the step for build...'
            }
        }
        stage('Test Code') {
            steps {
                echo 'This is the step to test...'
            }
        }
        stage('Deploy Code') {
            steps {
                echo 'This step deploys the code...'
            }
        }
    }
}
  

스크립트 구문을 사용하면 아래와 같이 파이프라인을 작성할 수 있습니다.

node {
    stage('Build Code') {
        echo 'This is the step for build...'
    }
    stage('Test Code') {
        echo 'This is the step to test...'
    }
    stage('Deploy Code') {
        echo 'This step deploys the code...'
    }
}
  

"저장" 버튼을 클릭하고 왼쪽 패널의 "Build Now" 버튼을 클릭하여 방금 생성한 파이프라인을 트리거합니다. 파이프라인이 완료되면 빌드 기록에서 확인할 수 있습니다. 처음 실행하는 경우 빌드 번호 "#1"을 클릭하고, "Console Output"을 클릭하여 각 단계의 파이프라인 코드에 있는 세 개의 "echo" 문을 확인할 수 있습니다.

외부 파일을 사용하여 파이프라인을 코드로 생성

파이프라인이 복잡해질수록 젠킨스 내에서 직접 파이프라인을 관리하는 것은 어려워집니다. 이 경우 외부 파일을 생성하고 관리하는 것이 효율적입니다.

젠킨스 파이프라인을 생성하기 전에 외부 저장소와 버전 관리 시스템이 필요합니다. Git 저장소를 생성하고 GitHub에 원격으로 호스팅하는 방법을 예시로 들어 설명하겠습니다.

  1. 본인의 GitHub 프로필에 로그인합니다. 무료 계정이 없다면 새로 생성할 수 있습니다.
  2. 새로운 저장소를 만들고 이름을 "customJenkins"로 지정합니다.
  3. 로컬 머신에 Git이 설치되어 있는지 확인합니다.
  4. 원하는 위치에 디렉토리를 생성합니다.
  5. 디렉토리 안으로 이동하여 터미널을 엽니다.
  6. "git init" 명령을 사용하여 빈 Git 저장소를 초기화합니다.
  7. 이제 젠킨스파일이 될 새 파일을 만듭니다. 이름을 "customJenkinsfile"로 지정합니다.
  8. 해당 파일 안에 파이프라인을 코드로 작성합니다. 아래의 예시를 참고하세요.
pipeline {
    agent any

    stages {
        stage('Build Code') {
            steps {
                echo 'This is the step for build defined in custom file...'
            }
        }
        stage('Test Code') {
            steps {
                echo 'This is the step to test defined in custom file...'
            }
        }
        stage('Deploy Code') {
            steps {
                echo 'This step defined in custom file deploys the code...'
            }
        }
    }
}
    
  1. 터미널에서 "git add --all" 명령을 사용하여 새로 생성한 파일을 Git에 추가합니다.
  2. "git commit -m "Created a custom jenkinsfile"" 명령을 사용하여 파일을 Git에 커밋합니다.
  3. "git remote add origin [email protected]:<사용자 이름>/customJenkins.git" 명령을 사용하여 로컬 Git 저장소를 원격 저장소에 연결합니다.
  4. "git push --set-upstream origin master" 명령을 사용하여 파일을 원격(GitHub)에 업로드합니다.

이제 customJenkinsfile이 포함된 원격 저장소가 GitHub에 생성되었습니다. 이 저장소를 사용하도록 젠킨스를 설정해 보겠습니다.

GitHub의 젠킨스파일을 사용하도록 젠킨스 구성

  1. 젠킨스 대시보드를 엽니다.
  2. 새 파이프라인을 생성하거나 기존 파이프라인의 왼쪽 패널에서 "구성"을 클릭합니다.
  3. "파이프라인" 섹션까지 아래로 스크롤합니다.
  4. "정의" 드롭다운에서 "SCM의 파이프라인 스크립트" 옵션을 선택합니다.
  5. SCM 옵션에서 "Git"을 선택합니다.
  6. "리포지토리 URL" 필드에 GitHub 리포지토리 링크를 입력합니다.
  7. "빌드할 분기" 필드에서 분기 지정자가 "*/master"로 설정되어 있는지 확인합니다.
  8. "스크립트 경로" 필드에 젠킨스 파일 이름을 "customJenkinsfile"로 입력하고 "저장"을 클릭합니다.

이제 파이프라인을 실행하면 젠킨스는 먼저 원격 저장소에서 코드를 가져온 후, 사용자 정의 젠킨스파일을 사용하여 파이프라인을 생성하고 실행합니다.

이제 코드로서의 파이프라인을 사용하여 자체 소프트웨어 개발 파이프라인을 성공적으로 만들었습니다. 또한, 파이프라인 스크립트에서 버전 관리를 활성화했습니다. 이제 파이프라인 코드에 대한 모든 변경 사항을 Git 커밋 단위로 추적할 수 있습니다. 다음으로는 파이프라인 코드 작성 시 모범 사례에 대해 알아보겠습니다.

효과적인 파이프라인을 코드로 작성하기 위한 모범 사례

파이프라인을 코드로 작성할 때 따라야 할 모범 사례들을 살펴보겠습니다.

  • 파이프라인을 간결하게 유지하고 과도하게 복잡한 조건을 피하십시오.
  • 파이프라인 내에서 너무 많은 명령을 한 번에 실행하는 경우 명령을 여러 단계로 분할하십시오.
  • 파이프라인의 버전 관리를 위해 외부 파일을 코드 스크립트로 활용하십시오.
  • Groovy와 같은 코딩 언어의 기능을 활용하여 다양한 단계를 통합하십시오.
  • 보안 및 성능 문제를 피하려면 "Jenkins.getInstance" 또는 해당 접근자를 호출하지 마십시오.
  • "sh" 및 "timeout"과 같은 내장 파이프라인 명령을 재정의하지 마십시오.
  • 복잡한 CPU 집약적 작업을 처리하기 위해 외부 도구나 스크립트를 생성하고 이를 파이프라인에 연결하십시오.
  • 젠킨스에서 제공하는 다양한 기존 플러그인을 활용하여 사용 사례를 해결하십시오.
  • 오류 발생 시 대처할 수 있도록 예외 및 오류 처리 기능을 통합하십시오.
  • 코드로서의 파이프라인을 내부의 비즈니스 로직과 긴밀하게 결합하지 마십시오.
  • 파이프라인을 재사용할 수 있도록 가능한 경우 매개변수를 활용하십시오.

코드로서의 파이프라인: 복잡한 프로세스를 단순화하는 방법

요약하자면, 코드로서의 파이프라인은 전체 프로세스를 코드로 표현하여 CI/CD 파이프라인의 자동화를 단순화합니다. CI/CD 파이프라인은 코드 변경 사항의 빌드, 테스트, 배포를 자동화하지만, 코드로서의 파이프라인은 한 단계 더 나아가 그래픽 인터페이스에 의존하지 않고 워크플로우를 텍스트로 정의할 수 있도록 합니다.

코드로서의 파이프라인을 사용하면 워크플로우의 각 단계가 올바른 순서로 진행되도록 보장할 수 있으며, 예기치 않은 문제가 발생할 위험을 줄일 수 있습니다. 또한 일관성, 반복성, 협업 촉진과 같은 다양한 이점을 얻을 수 있습니다.

이 가이드를 통해 널리 사용되는 CI/CD 도구인 젠킨스를 사용하여 자신만의 파이프라인을 생성하는 방법을 알게 되었습니다. 젠킨스는 젠킨스파일을 통해 파이프라인을 코드로 구현하기 위한 강력하고 유연한 플랫폼을 제공합니다. 모범 사례를 따르고 모든 파이프라인 사용 사례를 처리할 수 있는 워크플로우를 구축해 보십시오.

젠킨스에 대해 자세히 알아보려면 자신만의 젠킨스 파이프라인을 만드는 방법을 확인해 보십시오.

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.