동기화와 여러 저장소

로컬 CI

푸시 → 대기 → 빨간 엑스 → 수정 → 푸시로 이어지는 루프는 한 바퀴에 10분씩 낭비해요. act를 쓰면 같은 워크플로가 내 컴퓨터의 Docker 컨테이너에서 돌아가고, Gitcito가 이를 조종해요. 워크플로를 고르고, 실행을 누르고, CI가 찍어냈을 바로 그 로그를 지켜보면 돼요 — 무엇이든 컴퓨터 밖으로 나가기 전에요.

로컬 CI

런타임을 내장한 게 아니라, 연동이에요

Gitcito는 일부러 act도 Docker도 함께 배포하지 않아요 — 컨테이너 런타임을 끌고 다니는 앱은 git 클라이언트와는 정반대니까요. 이건 선택해서 켜는 연동 기능이에요. 설정 → 연동(또는 다이얼로그 안)에서 켜면, Gitcito가 무엇이 설치되어 있는지 감지하고 나머지를 안내해요 — brew install act, 실행 중인 Docker 데몬, 그러면 끝이에요. 세 가지가 모두 갖춰지기 전에는 아무것도 실행되지 않아요: 기능이 켜져 있고, act가 설치되어 있고, Docker에 연결할 수 있어야 해요.

하는 일

  • .github/workflows 아래의 모든 워크플로를 name: 기준으로 나열해요.
  • 실행은 act로 워크플로를 작업 트리에 대해 실행해요 — 커밋하지 않은 변경까지 포함해서요. 바로 그게 핵심이에요: 푸시한 뒤가 아니라 커밋하기 전에 테스트하는 거죠.
  • 출력은 다이얼로그로 실시간 스트리밍되고, 중지를 누르면 실행이 종료돼요. 종료 코드 0이면 통과, 그 외에는 코드와 함께 실패로 표시돼요.

그래프의 커밋별 판정

그래프의 Local-CI 판정

실행이 끝나면 그 결과가 테스트한 커밋에 고정돼요. 그래프의 해당 행에 작은 플라스크가 붙어 초록 또는 빨강으로 표시되니, 어떤 커밋이 이미 로컬에서 CI를 통과했는지 한눈에 알 수 있어요. 판정은 refs/notes/gitcito-ci 아래의 git 노트로 저장돼요 — 내 컴퓨터에만 있는 로컬 데이터고, 기본적으로는 절대 푸시되지 않아요.

정직함의 규칙: 판정은 작업 트리가 깨끗했을 때만 고정돼요. 커밋하지 않은 변경 위에서 돌린 실행은 어떤 커밋에도 담겨 있지 않은 것을 테스트한 셈이라, 결과는 다이얼로그에 보여 주지만 아무것도 표시하지 않아요.

커밋 또는 범위 테스트 — 브랜치를 떠나지 않고

다이얼로그의 커밋 또는 범위 테스트 섹션은 지금 내가 있지 않은 커밋들에 대해 워크플로를 실행해요. 각 커밋은 시스템 임시 디렉터리 아래의 일회용 워크트리에 detached 상태로 체크아웃되고, act는 거기서 실행되며, 실행이 어떻게 끝나든 워크트리는 제거돼요 — 내 작업 트리와 브랜치는 절대 움직이지 않아요. 그 체크아웃은 구조상 언제나 깨끗하기 때문에, 판정은 항상 테스트한 커밋에 고정돼요. 그래프에서 커밋을 오른쪽 클릭하면 이 커밋에서 로컬 CI 실행을 바로 고를 수 있어요.

비용은 무언가 실행되기 전에 미리 알려 줘요 — 나중에야 알게 되는 게 아니에요. 리비전이나 범위(main..HEAD, HEAD~5.., sha)를 입력하고 미리보기를 누르면, 지정한 조건에 몇 개의 커밋이 걸리는지, 그중 실제로 실행될 최신 N개 — 최대 50개로 제한되는 명시적인 예산 — 가 무엇인지 Gitcito가 보여 줘요. 일괄 실행은 커밋들을 순차적으로 돌려요(act에 Docker까지 더해지면 병렬 실행이 컴퓨터를 두고 다툴 만큼 무겁거든요). 각 실행의 로그를 스트리밍하고, 커밋마다 통과/실패를 실시간으로 표시하며, 중지는 진행 중인 실행을 종료하면서 커밋 사이에서 멈춰요. 커밋 하나에 실제로 몇 분씩 걸린다고 생각하세요.

알아 둘 만한 한계가 하나 더 있어요: 일회용 워크트리에는 커밋의 파일은 들어 있지만 저장소의 서브모듈 체크아웃은 들어 있지 않아요 — 초기화된 서브모듈에 의존하는 워크플로는 서브모듈 없는 새 클론에서처럼 동작해요.

한계

  • act는 GitHub 러너를 아주 잘 흉내 내지만, 완벽하지는 않아요. GitHub가 호스팅하는 서비스나 시크릿, 특이한 러너 이미지가 필요한 액션은 다르게 동작할 수 있어요. 로컬에서의 초록불은 강력한 근거일 뿐, 보증은 아니에요.
  • 저장소마다 한 번에 하나만 실행돼요. 다른 실행을 시작하면 먼저 돌던 실행은 취소돼요.
  • 워크플로 단위 실행만 지원해요 — 개별 잡, 매트릭스, 이벤트를 고르는 건 act의 영역이니, 플래그가 필요할 때는 내장 터미널에서 실행하세요.
  • 첫 실행은 러너 이미지를 내려받아요 — 처음 한 번은 느릴 수 있어요.

함께 보기: 호스팅과 풀 리퀘스트 · 내장 터미널

GitHub에서 이 번역 개선하기