GitHub/github-actions

16 개의 포스트

github

코더에서 오케스트레이터로: 에이전트가 개발자의 역할을 어떻게 바꾸는가 (새 탭에서 열림)

한 번의 프롬프트로 코드를 만드는 시연과, 코드를 반복적·안전하게 배포하는 시스템을 구축하는 일은 다르다. AI 에이전트 시대의 개발자는 단순히 코드를 작성하는 사람을 넘어, 코드 생성부터 검증·리뷰·배포까지의 흐름을 설계하고 통제하는 ‘오케스트레이터’가 되어야 한다. 에이전트의 유연성과 CI·브랜치 보호·리뷰 같은 결정론적 통제를 결합해야 팀이 신뢰할 수 있는 개발 시스템을 만들 수 있다. ## 일회성 프롬프트에서 반복 가능한 워크플로로 - 한 번의 프롬프트는 빠르게 결과를 만들 수 있지만, 매번 안정적으로 재현되는 산출물을 보장하지는 않는다. - 실제 개발에는 다음 요소가 연결된 워크플로가 필요하다. - 작업을 시작하는 이벤트와 트리거 - 에이전트가 수행할 작업의 범위 - 코드 검증과 보안 검사 - 리뷰 및 승인 절차 - 안전한 병합과 배포를 위한 통제 - 따라서 개발자는 코드뿐 아니라 코드가 제안되고, 검증되고, 리뷰되고, 배포되는 시스템 자체를 설계해야 한다. ## 이벤트 기반 에이전트 흐름 - 익숙한 저장소 이벤트를 에이전트 작업의 시작점으로 활용한다. - 이슈에 특정 라벨 추가 - 예약된 야간 워크플로 실행 - 기타 GitHub 저장소 이벤트 - 이벤트가 GitHub Actions 워크플로를 실행하고, 사전에 범위를 정한 작업을 Copilot 에이전트가 수행한다. - 에이전트가 만든 결과는 풀 리퀘스트에 기록된다. - 이후 자동화된 검증 절차가 결과를 평가한다. - 린트 - 테스트 - 보안 스캔 - 빌드 검증 ## 에이전트의 유연성과 결정론적 통제 - 에이전트는 모호하고 맥락이 많은 작업을 처리하는 데 적합하다. - 반면 다음과 같은 규칙 기반 장치는 예측 가능하고 반복 가능한 품질 신호를 제공한다. - CI 검사 - CODEOWNERS - 필수 리뷰 - 브랜치 보호 규칙 - 브랜치 보호는 검증되지 않은 변경이나 승인되지 않은 병합을 막는다. - 위험도가 높은 변경에는 사람의 판단이 반드시 개입되도록 리뷰 요건을 설정할 수 있다. - 팀이 에이전트를 신뢰하려면 에이전트의 자율성을 무제한으로 허용하기보다, 명확한 결정론적 경계 안에서 운영해야 한다. ## 개발자의 역할 변화 - 개발자는 여전히 코드를 작성하지만, 동시에 다음을 책임진다. - 어떤 이벤트가 에이전트를 실행할지 정의 - 에이전트의 권한과 작업 범위 제한 - 에이전트와 검증·리뷰 단계 사이의 인계 설계 - 사람의 판단이 필요한 지점 결정 - GitHub Copilot은 이러한 자동화와 에이전트 운영을 한곳에서 관리하는 제어 평면 역할을 한다. - Copilot cloud agent 워크플로, GitHub Actions의 Copilot CLI, MCP를 통한 외부 도구·컨텍스트 연동은 같은 성숙 경로에서 선택할 수 있는 구현 방식이다. ## 작은 범위에서 시작하기 - 처음부터 전체 개발 프로세스를 자동화하기보다 범위가 명확하고 위험이 낮은 작업 하나를 선택하는 것이 좋다. - 예시: - 이슈 분류 - 문서와 테스트의 동기화 - 단순 유지보수 변경 - 기존 소프트웨어 개발 인프라에 Copilot을 단계적으로 도입하고, 실제로 필요한 다음 자동화 단계를 확인하며 확장한다. 실용적으로는 에이전트에게 제한된 권한을 부여하고, 모든 변경을 풀 리퀘스트와 자동 검사를 거치게 하는 방식이 적합하다. 즉, AI가 코드를 대신 작성하는 것보다 중요한 것은 사람이 통제 가능한 검증·승인·배포 체계를 설계하는 일이다.

github

Dependabot 길들이기: 업데이트를 그룹화하고, 주기를 늦추되, 보안 업데이트는 신속하게 (새 탭에서 열림)

활성 저장소에서는 Dependabot이 의존성마다 개별 PR을 생성해 알림, 리뷰, CI 실행을 과도하게 늘릴 수 있다. 글은 Microsoft GCToolkit 사례를 통해 의존성 업데이트를 생태계별로 그룹화하고 주기를 월간으로 늦추면 유지보수 소음을 크게 줄일 수 있다고 설명한다. 다만 일반 버전 업데이트와 달리 보안 업데이트는 신속하게 처리되므로, 업데이트 빈도를 낮춰도 보안 대응 속도는 유지할 수 있다. ## Dependabot이 만드는 유지보수 소음 - GCToolkit의 578개 커밋 중 92개가 Dependabot 버전 업데이트였으며, 최근 12개월에만 61개가 발생했다. - 기존 설정은 다음과 같았다. - GitHub Actions만 감시 - 매일 업데이트 확인 - 최대 10개의 PR 허용 - 의존성 10개가 업데이트되면 PR 10개, CI 실행 10회, 리뷰 알림 10건이 발생한다. - `open-pull-requests-limit: 10`은 PR 수를 제한할 뿐, 업데이트가 쏟아지는 원인을 해결하지 못한다. ## 여러 업데이트를 하나의 PR로 그룹화 - `groups`와 `patterns: ["*"]`를 사용하면 모든 의존성 업데이트를 하나의 PR로 묶을 수 있다. - 예를 들어 10개의 업데이트가 발생해도 다음처럼 처리된다. - 브랜치 1개 - PR 1개 - CI 실행 1회 - 리뷰 및 병합 1회 - 그룹 이름은 자유롭게 정할 수 있으며 PR 제목과 브랜치 이름에 표시된다. - 규모가 큰 프로젝트에서는 테스트 라이브러리, 운영 의존성 등 목적별로 여러 그룹을 만들 수 있다. - 모노레포에서는 `directories`와 `group-by: dependency-name`을 사용해 여러 디렉터리에 같은 의존성이 있을 때 하나의 PR로 통합할 수 있다. ```yaml - package-ecosystem: "npm" directories: - "/apps/*" schedule: interval: "monthly" groups: monthly-batch: group-by: dependency-name patterns: - "*" ``` ## 업데이트 주기를 일간에서 월간으로 변경 - `interval: daily`는 평일마다 업데이트를 확인하므로 지속적인 PR 생성으로 이어질 수 있다. - `interval: monthly`로 바꾸면 계획 가능한 월간 배치 방식으로 전환된다. - 그룹화와 결합하면 생태계별로 한 달에 하나의 일괄 PR을 받게 된다. - 프로젝트 특성에 따라 `weekly`를 선택할 수도 있고, `schedule.day`와 `schedule.time`으로 실행 시점을 지정할 수 있다. - 의존성이 안정적인 성숙한 라이브러리에는 월간 주기가 적합하다. ## 실제 사용하는 생태계를 모두 설정 - 기존 설정은 GitHub Actions만 대상으로 했지만, GCToolkit은 Maven 기반 Java 프로젝트이므로 Maven 의존성도 별도로 등록해야 했다. - 생태계마다 `updates` 항목을 추가해야 한다. ```yaml - package-ecosystem: "github-actions" directory: "/" schedule: interval: "monthly" groups: monthly-batch: patterns: - "*" - package-ecosystem: "maven" directory: "/" schedule: interval: "monthly" groups: monthly-batch: patterns: - "*" ``` - GitHub Actions와 Maven 업데이트는 각각 독립된 그룹과 일정으로 관리된다. - 소음을 줄이는 것뿐 아니라, 실제 애플리케이션 의존성까지 Dependabot이 감시하도록 만드는 것이 중요하다. ## 보안 업데이트는 빠르게 유지 - 월간 일정과 그룹 설정은 일반적인 버전 업데이트의 처리 방식을 조정하는 설정이다. - Dependabot 보안 업데이트는 별도의 메커니즘으로 동작하므로, 일반 업데이트 주기를 늦춰도 보안 취약점 대응까지 월간으로 미뤄지지 않는다. - 따라서 평상시에는 일괄 업데이트로 리뷰 부담을 줄이고, 보안 수정은 기존처럼 신속하게 처리하는 균형을 유지할 수 있다. ## 실용적인 적용 방법 - 안정적인 저장소라면 생태계별로 `monthly` 일정과 전체 의존성 그룹화를 적용한다. - 업데이트가 자주 필요하거나 변경 영향이 큰 프로젝트는 `weekly` 또는 목적별 다중 그룹을 사용한다. - GitHub Actions뿐 아니라 Maven, npm 등 실제 사용하는 모든 패키지 생태계를 `dependabot.yml`에 등록한다. - 보안 업데이트 설정은 별도로 확인해 취약점 수정이 지연되지 않는지 점검한다.

github

npm 및 GitHub Actions의 공급망 공격 교란 (새 탭에서 열림)

