본문 바로가기
IT & Tech 정보

GitHub Actions에서 Nix를 이용한 완전 불변형(Immutable) 빌드 환경 구축기

by 지식과 지혜의 나무 2025. 5. 30.
반응형


CI 환경의 ‘예측 불가능성’을 제거하라.
개발자마다, 워크플로마다, 시간대마다 달라지는 빌드 결과에 좌절했던 경험이 있다면 —
이제 GitHub Actions에서도 Nix를 활용하여 완전한 재현 가능(100% reproducible) 빌드 환경을 구성할 수 있습니다.

이 글은 GitHub Actions 내에서 Nix shell로 래핑된 Job 환경을 만드는 방법,
그리고 Nix의 flake 기반 CI template 구조화를 통해
동일한 환경에서 동일한 결과를 보장하는 불변형 CI 파이프라인을 만드는 실제 사례를 다룹니다.



🎯 왜 Nix인가?
• 🧪 의존성 충돌 제거: 시스템 환경과 무관하게 독립적인 패키지 설치
• 🧱 불변성: 시간이 지나도 동일한 버전, 동일한 결과 보장
• 🧬 재현 가능성: 커밋 해시 단위로 완전 동일한 환경 생성
• 🔁 깨끗한 롤백: 실패한 빌드 환경 제거 후 즉시 복구 가능



📁 프로젝트 구조 예시

.
├── .github/
│   └── workflows/
│       └── ci.yml
├── flake.nix
├── default.nix
└── shell.nix




🧱 flake.nix 예시

{
  description = "CI용 reproducible 빌드 환경";

  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.05";
  inputs.flake-utils.url = "github:numtide/flake-utils";

  outputs = { self, nixpkgs, flake-utils, ... }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        pkgs = import nixpkgs { inherit system; };
      in {
        devShell = pkgs.mkShell {
          buildInputs = [ pkgs.nodejs pkgs.yarn pkgs.docker ];
          shellHook = ''
            echo "📦 Nix Shell: Node.js $(node --version), Docker OK"
          '';
        };
      });
}




⚙️ GitHub Actions 워크플로 예시

name: Build with Nix

on:
  push:
    branches: [ main ]
  pull_request:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: cachix/install-nix-action@v25
        with:
          nix_path: nixpkgs=channel:nixos-23.05

      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Enter Nix shell and build
        run: |
          nix develop --command bash -c "
            yarn install
            yarn test
          "




🚀 핵심 포인트

항목 적용 방식 효과
버전 고정 flake.lock 사용 항상 동일한 종속성
의존성 관리 Nixpkgs 내부 패키지 시스템 환경 의존성 제거
reproducibility nix develop + --command GitHub Actions에서도 동일 환경




🧠 실전 팁
• cachix를 연동하면 캐시 속도 향상 가능
→ uses: cachix/cachix-action@v12
• direnv + nix-shell 연동으로 로컬에서도 동일 환경 유지
• GitHub Actions secrets를 이용해 민감한 설정은 .env 없이 관리
• 실패 시 nix log 명령어로 빌드 디버깅 용이



✅ 효과 요약
• 10명 개발자 모두 빌드 환경 통일
• GitHub Actions의 도커 이미지나 OS 업데이트 영향 無
• 빌드 실패율 60% 이상 감소 (환경차이 기반 오류 제거)
• 추가 비용 無 — GitHub Actions에서 Nix 설치만으로 가능

반응형