한국어

Codex GitHub Action

GitHub 이벤트에서 Codex 작업 트리거

Codex GitHub Action(openai/codex-action@v1)을 사용하여 CI/CD 작업에서 Codex를 실행하거나, 패치를 적용하거나, GitHub Actions 워크플로에서 리뷰를 게시할 수 있습니다. 이 작업은 Codex CLI를 설치하고, API key를 제공하면 Responses API 프록시를 시작하며, 지정한 권한으로 codex exec을 실행합니다.

다음과 같은 경우 이 작업을 사용하세요.

  • CLI를 직접 관리하지 않고도 풀 리퀘스트 또는 릴리스에 대한 Codex 피드백을 자동화합니다.
  • CI 파이프라인의 일부로 Codex 기반 품질 검사를 통과해야만 변경 사항이 반영되도록 합니다.
  • 워크플로 파일에서 반복 가능한 Codex 작업(코드 리뷰, 릴리스 준비, 마이그레이션)을 실행합니다.

CI 예시는 비대화형 모드를 참조하고, openai/codex-action 저장소에서 소스 코드를 살펴보세요.

사전 요구 사항

  • OpenAI key를 GitHub secret(예: OPENAI_API_KEY)으로 저장하고 워크플로에서 참조합니다.
  • Linux 또는 macOS 러너에서 작업을 실행합니다. Windows에서는 safety-strategy: unsafe을 설정합니다.
  • Codex가 저장소 콘텐츠를 읽을 수 있도록 작업을 호출하기 전에 코드를 체크아웃합니다.
  • 실행할 프롬프트를 결정합니다. prompt을 통해 인라인 텍스트를 제공하거나 prompt-file을 사용하여 저장소에 커밋된 파일을 지정할 수 있습니다.

워크플로 예시

아래 샘플 워크플로는 새 풀 리퀘스트를 검토하고 Codex의 응답을 캡처한 다음 PR에 다시 게시합니다.

name: Codex pull request review
on:
  pull_request:
    types: [opened, synchronize, reopened]

jobs:
  codex:
    runs-on: ubuntu-latest
    permissions:
      contents: read
    outputs:
      final_message: ${{ steps.run_codex.outputs.final-message }}
    steps:
      - uses: actions/checkout@v5
        with:
          ref: refs/pull/${{ github.event.pull_request.number }}/merge
          fetch-depth: 0
          persist-credentials: false

      - name: Run Codex
        id: run_codex
        uses: openai/codex-action@v1
        with:
          openai-api-key: ${{ secrets.OPENAI_API_KEY }}
          prompt-file: .github/codex/prompts/review.md
          output-file: codex-output.md

  post_feedback:
    runs-on: ubuntu-latest
    needs: codex
    if: needs.codex.outputs.final_message != ''
    permissions:
      issues: write
      pull-requests: write
    steps:
      - name: Post Codex feedback
        uses: actions/github-script@v7
        with:
          github-token: ${{ github.token }}
          script: |
            await github.rest.issues.createComment({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.payload.pull_request.number,
              body: process.env.CODEX_FINAL_MESSAGE,
            });
        env:
          CODEX_FINAL_MESSAGE: ${{ needs.codex.outputs.final_message }}

.github/codex/prompts/review.md을 자체 프롬프트 파일로 바꾸거나 인라인 텍스트에는 prompt 입력을 사용하세요. 또한 이 예시는 나중에 검토하거나 아티팩트로 업로드할 수 있도록 Codex의 최종 메시지를 codex-output.md에 기록합니다.

codex exec 구성

codex exec 옵션에 매핑되는 작업 입력을 설정하여 Codex의 실행 방식을 세부적으로 조정할 수 있습니다.

  • prompt 또는 prompt-file(하나만 선택): 작업에 대한 인라인 지침 또는 Markdown이나 텍스트가 포함된 저장소 경로입니다. 프롬프트는 .github/codex/prompts/에 저장하는 것이 좋습니다.
  • codex-args: 추가 CLI 플래그입니다. JSON 배열(예: ["--ephemeral"]) 또는 셸 문자열(--profile ci)을 제공하여 세션, 프로필 또는 MCP 설정을 구성합니다.
  • modeleffort: 원하는 Codex 에이전트 구성을 선택합니다. 기본값을 사용하려면 비워 두세요.
  • sandbox: 실행 중 Codex에 필요한 권한에 맞게 샌드박스 모드(workspace-write, read-only, danger-full-access)를 설정합니다.
  • output-file: 이후 단계에서 업로드하거나 차이를 비교할 수 있도록 Codex의 최종 메시지를 디스크에 저장합니다.
  • codex-version: 특정 CLI 릴리스로 고정합니다. 최근에 게시된 버전을 사용하려면 비워 두세요.
  • codex-home: 여러 단계에서 구성 파일이나 MCP 설정을 재사용하려면 공유 Codex 홈 디렉터리를 지정합니다.

