GitHub Actionsでgithub-scriptを使ってissueを作成する

CI/CD

この記事では、github-scriptを使ってissue作成を試してみます。

github-scriptとは?

github-scriptは、GitHub Actionsの一部として提供されるアクションで、JavaScriptまたはTypeScriptを使用してGitHub APIを簡単に操作できるツールです。これにより、複雑なAPIリクエストをシンプルなコードで実現できます。

主な特徴

GitHub APIを簡単に操作

github-scriptは、GitHub REST APIとGraphQL APIの両方にアクセスできる柔軟なツールです。例えば、リポジトリのissueやPull Requestを管理する処理を数行のスクリプトで実装できます。APIのドキュメントはこちらです。

issueを作成してみる

以下は、GitHub Actionsを使用して特定のリポジトリにissueを作成するworkflowです。

name: Create Issue
on:
  workflow_dispatch:

jobs:
  create_issue:
    runs-on: ubuntu-latest
    permissions:
      issues: write
    steps:
      - name: Create GitHub Issue
        uses: actions/github-script@v7
        with:
          script: |
            await github.rest.issues.create({
              owner: context.repo.owner,
              repo: context.repo.repo,
              title: "自動生成されたIssue",
              body: "このIssueはGitHub Actionsによって自動生成されました。",
              labels: ['automated'],
              assignees: ['user-name']
            });

issueを作成させるために、premissionsでissues: writeを指定し、このジョブがリポジトリのissueを作成できる権限を付与しています。
また、github-scriptを用いて、issues.createを使ってIssueを作成しています。使用しているAPIのドキュメントはこちらです。

実行した結果はこんな感じになります。

issueの本文をカスタマイズする

issueを自動生成するユースケースとして、何かしらのテストを実行してエラーが検出された際が挙げられます。そのユースケースを想定したworkflowを作成してみます。

name: Create Issue
on:
  workflow_dispatch:

jobs:
  create_issue:
    runs-on: ubuntu-latest
    permissions:
      issues: write
    steps:
      - name: Generate and Save Error
        id: error_step
        run: |
          echo "エラーのサンプル: $(date)" > error_log.txt
          python3 -c "print(undefined_variable)" 2>> error_log.txt
        continue-on-error: true

      - name: Upload Error Log
        if: steps.error_step.outcome == 'failure'
        uses: actions/upload-artifact@v4
        with:
          name: error-logs
          path: error_log.txt

      - name: Create GitHub Issue
        if: steps.error_step.outcome == 'failure'
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const errorLog = fs.readFileSync('error_log.txt', 'utf8');

            await github.rest.issues.create({
              owner: context.repo.owner,
              repo: context.repo.repo,
              title: "エラーが検出されました",
              body: `以下のエラーが検出されました:\n\`\`\`\n${errorLog}\n\`\`\``,
              labels: ['automated', 'error'],
              assignees: ['user-name']
            });

エラーの内容を次のstepに受け渡すためにupload-artifactを使用しています。
実行した結果はこんな感じになります。

終わりに

github-scriptを使ってissueを作成を試してみました。workflowの実行結果によって、issueを作成できるのは便利でした。また、github-scriptはGitHub APIを操作できるので、あらゆる場面で使えそうですね。