콘텐츠로 이동

CI/CD

Nixbot

https://buildbot.sjanglab.org — GitHub 연동 Nix CI/CD입니다. 도메인과 check context는 기존 GitHub branch protection을 유지하기 위해 buildbot 이름을 계속 사용합니다.

구성

flowchart LR
  gh["GitHub App 웹훅"] --> edge["public nginx + TLS<br/>eta :443"]
  edge --> proxy["Nixbot nginx upstream<br/>psi wg-admin :443"]
  proxy --> svc["nixbot<br/>psi"]
  svc --> db["PostgreSQL<br/>psi"]
  svc -- "nix-eval-jobs → nix build" --> nix["local nix daemon<br/>psi"]
  nix --> result["빌드 결과"]
  result --> gh
  • Service host: psi (nixbot.service)
  • Public reverse proxy/TLS: eta (포트 443), wg-admin으로 psi nginx에 프록시
  • DB: PostgreSQL (psi, local peer auth)
  • Build execution: psi의 local nix daemon
  • Check context prefix: buildbot (buildbot/nix-eval, buildbot/nix-build ...)

빌드 트리거

  • GitHub App-level 웹훅으로 자동 트리거
  • GitHub App이 접근 가능한 리포지토리를 Nixbot이 discovery
  • 첫 import 때 build-with-buildbot 토픽 리포지토리 enable
  • 이후에는 웹 UI에서 admin이 project enable/disable
  • PR 생성/업데이트와 default branch push 때 .#checks 평가/빌드

권한

항목 설정 위치
빌드 대상 SBEE-Lab 조직, mulatta 사용자 modules/buildbot/master.nix: github.userAllowlist
웹 관리자 github:mulatta modules/buildbot/master.nix: admins
인증 GitHub OAuth services.nixbot.github.oauth*

관련 시크릿 (modules/buildbot/secrets.yaml, sops 암호화):

시크릿 용도
github-app-private-key GitHub App 인증
github-oauth-secret 웹 UI 로그인
github-webhook-secret 웹훅 HMAC 검증
niks3-auth-token 선택 리포지토리 외부 캐시 푸시

GitHub App 설정

GitHub App 설정은 Nixbot 형식으로 유지해야 합니다.

항목
Webhook URL https://buildbot.sjanglab.org/webhooks/github
OAuth callback https://buildbot.sjanglab.org/auth/github/callback
Repository permissions Contents: Read & write, Checks: Read & write, Issues: Read & write, Metadata: Read-only, Pull requests: Read & write
Events Push, Pull request, Check run, Check suite

Contents 쓰기 권한은 docs effect의 gh-pages push와 updater의 update branch push에 필요합니다. Pull requests 쓰기 권한은 updater PR 생성에, Issues 쓰기 권한은 auto-merge label 추가에 필요합니다. 권한을 변경하면 각 installation에서 새 권한 승인이 필요합니다.

관리자 변경

Nixbot 관리자를 변경하려면:

  1. modules/buildbot/master.nix에서 admins 목록 수정 (github:<login> 형식)
  2. GitHub App 설정에서 조직/사용자 권한 업데이트
  3. OAuth 시크릿 갱신 필요 시 sops modules/buildbot/secrets.yaml로 편집
  4. inv deploy --hosts psi

빌드/effect 재트리거

실패한 빌드와 effect는 Nixbot 웹 UI에서 수동으로 재트리거할 수 있습니다. https://buildbot.sjanglab.org에 GitHub 계정으로 로그인한 뒤, 해당 빌드 페이지에서 재시작 버튼을 클릭합니다.

Hercules-style effects

리포지토리의 flake.herculesCI가 Nixbot effect를 정의합니다. Nixbot은 effect 실행 시 GitHub App installation token을 GitToken secret으로 전달하고, effect는 이 token으로 git push와 GitHub CLI 작업을 수행합니다.

Effect Trigger 동작
docs-pages main push .#docs 결과를 gh-pages 브랜치로 force-push합니다. GitHub Pages source는 terraform/github/repo.tf에서 gh-pages /로 관리합니다.
update-packages 매일 03:00 UTC .#updater -- --pr를 실행해 updateable package별 PR을 생성합니다.

외부 캐시 푸시

Nixbot은 mulatta/dots, mulatta/seqtable 빌드 성공 결과만 https://niks3.mulatta.io로 push합니다. 전체 빌드는 psi의 Harmonia cache에서 계속 제공됩니다.

Package 자동 업데이트

Nixbot scheduled effect가 매일 03:00 UTC에 .#updater -- --pr를 실행합니다. Updater는 packages/*/nix-update-args 또는 packages/*/update.py를 발견해 package별 update branch와 PR을 만듭니다. 현재 slack-clinix-update/GitHub releases 기반 업데이트 대상으로 등록되어 있습니다.

생성된 PR에는 auto-merge label이 붙고, 기존 auto-merge 워크플로우가 CI 성공 뒤 squash merge합니다.

Flake 입력 자동 업데이트

Dependabot이 매일 flake.lock을 검사하여 flake input 최신 커밋 PR을 생성합니다.

flowchart LR
  cron["Dependabot<br/>(매일 03:00 KST)"] -- "flake.lock 검사" --> pr["PR 자동 생성<br/>(flake.lock 변경)"]
  pr -- "auto-merge<br/>(squash)" --> main["main 브랜치"]
  main -- "매일 04:40 KST" --> upgrade["NixOS<br/>system.autoUpgrade"]
  upgrade -- "매월 마지막 토요일" --> reboot["커널 변경<br/>재부팅 확인"]
항목 설정
설정 파일 .github/dependabot.yml
스케줄 매일 03:00 KST
도구 Dependabot nix ecosystem
대상 루트 flake.lock
그룹 flake-inputs (모든 flake input을 한 PR로 묶음)
병합 auto-merge 워크플로우가 PR을 자동 squash 병합

흐름: flake.lock 변경 → PR 생성 → 자동 squash 병합 → main에 반영 → 각 호스트가 매일 04:40 KST에 system.autoUpgrade로 적용. 매월 마지막 토요일에는 auto-reboot가 적용된 커널과 부팅 중인 커널을 비교하고, 변경된 경우 24시간 후 재부팅을 예약합니다.

Nixbot은 flake 업데이트와 무관합니다. Nixbot은 PR CI 빌드만 담당하고, flake 입력 업데이트 PR 생성은 Dependabot이 담당합니다.

Nix 바이너리 캐시

Harmonia (내부 캐시)

psi에서 빌드한 /nix/store 경로를 Harmonia 데몬이 네트워크로 제공합니다. 다른 호스트가 배포 시 이 캐시에서 빌드 결과를 가져오므로 중복 빌드를 피할 수 있습니다.

항목
호스트 psi
포트 5000 (wg-admin 인터페이스)
주소 http://10.100.0.2:5000
서명 키 secrets.yaml (sops 암호화)

모든 호스트(rho, tau, eta)는 이 주소를 Nix substituter로 자동 설정되어 있습니다.