원문출처: https://iohk.io/blog/how-we-use-nix-at-iohk/

저자: Rodney Lorrimar (IOHK DevOps Engineer)

게재일: 2019년 2월 6일

닉스 OS

IOHK는 훌륭한 연구를 수행해 온 역사가 있다. 여기에는 함수형 프로그래밍 언어의 사용, 공식적인 메소드의 채택, 그리고 당연하지만 우리의 독자적인 사독(피어리뷰)형 연구를 블록체인 컨센서스 알고리즘에 구현시키는 것이 포함된다.

우리는 최근의 학술적 작업에서 나온 아이디어를 사용하여 비슷한 맥락에서 소프트웨어 배포의 문제에 접근한다. 이 시스템은 함수형 프로그래밍의 원칙을 소프트웨어 패키지 관리 및 시스템 관리 영역에 적용한다.

이 짧은 기술적 내용의 기사에서는 IOHK에서 우리가 Nix를 어떻게 활용하는 지를 설명하고 향후의 몇 가지 계획을 공유한다.

Nix, Nixpkgs 및 NixOS 란 무엇인가?

NixOS는 Nix 패키지 관리자를 기반위에 구축된 Linux 배포판이다.

필자가 개인적으로 Nix 패키지 관리자를 좋아하는 점은 동일한 패키지의 여러 버전을 설치하거나 패키지에 소스 코드의 수정을 쉽게 적용할 수 있다는 것이다. 특히 Haskell 개발을 위해 인상적인 수의 컴파일러, 툴 및 Hackage 패키지를 사용할 수 있는 바이너리 패키지가 있다.

NixOS와 구별되는 것은 그 구성 시스템이다. 여기에는 일관된 방식으로 선언적으로 구성된 고품질 모듈의 대량 컬렉션이 포함된다. 이는 동일한 구성을 많은 시스템에 적용하거나 다양한 소프트웨어를 하나의 시스템에 통합할 필요가 있는 시스템 관리자에게는 큰 도움이 되는 것이다.

Nix 패키지 관리자와 NixOS에는 Nix 언어가 있다. Nix 언어는 소프트웨어 구성 및 배포에 있어 영역 특수적이고, 순수 함수형이며, 느슨하게 계산되는(역자주: 느슨하게 계산된다는 의미가 나쁜 의미만은 아닌 것에 주의할 필요가 있다) 언어이다.

논문 NixOS : 순수 함수형 리눅스 배포판은 훌륭한 소개이다. NixOS가 해결하려고 시도하는 문제를 명확히 설명하지만. 그 중 많은 부분이 기술 사용자에게 익숙한 것일 것이다.

NixOS 프로젝트 뒤에 있는 것은 누구인가?

NixOS는 2003년에 Utrecht University에서 박사학위 논문의 주요 부분을 구성하는 Eelco Dolstra의 연구 프로젝트로 처음으로 창안되었다. 15년 후 NixOS 프로젝트는 수백 명의 공헌자와 함께 GitHub상에서 실행되고 있고 코드 기반은 현재 일주일에 약 500 git의 커밋 속도로 개선되고 있다.

커뮤니티는 또한 Freenode상의 활발한 IRC 채널, 토론 게시판, (대략적) 연례 회의 및 정기 모임을 통해 의견 교환을 한다.

또한 Tweag I / O 및 Mayflower와 같은 몇몇 회사는 Nix 컨설팅 ​​서비스를 제공한다.

왜 닉스인가?

소프트웨어 구성 관리를 위한 기존 시스템은 많이 있으나 Nix보다 훨씬 많은 사용자를 가진 것도 있다. 그러나 우리는 Nix가 기능면에서 뿐만 아니라 그 설계와 잠재력 면에서도 ‘구조로서의 코드(Code as Infrastructure)’를 가장 잘 구현할 수 있다고 생각한다.