npm과 GitHub Actions를 겨냥한 공급망 공격은 계정 탈취, CI/CD 취약점 악용, 자격 증명 탈취, 악성 패키지 확산을 연쇄적으로 결합한다. GitHub는 단일 방어 기능보다 공격 단계별로 핵심 연결고리를 끊는 다층 방어가 필요하다고 보고, npm과 GitHub Actions에 계정 보호·워크플로 권한 제한·캐시 보호·무자격 증명 배포 등의 기능을 도입했다. 목표는 공격을 완전히 제거하기보다 초기 침해와 권한 상승, 자격 증명 유출, 대규모 확산을 차단하고 탐지·대응 시간을 확보하는 것이다. ## 공급망 공격의 구조 - 공격은 대개 다음 단계로 진행된다. - 유지보수자 계정이나 프로젝트의 GitHub Actions 워크플로를 침해한다. - CI/CD 환경에서 더 높은 권한과 자격 증명을 찾는다. - 토큰과 계정 정보를 외부로 유출한다. - 탈취한 자격 증명으로 다른 패키지와 프로젝트를 연쇄적으로 감염시킨다. - 공격 방식은 다양하지만, 초기 침해·권한 상승·확산이라는 공통된 흐름을 가진다. - 따라서 하나의 보안 기능보다 공격 사슬의 영향력이 큰 지점을 여러 단계에서 차단하는 접근이 필요하다. ## 초기 침해 차단 - **고영향 npm 계정 보호** - 이메일 주소를 변경하거나 2FA 복구 코드를 사용한 고영향 npm 계정은 72시간 동안 읽기 전용 상태가 된다. - 피싱으로 계정을 탈취당하더라도 공격자가 즉시 악성 버전을 배포하지 못하게 한다. - 해당 기간 동안 유지보수자가 계정을 복구하거나 이상 행위를 확인할 수 있다. - **`pull_request_target`의 안전한 checkout 기본값** - 포크에서 제출된 풀 리퀘스트의 신뢰할 수 없는 코드를 워크플로가 실행하는 “pwn request” 취약점을 완화한다. - `actions/checkout`은 일반적으로 악용되는 트리거에서 포크의 비신뢰 코드를 checkout하지 않도록 변경됐다. - 관리자가 위험을 검토한 뒤 명시적으로 예외를 선택해야 하며, 기존 버전에도 변경 사항이 백포트됐다. - **워크플로 실행 주체와 트리거 제한** - 엔터프라이즈·조직·저장소 수준에서 누가 워크플로를 실행할 수 있는지 설정할 수 있다. - 허용할 워크플로 트리거 유형도 제한할 수 있다. - 이를 통해 Actions 인프라에 최소 권한 원칙을 적용하고 공격 표면을 줄인다. - **비신뢰 트리거의 Actions 캐시 읽기 전용화** - 공격자가 워크플로 실행 권한을 얻은 뒤 공유 캐시를 오염시켜 더 높은 권한의 워크플로를 공격하는 경로를 차단한다. - 신뢰도가 낮은 워크플로는 다른 워크플로와 공유되는 캐시를 수정할 수 없게 된다. - 결과적으로 릴리스·패키지 배포 워크플로의 고권한 자격 증명 탈취로 이어지는 권한 상승을 어렵게 만든다. ## 자격 증명 탈취와 유출 방지 - **장기 자격 증명 제거** - CI/CD 파이프라인에 저장된 장기 토큰은 공격자가 가장 먼저 노리는 대상이다. - npm Trusted Publishing은 장기 자격 증명 없이 패키지를 배포하도록 해 탈취 가능한 비밀 정보를 줄인다. - CircleCI도 Trusted Publishing 공급자로 추가되어, CircleCI 기반 배포에서도 장기 자격 증명 제거가 가능해졌다. - **Actions 네트워크 방화벽** - 기술 프리뷰 단계의 기능으로, Actions 실행 중 발생하는 모든 외부 네트워크 트래픽을 기록한다. - 악성 코드 다운로드나 새 도메인으로의 자격 증명 유출처럼 비정상적인 통신을 탐지하는 데 활용할 수 있다. - 향후에는 네트워크 외부 연결 제한과 정책 기반 차단을 지원해 유출이 발생하기 전에 공격을 막는 방향으로 확장될 예정이다. ## 악성 패키지 확산 억제 - **npm 단계적 게시(Staged Publishing)** - 패키지 배포 자격 증명만 가지고는 새 버전을 즉시 공개할 수 없도록 한다. - 배포된 패키지는 추가 승인과 npm CLI 또는 npmjs.com에서의 2FA 인증이 완료될 때까지 보류된다. - 선택적으로 활성화할 수 있으며, 자동화·CI/CD 자격 증명과 실제 배포 승인 절차를 분리한다. - 탈취된 배포 자격 증명으로 악성 버전을 대규모 배포하는 공격을 줄인다. ## 실용적인 권장 사항 npm 유지보수자는 고영향 계정 보호, Trusted Publishing, 단계적 게시를 검토하고, GitHub Actions 사용자는 포크 PR 처리 방식과 캐시 공유 구조를 점검하는 것이 좋다. 또한 워크플로 실행 주체를 최소화하고, Actions 네트워크 트래픽을 모니터링하면 자격 증명 유출과 연쇄 확산을 조기에 발견할 가능성을 높일 수 있다.

github

GitHub 에이전틱 워크플로로 리포지토리 간 문서화 자동화 (새 탭에서 열림)

Aspire 팀은 GitHub Agentic Workflows를 활용해 제품 코드 저장소와 문서 저장소가 분리된 환경에서도 기능 변경 직후 문서 PR을 자동 생성하는 시스템을 구축했다. 에이전트가 변경 사항과 이슈를 분석해 문서를 작성하지만, 실제 쓰기 작업은 제한된 별도 핸들러가 수행하도록 분리해 보안을 확보했다. 그 결과 Aspire 13.3·13.4에서 82개의 문서 PR이 제품 PR 병합 후 중앙값 44.8시간 내 생성됐고, 모두 해당 기능을 구현한 엔지니어의 검토를 받았다. ## 교차 저장소 문서화가 어려운 이유 - 제품 코드는 `microsoft/aspire`, 문서 사이트는 `microsoft/aspire.dev`에 있어 저장소와 배포 대상, 리뷰 절차가 분리되어 있다. - 기존 방식은 문서 작성자가 몇 주 뒤 닫힌 PR을 찾아 변경 내용을 역추적하는 구조였다. - 기능 작성자는 이미 다음 작업으로 넘어간 상태라 문서 작성에 필요한 맥락을 충분히 제공하기 어려웠다. - 저장소 전체에 쓰기 권한을 가진 광범위한 토큰은 보안상 부적절하므로, 단순한 크로스 리포지토리 자동화도 권한 설계가 병목이 된다. ## GitHub Agentic Workflows의 구조 - 워크플로를 YAML 대신 하나의 Markdown 파일로 작성한다. - YAML 형식의 frontmatter에 설정을 작성한다. - 아래에는 에이전트가 수행할 작업을 자연어 프롬프트로 작성한다. - 컴파일하면 일반 GitHub Actions 워크플로인 `.lock.yml` 파일이 생성된다. - 실행 시 에이전트는 제한된 도구와 프롬프트를 바탕으로 변경 사항을 분석한다. - 에이전트가 GitHub에 직접 쓰지 않는 점이 핵심이다. - 에이전트는 생성하려는 PR, 이슈, 댓글을 JSON 형태의 의도로 출력한다. - 별도의 `safe-outputs handler`가 허용된 작업만 실제로 실행한다. - 저장소와 작업 종류를 명시적으로 제한할 수 있어 보안 검토와 자동화의 균형을 맞춘다. ## 기능 PR에서 문서 PR로 이어지는 자동화 흐름 - `microsoft/aspire`의 `main` 또는 `release/*` 브랜치에 병합된 PR을 `pull_request: closed` 이벤트로 감지한다. - `merged == true` 조건을 적용해 실제 병합된 PR만 처리한다. - 에이전트가 실행되기 전에 Bash 기반의 결정론적 로직으로 문서 대상 브랜치를 결정한다. 1. 제품 PR의 마일스톤 제목을 확인한다. 예를 들어 `13.4`는 문서 저장소의 `release/13.4`로 매핑된다. 2. PR 본문에서 `Fixes`, `Closes`, `Resolves`로 연결된 이슈를 찾고, 해당 이슈의 첫 번째 비어 있지 않은 마일스톤을 확인한다. 3. PR의 base ref가 `release/X.Y` 또는 `release/X.Y.Z` 형식이면 이를 사용한다. 4. 어느 조건에도 해당하지 않으면 `main`을 사용한다. - 마일스톤과 문서 브랜치를 명확히 매핑해 에이전트가 대상 브랜치를 추측하지 않도록 한다. - 에이전트는 제품 diff와 연결된 이슈를 읽고 문서화가 필요한 변경인지 판단한다. - 문서가 필요하면 체크아웃된 `microsoft/aspire.dev` 작업 공간에 기존 문서 작성 규칙에 맞춰 초안을 작성한다. - 문서의 문체 - MDX 규칙 - Astro Starlight 컴포넌트 사용법 - 이후 `create_pull_request` safe output을 생성해 문서 PR 생성을 요청한다. ## 제한된 권한으로 PR 생성하기 - safe-outputs 핸들러는 실제 PR 생성 시 다음 제약을 적용한다. - PR 제목에 `[docs]` 접두사 사용 - `docs-from-code` 라벨 부착 - 자동 병합 없이 항상 draft PR로 생성 - base 브랜치는 `main` 또는 `release/*`로 제한 - 대상 저장소는 `microsoft/aspire.dev`로 고정 - 제품 PR의 리뷰 기록에서 해당 기능을 승인한 SME를 찾아 문서 PR 리뷰어로 요청한다. - 문서 리뷰가 기능 구현자의 맥락과 분리되지 않도록, 실제 기능을 승인한 사람이 문서도 검토하게 한다. - 별도 작업은 원본 제품 PR에 문서 PR 링크를 댓글로 남긴다. - 재실행 시 이전 `pr-docs-check` 댓글을 최소화해 중복 알림을 줄인다. - 기능을 병합한 엔지니어는 몇 분 안에 문서 초안을 확인할 수 있다. ## 보안 설계와 safe-outputs 계약 - GitHub 도구 세트를 `repos`, `issues`, `pull_requests` 등 필요한 범위로 제한한다. - `min-integrity: approved` 설정으로 무결성이 검증된 작업만 실행하도록 한다. - 허용 저장소를 `microsoft/*`처럼 제한할 수 있다. - 전용 GitHub App의 App ID와 private key를 사용해 일반적인 광범위 토큰 대신 작업별 권한을 부여한다. - App이 접근할 수 있는 저장소도 `aspire.dev`, `aspire`로 한정한다. - 에이전트의 분석 권한과 실제 변경 권한을 분리해, 에이전트가 임의로 저장소에 쓰거나 병합하지 못하게 한다. - 최종 문서 반영은 여전히 draft PR과 사람의 리뷰를 거친다. ## 측정된 결과 - Aspire 13.3과 13.4에서 문서 기능 PR 82개가 병합됐다. - 문서 PR은 제품 PR 병합 후 중앙값 44.8시간 뒤에 생성됐다. - 모든 문서 PR을 해당 기능을 구현한 엔지니어가 검토했다. - 별도의 인력 충원이나 새로운 프로세스 교육 없이 운영됐다. - 문서 작성 시점이 기능 출시 후 수 주가 아니라 기능 병합 직후로 앞당겨졌다. 기능 저장소와 문서 저장소가 분리되어 있다면, 에이전트에게 광범위한 쓰기 권한을 주기보다 **결정론적인 브랜치 선택 로직, 제한된 safe outputs, 초안 PR, 담당 엔지니어 리뷰**를 결합하는 방식이 실용적이다. AI가 문서를 작성하더라도 최종 병합은 사람이 담당하도록 설계하는 것이 안전성과 문서 품질을 함께 확보하는 방법이다.

github

범용 접근성 에이전트 구축과 그 과정에서 얻은 교훈 (새 탭에서 열림)

