Renovate 업데이트 PR을 AI 에이전트가 리뷰하고 자동 병합까지 연결하는 방법
요약
본 글은 Renovate가 생성한 의존성 업데이트 PR을 AI 에이전트가 자동으로 리뷰하고, 안전하다고 판단되면 자동 병합까지 연결하는 시스템 구축 방법을 소개합니다. GitHub Actions와 Claude Code Action을 활용하여 릴리스 노트를 분석하고 코드 영향도를 검토함으로써 수동 검토에 소요되는 시간을 절약할 수 있습니다.
핵심 포인트
- AI 에이전트가 의존성 PR의 릴리스 노트 및 코드를 비교 분석합니다.
- 자동 병합은 AI 승인, 특정 라벨 부재, 자동 병합 스위치 활성화 등 복합 조건 충족 시에만 이루어집니다.
- GitHub Actions와 Claude Code Action을 사용하여 시스템을 구현하는 구체적인 워크플로우를 제시합니다.
서론
AI 에이전트가 등장한 이후, 만들고 싶은 것이 늘어나지 않았나요?
아이디어를 떠올리고 실제로 작동하는 결과물을 만드는 데 걸리는 시간이 크게 단축되었습니다. 직장에서도 기능 추가가 전례 없는 속도로 구현되고 있다고 느낍니다. 적은 인원으로 많은 일을 할 수 있게 되면서, AI 에이전트 등장 이전보다 팀 규모가 줄어든 현장이 있을지도 모릅니다.
반면에 라이브러리 업데이트는 어떨까요?
Dependabot이나 Renovate 같은 도구가 업데이트용 PR을 만들어 주는 것까지는 자동화되었습니다. 하지만 그 PR을 확인하고 병합하는 것은 사람의 몫입니다. 릴리스 노트를 읽고 파괴적 변경(breaking change)이 우리 코드에 영향을 주지 않는지 확인하는 작업에 시간을 쓰고 있지 않나요?
그래서 이 글에서는 Renovate의 업데이트 PR을 AI 에이전트가 리뷰하고, 문제가 없으면 자동 병합까지 진행하는 시스템을 소개합니다. AI 에이전트에게는 GitHub Actions 위에서 작동하는 Claude Code (anthropics/claude-code-action)를 사용합니다.
코드는 다음 두 개의 파일로 나누어져 있습니다. 본문에서는 핵심 내용을 발췌하여 소개하고, 전체 코드는 글의 마지막에 첨부하겠습니다.
.github/workflows/deps-ai-review.yml
: 워크플로우 -
.github/scripts/deps-ai-review/lib.cjs
: 각 단계에서 사용되는 공통 처리
업데이트 PR 확인에 시간이 소요됨
Renovate를 사용하면 의존 라이브러리 업데이트 PR이 매일같이 도착합니다.
패치(patch) 업데이트는 CI가 통과하면 자동 병합해도 큰 문제가 생기는 경우가 적습니다. Renovate의 automerge 기능만으로 충분한 경우도 많을 것입니다. 하지만 semver를 엄격하게 지키지 않는 패키지도 있기 때문에, 절대 안전하다고 단정할 수는 없습니다. 까다로운 부분은 minor와 major 업데이트입니다.
- 릴리스 노트를 읽고 파괴적 변경이나 사용 중단(deprecation)이 없는지 확인하는 것
- 파괴적 변경이 있다면, 우리 코드에서 해당 API를 사용하고 있는지 찾아보는 것
- 타입 정의나 설정 파일에 미치는 영향을 확인하는 것
한 건당 몇 분이라도, 건수가 늘어나면 무시할 수 없는 시간이 됩니다. 미루게 되면 PR이 쌓이고, 한꺼번에 확인하는 것이 더욱 힘들어집니다.
AI 에이전트에게 업데이트 PR을 검토받기
이러한 확인 작업은 AI 에이전트가 가장 잘하는 일입니다. 릴리스 노트와 리포지토리의 코드를 비교하여 영향 여부를 판단할 수 있습니다.
그래서 다음 흐름을 GitHub Actions로 구성했습니다.
AI 에이전트의 판정은 다음 세 가지입니다.
| 판정 | 의미 | 결과 표기 방식 |
|---|---|---|
| approve | 그대로 병합해도 좋음 | 라벨 deps-ai-review:pass, 스테이터스 success |
| ... | ||
| 판단의 근거는 PR에 코멘트로 남깁니다. |
자동 병합이 가능한 조건의 예시
AI 에이전트가 approve로 판정했다고 해서 모든 것을 자동으로 병합하는 것은 아닙니다. 이 시스템에서는 업데이트 종류에 따라 다음과 같이 처리합니다.
| 업데이트 종류 | 처리 방식 |
|---|---|
| patch | 이전과 같이 Renovate가 CI 통과 후 자동 병합합니다 (AI 에이전트는 사용하지 않음) |
| ... | |
| 자동 병합은 다음 조건을 모두 충족했을 때만 이루어집니다. |
- AI 에이전트의 판정이 approve일 것
deps-ai-review:manual-merge라벨이 붙지 않았을 것 -
자동 병합 스위치(후술할DEPS_AI_REVIEW_AUTO_MERGE)가 활성화되어 있을 것 -
린팅(lint), 타입 체크(typecheck), 테스트 등의 필수 검사가 통과했을 것
마지막 필수 검사가 중요합니다. 타입 에러나 테스트에서 발견되는 문제는 CI가 막아줍니다. AI 에이전트에게는 CI에서는 찾기 어려운
는, 여러 규칙에 적용되면 레이블이 합산됩니다. 따라서 Rails 같은 예외도 패키지 단위로 1개의 규칙만 추가하면 됩니다.
minor 업데이트에 붙어 있던 Renovate 자체의 automerge는 제거하고 patch만 남겼습니다. minor 병합은 워크플로우에 맡깁니다.
Renovate의 전체 설정은 기사 마지막에 올렸습니다.
GitHub Actions 워크플로우
워크플로우는 다음 3개의 Job으로 나뉘어 있습니다.
| Job | 권한 | 내용 |
|---|---|---|
| prepare | 쓰기 (Write) | PR의 상태를 확인하고 리뷰할지 결정함 |
| ... | ||
Job을 나눈 이유는 AI 에이전트에게 쓰기 권한을 주지 않기 위함입니다. 릴리스 노트나 node_modules 안에 악의적인 지시가 숨겨져 있어도, AI 에이전트가 댓글을 작성하거나 커밋할 수 없도록 했습니다. |
트리거 (Trigger)
on:
pull_request:
types:
...
pull_request_target은 사용하지 않습니다. PR의 코드와 쓰기 권한이 같은 Job에 들어가는 것을 피하기 위함입니다.
AI 에이전트 리뷰 (AI Agent Review)
review Job에서는 먼저 pnpm install --frozen-lockfile --ignore-scripts로 의존성을 설치합니다. 이는 AI 에이전트가 새로운 버전의 CHANGELOG나 타입 정의를 node_modules에서 직접 읽을 수 있도록 하기 위함입니다. --ignore-scripts를 사용해 패키지의 설치 스크립트는 실행하지 않습니다.
그 후, claude-code-action을 실행합니다.
review:
needs: prepare
if: needs.prepare.outputs.mode == 'review' && needs.prepare.outputs.guard-hit != 'true'
...
핵심은 다음과 같습니다.
Renovate의 PR에서도 작동: claude-code-action은 기본적으로 봇이 시작한 워크플로우를 받아들이지 않습니다. allowed_bots에서 renovate[bot]을 허용하고 있습니다.
사용 가능한 도구 제한: claude_args에서 읽기 전용 도구(Read・Grep・Glob)만 허용합니다. 파일 변경, 명령어 실행, 네트워크 접근은 금지했습니다.
판단 결과를 JSON으로 받기: claude_args에 --json-schema를 전달하면, 판단 결과를 structured_output으로 받을 수 있습니다.
claude_args에는 다음 값을 전달하고 있습니다.
--model sonnet
--max-turns 40
--allowedTools Read,Grep,Glob
...
프롬프트의 핵심 (Prompt Key Points)
프롬프트에는 PR의 제목・본문(Renovate가 작성하는 릴리스 노트)・diff를 '데이터'로 전달합니다. 중요한 것은 판단 기준을 어떻게 작성하느냐입니다.
## 판단 기준
최대한 자동으로 병합할 수 있도록, 근거를 확인한 후 판단해 주세요.
- approve: 파괴적 변경・사용 중지(Deprecation)・행동 변화가 없거나, 또는 이 리포지토리 사용법에 영향을 주지 않음을,
...
'확신이 서지 않으면 human_review'라고만 적으면, AI 에이전트는 너무 신중해져서 대부분의 PR을 사람에게 넘깁니다. CI에서 감지할 수 있는 불안함은 이유로 삼지 않도록 명시함으로써, 자동으로 병합 가능한 PR을 늘리고 있습니다.
또한, 릴리스 노트나 node_modules 파일 안에 적힌 지시 사항에는 따르지 않도록 프롬프트 시작 부분에 전달하고 있습니다. 이는 프롬프트 인젝션(Prompt Injection)에 대한 대책입니다.
판단 결과 반영 (Reflecting Judgment Results)
finalize Job에서는 판단 결과를 레이블・커밋 상태・PR 댓글에 반영합니다. approve의 경우, auto-merge를 활성화합니다.
GitHub의 auto-merge는 이미 병합 가능한 상태의 PR에는 적용할 수 없습니다. 따라서, success를 만들기 위한 선행 단계에서 auto-merge를 활성화하고, 이미 병합 가능한 상태라면 그대로 병합합니다.
// auto-merge는 deps-ai-review가 success가 되기 전에 활성화해야 함
// (GitHub는 이미 병합 가능한 PR에는 auto-merge를 활성화할 수 없기 때문에)
let autoMergeResult = null
...
직접 병합할 때는 검토한 커밋의 SHA를 지정합니다. 검토 후에 새로운 커밋이 쌓여 있다면, GitHub가 병합을 거부합니다.
rebase 할 때마다 재검토하지 않기
Renovate의 PR은 베이스 브랜치의 업데이트에 맞춰 rebase 될 수 있습니다. 그럴 때마다 AI 에이전트를 호출하면 시간과 사용량을 낭비하게 됩니다.
그래서, 차이점의 '변경 행'만으로 해시값(fingerprint)을 계산하고, 이전과 같다면 판정을 재사용합니다.
const computeFingerprint = (files) => {
const source = files
...
git patch-id와 같은 방식입니다. 행 번호(@@의 행)나 주변 행은 포함하지 않기 때문에, 변경 내용이 동일한 rebase라면 값은 변하지 않습니다. lockfile의 해결 결과가 바뀌었다면 값이 변하고 재검토를 하게 됩니다.
필요한 설정
워크플로우를 실행하려면 다음 설정이 필요합니다.
| 종류 | 이름 | 내용 |
|---|---|---|
| secret | CLAUDE_CODE_OAUTH_TOKEN | claude setup-token으로 발급한 OAuth 토큰 |
| variable | DEPS_AI_REVIEW_AUTO_MERGE | 자동 병합을 활성화합니다 (true로 설정, 기본값은 비활성화) |
| variable | DEPS_AI_REVIEW_CLAUDE_MODEL | 사용할 모델 (예: sonnet. 선택 사항) |
| variable | DEPS_AI_REVIEW_MERGE_METHOD | 병합 방식 (MERGE / SQUASH / REBASE. 기본값은 MERGE) |
리포지토리 설정도 변경해야 합니다.
- Settings → General에서
마지막으로, 이 글에서 소개한 파일 전체를 첨부합니다. 내용이 길어 접혀 있습니다.
renovate.json5
{
$schema: 'https://docs.renovatebot.com/renovate-schema.json',
// Renovate 권장 기본 설정을 상속
...
.github/workflows/deps-ai-review.yml
---
# Renovate의 major / minor 업데이트 PR을 AI 에이전트 (anthropics/claude-code-action)로 리뷰하고, pass 시 auto-merge를 활성화
#
...
.github/scripts/deps-ai-review/lib.cjs
// deps-ai-review 워크플로우(.github/workflows/deps-ai-review.yml)의 각 단계에서 사용하는 공통 처리
//
// 단계 간 데이터는, 짧은 값은 단계의 outputs로, 큰 값은 $RUNNER_TEMP/deps-ai-review/의 JSON 파일로 전달
...
```(?:json)?\s*\n([\s\S]*?)\n```$/, '$1')
let parsed
try {
parsed = JSON.parse(text)
...
```', sanitize(data.error).slice(0, 2000), '```', '')
lines.push(`[워크플로우 실행 로그](${runUrl})`, '')
}
if (data.summary) lines.push('### 요약', '', sanitize(data.summary), '')
...
요약
- AI 에이전트의 등장으로 개발 속도는 빨라졌지만, 라이브러리 업데이트 확인은 사람의 작업으로 남는 경향이 있다.
- Renovate의 업데이트 PR을 GitHub Actions 상의 Claude Code에 리뷰시켰다.
- AI 에이전트에게는 읽기 권한과 도구만 전달하고, 판정 결과 반영은 다른 Job에서 수행한다.
- 자동 병합 여부는 Renovate의 Label과 변수로 결정한다.
- 타입 오류나 테스트에서 발견되는 문제는 필수 체크에 맡기고, AI 에이전트에게는 릴리스 노트 영향 판단에 집중하도록 한다.
- 우선 확인만 하는 것부터 시작하고, 판정이 신뢰할 수 있다고 판단되면 자동 병합을 활성화한다.
저도 이 시스템을 막 구축했습니다. 당분간은 자동 병합을 비활성화한 상태로 운영하며, AI 에이전트의 판정을 확인할 예정입니다. 문제가 없어 보이면, 자동 병합을 활성화할 생각입니다.
끝까지 읽어주셔서 감사합니다. 이 글이 조금이라도 도움이 되었다고 생각하시면, Like♥를 눌러주시면 큰 힘이 됩니다.
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기