Skip to content

ops 패치를 PR 로 여는 공통 액션 추가 - #143

Merged
m-a-king merged 4 commits into
mainfrom
chore/139-ops-pull-action
Oct 18, 2026
Merged

m-a-king merged 4 commits into
mainfrom
chore/139-ops-pull-action

Conversation

@m-a-king

@m-a-king m-a-king commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

한눈에

사람이 승인한 자동 수정 패치만 PR 로 올리는 공통 액션 추가

  • 클라우드 에이전트가 매일 추출 실패를 조사해 비공개 repo 에 패치를 남김
  • 이 액션이 renderer·extractor 에 패치마다 승인 이슈를 만듦
  • 사람이 이슈의 링크로 패치를 보고 체크박스를 누르면 그 패치로 PR 이 열림
    • 승인 전에는 브랜치도 PR 도 없음
  • 워크플로 변경·숨은 글·URL 노출 같은 위험한 패치는 PR 전에 거부
  • 머지해도 바로 일어나는 일 없음
    • renderer·extractor 가 이 액션을 부르는 워크플로를 따로 추가해야 동작

Situation

이슈

추가

  • 첫 구현은 패치 글자를 정규식으로 검사
    • 결과: 대화 맥락 없는 리뷰가 Ubuntu 에서 우회 9가지 재현
    • 8진 이스케이프 경로·모드 앞 0·NUL 바이트·파이프 SIGPIPE·userinfo 로 위장한 URL 등
  • 패치가 .gitattributes 를 함께 넣으면 바이너리 판정이 풀리고 리뷰 화면의 diff 가 접힘 (재현)
  • ops 의 .gitattributes 와 LFS 설정이 체크아웃 때 러너의 외부 요청을 일으킴 (재현)
  • 렌더링된 pr.md 는 HTML 주석 같은 숨은 글을 보여 주지 않음
    • 그 글은 PR 본문과 커밋 메시지로 공개됨
  • 사람이 확인한 뒤 올리기 전에 에이전트가 같은 id 의 패치를 다시 쓸 수 있음
  • environment 승인은 Free 플랜에서 공개 repo 만 됨 (GitHub 문서)
  • TeamPiKi 조직은 배포 키 생성이 꺼져 있음
    • 원인: 새 조직의 기본값

Task

이슈

Action

승인 이슈 체크박스로 통일

  • 예약 실행(request)이 아직 요청하지 않은 항목마다 그 repo 에 ops 패치 <id> 승인 이슈를 만듦
    • 커밋 하나로 만들어지고 그 뒤로 바뀌지 않은 항목만. 만든 지 2일 안. 미래 날짜는 건너뜀
    • 한 실행에 5건까지. 이슈 조회는 전체 페이지
  • 이슈에는 그 커밋의 pr.md 원문 링크와 patch.diff 링크
    • 링크의 커밋이 곧 PR 이 되는 커밋이라 sha 를 맞춰 볼 필요 없음
  • 체크 편집(approve)을 쓰기 권한자의 체크로 확인한 뒤 PR 을 열고 이슈를 닫음
    • 루틴은 renderer·extractor 에 접근하지 못해 대신 체크할 수 없음
  • 거절은 이슈 닫기. 한 번 이슈가 생긴 항목은 다시 요청하지 않음
  • ops 의 폴더 이름은 patches
    • 대안: outbox
      • 기각: 무엇이 들어 있는지 이름으로 드러나지 않음
선택지 장점 비용
승인 이슈 체크박스 (채택) 두 repo 같은 방식·입력 없음·승인 전 공개 없음 각 repo 이슈 목록에 승인 이슈
renderer 브랜치 링크·extractor environment 승인 이슈 없음 repo 마다 방식이 다름
사람이 id·커밋 sha 를 넣어 실행 방식 하나 패치마다 입력 두 개
매일 draft PR 자동 개시 사람 손이 들지 않음 확인 전 PR 이 섞임·공개 repo 는 열리는 순간 공개

git 이 해석한 결과로 판정

  • 패치를 base 위에 적용한 뒤 git diff --cached 의 경로·모드·바이너리 표시로 판정
  • 작업 트리의 속성 파일은 판정과 ops 체크아웃에서 읽지 않음
  • 속성 파일(.gitattributes·.lfsconfig·.gitmodules)을 바꾸는 패치 거부
  • 파일 20개 초과·바뀐 줄 800줄 초과 패치 거부
    • 원인: 큰 diff 는 리뷰 화면이 접음
  • 코드 표시 밖에 HTML 이 있는 pr.md 와 세 파일 밖의 파일이 든 항목 거부