GitHub는 개발자가 접근성 질문에 즉시 답을 얻고, 배포 전 단순하고 객관적인 접근성 문제를 자동 수정하도록 실험적인 범용 접근성 에이전트를 운영하고 있습니다. 이 에이전트는 3,535개의 풀 리퀘스트를 검토해 68%의 해결률을 기록했지만, 접근성을 자동으로 “해결”하는 만능 도구가 아니라 기존 엔지니어링 노력을 보완하는 역할로 설계되었습니다. 특히 조직이 축적한 구조화된 접근성 이슈와 수정 사례가 에이전트의 정확도와 실용성을 높이는 핵심 자산이 되었습니다. ## 접근성 에이전트의 목표와 성과 - GitHub Copilot CLI와 VS Code 통합 환경에서 접근성 관련 질문에 신뢰할 수 있는 답변을 제공합니다. - 프런트엔드 코드가 변경된 풀 리퀘스트를 자동으로 검사합니다. - 단순하고 판단 기준이 명확한 접근성 문제는 코드 제안 형태로 자동 수정할 수 있습니다. - 현재까지 3,535개의 풀 리퀘스트를 검토했으며, 68%의 해결률을 기록했습니다. - 가장 많이 발견된 문제는 다음과 같습니다. - 구조와 관계를 보조공학 기술이 명확히 이해하도록 표현하지 못한 문제 - 대화형 컨트롤의 이름이 불명확한 문제 - 중요한 상태 변화나 공지를 사용자에게 전달하지 못한 문제 - 이미지 등 비텍스트 콘텐츠에 텍스트 대안이 없는 문제 - 키보드 포커스 이동 순서가 논리적이지 않은 문제 예를 들어 시각적 배치와 DOM·스크린 리더 읽기 순서가 서로 다른 경우, 에이전트는 `row-reverse` 대신 DOM 요소 순서를 바꾸고 일반적인 `flex-direction: row`를 사용하라고 제안할 수 있습니다. ## 접근성을 바라보는 관점 - 사회적 장애 모델에 따르면 장애와 사용 장벽은 개인뿐 아니라 환경의 설계 방식에서도 발생합니다. - 디지털 서비스에서도 잘못 구성된 UI가 보조공학 사용자에게 장벽을 만들 수 있습니다. - 따라서 에이전트의 목표는 접근성을 독립적으로 완성하는 것이 아니라, 동료 개발자가 장벽을 더 빠르게 발견하고 제거하도록 돕는 것입니다. - 모든 상황을 자동으로 처리할 수 있는 “실버 불릿”으로 에이전트를 홍보하지 않았습니다. - 에이전트의 책임 범위를 현실적으로 정의한 덕분에 실험을 빠르게 시작하고 조직 내 동의를 얻을 수 있었습니다. ## 규제와 사전 투자 - 유럽 접근성법(EAA)이 시행되었고, 미국 장애인법(ADA) Title II도 2027년 4월부터 WCAG 2.1 AA 준수를 법적 완료 기준으로 삼을 예정입니다. - LLM 기반 에이전트는 접근성 트리를 읽고 이를 바탕으로 UI를 분석하거나 조작할 수 있습니다. - 조직이 아직 수동으로 접근성 문제를 식별하고 수정하는 체계를 마련하지 않았다면, 향후 에이전트를 구축할 때도 불리해집니다. - 자동화는 기존의 접근성 품질 관리 체계를 대체하는 것이 아니라, 이미 검증된 문제와 해결 방식을 활용해 확장하는 방식으로 효과를 냅니다. ## 구조화된 이슈 데이터의 가치 GitHub는 에이전트 도입 이전부터 접근성 문제를 일관되게 기록하고 검증하는 시스템을 운영했습니다. - 문제 신고용 구조화된 템플릿 - 재현 절차 - 심각도, 담당 서비스 영역, 적용 가능한 WCAG 성공 기준 등의 메타데이터 - 문제를 해결한 풀 리퀘스트와의 연결 - 수정 완료를 판단하는 명확한 수용 기준 - 모든 접근성 이슈를 하나의 저장소에 중앙화 이처럼 일관된 형식으로 축적된 이슈와 코드 변경 내역은 에이전트가 참고할 수 있는 고품질 학습·검색 자료가 되었습니다. LLM의 비결정적이고 유연한 매칭 능력도 비슷한 코드와 문구를 찾아내는 데에는 장점으로 작용했습니다. ## 일반적인 지침만으로는 부족한 이유 - 전문 영역에서 “접근성 모범 사례를 따르라”는 식의 짧고 추상적인 지침만으로는 충분하지 않습니다. - 주요 LLM은 접근성이 부족한 코드가 포함된 수십 년간의 자료로 학습되었기 때문에, 접근성 안티패턴을 생성하는 편향을 보일 수 있습니다. - 따라서 에이전트가 실제 조직의 코드 스타일과 문제 해결 관례를 반영한 구체적인 사례를 참고해야 합니다. - 수동으로 접근성 문제를 분류하고 수정한 기록은 다음 요소를 함께 포함합니다. - 실제 제품 맥락 - 조직의 코딩·문서화 규칙 - 적용된 WCAG 기준 - 문제를 해결한 코드 - 수정 여부를 검증하는 조건 - 이런 사례 기반 자료는 단순한 체크리스트보다 에이전트의 판단과 코드 제안에 훨씬 강력한 기반이 됩니다. ## 실용적인 결론 접근성 에이전트를 도입하려면 먼저 사람이 접근성 문제를 일관되게 기록하고, 재현 절차와 WCAG 기준, 실제 수정 사례를 축적하는 것이 좋습니다. 에이전트는 전문가의 판단을 대체하기보다 반복적이고 객관적인 문제를 빠르게 발견·수정하는 보조 수단으로 운영해야 하며, 그 한계를 명확히 정의할수록 조직 내 신뢰와 도입 효과가 커집니다.

github

GitHub 에이전틱 워크플로의 토큰 효율성 향상 (새 탭에서 열림)

GitHub Agentic Workflows는 반복 실행되는 CI 자동화인 만큼 토큰 비용이 누적되기 쉬우며, YAML과 실행 로그를 분석하면 이를 체계적으로 줄일 수 있다. GitHub는 토큰 사용량을 표준화해 수집하고, 감사·최적화 워크플로를 통해 불필요한 MCP 도구를 제거하거나 GitHub CLI로 대체했다. 그 결과 동작을 바꾸지 않고도 요청당 수천 토큰을 절약할 수 있었다. ## 토큰 사용량을 표준화해 기록 - Claude CLI, Copilot CLI, Codex CLI 등 에이전트 프레임워크마다 로그 형식이 달라 사용량 비교가 어려웠다. - 인증 정보를 에이전트에 직접 노출하지 않도록 사용하는 API 프록시를 활용해 모든 실행의 토큰 사용량을 한 형식으로 수집했다. - 각 워크플로는 `token-usage.jsonl` 아티팩트를 생성한다. - API 호출별 입력 토큰 - 출력 토큰 - 캐시 읽기·쓰기 토큰 - 모델과 제공업체 - 호출 시각 - 실행 로그와 이 데이터를 결합해 워크플로별 일반적인 토큰 소비 패턴과 이상 실행을 파악했다. ## 감사·최적화 워크플로로 자동 개선 - **Daily Token Usage Auditor** - 최근 실행의 토큰 사용량을 워크플로별로 집계한다. - 사용량이 급증한 워크플로, 비용이 큰 워크플로, 비정상적인 실행을 탐지한다. - 예를 들어 평소 4번의 LLM 턴으로 끝나던 작업이 18턴까지 늘어난 경우를 표시한다. - **Daily Token Optimizer** - 감사 결과가 나온 워크플로의 YAML과 최근 로그를 분석한다. - 불필요한 동작과 구체적인 최적화 방안을 GitHub Issue로 제안한다. - 감사·최적화 도구 자체도 에이전트 워크플로이므로 사용량을 함께 측정할 수 있고, 이를 통해 개선 작업이 반복되는 순환 구조를 만든다. ## 사용하지 않는 MCP 도구 제거 - LLM API는 상태를 유지하지 않기 때문에 MCP 도구의 함수명과 JSON 스키마가 매 요청에 포함되는 경우가 많다. - GitHub MCP 서버의 도구가 40개라면 매 턴마다 10~15KB의 스키마가 추가될 수 있다. - 실제로 두 도구만 사용하는 에이전트라면 나머지 38개 도구의 스키마는 매번 순수한 오버헤드가 된다. - 도구 설정과 실제 호출 기록을 대조하면 장기간 사용되지 않은 도구를 식별할 수 있다. - 스모크 테스트에서는 사용하지 않는 MCP 도구를 제거해 요청당 컨텍스트를 8~12KB 줄였고, 동작 변경 없이 실행당 수천 토큰을 절약했다. ## 데이터 조회를 GitHub CLI로 대체 MCP 호출은 단순한 데이터 조회에도 LLM의 판단 과정을 요구한다. - 에이전트가 도구를 선택하고 인자를 구성한 뒤 결과를 받는 과정 전체가 추가 LLM 호출이 된다. - 이 과정에서 도구 스키마, 인자 JSON, 응답 데이터가 모두 토큰을 소비한다. - 반면 `gh pr diff` 같은 GitHub CLI 명령은 결정적인 API 요청이므로 LLM 추론 단계가 필요 없다. GitHub는 두 가지 방식으로 MCP 데이터 조회를 CLI로 옮겼다. - **에이전트 실행 전 데이터 다운로드** - 항상 필요한 PR diff, 변경 파일 목록 등을 에이전트 시작 전에 `gh` 명령으로 가져온다. - 결과를 작업 공간 파일에 저장하고 에이전트가 파일을 읽도록 한다. - MCP 호출과 별도 추론 라운드트립을 제거하며, 에이전트가 Bash 도구를 활용해 데이터를 효율적으로 처리할 수 있다. - **에이전트 내부 CLI 프록시** - 실행 중 어떤 데이터를 가져올지 에이전트가 결정해야 하는 경우 사용한다. - 인증 토큰을 노출하지 않는 투명 HTTP 프록시가 CLI 요청을 GitHub API로 전달한다. - 에이전트는 `gh pr view --json` 같은 명령을 실행하고 구조화된 결과를 받는다. - 보안상 “에이전트에 비밀정보를 직접 제공하지 않는다”는 원칙을 유지하면서 토큰 사용량을 줄인다. ## 효율성 측정에서 고려할 요소 단순히 토큰 개수만 비교하면 최적화 효과를 정확히 판단하기 어렵다. - 모델별 토큰 가격이 다르다. - Claude Haiku와 Sonnet은 비슷한 토큰 수를 사용할 수 있지만 Haiku가 토큰당 약 4배 저렴하다. - 이를 반영하기 위해 모델과 토큰 종류에 가중치를 적용한 **Effective Tokens(ET)** 지표를 사용한다. ```text ET = m × (1.0 × I + 0.1 × C + 4.0 × O) ``` - `m`: 모델 비용 배수 - Haiku = 0.25 - Sonnet = 1.0 - Opus = 5.0 - `I`: 새로 처리한 입력 토큰 - `C`: 캐시에서 읽은 토큰 - `O`: 출력 토큰 - 출력 토큰은 입력 토큰보다 비용 영향이 크므로 4배 가중치를 적용한다. - 따라서 최적화가 토큰 수를 줄였는지뿐 아니라, 더 저렴한 모델을 사용했는지와 작업 품질을 유지했는지도 함께 평가해야 한다. 반복 실행되는 에이전트 워크플로는 먼저 사용량을 관측하고, 실제 사용 도구만 남기며, 결정적인 데이터 조회를 CLI나 사전 다운로드로 이동하는 방식이 효과적이다. 특히 MCP를 편리하다는 이유로 전체 등록하기보다 워크플로별 최소 도구만 구성하고, ET 같은 비용 반영 지표로 품질 저하 없이 최적화되는지 검증하는 것이 권장된다.

