Nix 이종 환경 + 원격 빌드하기
문제
당신에게 작고 소중한 클라우드 서버가 있다고 치자. 서버 환경 옮겨다니느라 피곤했던 당신은 declarative하게 서버 환경을 설정할 수 있는 NixOS의 장점에 설득되어, 모든 서버 환경을 NixOS 기반에서 관리하고 있다고 치자.
그러던 어느날, codex가 살짝 오래된 버전이라서 찜찜했던 당신은 최신 버전으로 관리될 것만 같은 nixos-unstable 배포판으로 이전하게 된다.
그러던 어느날, 무심코 nix flake update를 하고 나자 서버 빌드가 저녁시간 내내 진행되는 불상사가 발생하게 되고야 말았다…
문제의 원인
https://hydra.nixos.org/job/nixos/unstable/nixpkgs.deno.aarch64-linux
지금은 최신 버전의 빌드가 성공해서 narinfo가 제공되는데, 어제 빌드했을 때 해당 빌드가 실패해서 바이너리가 제공되지 않고 있었다. source 빌드로 fallback 해서 저녁 내내 빌드만 하다가 하루를 날려먹었다.
원격 빌드 됩니까?
아무래도 작고 소중한 Arm 4코어짜리 무료서버라서 그런가 싶어서 데스크탑으로 빌드를 한 다음, 서버에는 바이너리만 넘겨주면 어떨까 싶어서 좀 알아봤다.
일단 로컬에서 aarch64 타겟으로 빌드하기
/etc/nix/nix.conf에 extra-platforms = aarch64-linux가 설정되어 있고,
qemu-aarch64-static이 있으면 되는 듯 하다. 처음에 qemu-aarch64만 있어도
되는 줄 알았는데, -static이 아니면 잘 안되더라.
aarch64-linux 타겟으로 deno 2.7.12를 빌드하면 다음 path가 생성된다. hash는 https://hydra.nixos.org/build/326614946#tabs-details 에서도 확인할 수 있다.
/nix/store/w6xna8ysbkqxgcwzjv3wvdlqhqxnghj6-deno-2.7.12
빌드 결과를 원격 서버로 복제하기
nix copy --to ssh://sx $(nix build --no-link --print-out-paths .#packages.aarch64-linux.deno)
결론
이게 되긴 하는데, 막상 삽질 다 하고나니까 hydra에 캐시가 등록되었고, 또 막상 x86에서 에뮬레이터로 빌드하는거나 쟉고 쇼듕한 arm 서버에서 빌드하는거나 n시간 단위로 걸려서 복장터지게 만드는 건 매한가지고 해서… 굳이? 싶다. 어쨌든 내친걸음이니
nix copy --to ssh://sx $(nix build --max-jobs auto --no-link --print-out-paths .#packages.aarch64-linux.nixosConfigurations.sx.config.system.build.toplevel)
요거 한번 해보긴 할 텐데 서버에서 빌드하는것보다 라이젠 16코어 데탑에서 빌드하는게 빠르지 않다보니 실용적이지는 않은 것 같다는게 문제…