만일 함수형 언어로 작성된 프로그램으로 배포를 한다면 참조 투명성, 안전한 코드 재사용, 배포 단위 테스트 기능과 같은 함수형 프로그래밍의 장점을 얻을 수 있다. 가장 핵심에는 Nix ‘파생’이 세부 사항을 추상화하고 소스 언어에 관계없이 소프트웨어 모듈을 거의 같은 방식으로 만들고 사용할 수 있게합니다.

파생은 소스 코드, 빌드 도구 및 라이브러리 종속성, 불변적인 소프트웨어 패키지를 생성하는 함수이다. Nix가 순수 함수이기 때문에 (함수형 프로그래밍의 관점에서), 입력 값이 변경되면 결과는 다른 소프트웨어 패키지가 된다. 또한 정확히 동일한 입력을 가진 파생물이 다른 곳 (예: 지속적 융합(CI))에 이미 구축된 경우 Nix는 파생 자체를 구축하지 않고 작업의 중복을 줄이기 위해 패키지를 다운로드한다.

Nix가 파생 입력이 변경되었는지 여부를 계산하는 방법은 암호 해시를 사용하는 것이다. 종속성은 재귀적이므로 이 해시는 실제로는 해시의 해시입니다. 블록체인 애호가라면 바로 알 수 있는 강력한 개념이다.

우리는 Nix를 어떻게 사용하는가?

다음은 IOHK에서 Nix를 사용하는 몇 가지 예이다.

1. Cardano SL 네트워크 배치

다양한 테스트 넷, Cardano SL Byron 메인 넷 및 Cardano SL 스테이징 배포 (업그레이드 테스트에 사용되는 환경)를 위해 AWS에서 약 200개의 컴퓨팅 노드를 실행한다.

이것들은 모두 NixOps와 함께 배포된 NixOS 시스템이다.

우리는 추상적인 토폴로지 기술(설명)으로부터 NixOps 네트워크를 생성하는 iohk-ops라고 불리는 도구를 작성했다. 토폴로지 기술(설명)은 Cardano SL 중계 노드 수, 그들이 호스팅되는 데이터 센터 및 피어 간의 고정 경로를 기술(설명)한다. iohk-ops는 배포를 실행하기 위해 NixOps를 불러들인다.

동일한 도구를 사용하여 테스트 활동에 사용되는 더 작은 ‘개발자 클러스터’를 배포할 수 있다. 이러한 클러스터는 동일한 배포 코드와 동일한 소프트웨어 버전을 공유하지만 더 작고 필요에 따라 시작 및 중지할 수 있다.

NixOS 및 NixOps의 롤백 기능은 이미 배포 준비 단계에서 여러 번 귀중한 것으로 입증되었다. 전체 네트워크를 단일 명령 또는 특정 노드로 재배포될 수 있다.

NixOps를 사용하면 구성 조정 및 코드 패치를 적용할 수 있음으로 인해  배포시 재구성되고, 결과가 CI에서 제공되는 것과 동일할 것이라는 확신을 갖게 되며 혼란스러움 없이 실행을 취소할 수 있다.

2. 재현 가능한 배포

배포 환경을 재현하고 로컬에서 테스트할 수 있으므로 문제가 사전에 잘 포착될 수 있으므로 배포 시간 코드 수정과 같은 극단적 인 조치는 일반적으로 필요하지 않는다.

앞서 언급했듯이 Nix 파생은 순수 함수이다. 프로덕션 환경에서 사용되는 것과 동일한 환경 및 라이브러리 (Linux 커널까지)를 사용하여 로컬에서 코드를 실행할 수 있다.

3. Docker 이미지의 빠른 재구성

Docker의 강점은 Nix가 공유하는 특성인 불변성, 캡슐화 및 재현성을 포함한다. 그러나 데이터 모델 및 제한된 DSL로 인해 심각하게 제한된다.

소프트웨어의 종속 구조는 Docker에 의해 모델링된 것처럼 시퀀스가 ​​아니라 계층이다. Docker 파일을 사용하여 Docker 이미지를 빌드할 때 일반적으로 주의해야 할 점은 맨 아래에 가까운 레이어가 변경되면 위의 모든 내용을 다시 작성해야 한다는 것이다. 또한 여러 빌드 단계를 사용하기 위한 단계가 수행되지 않으면 하위 계층의 중간 빌드 제품이 최종 이미지에 포함된다.