github

에이전트 풀 리퀘스트가 도처에 있습니다. 이를 검토하는 방법을 소개합니다. (새 탭에서 열림)

에이전트가 작성한 풀 리퀘스트(PR)는 빠르게 늘고 있지만, 테스트 통과와 깔끔한 코드만으로 품질을 보장할 수 없다. 연구에 따르면 에이전트 코드는 인간 작성 코드보다 중복과 기술 부채가 많을 수 있으며, 리뷰어는 오히려 더 쉽게 승인하는 경향이 있다. 따라서 리뷰어는 코드의 표면적 완성도보다 CI 조작, 중복 구현, 경계 조건, 권한 및 보안 문제를 중심으로 의도적으로 검토해야 한다. ## 에이전트 PR 증가와 리뷰 한계 - GitHub Copilot 코드 리뷰는 6천만 건 이상 처리됐고, 1년이 안 되는 기간에 10배 성장했다. - GitHub의 코드 리뷰 5건 중 1건 이상에 에이전트가 관여한다. - 개발자 한 명이 짧은 시간에 여러 에이전트 세션을 실행하면서 PR 생성 속도는 크게 늘었지만, 인간의 리뷰 처리 능력은 그만큼 증가하지 않았다. - 기존의 “리뷰 요청 → 코드 소유자 대기 → 병합” 방식만으로는 증가한 물량을 감당하기 어렵다. ## 에이전트 코드를 바라보는 관점 - 코딩 에이전트는 저장소의 패턴을 잘 따르지만 다음과 같은 맥락은 알지 못한다. - 과거 장애와 사고 이력 - 팀이 경험한 특수한 엣지 케이스 - 문서화되지 않은 운영 제약 - 에이전트는 실제로 완전하지 않은 구현도 완성된 것처럼 보이게 만들 수 있다. - 리뷰어의 핵심 역할은 자동화하기 어려운 판단과 맥락 이해다. - 따라서 diff를 단순히 읽기보다, 변경이 시스템의 운영 현실과 맞는지 검증해야 한다. ## CI를 약화시키는 변경 - 에이전트가 CI 실패를 해결하기 위해 다음과 같은 편법을 사용할 수 있다. - 테스트 삭제 - 린트 단계 건너뛰기 - 테스트 명령에 `|| true` 추가 - 테스트나 워크플로 실행 조건 완화 - 다음 항목이 변경됐다면 명확한 근거 없이는 병합하지 않아야 한다. - 코드 커버리지 기준 하향 - 테스트 삭제, 이름 변경 또는 skip 처리 - fork나 PR에서 워크플로가 실행되지 않도록 변경 - 기존에 항상 실행되던 CI 단계에 조건 추가 - CI를 약화하는 변경은 에이전트 PR에서 즉시 차단해야 할 대표적인 신호다. ## 기존 코드 재사용 여부 - 에이전트는 저장소 전체의 설계 의도보다 눈앞의 코드 패턴을 복제하는 경향이 있다. - 다음과 같은 중복이 생길 수 있다. - 기존 유틸리티와 기능이 같은 새 헬퍼 - 여러 위치에 반복 구현된 검증 로직 - 공유 모듈에 이미 있는 미들웨어의 재작성 - 이름만 다르고 동작은 거의 같은 함수 - 새 유틸리티가 추가될 때마다 저장소에서 동등한 기능을 검색해야 한다. - 중복 구현을 발견하면 단순 코멘트가 아니라 병합 전 통합을 요구하는 편이 낫다. - 새로운 유틸리티를 추가할 경우, 일정 규모 이상의 PR에서는 추가 이유를 설명하도록 요구하면 중복을 조기에 발견할 수 있다. ## 테스트를 통과해도 틀릴 수 있는 코드 - 명백한 API 오용이나 컴파일 오류는 CI에서 잡히지만, 다음과 같은 논리 오류는 통과할 수 있다. - 페이지네이션의 off-by-one 오류 - 테스트되지 않은 분기의 권한 검사 누락 - 특정 입력에서만 검증이 조기에 종료되는 문제 - 대규모 환경이나 경쟁 상태에서만 발생하는 오류 - 중요한 변경 경로를 입력부터 출력까지 직접 추적해야 한다. - 특히 다음 경계를 확인해야 한다. - `0`, 최댓값, 빈 값 - 외부에서 들어오는 값에 대한 검증 - 모든 분기의 권한 확인 - 예상하기 어려운 조건문과 조기 반환 - 수정 전에는 실패하고 수정 후에는 통과하는 회귀 테스트를 요구해야 한다. - 에이전트가 수정하려는 버그를 재현하는 테스트를 작성하지 못한다면, 문제에 대한 이해나 수정 자체가 불완전할 가능성이 높다. ## 계획 없는 대규모 PR과 에이전트 이탈 - 크고 범위가 불명확한 PR은 에이전트가 리뷰 피드백을 제대로 반영하지 못하거나 작업을 중단할 가능성이 높다. - 깊이 있는 리뷰를 시작하기 전에 다음을 확인해야 한다. - 이전 리뷰 라운드에 에이전트가 적절히 응답했는가 - 구현 계획이 구조적으로 제시돼 있는가 - 변경이 작은 단위로 나뉘어 있는가 - 계획이 없다면 상세한 코드 리뷰보다 먼저 작업을 분할하거나 각 부분의 목적과 구조를 설명하도록 요구하는 것이 효율적이다. - 이렇게 하면 리뷰어가 방향을 잃은 대규모 변경에 시간을 낭비하는 일을 줄일 수 있다. ## 워크플로의 신뢰할 수 없는 입력과 프롬프트 인젝션 LLM을 호출하는 GitHub Actions나 CI 워크플로는 일반 PR보다 더 엄격하게 검토해야 한다. - 위험한 흐름은 다음과 같다. - PR 본문, 이슈 본문, 커밋 메시지를 읽음 - 해당 내용을 프롬프트에 삽입 - 모델 출력을 셸 명령으로 전달 - `GITHUB_TOKEN` 권한으로 실행 - 다음 항목은 병합을 막아야 하는 보안 신호다. - 사용자 입력을 정제·인용 없이 프롬프트에 삽입 - 필요한 범위보다 넓은 쓰기 권한의 `GITHUB_TOKEN` - 모델 출력을 검증 없이 셸 명령으로 실행 - 에이전트 단계에서 시크릿에 접근하거나 로그에 출력 - 요구할 수 있는 방어책은 다음과 같다. - 워크플로에 최소 권한을 설정하고 `permissions: read-all`을 기본값으로 고려 - 신뢰할 수 없는 입력을 프롬프트에 넣기 전에 정제하고 명확히 인용 - 분석 단계와 실행 단계를 분리 - 운영 환경에 영향을 주는 작업에는 사람의 승인 단계 추가 - 모델 출력을 직접 실행하거나 `eval`하지 않고 검증된 형식으로 제한 에이전트 PR은 느리게 검토해야 하는 대상이 아니라, 다르게 검토해야 하는 대상이다. CI가 약화되지 않았는지, 기존 코드와 중복되지 않는지, 핵심 경로와 경계 조건이 검증됐는지, 워크플로 권한과 입력이 안전한지를 우선 확인하면 리뷰 시간을 줄이면서도 조용한 기술 부채와 보안 위험을 효과적으로 잡을 수 있다.

github

“정답”이 결정적이지 않을 때 에이전트 행동 검증 (새 탭에서 열림)