선택지 장점 비용
적용 뒤 git 출력으로 판정 (채택) git 과 해석이 갈릴 수 없음 checkout 에 패치를 한 번 적용
패치 글자를 정규식으로 검사 적용 없이 판정 우회 9가지 재현

공개 repo 의 노출 검사

  • 공개 여부는 입력값이 아니라 repo 설정에서 읽음
    • 원인: 입력값 실수로 검사가 꺼지는 경로 차단
  • 잡는 형태
    • scheme 이 있는 주소 전부. userinfo 가 있으면 허용 도메인이어도 거부
    • scheme 없이 도메인 뒤에 /·?·#·:포트 가 오는 형태
    • IP 뒤에 경로·쿼리가 오는 형태
    • 이메일 주소
    • 예외: 경로 없는 도메인 단독은 통과. 사용자 데이터가 아니고 파일명(Foo.java)과 구분되지 않음
  • 금지어는 호출하는 repo 의 시크릿으로 받음. 단어 목록이 공개 코드에 남지 않음
    • 공개 repo 에서 금지어 시크릿이 비면 실행 실패
  • 한글 경로는 이스케이프 없이 검사
    • 원인: git 기본 출력은 8진 이스케이프라 금지어가 빠져나감

CI 실행 승인

  • action 이 연 PR 의 CI 는 push 한 커밋·이 repo·pull_request 이벤트가 모두 맞는 실행만 승인
    • 원인: 같은 이름의 fork 브랜치 실행까지 승인할 수 있음
  • 승인한 실행이 0건이면 실패 처리. 이슈 댓글로 PR 화면에서 직접 승인하라고 알림

그 밖의 차단

  • ops 를 받을 때 심볼릭 링크를 일반 파일로 받음
    • 원인: 항목 파일이 checkout 의 .git/config 토큰을 가리킬 수 있음
  • 끝나면 checkout 을 base 로 되돌림
    • 원인: 같은 job 의 뒤 step 이 패치된 트리를 실행하지 않게 함

Result

셀프 테스트

  • fetch·scan·request·gate·check·open 셀프 테스트를 CI block-test 에 추가
  • 리뷰 세 차례가 재현하거나 짚은 우회를 케이스로 넣음
  • 속성 파일 무시 설정은 negative control 로 확인
    • 설정을 뺀 사본에서 해당 케이스 2건이 실패
  • macOS 와 Ubuntu 24.04(git 2.43) 컨테이너 양쪽에서 확인

위험

  • 승인은 루틴이 renderer·extractor 에 접근하지 못한다는 설정에 기댐
    • Claude App 을 ops 에만 설치. 설치 뒤 범위를 API 로 확인
  • 일부러 인코딩한 URL(퍼센트 인코딩·base64)은 검사가 잡지 못함
    • 승인 전에 사람이 원문을 봄

후속

  • renderer·extractor 호출 워크플로 추가. 이 PR 머지 뒤
  • 조직 설정에서 배포 키 허용·Actions 의 PR 생성 허용

연관 이슈

- .github/actions/ops-pull 추가
  - 사람이 id 와 ops 커밋 sha 를 넣어 실행
  - 그 패치 하나를 autofix/<id> PR 로 엶
  - 원인: 확인 전의 패치가 PR 목록에 섞이면 헷갈림
  - 대안: 매일 예약 실행으로 draft PR 자동 개시
    - 기각: extractor 는 공개 repo 라 PR 이 열리는 순간 공개
- 사람이 확인한 ops 커밋을 그대로 받음
  - 원인: 확인 뒤 루틴이 같은 id 의 패치를 다시 쓸 수 있음
- 패치를 적용한 뒤 git 이 실제로 바꾼 경로·모드로 판정
  - .github 경로·바이너리·심볼릭 링크·서브모듈 변경 거부
  - 대안: 패치 글자를 정규식으로 검사
    - 기각: 8진 이스케이프 경로·모드 앞 0·NUL 바이트·SIGPIPE 로 우회 재현
- 공개 repo 는 URL·금지어가 든 패치 거부
  - 공개 여부는 입력값이 아니라 repo 설정에서 읽음
  - 금지어 목록은 시크릿으로 받음. 공개 코드에 단어가 남지 않음