반대로 Nix 패키지는 종속성 (또는 그것들의 종속성)이 변경된 경우에만 다시 빌드된다. Nix 패키지의 최소 폐쇄에는 해당 소프트웨어를 실행하는 데 필요한 것만 포함된다.

따라서 최소화와 신속하게 재구성이 가능한 Nix 파생 폐쇄를 통해 Docker 이미지를 생성할 수 있다. 빌드 프로세스는 Nix 언어의 함수로 정의하여 파라미터화할 수도 있다.

4. macOS 빌드 슬레이브의 선언적 배포

Daedalus의 macOS 설치 프로그램 패키지를 제작하기 위해 MacOS 시스템 (MacinCloud에서 호스팅)의 소규모 컬렉션을 유지 관리한다. 이 시스템은 nix-darwin을 사용하기 시작할 때까지 유지 관리가 매우 불편했다. Nix-darwin은 NixOS와 비슷한 방식으로 macOS 시스템의 선언적 구성을 가능케 한다.

우리는 SSH를 통해 Mac을 셋업하기 위한 스크립트를 작성했다. 모든 것은 빌드 환경, 모니터링 및 SSH 액세스를 포함한 모든 것이 Nix 코드를 통해 관리된다.

5. Windows용 Cardano SL의 크로스 컴파일

Daedalus의 Windows 설치 관리자 패키지를 생성하려면 리소스 공급자가 제공하는 제한된 리소스 인스턴스에 의존하거나 작은 Windows 시스템 모음을 유지해야 했다. Windows CI 인프라는 지속적으로 문제의 원인이 되었다.

그러나 이제 Linux상에서 Windows용 하스켈 코드를 크로스 컴파일할 수 있다! Windows용 Daedalus의 다음 주요 버전에는 Linux상의 Nix로 빌드된 cardano-node.exe로 제공될 것이다.

Cardano SL의 크기 때문에, 이것은 상당한 업적이며 몇 달 간의 각고의 노력의 결과이다.

6. 개발 환경

nix-shell을 사용하면 정확하게 정의된 버전으로 고정된 프로젝트를 빌드하는 데 필요한 모든 도구와 라이브러리가 포함된 개발 환경을 제공할 수 있다.

cardano-sl에서 Nix 쉘은 IOHK 바이너리 캐시에서 다운로드한 Haskell 사전 빌드된 종속성을 사용하여 stack(스택) 워크 플로우나 cabal new-build를 지원한다.

daedalus에서는 Nix 쉘은 yarn을 제공하고 Cardano SL 블록체인과 지갑을 로컬에서 실행하는 방법을 제공한다.

Cabal, Stack (Haskell), NPM, Yarn (Javascript) 또는 Cargo (Rust)와 같은 다른 언어의 빌드 도구에 익숙하지 않은 개발자와 사용자는 단순히 nix build를 실행함으로써 여전히 CI에서 캐시된 빌드를 다운로드하거나 다시 빌드할 수 있다.

Apache Maven이나 Docker와 같은 재현 가능한 개발 환경을 제공하는 다른 도구가 있지만 쉽게 구성할 수는 없다. Nix는 기능 언어이기때문에 개발 환경은 작성할 수 있는 함수의 응용 프로그램이다. 따라서 Nix를 사용하면 개발 환경이나 필요한 부분만을 결합한 함수를 작성할 수 있다.

향후 방향

파이프 라인에 몇 가지 야심찬 프로젝트가 있어 2019년은 IOHK에게 있어 흥분된 한 해가 될 것이다. 우리는 Nix가이 프로젝트의 성공에 큰 역할을 할 것으로 기대한다. 우리가 계획한 것들 중 일부는 다음과 같다.

순수한 다이다로스 빌드