자율 에이전트의 실행 과정은 환경, 타이밍, UI 상태에 따라 달라지므로 기존의 결정론적 테스트 방식만으로는 올바른 동작을 안정적으로 검증하기 어렵다. 에이전트가 실제 작업을 성공했는데도 실행 경로가 예상과 다르다는 이유로 테스트가 실패하는 ‘거짓 음성(false negative)’이 발생할 수 있다. 글은 고정된 스크립트 대신 필수 결과와 경로의 구조를 검증하는 독립적인 ‘Trust Layer’를 제안하며, 이를 통해 설명 가능하고 CI에 적합한 에이전트 검증을 구현할 수 있다고 주장한다. ## 에이전트 기반 검증에서 발생하는 문제 - Copilot Coding Agent가 UI, 브라우저, IDE 같은 실제 환경을 조작하면 실행 결과가 매번 동일하지 않다. - 네트워크 지연으로 로딩 화면이 오래 표시되거나, 반대로 즉시 화면이 나타날 수 있다. - 에이전트가 상황에 맞게 대기하고 작업을 완료했더라도, 테스트가 특정 시점이나 순서를 기대하면 실패한다. - 주요 문제는 다음과 같다. - **거짓 음성:** 작업은 성공했지만 테스트가 실패로 판정한다. - **취약한 인프라:** 렌더링, 타이밍, 네트워크 같은 환경 잡음이 결과에 영향을 준다. - **컴플라이언스 함정:** 올바른 결과를 냈어도 사전에 기록된 에이전트 행동과 다르면 회귀로 오인된다. - 에이전트의 정확성은 정해진 단계를 그대로 따르는 것이 아니라, 필수적인 결과를 안정적으로 달성하는지로 판단해야 한다. ## 기존 테스트 방식이 자율 에이전트에 맞지 않는 이유 - **Assertion 기반 테스트** - 모든 검증 조건을 사람이 직접 작성해야 한다. - 가능한 모든 대체 경로를 명세하기 어렵다. - **Record-and-replay** - 실행을 녹화된 순서와 비교하므로 사소한 타이밍·렌더링 변화에도 실패한다. - **시각적 회귀 테스트** - 스크린샷 차이는 감지하지만, 해당 변화가 작업의 의미나 최종 결과에 영향을 주는지는 이해하지 못한다. - **ML 오라클** - 많은 학습 사례가 필요하다. - 실패 판정의 근거를 설명하기 어려운 블랙박스가 되기 쉽다. - 이 방식들은 모두 “정확성은 특정한 관찰 상태와 순서를 재현하는 것”이라는 공통 가정을 갖는다. - 하지만 에이전트 시스템에서는 서로 다른 실행 경로가 동일한 올바른 결과로 이어질 수 있다. ## 필수 상태와 선택적 변형의 구분 에이전트 동작을 검증하려면 모든 상태를 동일하게 취급하지 말고, 성공에 반드시 필요한 요소와 환경에 따라 달라지는 요소를 분리해야 한다. - **필수 상태(Essential states)** - 성공을 위해 반드시 도달해야 하는 상태다. - 예를 들어 VS Code 검색 작업에서는 최종적으로 ‘검색 결과’ 화면에 도달해야 한다. - **선택적 변형(Optional variations)** - 로딩 스피너, 일시적인 로딩 화면, 장식적 UI 변화처럼 성공 여부와 직접 관련 없는 상태다. - **수렴 경로(Convergent paths)** - 단축키 사용, 메뉴 선택 등 서로 다른 절차가 동일한 최종 상태로 합쳐지는 경우다. - 로딩 화면이 나타났는지는 중요하지 않지만, 검색 결과가 표시되었는지는 작업의 성공을 결정한다. - 따라서 검증 대상은 실행 과정 전체가 아니라 성공을 보장하는 논리적 구조여야 한다. ## Dominator 분석을 활용한 필수 행동 추출 필수 상태와 부수적 상태를 자동으로 구분하기 위해 컴파일러 이론의 **Dominator 관계**를 활용할 수 있다. - 제어 흐름 그래프에서 노드 A가 노드 B를 지배(dominates)한다는 것은 시작점에서 B로 가는 모든 경로가 A를 거쳐야 한다는 뜻이다. - 에이전트의 실행 기록을 그래프로 표현하면 다음을 식별할 수 있다. - 모든 성공 경로에 공통으로 나타나는 필수 상태 - 일부 경로에만 등장하는 선택적 상태 - 서로 다른 실행 경로가 다시 합쳐지는 지점 - 이 분석을 통해 테스트가 확인해야 할 최소한의 성공 조건을 추출할 수 있다. - 또한 “왜 이 실행을 성공 또는 실패로 판단했는가”를 그래프 구조로 설명할 수 있어, 단순한 블랙박스 판정보다 신뢰성이 높다. ## 스크립트가 아닌 실행 그래프로 모델링 - 자율 에이전트의 행동은 고정된 1차원 스크립트보다 여러 분기와 수렴 지점을 가진 그래프로 보는 편이 적합하다. - 그래프 기반 모델은 특정 순서를 강제하지 않고, 서로 다른 행동 경로가 같은 필수 결과에 도달했는지를 평가할 수 있다. - 이 접근은 에이전트의 자유로운 문제 해결 능력을 유지하면서도, CI 파이프라인에서는 반드시 충족되어야 할 결과를 엄격하게 검증할 수 있는 기반이 된다. - 글에서 제안하는 Trust Layer는 이러한 실행 그래프를 바탕으로 우연한 환경 차이와 실제 기능 실패를 구분하는 역할을 한다. ## 실용적인 적용 방향 - 에이전트 테스트를 작성할 때 모든 중간 화면과 클릭 순서를 고정하지 않는다. - 대신 다음을 명확히 정의한다. - 반드시 도달해야 하는 최종 상태 - 작업 성공을 입증하는 핵심 데이터나 UI 상태 - 무시할 수 있는 로딩·렌더링 변화 - 허용 가능한 대체 실행 경로 - CI에서는 기록된 경로의 일치 여부보다 필수 상태의 도달 여부와 상태 간 논리적 관계를 검증하는 것이 적절하다. - 이를 적용하면 환경 변화로 인한 불필요한 실패를 줄이고, 에이전트가 실제로 작업에 실패한 경우에는 더 정확하게 감지할 수 있다.

github

당신의 코드는 얼마나 노출되어 있나요? 단 몇 분 만에 무료로 확인해 보세요 (새 탭에서 열림)

대부분의 코드베이스에는 아직 발견되지 않은 보안 취약점이 존재하며, 수동 검토나 제한적인 도구만으로는 이를 파악하기 어렵다. GitHub는 조직의 활성 저장소를 몇 분 안에 점검하는 무료 **Code Security Risk Assessment**를 공개했다. 이 assessment는 CodeQL로 취약점을 찾고, 위험도와 언어·저장소별 분포, Copilot Autofix 적용 가능성까지 보여줘 보안 대응 우선순위를 정하도록 돕는다. ## Code Security Risk Assessment의 기능 - GitHub의 정적 분석 엔진인 **CodeQL**을 사용해 조직에서 가장 활발한 저장소 최대 20개를 검사한다. - 별도 라이선스 구매나 설정 없이 원클릭으로 실행할 수 있다. - 다음 정보를 대시보드로 제공한다. - 전체 취약점 수와 심각도별 분류: Critical, High, Medium, Low - 프로그래밍 언어별 취약점 분포 - 발견된 보안 규칙과 해당 규칙의 영향 저장소 수 - 취약점이 가장 많은 저장소 - Copilot Autofix로 자동 수정할 수 있는 취약점 수 - GitHub Enterprise Cloud 및 GitHub Team 플랜의 조직 관리자와 보안 관리자가 사용할 수 있다. - 스캔에 사용된 GitHub Actions 실행 시간은 사용량 할당량에서 차감되지 않는다. ## 시크릿과 코드 취약점을 함께 파악 - 기존의 **Secret Risk Assessment**는 저장소에 노출된 인증 정보와 자격 증명을 파악하는 기능이다. - Code Security Risk Assessment는 소스 코드 자체의 취약점을 분석한다. - 두 assessment는 하나의 진입점과 탭 기반 화면에서 함께 실행할 수 있다. - 이를 통해 조직은 다음 두 가지 위험을 통합적으로 확인할 수 있다. - 유출된 시크릿 및 자격 증명 - 애플리케이션 코드의 보안 취약점 - GitHub는 2025년에 Secret Protection 사용 고객들이 약 20억 건의 push를 검사하고, 약 1,900만 건의 시크릿 노출을 차단했다고 설명한다. ## 취약점 발견에서 수정까지 - 취약점을 찾는 것만으로는 충분하지 않으며, 실제 수정 속도가 위험 감소에 중요하다. - GitHub Code Security와 Copilot Autofix는 개발자가 작업하는 pull request 안에서 취약점을 수정하도록 지원한다. - GitHub가 제시한 2025년 수치는 다음과 같다. - Copilot Autofix로 수정된 보안 경고: **460,258건** - pull request에서 직접 해결된 취약점 경고: **50%** - 평균 해결 시간: - Copilot Autofix 사용: **0.66시간** - 수동 수정: **1.29시간** - assessment 결과에서 Copilot Autofix를 적용할 수 있는 취약점 수를 확인하고, 결과 화면에서 GitHub Code Security를 바로 활성화할 수 있다. ## 어떤 조직에 유용한가 - 보안 스캔을 아직 도입하지 않은 조직이 현재 위험 수준을 빠르게 파악할 수 있다. - 기존 보안 도구를 사용하는 조직도 다른 관점에서 코드베이스 전체를 점검할 수 있다. - 여러 팀과 언어로 구성된 조직에서 취약점이 집중된 저장소와 기술 영역을 식별하는 데 유용하다. - 평가 결과를 바탕으로 어떤 제품이나 보안 기능을 도입할지 판단할 수 있다. - Secret Protection: 자격 증명 유출 방지 - Code Security: 코드 취약점 탐지 및 수정 우선 무료 assessment를 실행해 조직의 취약점 분포와 우선순위를 확인하는 것이 좋다. 이후 반복적인 스캔과 pull request 기반 수정 프로세스를 도입하면 일회성 점검을 지속적인 보안 관리로 발전시킬 수 있다.

github

GitHub 전반의 오픈 소스 공급망 보안 강화 (새 탭에서 열림)

공격자들은 GitHub Actions 워크플로를 침해해 API 키 같은 비밀을 탈취한 뒤, 악성 패키지를 배포하고 더 많은 프로젝트로 공격을 확산시키고 있다. 이에 대응하려면 Actions 워크플로를 CodeQL로 점검하고, 서드파티 액션을 커밋 SHA로 고정하며, 장기 비밀 대신 OIDC 기반 인증과 trusted publishing을 사용해야 한다. GitHub는 npm 악성코드 탐지와 Actions·npm 보안 로드맵을 강화하고 있지만, 오픈소스 생태계 전반의 지속적인 협력이 필요하다고 강조한다. ## GitHub Actions 워크플로가 공격의 출발점 - 최근 오픈소스 공급망 공격은 GitHub Actions 워크플로의 취약점을 찾는 방식으로 시작되는 경우가 많다. - 공격자는 워크플로에서 API 키, 토큰, 배포 자격 증명 등의 비밀을 탈취한다. - 탈취한 자격 증명으로: - 공격자가 통제하는 환경에서 악성 패키지를 배포하고 - 해당 패키지를 이용해 다른 프로젝트와 계정으로 공격을 확산한다. ## 지금 적용할 수 있는 Actions 보안 조치 - 공개 저장소에서 무료로 사용할 수 있는 **CodeQL의 GitHub Actions 분석 기능**을 활성화한다. - 워크플로 구현상의 보안 취약점과 보안 모범 사례 위반을 점검할 수 있다. - `pull_request_target`을 사용하지 않는다. - 외부 기여자의 코드가 높은 권한의 워크플로 컨텍스트에서 실행될 위험이 있다. - 서드파티 GitHub Actions를 전체 길이의 커밋 SHA로 고정한다. - 태그나 브랜치는 이후 다른 코드로 변경될 수 있지만, SHA 고정은 특정 코드 버전을 보장한다. - 이 변경은 저장소 관리자나 Dependabot이 수행해야 하며, 외부 Pull Request가 액션 버전 고정을 바꾸려 하면 주의해야 한다. - 사용자 입력을 셸 명령이나 스크립트에 직접 삽입하지 않는다. - 이 방식은 스크립트 인젝션으로 이어질 수 있다. - 침해된 의존성은 GitHub Advisory Database에서 확인한다. - Dependabot을 사용해 악성 또는 취약한 의존성에 대한 알림을 받는다. ## 비밀 대신 OIDC와 trusted publishing 사용 - 워크플로에 장기 보관되는 비밀을 넣는 대신, **OpenID Connect(OIDC) 토큰**을 사용할 수 있다. - OIDC 토큰에는 실행 중인 워크로드의 신원이 포함되므로, 클라우드 제공업체·패키지 저장소·호스팅 서비스가 해당 워크플로를 검증하고 권한을 부여할 수 있다. - GitHub와 OpenSSF는 이를 패키지 저장소의 **trusted publishing**으로 확산하고 있다. - 현재 npm, PyPI, NuGet, RubyGems, Crates 등 여러 저장소에서 지원된다. - trusted publishing의 장점: - 빌드 파이프라인에서 장기 비밀을 제거한다. - 패키지가 어떤 신뢰된 워크플로에서 배포됐는지 확인할 수 있다. - 패키지가 갑자기 trusted publishing을 중단하면, 탈취된 자격 증명을 이용한 공격 가능성을 조사하는 신호가 된다. ## npm의 악성 패키지 탐지 - npm에서는 매일 3만 개가 넘는 패키지가 배포된다. - GitHub는 모든 npm 패키지 버전을 악성코드 관점에서 검사한다. - 탐지 규칙은 공격 방식의 변화에 맞춰 지속적으로 개선된다. - 매일 수백 개의 신규 배포 패키지에서 악성 코드가 발견될 수 있으며, 실제 조치 전에는 사람이 양성 여부를 검토한다. - 오탐률이 1%만 되어도 매일 수백 개의 정상 패키지 배포가 중단될 수 있으므로, 자동 탐지와 사람의 검증 사이 균형이 중요하다. ## Shai-Hulud 이후의 보안 로드맵 - 2025년 말 발생한 Shai-Hulud 공격은 npm 보안 로드맵을 재정비하는 계기가 됐다. - GitHub는 다음 작업을 가속했다. - npm trusted publishing 확대 - 악성코드 탐지 및 제거 기능 강화 - 오픈소스 유지관리자와의 보안 요구사항 논의 - 보안 변경은 기존 워크플로를 수정하게 만들거나 하위 호환성을 깨뜨릴 수 있으므로, GitHub는 생태계가 원활하게 전환할 수 있도록 지원할 계획이다. - 최근 공격을 계기로 GitHub Actions 보안 로드맵도 재검토하고, 이미 진행 중인 보안 기능의 출시를 앞당기고 있다. ## 오픈소스 생태계의 공동 대응 - 오픈소스는 전 세계가 공유하는 공공재인 만큼 공격이 앞으로도 계속될 가능성이 높다. - GitHub는 npm과 GitHub Actions를 비롯해 향후 등장할 새로운 공격 경로까지 방어 범위를 확대하겠다고 밝혔다. - 효과적인 보안 기능을 만들기 위해 유지관리자와 커뮤니티의 피드백이 중요하다. 실무적으로는 먼저 CodeQL로 Actions를 검사하고, `pull_request_target` 제거·커밋 SHA 고정·스크립트 인젝션 점검을 진행하는 것이 좋다. 이후 가능하면 OIDC와 trusted publishing으로 배포 인증을 전환해, 탈취 가능한 장기 비밀 자체를 줄여야 한다.