- 봇 PR 의 승인 대기 CI 실행 승인
  - push 한 커밋·이 repo·pull_request 이벤트의 실행만 승인
  - 원인: 같은 이름의 fork 브랜치 실행까지 승인할 수 있음
- ops 클론은 심볼릭 링크를 일반 파일로 받음
  - 원인: 항목 파일이 checkout 의 .git/config 토큰을 가리킬 수 있음
- CI block-test 에 fetch·check·pull 셀프 테스트 추가
@m-a-king m-a-king added the chore 그 외 (빌드·deps·ci·도구·설정·잡일) label Oct 15, 2026
@m-a-king m-a-king linked an issue Oct 15, 2026 that may be closed by this pull request
@m-a-king m-a-king self-assigned this Oct 15, 2026
@coderabbitai

coderabbitai Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: adfc5a1e-33e6-4c5f-a0e1-43c860d00541
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

m-a-king and others added 3 commits October 15, 2026 15:59
- 사람이 id·sha 를 입력하던 실행을 예약 실행의 항목 찾기로 교체
  - 원인: id·sha 입력이 번거로움
  - 커밋 하나로 만들어지고 그 뒤 바뀌지 않은 항목만 찾음
  - 만든 지 2일이 지난 항목은 보지 않음. 사람이 지운 브랜치가 되살아나지 않음
- renderer 같은 비공개 repo 는 branch 모드
  - 검사를 통과한 패치를 autofix/<id> 브랜치로만 올림
  - 사람이 PR 작성 화면에서 diff 를 보고 PR 을 만듦
- extractor 같은 공개 repo 는 scan 과 pr 모드
  - scan 이 항목 하나를 내고 승인 대기 job 이 받음. 승인 뒤 PR 을 엶
  - 원인: 공개 repo 는 브랜치를 올리는 순간 공개
  - 한 실행에 한 건. 승인 하나가 그 실행의 job 전부를 풀기 때문
- 속성 파일(.gitattributes·.lfsconfig·.gitmodules)을 바꾸는 패치 거부
  - 판정과 ops 체크아웃에서 작업 트리의 속성 파일을 읽지 않음
  - 원인: 패치로 바이너리 판정을 끄거나 리뷰 화면의 diff 를 접을 수 있음
  - 원인: ops 의 LFS 필터 설정으로 러너가 외부에 요청하고 응답이 공개 로그에 찍힘
- 파일 20개·바뀐 줄 800줄 상한
  - 원인: 큰 diff 는 리뷰 화면이 접음
- 미래 날짜 커밋의 항목은 건너뜀
- pull.sh 를 모드를 받는 open.sh 로 교체
- renderer 의 브랜치 링크와 extractor 의 environment 승인을 승인 이슈 하나로 통일
  - 원인: 두 repo 의 방식이 달라 헷갈림
  - 대안: 둘 다 environment 승인
    - 기각: Free 플랜 비공개 repo(renderer)는 required reviewers 불가
  - 대안: 둘 다 브랜치와 PR 작성 링크
    - 기각: 공개 repo(extractor)는 확인 전 브랜치가 공개
- request 모드 추가
  - 아직 요청하지 않은 항목마다 그 repo 에 승인 이슈를 만듦
  - 이슈의 링크가 가리키는 커밋이 승인 뒤 PR 이 되는 커밋
  - 한 실행에 5건까지. 이슈 조회는 전체 페이지
- approve 모드 추가
  - 쓰기 권한이 있는 사람이 체크박스를 체크한 편집만 승인으로 봄
  - PR 을 연 뒤 이슈에 결과 댓글을 달고 이슈를 닫음
  - 거절은 이슈 닫기. 한 번 이슈가 생긴 항목은 다시 요청하지 않음
- scan·branch·pr 모드와 open.sh 의 브랜치만 올리는 모드 제거
- pr.md 의 HTML 과 항목 폴더의 다른 파일 거부
  - 원인: 렌더링된 화면에서 숨은 글이 PR 본문·커밋 메시지로 공개됨
  - 승인 이슈는 pr.md 원문 링크를 줌
- 공개 repo 는 이메일 주소가 든 패치도 거부
@m-a-king
m-a-king merged commit 8d9ae15 into main Oct 18, 2026
4 checks passed
@m-a-king
m-a-king deleted the chore/139-ops-pull-action branch October 18, 2026 20:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

chore 그 외 (빌드·deps·ci·도구·설정·잡일)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ops 패치를 PR 로 여는 공통 액션 추가

1 participant