권한 관리

제한하지 않으면 Codex는 GitHub 호스팅 러너에서 광범위한 접근 권한을 갖습니다. 다음 입력을 사용하여 노출 범위를 제어하세요.

  • safety-strategy(기본값 drop-sudo)은 Codex를 실행하기 전에 sudo을 제거합니다. 이 작업에서는 되돌릴 수 없으며 메모리에 있는 비밀을 보호합니다. Windows에서는 safety-strategy: unsafe을 설정해야 합니다.
  • unprivileged-usersafety-strategy: unprivileged-usercodex-user과 함께 사용하여 특정 계정으로 Codex를 실행합니다. 해당 사용자가 체크아웃된 저장소를 읽고 쓸 수 있는지 확인하세요. 소유권 수정 방법은 unprivileged-user 예시를 참조하세요.
  • read-only은 Codex가 파일을 변경하거나 네트워크를 사용하지 못하도록 하지만, Codex는 여전히 상승된 권한으로 실행됩니다. 비밀을 보호하기 위해 read-only에만 의존하지 마세요.
  • sandbox은 Codex 내부의 파일 시스템 및 네트워크 접근을 제한합니다. 작업을 완료할 수 있는 범위 내에서 가장 제한적인 옵션을 선택하세요.
  • allow-usersallow-bots은 워크플로를 트리거할 수 있는 사용자를 제한합니다. 기본적으로 쓰기 권한이 있는 사용자만 작업을 실행할 수 있습니다. 신뢰할 수 있는 추가 계정을 명시적으로 나열하거나, 기본 동작을 사용하려면 필드를 비워 두세요.

출력 캡처

이 작업은 final-message 출력을 통해 Codex의 마지막 메시지를 내보냅니다. 위 예시처럼 작업 출력에 매핑하거나 이후 단계에서 직접 처리하세요. 러너에서 전체 트랜스크립트를 수집하려면 output-file을 아티팩트 업로드 기능과 함께 사용하세요. 구조화된 데이터가 필요하면 --output-schemacodex-args을 통해 전달하여 JSON 형식을 적용하세요.

보안 체크리스트

  • 워크플로를 시작할 수 있는 사용자를 제한하세요. 누구나 저장소에 대해 Codex를 실행하도록 허용하는 대신 신뢰할 수 있는 이벤트나 명시적 승인을 사용하세요.
  • 프롬프트 인젝션을 방지하려면 풀 리퀘스트, 커밋 메시지 또는 이슈 본문의 프롬프트 입력을 정제하세요. Codex에 전달하기 전에 HTML 주석이나 숨겨진 텍스트를 검토하세요.
  • OPENAI_API_KEY을 보호하려면 safety-strategydrop-sudo으로 유지하거나 Codex를 권한이 없는 사용자로 실행하세요. 다중 테넌트 러너에서는 작업을 unsafe 모드로 두지 마세요.
  • 이후 단계가 예기치 않은 상태 변경을 상속하지 않도록 작업의 마지막 단계에서 Codex를 실행하세요.
  • 프록시 로그나 작업 출력에 비밀 정보가 노출되었다고 의심되면 즉시 key를 교체하세요.

문제 해결

  • prompt와 prompt-file을 모두 설정한 경우: 입력 소스를 정확히 하나만 제공하도록 중복 입력을 제거하세요.
  • responses-api-proxy가 서버 정보를 기록하지 않은 경우: API key가 존재하고 유효한지 확인하세요. 프록시는 openai-api-key을 제공한 경우에만 시작됩니다.
  • sudo이 제거될 것으로 예상했지만 sudo이 성공한 경우: 이전 단계에서 sudo을 복원하지 않았는지, 러너 OS가 Linux 또는 macOS인지 확인하세요. 새 작업으로 다시 실행하세요.
  • drop-sudo 이후 권한 오류가 발생하는 경우: 작업을 실행하기 전에 쓰기 권한을 부여하세요(예: chmod -R g+rwX "$GITHUB_WORKSPACE"을 사용하거나 권한이 없는 사용자 패턴 적용).
  • 승인되지 않은 트리거가 차단된 경우: 기본 쓰기 권한 공동 작업자 외에 서비스 계정을 허용해야 한다면 allow-users 또는 allow-bots 입력을 조정하세요.