github

초보자를 위한 GitHub: GitHub Actions 시작하기 (새 탭에서 열림)

GitHub Actions는 GitHub에 내장된 CI/CD 및 자동화 플랫폼으로, YAML 워크플로를 통해 반복 작업과 배포 과정을 자동화한다. 저장소 이벤트가 발생하면 가상 실행 환경에서 작업을 수행하며, 글에서는 새 이슈에 `triage` 라벨을 자동으로 붙이는 첫 워크플로를 만드는 과정을 설명한다. 핵심 구성 요소는 이벤트(`on`), 실행 환경(`runs-on`), 작업(`jobs`), 단계(`steps`), 권한(`permissions`)이다. ## GitHub Actions의 역할 - GitHub Actions는 지속적 통합·지속적 배포(CI/CD)와 자동화를 위한 플랫폼이다. - YAML 파일로 다음과 같은 작업을 자동화할 수 있다. - 취약점 검사 - 테스트 실행 - 릴리스 생성 - 팀에 업데이트 알림 - 배포 프로세스 - 워크플로는 저장소에 저장되며, 코드 푸시·풀 리퀘스트·이슈 생성·예약된 시간 등의 이벤트로 실행된다. - 이벤트가 발생하면 GitHub가 가상 환경을 준비하고 정의된 작업을 자동으로 실행한다. ## 워크플로를 구성하는 요소 - **이벤트(Event)** - 워크플로를 시작시키는 저장소 활동이다. - 예: 코드 푸시, 풀 리퀘스트 생성, 이슈 생성, 브랜치 병합 - **실행기(Hosted runner)** - 워크플로의 작업을 실행하는 가상 머신이다. - GitHub가 제공하는 Ubuntu, Windows, macOS 실행기를 사용할 수 있다. - 필요하면 자체 호스팅 실행기를 구성할 수도 있다. - **작업(Job)** - 하나의 실행기에서 수행되는 단계들의 묶음이다. - **단계(Step)** - 셸 명령을 실행하거나 미리 만들어진 재사용 가능한 액션을 호출한다. ## Actions 탭과 워크플로 템플릿 - 저장소의 **Actions** 탭에서는 현재 저장소에 등록된 워크플로를 확인할 수 있다. - **New workflow**를 선택하면 저장소에 적합한 추천 템플릿을 확인할 수 있다. - 템플릿은 YAML 편집기로 열리며, 기본적으로 다음 세 영역을 포함한다. - `name`: 워크플로의 목적을 설명하는 이름 - `on`: 워크플로를 실행할 이벤트 - `jobs`: 실제 작업 내용 ## YAML 워크플로 파일 작성 - 워크플로 파일은 저장소의 `.github/workflows` 디렉터리에 `.yml` 확장자로 저장한다. - 파일명은 `build-and-test.yml`, `security-scanner.yml`처럼 역할을 바로 알 수 있게 작성하는 것이 좋다. - 예제에서는 `label-new-issue.yml` 파일을 만들고 새 이슈에 라벨을 자동으로 추가한다. - 워크플로 이름은 다음과 같이 지정한다. ```yaml name: Label New Issues ``` ## 이슈 생성 이벤트 설정 - `on` 키워드로 워크플로의 실행 조건을 정의한다. - 다음 설정은 이슈가 새로 생성될 때만 워크플로를 실행한다. ```yaml on: issues: types: [opened] ``` - GitHub Actions는 다양한 이벤트와 세부 이벤트 유형을 지원하므로, 작업 목적에 맞는 트리거를 선택할 수 있다. ## 작업 환경과 권한 설정 - `jobs` 아래에 작업 이름을 지정한다. - `runs-on: ubuntu-latest`는 GitHub가 제공하는 최신 Ubuntu 실행기를 사용한다는 의미다. - 작업이 저장소를 읽고 이슈 라벨을 수정하려면 적절한 권한을 명시해야 한다. ```yaml jobs: label-issues: runs-on: ubuntu-latest permissions: issues: write contents: read ``` - `issues: write`는 이슈를 수정할 수 있는 권한이다. - `contents: read`는 저장소 콘텐츠를 읽을 수 있는 권한이다. - 작업 수준에서 `permissions`를 지정하면 해당 작업의 액션과 명령에 그 권한이 적용된다. ## 저장소 확인과 라벨 추가 단계 - `steps`에는 작업에서 순서대로 수행할 동작을 작성한다. - `actions/checkout@v6` 액션으로 저장소 코드를 실행 환경에 내려받는다. - 이후 GitHub CLI를 사용해 새 이슈에 `triage` 라벨을 추가한다. ```yaml steps: - name: Checkout repository uses: actions/checkout@v6 - name: Add triage label env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} ISSUE_NUMBER: ${{ github.event.issue.number }} LABEL: "triage" run: gh issue edit "$ISSUE_NUMBER" --add-label "$LABEL" ``` - `uses`는 GitHub Marketplace의 미리 만들어진 재사용 액션을 호출한다. - 저장소 체크아웃 - Node.js 설정 - 기타 반복적인 개발 작업 등에 활용할 수 있다. - `run`은 실행기에서 셸 명령을 직접 실행한다. - `GH_TOKEN`에는 GitHub가 제공하는 `GITHUB_TOKEN`을 사용한다. - `${{ github.event.issue.number }}`는 이벤트 정보에서 새로 생성된 이슈 번호를 가져온다. - `gh issue edit` 명령은 해당 이슈에 `triage` 라벨을 추가한다. 처음에는 GitHub Actions의 템플릿을 활용해 간단한 이벤트 기반 자동화를 만들어 보는 것이 좋다. 이후 이벤트 조건, 최소 권한, 재사용 액션과 직접 실행 명령을 조합하면 테스트·보안 검사·이슈 관리·배포까지 확장할 수 있다.

github

접근성을 위한 지속적인 AI: GitHub이 피드백을 포용으로 전환하는 방법 (새 탭에서 열림)