현재 Haskell 스크립트를 사용하여 Windows와 macOS용의 daedalus 설치 프로그램을 구축하고 있다. 이것은 필요이상으로 느리고 Windows 또는 macOS 시스템에서 실행해야 한다. 소프트웨어 구성 요소가 필요에 따라 캐시될 수 있도록 Linux에서 Nix를 함께 빌드할 것을 권한다.

IOHK-nix

IOHK는 Cardano SL 코드 기반을 독립적인 모듈로 분할하고 있다. 이 모듈은 최종 제품 빌드에 통합될 필요가 있다. 우리는 각 Cardano SL 하위 프로젝트에서 재사용할 수있는 공통 Nix 코드 iohk-nix의 리포지터리(저장소)를 개시했다.

모든 언어와 같이 Nix 코드는 아름다운 또는 거친 방식으로 작성할 수 있다. 그리고 Nix에는 정적 유형의 시스템이 없기 때문에 거친 코드는 정말 나쁘다. 따라서 이 프로젝트의 일부는 이해하고 유지하기가 쉽도록 하기 위해 Nix 코드의 가독성과 문서화를 향상시키는 데 있다.

노드 또는 스테이크 풀을 배포하기 위한 도구

2019년, Cardano SL은 분산화 될 것이다. 기술 사용자가 하나 이상의 Cardano SL 노드를 설치하거나 스테이크 풀을 운영하는 것이 매우 쉽게 할려고 한다.

여기에는 다음 내용이 포함된다.

nix-tools 하스켈 빌더

Nix Haskell 빌드 인프라는 주로 Windows를 대상으로 하스켈을 크로스 컴파일하여 컴파일러 플래그 및 종속성에 관한 보다 많은 정보를 추적하기 위해 상당한 재작업이 필요했다.

그 결과 보다 더 강력한 Haskell 빌더와 특히 다른 것보다 더 빠르게 실행되는 stack2nix의 새로운 구현이 가능케 되었다. 이 Haskell 빌드 인프라는 nix-tools라고 불린다. 우리는 누락된 부분을 채우고 다가오는 해에 Nixpkg에 업로드하는 것을 목표로 하고 있다.

이 주제는 너무 흥미롭기 때문에 곧 게시 할 예정인 블로그 게시물에 게재될 가치가 있다. 니다.

결론

이것은 우리가 Cardano를 개발하고 배포하는 것을 돕기 위해 Nix를 어떻게 사용하는 지를  신속하게 전달한 것이다.

그것은 물론 모든 것이 훌륭한 것은 아니다. 사용자는 Nix가 가파른 학습 곡선을 가지고 있으며 커뮤니티가 비교적 작다는 사실을 알게되었다. 우리는 아직 구현되지 않은 Nix의 기능과 버그 수정 목록을 가지고 있다.

Nix에 대해 더 알고 싶다면 NixOS 웹 사이트를 방문하라. 코딩이나 시스템 관리가 마음에 들면 NixOS 프로젝트에 참여하는 것은 매우 쉽다. Nix 언어에 익숙해 지려면 조금 시간이 걸리지만 알아야 할 모든 것이 하나의 git 저장소에 있다는 것을 알게 될 것이다.

IOHK에서는 정기적으로 NixOS 프로젝트에 기여합니다. 이러한 기여에는 패키지와 NixOS 모듈의 개선, 개발자의 계약 개선 등이 포함된다. 또한 NixOS를 연구 및 상업 프로젝트에 대규모로 사용하는 것 만으로도 우리는 소스 코드를 무료 라이센스로 게시하거나, 버그 보고서를 제출하거나, 경험을 커뮤니티와 공유함으로써 생태계에 기여한다.

직원 모집한다

IOHK 팀은 성장하고 있고 적절한 사람들이 우리와 함께할 수 있는 지를 찾고 있다. 다른 어떤 것보다 진보된 블록체인 플랫폼을 개발하는 일에 도움이 된다면, 관심있는 분야에 대한 정보를 얻고 나서 우리의 구직 정보를 확인하고 연락을 취해 주기를 바란다!