TL;DR

  • assert-no-unexpected-changes는 데스크톱 앱, CLI 도구 등에서 허용 목록 밖의 예상치 못한 파일 변경이 발생하는지 검사하는 GitHub Action임.
  • AI가 작성한 코드를 블랙박스처럼 실행하고, 파일 삭제나 뒤에서 일어나는 재작성을 감지하려는 목적으로 제작됨.
  • arrange 단계만 실행하는 컨테이너와 arrange 및 act 단계를 모두 실행하는 컨테이너를 준비해 두 결과를 비교함.
  • 두 컨테이너에서 docker diff를 실행하고 결과를 allowlist와 대조하며, 허용되지 않은 변경이 있으면 단계가 오류로 실패함.
  • Linux 러너에서 사용하며, arrange의 변경 사항과 지정된 workdir 아래의 변경 사항은 검사 대상에서 제외됨.

제작 배경

  • AI가 작성한 코드가 이상한 동작을 하지 않는지 코드 자체를 들여다보지 않고 확인할 수 있도록 이 GitHub Action을 제작함.
  • 데스크톱 앱을 만들었다고 소셜 미디어에 게시하려던 중, AI가 만들었다고 말하면 일부 사람들이 자신의 기기에서 이상한 동작이 일어날까 걱정할 수 있다는 생각이 듦.
  • ‘이상한 동작’이 무엇일지 자문한 결과, 파일이 몰래 삭제되거나 다시 작성되는 일이 가장 먼저 떠오름.
  • 이를 감지하는 도구가 보이지 않아 직접 Action을 작성함.

기능

  • Docker 컨테이너 두 개를 준비함. 하나는 arrange 단계만 실행하고, 다른 하나는 arrange와 act 단계를 모두 실행함.
  • 지정된 이미지에서 시작하는 Dockerfile을 작성하고, GITHUB_WORKSPACE를 workdir에 복사한 뒤 arrange 단계를 실행해 이미지를 빌드함.
  • 해당 이미지로 컨테이너 두 개를 시작하고, 한 컨테이너에서만 act 단계를 실행한 다음 두 컨테이너 모두에 docker diff를 실행함.
  • 두 컨테이너 간 차이를 allowlist와 대조해 위반을 감지함.
  • 허용되지 않은 변경이 있으면 다음과 같은 오류와 함께 단계가 실패함.
  • A는 생성, C는 변경, D는 삭제를 의미함.
  • 예시에서는 허용 목록 밖의 변경 2건과 /unexpected 추가, /expected 삭제가 표시됨.

사용 방법

  • checkout-latest-version과 this-action-latest-version을 v1 같은 최신 버전 번호로 바꿔 사용함.
  • 러너는 Linux 환경이어야 하며, 예시에서는 ubuntu-latest를 사용함.
  • arrange는 sh에서 실행되는 선택 항목이며, 의존성 설치나 빌드 등 준비 명령을 지정할 수 있고 이 단계의 변경 사항은 검사되지 않음.
  • act는 sh에서 실행되며 변경 사항을 검사함. 테스트 실행이나 빌드된 실행 파일 구동 등의 명령을 지정함.
  • allowlist는 변경이 허용되는 절대 경로를 한 줄에 하나씩 지정하는 선택 항목이며, *는 /도 일치 대상으로 포함함.
  • workdir는 선택 항목이며 기본값은 /workdir임. 이 경로 아래의 변경 사항은 검사되지 않음.
  • image는 선택 항목이며 기본값은 Ubuntu임. 복사된 작업 공간을 변경하려면 이미지가 root 사용자로 실행되어야 함.

라이선스

  • MIT 라이선스임.