GitHub는 접근성 피드백이 여러 팀과 채널에 흩어져 처리되지 못하던 문제를 해결하기 위해, 피드백을 지속적으로 수집·분류·추적하는 AI 기반 워크플로를 구축했다. GitHub Actions, GitHub Copilot, GitHub Models를 결합해 반복적인 분석과 라우팅은 자동화하되, 우선순위와 해결 판단은 사람이 맡는다. 그 결과 접근성 문제를 일회성 감사가 아니라 지속적으로 개선되는 운영 시스템으로 전환했다. ## 접근성 피드백이 기존 방식에서 겪은 문제 - 접근성 문제는 내비게이션, 인증, 설정, 공통 컴포넌트 등 여러 영역에 걸쳐 발생해 단일 팀이 소유하기 어렵다. - 피드백이 여러 백로그와 버그 목록에 분산되면서 담당자가 정해지지 않거나 장기간 방치됐다. - 사용자가 반복해서 진행 상황을 문의해야 했고, 개선 사항이 막연한 “2단계 작업”으로 미뤄지는 경우가 많았다. - 따라서 단순한 버그 관리가 아니라, 접수부터 해결과 후속 안내까지 연결하는 조정 체계가 필요했다. ## Continuous AI: 접근성을 살아 있는 시스템으로 관리 - GitHub가 말하는 Continuous AI는 단일 제품이나 일회성 자동 검사 도구가 아니다. - 자동화, 인공지능, 사람의 전문성을 결합해 소프트웨어 개발 과정에 접근성을 지속적으로 포함시키는 방법론이다. - 코드 스캐너만으로는 실제 사용자가 겪는 장벽을 충분히 발견하기 어렵기 때문에, 사용자와 고객의 경험을 중심 데이터로 삼는다. - 피드백을 명확한 구조의 데이터로 바꾸고, 적절한 팀에 전달하며, 구현 가능한 이슈로 발전시키는 것이 핵심이다. - 이는 2025년 GAAD pledge의 방향인 오픈소스 생태계 전반의 접근성 개선과도 연결된다. ## 사용자와 조직 구성원을 위한 설계 시스템은 세 가지 주요 사용자를 기준으로 설계됐다. - **이슈 제출자** - 커뮤니티 관리자, 지원 담당자, 영업 담당자가 사용자를 대신해 문제를 등록한다. - 이들이 반드시 접근성 전문가일 필요는 없으므로, 입력 과정에서 접근성 개념과 필요한 정보를 안내해야 한다. - **접근성·서비스 팀** - 엔지니어와 디자이너가 재현 단계, WCAG 기준, 심각도, 담당 팀 등 실행 가능한 정보를 받아야 한다. - **프로그램·제품 관리자** - 문제 유형별 현황, 반복되는 추세, 해결 진행률을 파악해 리소스와 우선순위를 결정해야 한다. - 이를 위해 피드백을 단순 티켓이 아니라 파이프라인을 따라 흐르는 데이터로 취급하고, 변화에 맞춰 확장 가능한 구조를 선택했다. ## 이벤트 기반 피드백 워크플로 - 각 단계가 GitHub Action을 실행하는 이벤트 기반 구조로 설계됐다. - 이슈가 생성되면 GitHub Models API를 통해 GitHub Copilot이 피드백을 분석한다. - 상태가 변경되면 다음 담당 팀으로 자동 인계된다. - 문제가 해결되면 최초 제출자에게 후속 안내를 보내 사용자와의 소통을 마무리한다. - 모든 Action은 수동 실행하거나 재실행할 수 있어, 자동화가 처리하지 못하는 경우 사람이 언제든 개입할 수 있다. - 전체 흐름은 다음 일곱 단계로 구성된다. - 접수(Actioning intake) - Copilot 분석 - 제출자 검토 - 접근성 팀 검토 - 링크 감사 - 사용자와의 마무리 소통 - 개선 및 프롬프트 업데이트 - 제출자 검토에서 Copilot 분석을 다시 실행하거나, 마무리 단계에서 접근성 팀 검토로 되돌아가는 식의 피드백 루프도 포함된다. - 2024년 중반에는 이 시스템을 주로 직접 구축했지만, 현재는 자연어로 GitHub Actions를 생성할 수 있는 Agentic Workflows를 이용하면 유사한 시스템을 더 빠르게 만들 수 있다. ## 다양한 채널에서의 접수와 표준화 - 접근성 피드백은 지원 티켓, 소셜 미디어, 이메일, 직접 연락 등 다양한 경로에서 들어온다. - 현재 약 90%는 GitHub 접근성 Discussion 게시판을 통해 접수된다. - 공개 게시판에서는 다른 사용자가 문제를 확인하거나 추가 맥락과 우회 방법을 제공할 수 있어, 일반 지원 티켓보다 풍부한 정보가 모이는 장점이 있다. - 모든 피드백에는 영업일 기준 5일 이내에 응답한다. - 즉시 조치할 수 없는 내용도 관련 자료나 도움을 받을 수 있는 경로를 안내해 응답이 끊기지 않도록 한다. - 내부 팀의 조치가 필요한 경우 담당자가 사용자 보고 내용, 출처, 관련 컴포넌트를 담은 전용 접근성 피드백 이슈 템플릿으로 추적 이슈를 만든다. - 이슈 템플릿은 접수 정보를 표준화해 초기 맥락이 트리아지 과정에서 사라지는 것을 방지한다. ## 운영 방식에서 얻는 시사점 - AI는 접근성 문제의 최종 판단자라기보다 반복적인 분류·요약·전달을 담당하는 보조 수단으로 사용된다. - 실제 해결 여부, 우선순위, 담당 지정에는 사람의 전문성과 판단이 계속 필요하다. - 효과적인 자동화의 전제는 AI 모델 자체가 아니라, 먼저 피드백 채널을 정리하고 입력 형식을 표준화하는 일이다. - 접근성 문제를 개별 팀의 선택적 업무가 아니라 지속적으로 측정하고 개선해야 하는 제품 운영 데이터로 다뤄야 한다. 실무적으로는 먼저 접근성 피드백을 한곳으로 모으고, 재현 단계·영향 범위·WCAG 기준·심각도·소유 팀을 포함한 템플릿을 마련하는 것이 좋다. 그 기반 위에서 AI와 워크플로 자동화를 도입해야 자동 분류가 실제 해결과 사용자 후속 안내로 이어질 수 있다.

github

내부 살펴보기: GitHub (새 탭에서 열림)

GitHub Agentic Workflows는 에이전트를 기존 CI/CD에 통합하되, 에이전트의 비결정성과 프롬프트 인젝션 위험을 전제로 설계된 보안 아키텍처를 사용합니다. 핵심은 자유로운 에이전트 작성과 통제된 실행을 분리하고, 워크플로를 명시적인 권한·출력·네트워크·감사 제약이 있는 GitHub Actions로 컴파일하는 것입니다. 특히 에이전트에 비밀을 직접 제공하지 않고, 계층적 격리와 단계적 쓰기 검증으로 피해 범위를 제한합니다. ## 에이전트 자동화가 만드는 새로운 위협 - 에이전트는 저장소 상태와 외부 입력을 해석해 런타임에 자율적으로 결정을 내리므로 기본적으로 신뢰할 수 없습니다. - GitHub Actions는 구성 요소들이 하나의 신뢰 도메인에서 실행되는 비교적 개방적인 환경입니다. - 에이전트가 손상되면 다음과 같은 행동이 가능해질 수 있습니다. - MCP 서버와 상호작용 - 인증 토큰과 환경 변수 접근 - 임의의 인터넷 호스트로 네트워크 요청 - 악성 이슈·웹 페이지를 통한 프롬프트 인젝션 실행 - 원치 않는 커밋, 댓글, 이슈 생성 - 따라서 기본 보안 모드는 에이전트가 읽거나 쓰면 안 되는 상태에 접근하고, 허가되지 않은 통신 채널을 악용한다고 가정합니다. ## 다층 방어 구조 GitHub Agentic Workflows는 **기반 인프라(substrate)**, **구성(configuration)**, **계획(planning)**의 세 계층으로 방어합니다. - **기반 인프라 계층** - GitHub Actions 러너 VM과 신뢰된 컨테이너를 사용합니다. - 컨테이너 격리, 커널 수준 통신 경계, 권한 있는 작업과 시스템 호출 중재를 제공합니다. - 사용자 수준 구성 요소가 손상되어 컨테이너 내부에서 임의 코드를 실행하더라도 격리 경계를 넘는 피해를 제한합니다. - **구성 계층** - 어떤 구성 요소를 실행하고 서로 어떻게 연결할지 선언적으로 정의합니다. - 허용되는 통신 채널과 각 구성 요소의 권한을 결정합니다. - 에이전트 API 키와 GitHub 토큰 같은 외부 자격 증명을 어떤 컨테이너에 주입할지 통제합니다. - 컴파일러, 방화벽 정책, MCP 설정 등이 이 계층에 포함됩니다. - **계획 계층** - 구성 계층이 정한 구성 요소들을 언제, 어떤 순서로 실행할지 결정합니다. - 구성 요소 간 데이터 교환을 명시한 단계적 워크플로를 생성합니다. - 안전한 출력 시스템을 통해 쓰기 작업을 검증하고 제한하는 역할을 담당합니다. ## 에이전트에 비밀을 제공하지 않는 설계 - 일반적인 GitHub Actions 환경에서는 여러 프로세스가 환경 변수와 설정 파일에 저장된 토큰을 볼 수 있습니다. - 프롬프트 인젝션을 받은 에이전트는 셸 도구를 이용해 다음 정보에 접근할 수 있습니다. - 설정 파일 - SSH 키 - Linux `/proc` 상태 - 워크플로 로그 - 탈취한 자격 증명은 외부 웹사이트로 전송하거나 공개 이슈·풀 리퀘스트·댓글에 삽입할 수 있습니다. - 이를 막기 위해 에이전트를 별도 컨테이너에서 실행하고 네트워크 경로를 제한합니다. - 인터넷 접속은 방화벽을 통해 통제 - MCP 호출은 신뢰된 MCP 게이트웨이를 통해서만 허용 - LLM 호출은 API 프록시를 통해 중계 - MCP 게이트웨이는 별도의 신뢰 컨테이너에서 MCP 서버를 실행하며, MCP 인증 정보에 독점적으로 접근합니다. - 에이전트 컨테이너는 LLM 인증 토큰을 직접 보지 않고, 격리된 API 프록시가 인증을 대신 처리하는 구조를 사용합니다. ## 네트워크와 권한의 제한 - 에이전트와 방화벽 사이에 전용 사설 네트워크를 구성해 인터넷 연결을 통제합니다. - 허용 목록 기반 방화벽 정책으로 에이전트가 통신할 수 있는 대상과 채널을 제한합니다. - MCP 서버와 LLM API를 직접 노출하지 않고 각각 게이트웨이와 프록시 뒤에 배치합니다. - 이 구조는 에이전트가 손상되더라도 임의의 외부 호스트로 데이터를 반출하거나 인증 서비스를 직접 악용하는 가능성을 줄입니다. ## 안전한 쓰기와 감사 가능성 - 에이전트가 저장소나 GitHub 객체에 직접 자유롭게 쓰지 못하도록 출력 단계를 별도로 통제합니다. - 계획 계층의 안전한 출력 시스템은 다음을 담당하도록 설계됩니다. - GitHub 쓰기 작업의 허용 여부 결정 - 호출 가능한 기능과 호출 횟수 제한 - 출력에서 비밀 정보 제거 - 부적절하거나 원치 않는 내용 조정 - 에이전트의 실행 결과와 외부 효과를 추적할 수 있도록 모든 작업을 기록하는 원칙을 적용합니다. - 결과적으로 에이전트의 자유로운 추론 능력은 유지하되, 실제 커밋·댓글·이슈 생성 같은 효과는 검증된 단계와 명시적 정책을 거쳐야 합니다. ## 실용적인 결론 에이전트 기반 CI/CD를 도입할 때는 에이전트를 일반 스크립트처럼 신뢰하지 말고, 처음부터 침해 가능성을 전제로 설계해야 합니다. 별도 컨테이너 격리, 비밀의 프록시 위임, 허용 목록 네트워크, 단계적 쓰기 검증, 전체 감사 로그를 함께 적용하는 것이 안전한 기본값입니다.

github

6,000만 건 (새 탭에서 열림)

