0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

codex-actionでissueに自動でラベリングしてみた!

Last updated at Posted at 2025-11-08

codex-actionを使用してissueが作成されると自動でラベルを自動で追加するようにしてみました。
また、output-schemaを使用してラベルのみが回答されるようにしました。

実行は以下のようにしました。

  1. リポジトリ内のラベルの取得する
  2. ラベルの名前と説明をコンテキストに渡して、issueの内容に適したラベルを返す
  3. 返ってきたラベルをissueに追加する
name: Issue Triage
on:
  issues:
    types: [opened]

jobs:
  analyze_issue:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      issues: read
    outputs:
      final_message: ${{ steps.analyze_with_ai.outputs.final-message }}
      triage_label: ${{ steps.extract_label.outputs.label }}

    steps:
      - name: Checkout repository
        uses: actions/checkout@v5
        with:
          fetch-depth: 0

      - name: Fetch Repository Labels
        id: get_labels
        uses: actions/github-script@v7
        with:
          github-token: ${{ github.token }}
          script: |
            const { data } = await github.rest.issues.listLabelsForRepo({
              owner: context.repo.owner,
              repo: context.repo.repo
            });

            const labels = data.map(label => `${label.name}: ${label.description || 'No description'}`).join('\n');
            const labelNames = JSON.stringify(data.map(label => label.name));

            core.setOutput('labels', labels);
            core.setOutput('label_names', labelNames);

      - name: Generate Dynamic Schema with Label Enums
        id: generate_schema
        env:
          LABEL_NAMES: ${{ steps.get_labels.outputs.label_names }}
        run: |
          schema=$(cat <<EOF
          {
            "type": "object",
            "properties": {
              "label": {
                "type": "string",
                "description": "The most appropriate label for this issue based on its content and purpose",
                "enum": $LABEL_NAMES
              }
            },
            "required": [
              "label"
            ],
            "additionalProperties": false
          }
          EOF
          )
          echo "schema<<EOF" >> $GITHUB_OUTPUT
          echo "$schema" >> $GITHUB_OUTPUT
          echo "EOF" >> $GITHUB_OUTPUT

      - name: Analyze Issue with AI
        id: analyze_with_ai
        uses: openai/codex-action@v1
        with:
          openai-api-key: ${{ secrets.OPENAI_API_KEY }}
          output-schema: ${{ steps.generate_schema.outputs.schema }}
          prompt: |
            Analyze this issue and determine the appropriate label.

            Available labels:
            ${{ steps.get_labels.outputs.labels }}

            Issue #${{ github.event.issue.number }}: ${{ github.event.issue.title }}

            ${{ github.event.issue.body }}

      - name: Extract Label from AI Response
        id: extract_label
        env:
          CODEX_FINAL_MESSAGE: ${{ steps.analyze_with_ai.outputs.final-message }}
        run: |
          label=$(echo "$CODEX_FINAL_MESSAGE" | jq -r '.label')
          echo "label=$label" >> $GITHUB_OUTPUT

  apply_label:
    runs-on: ubuntu-latest
    needs: analyze_issue
    if: needs.analyze_issue.outputs.triage_label != ''
    permissions:
      issues: write

    steps:
      - name: Apply Label to Issue
        uses: actions/github-script@v7
        env:
          TRIAGE_LABEL: ${{ needs.analyze_issue.outputs.triage_label }}
        with:
          github-token: ${{ github.token }}
          script: |
            await github.rest.issues.addLabels({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.payload.issue.number,
              labels: [process.env.TRIAGE_LABEL]
            });
``
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?