Description
배경
- 이전 PR을 통해 작업자의 Pull Request 에 사용된 언어를 감지하고, 감지된 언어의
label
을 PR 에 추가하는 워크플로를 등록하였습니다. - 워크플로에 요구되는
permissions
이 있었고 이들을 모두 작성해주었으나, 지속적으로403 Forbidden
오류가 발생하였습니다.- PR 에
label
을 추가하기 위해서는issues
또는pull-requests
의 쓰기(write) 권한이 필요합니다. X-Accepted-GitHub-Permissions
: GitHub API 특정 엔드포인트 접근시 필요한 권한을 알려주는 헤더 (관련 문서).- 워크플로 실패 Response
- PR 에
data.message
에서 알 수 있듯, Response 에서는Resource not accessible by integration
이라며 리소스 접근이 불가하다고 합니다.- 결국 GitHub 서버에서 요청한
permissions
를 정상적으로 전달하였음에도(기존 워크플로에서는pull-requests: write
적용), 오류가 지속적으로 발생하였으므로 그 이유를 찾아야 했습니다.
문제 원인
- 최초 테스트 시에는 base repo 와 working repo 를 동일하게 사용했습니다. 즉,
fork
하지 않은 상태에서 PR을 작성하여 테스트를 진행하였습니다.- repo 가 동일하므로, 작업 repo 로부터 시작된 PR 워크플로에서 base repo 의 컨텍스트를 사용하는 데 문제가 없었습니다.
- 이후 테스트가 정상적으로 수행되는 걸 확인한 후
leetcode-study
Repo 에 PR 을 열었습니다.
- 그러나 실제로는 작업자가
fork
를 수행한 후에, 작업을 PR 로 만든다는 것을 깨닫고 테스트를 다시 수행하였습니다.fork
할 경우, PR 의 base repo 와 작업 repo 가 달라지는데, 작업자의 워크플로에서는 보안상의 이유로 base repo 의 민감 정보를 얻지 못하도록 GitHub 이 막아두고 있었습니다 (관련 문서).- 결과적으로 label 을 추가하는 API 는 GitHub Token, PR Context 등 민감 정보를 사용하므로,
fork
기반 워크플로가 항상 실패했습니다.
해결 방법 및 한계
- 위 문제의 해결 방법으로 GitHub 에서는
pull_request_target
이벤트를 소개하고 있습니다 (관련 문서 Note 참고) (기존 워크플로의pull_request
이벤트를 대체하면 됨). - 개인 repo의 PR에서 위 이벤트를 테스트해보았는데, 작업 repo 에서 base repo 컨텍스트를 사용할 수 있다는 것을 확인할 수 있었습니다.
- 그러나
label
을 추가하기 위해 base repo의 민감 정보를 굳이 얻어야 할까 싶어,leetcode-study
repo 에서는pull_request_target
이벤트를 사용하지 않고자 합니다.
대안
- 그럼에도 자동 labeling 에 대한 니즈가 있을 경우, base repo 내에서 워크플로를 만드는 방법이 있을 듯합니다.
- 예) 워크플로로 스케줄 잡을 만들어, 하루에 한 번 Opened PR 목록에 언어 label 을 붙이는 방식 등
- 하지만 이렇게까지 해야 하나 싶기도 해서.. 다른 분들의 의견을 들어봐야할 것 같습니다.. ㅎㅎ