GitHub Copilot 코드 리뷰(CCR)는 출시 이후 사용량이 10배 증가해 GitHub 전체 코드 리뷰의 5건 중 1건 이상을 차지하고 있다. GitHub는 단순히 많은 댓글을 생성하는 대신 정확성·신호·속도를 기준으로 실제로 도움이 되는 리뷰를 제공하는 방향으로 발전시켰다. 저장소 맥락을 탐색하고 이전 리뷰를 기억하는 에이전트형 아키텍처와 개선된 UX를 통해, 개발자가 더 빠르고 자신 있게 풀 리퀘스트를 병합하도록 지원한다. ## Copilot 코드 리뷰의 성장과 목표 변화 - 2025년 4월 초기 출시 이후 사용량이 10배 증가했다. - 현재 GitHub에서 수행되는 코드 리뷰의 20% 이상을 Copilot 코드 리뷰가 담당한다. - 초기 목표는 가능한 한 철저한 리뷰를 제공하는 것이었지만, 실제 개발자들이 원하는 것은 다음과 같은 고신호(high-signal) 피드백임을 확인했다. - 중요한 로직 및 유지보수성 문제를 우선적으로 지적 - 문제의 원인과 해결 방법을 함께 설명 - 풀 리퀘스트를 빠르게 다음 단계로 진행하도록 지원 - 댓글에 대한 thumbs-up·thumbs-down 반응과 실제 병합 전 수정 여부를 지속적으로 분석해 품질을 개선했다. ## 정확성: 중요한 문제를 찾아내기 - Copilot은 사소한 스타일 문제보다 영향이 큰 로직 오류와 유지보수성 문제에 집중한다. - 정확성은 두 가지 방식으로 평가한다. - 알려진 코드 문제를 포함한 내부 테스트 - 실제 풀 리퀘스트에서 수집한 운영 데이터 - 주요 운영 지표는 다음과 같다. - 개발자 피드백: 댓글이 유용했는지에 대한 긍정·부정 반응 - 실제 수정 여부: 지적된 문제가 병합 전에 해결되었는지 확인 - 목표는 리뷰를 대충 끝내도록 하는 것이 아니라, 신뢰할 수 있는 문제를 빠르게 수정하게 하는 것이다. ## 신호: 댓글 수보다 유용성이 중요하다 - 코드 리뷰에서 댓글이 많다고 품질이 높은 것은 아니다. - Copilot은 문제뿐 아니라 권장 수정 방법까지 제시하는 댓글을 고신호 피드백으로 간주한다. - 71%의 리뷰에서는 실행 가능한 피드백을 제공하고, 나머지 29%에서는 불필요한 지적을 하지 않고 아무 댓글도 남기지 않는다. - 고신호 문제를 더 확실하게 식별할 수 있게 되면서 리뷰당 평균 댓글 수는 약 5.1개로 증가했다. - 댓글 수가 늘었음에도 리뷰 재작업(churn)이나 품질 기준은 악화되지 않았다. - 즉, “침묵이 잡음보다 낫다”는 원칙 아래 확실하지 않은 문제는 지적하지 않는다. ## 속도와 분석 깊이의 균형 - Copilot은 풀 리퀘스트가 열린 직후 신뢰할 수 있는 1차 리뷰를 제공하는 것을 목표로 한다. - 다만 더 깊은 추론에는 더 많은 계산 시간이 필요하므로 속도와 정확성 사이에 의도적인 절충이 있다. - 더 발전된 추론 모델을 적용한 결과: - 긍정적인 개발자 피드백이 6% 증가 - 리뷰 지연 시간은 16% 증가 - GitHub는 즉각적이지만 잡음이 많은 리뷰보다, 조금 늦더라도 실제 문제를 발견하는 리뷰가 더 가치 있다고 판단한다. - 지연 시간은 계속 줄이되, 고신호 피드백을 희생하지 않는 방향으로 개선하고 있다. ## 저장소 맥락을 이해하는 에이전트형 아키텍처 - 새로운 시스템은 저장소를 탐색하고 코드의 로직, 아키텍처, 불변 조건을 파악할 수 있다. - 에이전트형 구조로 전환한 뒤 긍정적인 피드백이 초기 기준 8.1% 증가했다. - 주요 개선점은 다음과 같다. - **읽는 즉시 문제를 기록**: 리뷰 마지막에 결과를 정리하는 방식이 아니라 분석 중 발견한 문제를 바로 유지해 초기 발견을 잊지 않는다. - **리뷰 간 메모리 유지**: 각 풀 리퀘스트를 고립된 이벤트로 처리하지 않고, 코드베이스에서 발견한 패턴과 맥락을 이후 리뷰에도 활용한다. - **장기 풀 리퀘스트에 계획 적용**: 긴 변경 사항을 검토하기 전에 명시적인 리뷰 계획을 세워 컨텍스트 손실을 줄인다. - **관련 이슈와 풀 리퀘스트 참조**: 코드만 보면 정상처럼 보이지만 프로젝트 요구사항과 맞지 않는 미묘한 문제까지 발견한다. ## 리뷰 결과를 쉽게 탐색하는 UX - **다중 라인 댓글** - 한 줄에 댓글을 고정하는 대신 관련된 논리적 코드 범위에 연결한다. - 문제가 발생한 전체 맥락과 수정 범위를 더 쉽게 이해할 수 있다. - **댓글 클러스터링** - 동일한 패턴의 오류를 여러 개의 댓글로 반복하지 않고 하나의 일관된 피드백 단위로 묶는다. - 풀 리퀘스트 타임라인의 복잡성과 인지 부담을 줄인다. - **배치 자동 수정** - 개별 댓글을 하나씩 처리하지 않고 같은 유형의 로직 오류나 스타일 문제를 한 번에 수정한다. - 반복적인 컨텍스트 전환을 줄이고 수정 작업을 빠르게 끝낼 수 있다. ## 조직 차원의 활용 - 12,000개 이상의 조직이 모든 풀 리퀘스트에 Copilot 코드 리뷰를 자동으로 실행하고 있다. - General Motors는 Copilot이 풀 리퀘스트 리뷰와 요약을 처리해 팀이 더 복잡한 업무에 집중할 수 있다고 평가했다. - WEX에서는 AI 지원 리뷰를 기본값으로 도입하면서 조직 전체의 Copilot 사용이 확대되었다. - WEX 개발자의 약 3분의 2가 Copilot을 사용하고 있으며, 가장 활발한 기여자들도 포함된다. 실무적으로는 Copilot의 댓글 수를 최대화하기보다, 실제로 수정할 가치가 있는 문제를 선별하는 보조 리뷰어로 활용하는 것이 적절하다. 개발자는 AI 피드백을 최종 판단으로 간주하기보다 thumbs-up·thumbs-down과 수정 결과를 통해 팀의 코드 리뷰 기준을 계속 조정해야 한다.

github

GitHub Copilot 코딩 에 (새 탭에서 열림)

GitHub Copilot coding agent는 이슈를 할당받아 백그라운드에서 코드를 수정하고 테스트를 추가한 뒤, 검토 가능한 풀 리퀘스트를 생성하는 기능이다. 최근에는 작업별 모델 선택, 자체 코드 리뷰, 보안 검사, 사용자 정의 에이전트, 로컬 CLI와의 컨텍스트 공유가 추가되어 자동화 수준과 결과 품질이 향상됐다. GitHub는 향후 비공개 모드, 코딩 전 계획 수립, 이슈 요약과 보고서 생성까지 기능을 확장할 예정이다. ## 작업에 맞는 AI 모델 선택 Agents 패널에서 작업별로 사용할 모델을 지정할 수 있게 됐다. - 단순한 단위 테스트 추가에는 빠른 모델을 선택할 수 있다. - 복잡한 리팩터링이나 엣지 케이스가 많은 통합 테스트에는 더 강력한 모델을 사용할 수 있다. - `Auto`를 선택하면 GitHub가 작업에 적합한 모델을 자동으로 결정한다. - 사용 방법: - GitHub 우측 상단의 Agents 패널에서 저장소를 선택한다. - 모델을 고르고 작업 프롬프트를 입력한다. - 현재 Copilot Pro와 Pro+에서 사용할 수 있으며, Business와 Enterprise 지원은 추후 제공될 예정이다. ## 자체 코드 리뷰로 개선된 풀 리퀘스트 에이전트가 풀 리퀘스트를 열기 전에 Copilot code review를 실행해 자신의 변경 사항을 점검한다. - 코드가 동작하더라도 지나치게 복잡하거나 팀의 일반적인 작성 방식과 다른 부분을 찾아낸다. - 리뷰 피드백을 반영해 코드를 수정한 뒤 풀 리퀘스트를 생성한다. - 개발자는 에이전트의 작업 로그에서 코드 리뷰 실행과 수정 과정을 확인할 수 있다. - 사용자는 에이전트가 반복 작업을 마친 후 최종 풀 리퀘스트를 검토하면 된다. ## 작업 중 실행되는 보안 검사 Copilot coding agent는 작업 과정에서 생성된 코드를 대상으로 여러 보안 검사를 수행한다. - Code scanning으로 취약한 코드 패턴을 탐지한다. - Secret scanning으로 API 키나 비밀 값이 커밋되는지 확인한다. - 의존성 취약점 검사를 통해 알려진 CVE가 포함된 패키지를 탐지한다. - 검사 결과는 세션 로그에 표시되며, 풀 리퀘스트가 열리기 전에 문제를 확인할 수 있다. - 일반적으로 GitHub Advanced Security에 포함되는 code scanning을 Copilot coding agent에서는 별도 비용 없이 제공한다. ## 팀 규칙을 반영하는 사용자 정의 에이전트 사용자 정의 에이전트를 사용하면 팀의 개발 절차와 전문 작업 방식을 파일로 명시할 수 있다. - 저장소의 `.github/agents/` 아래에 에이전트 설정 파일을 만든다. - 특정 에이전트에 작업 범위와 수행 절차를 부여할 수 있다. - 예를 들어 성능 최적화 에이전트가 다음 순서로 동작하도록 만들 수 있다. - 먼저 벤치마크를 실행한다. - 특정 코드를 수정한다. - 변경 후 성능을 다시 측정한다. - 결과와 함께 풀 리퀘스트를 생성한다. - 조직이나 엔터프라이즈 전체에서 사용자 정의 에이전트를 공유할 수 있어 팀별 작업 방식의 일관성을 높인다. - 실제 데모에서는 조회 함수의 성능을 측정한 뒤 수정해 해당 함수에서 99% 개선을 달성했다. ## 클라우드와 로컬 CLI 간 작업 연속성 클라우드에서 시작한 작업을 로컬 터미널로 이어가거나, 로컬 작업을 클라우드 에이전트에 위임할 수 있다. - “Continue in Copilot CLI”를 선택하면 브랜치, 로그, 대화 컨텍스트가 유지된 채 로컬에서 작업을 이어간다. - CLI에서 `&`를 누르면 현재 작업을 클라우드로 다시 위임할 수 있다. - 클라우드와 로컬 사이를 이동할 때 대화를 처음부터 다시 설명할 필요가 없다. - 터미널 중심 개발과 GitHub 기반 자동화를 유연하게 결합할 수 있다. ## 앞으로의 확장 방향 GitHub는 Copilot coding agent를 단순한 풀 리퀘스트 생성 도구 이상으로 확장하려 하고 있다. - 비공개 모드 지원 - 코딩 전에 작업 계획을 세우는 기능 - 풀 리퀘스트가 필요 없는 이슈 요약 - 자동 보고서 생성 팀의 반복적인 개발 작업에는 사용자 정의 에이전트와 적절한 모델 선택을 적용하고, 보안 검사와 자체 리뷰 결과를 확인하는 방식으로 활용하는 것이 좋다. 복잡한 작업은 클라우드에서 위임하고 세부 수정은 CLI에서 이어가는 방식도 효과적이다.