티스토리 뷰

카테고리 없음

Nebula, Build Tool

Quill. 2020. 2. 16. 21:57

네뷸라(Nebula)는 성운(星雲) 또는 성무(星霧)라고하며 우주의 별들 사이의 물질과 수소로 이루어진 구름 또는 안개를 말한다. 다른 한 편으로는 가디언즈 오브 갤럭시(Guardians of Galaxy)에 나오는 캐릭터 이름이다. 오늘은 또 다른 네뷸라인 소프트웨어 패키지(Software Package) 제작 도구에 대해 이야기 하려고 한다. 네뷸라라는 같은 이름을 사용하지만, 넷플릭스 빌드 랭귀지(Netflix Build Language)의 줄임말이다. 네뷸라는 여러 유용한 기능을 제공하고 있는데, 특히 주요 운영체제(Operation System) 소프트웨어 패키지를 쉽게 만들도록 도와주는 기능이 있다.

네뷸라에 대한 간략한 역사를 살펴보면 다음과 같다.[각주:1] 네뷸라 이전에 넷플릭스에서는 앤트(Ant)와 아이비(Ivy) 기반의 솔루션(Solution)을 사용했다고 한다. 넷플릭스의 모든 자바 소프트웨어(Java Software)이 이 도구를 이용해서 만들었다. 그러나 이솔루션의 사용량이 증가함에 따라 여러 한계점에 부딪히게 되어 새로운 도구를 찾기로 하였다. 그래서 여러 요구사항을 고려하여 그래들(Gradle)을 사용하기로 결정하였고 그 결과물이 네뷸라가 되었다.
 
네뷸라가 탄생한 배경을 살펴보니 예전에 여러 빌드 도구들을 비교했던 기억이 떠올랐다. 당시에 회사보안 정책에 따라 메이븐(Maven)과 그래들을 사용할 수 없었다. 회사의 코드가 외부로 유출되는 것을 막고, 외부의 악성 코드를 임의로 사용하는 것을 방지하기 위해서 메이븐 저장소에 대한 접속이 막혀 있었기 때문이었다. 당시 해야할 일은 많았고 시간은 부족했었다. 그래서 메이븐의 구조를 공부해서 회사 보안 담당자와 협의하고 같은 팀의 상사에게 결재를 받아야 하는 일에 시간을 투자할 수 없었다. 그래서 뮤직 라디오(Music Radio)과제는 라이브러리(Library)를 회사 내 저장소에 보관하고 앤트를 이용해서 빌드를 하고 패키지를 만들었다. 필요한 라이브러리를 전부 웹브라우저로 찾아서 내려받은 후 회사 내 저장소에 다시 올리는 번거로움이 있었지만, 그 투박한 방법은 확실했기 때문에 고생스러웠지만 그렇게 했다. 반대로 메이븐의 구조를 공부하는 방법은 불투명했기 때문에 시간절약을 위해서 포기했었다. 결국 내부 저장소에 필요 라이브러리를 다 모아두었고, 사용자 안내 문서에 앤트를 선택한 이유에 대해서 설명을 써 두었다. 이후 과제가 잘 되서 다른 팀이 뮤직 라디오 과제를 인수인계 받게 되었는데, 그 때 코드 저장소와 5장 내외의 문서를 전달한 것으로 모든 인수인계 과정이 끝났다.

지난 일을 떠올려보니 넷플릭스에서 어떤 고민을 했고 어떤 이유에서 그래들을 선택했는 지 알 것 같았다. 같은 고민과 같은 분석이 있었지만, 상황이 달라서 다른 결론에 도달했을 뿐이었다. 그래들은 메이븐의 장점을 유지하면서도 빌드 작업에 조건문을 넣을 수 있는 유연함이 있었다. 메이븐은 라이브러리 의존성을 스냅샷(Snapshot)으로만 관리했다면, 그래들은 스냅샷을 여러 개 두고 상황에따라 고를 수 있도록 해주는 등 보다 유연한 빌드 작업을 구성할 수 있게 해주었다. 그래서 이러한 장점들로 인해서 그래들은 사용자도 많았고 커뮤니티(Community)도 활성화 되어 있었다.
 
다음은 네뷸라를 이용해서 데비안(Debian)[각주:2] 패키지를 만들어 보는 예제이다. 가장 위에 보면 'nebula.ospackage' 플러그인(Plug-in)을 불러오고 있다. 다음 아래에 ospackage 라는 블록(Block)이 있다. 그 안에 데비안 패키지를 만드는 설정이 들어간다. 여기서 지속적 통합(CI, Continuous Integration) 도구와 연동해서 패키지 버전 정보를 자동으로 지정할 수 있다. 또한 이 블록 안에는 패키지 의존성을 지정할 수 있다. 예를 들면, 아래 예제의 패키지는 'python3-pip'와 'virtualenv' 가 미리 설치 되어 있어야 한다. 만약 미리 설치되어야 하는 패키지가 없다면 패키지를 설치할 때 오류가 발생할 것이다. 또한, 패키지를 설치하는 과정 또는 삭제하는 과정 바로 앞뒤에서 해야하는 일들을 지정할 수 있다. 아래 예제에서는 예제 패키지를 설치한 후 실행할 스크립트(Script)를 'postInstall' 에 지정하였고 패키지를 제거하기 직전에 실행할 스크립트를 'preUninstall' 에 지정하였다. 이렇게 하면 예제의 패키지를 제거하기전에 뒷정리를 시킬 수 있다. 이를테면 패키지 관리 라이프사이클 훅(Lifecycle Hook)인 셈이다.


apply plugin: 'nebula.ospackage'

buildscript {
    repositories {
        jcenter()
        maven { url "https://plugins.gradle.org/m2/" }
    }
    dependencies {
        classpath 'com.netflix.nebula:gradle-ospackage-plugin:7.4.2'
    }
}

ospackage {
    // That looks like <packageName>_<version>_<release>_<arch>.deb
    packageName = "app"
    version = "0.${buildNumber}.0"
    release = "h${buildNumber}.${branchName}"
    arch = "all"
    
    // Package requirements
    requires('python3-pip')
    requires('virtualenv')
    
    postInstall file('pkg_script/postInstall.sh')
    preUninstall file('pkg_script/preUninstall.sh')
    
    customField([
        'Owner': 'Young-ook Kim <who@mail.com>'
    ])
}

본 예제에 설명한 내용보다 자세한 내용과 추가 정보를 알고 싶다면, 다음의 주소를 방문하면 된다, http://nebula-plugins.github.io.


 

  1. https://nebula-plugins.github.io/documentation/introduction_to_nebula.html [본문으로]
  2. 데비안 리눅스 배포판을 말한다. 데비안을 기반으로한 우분투(Ubuntu) 리눅스에서도 같은 패키지를 사용할 수 있다. [본문으로]
공지사항