OpenAI APIを使ってプルリクの内容を元にリリースノートを作成する

2024.01.29

はじめに

ソフトウェアの開発には、新機能の実装やバグの修正などコードの変更が欠かせません。これらの変更に対してリリースノートを作成しているケースも多くあると思います。

本記事では、GitHub ActionsとOpenAI APIを組み合わせて、プルリクエストの内容を元にリリースノートを自動で作成してみたいと思います。

Notionデータベースの準備

今回はリリースノートをNotionデータベースに登録したいので、まずその準備をします。

My integrationsにアクセスし、「New integration」をクリックします。

ワークスペースを選択し、任意の名前を入力して「Submit」をクリックします。

すると以下のような画面に遷移します。Secretsを「Show」で表示し、値をどこかにコピーしておきます。こちらは後からGitHubのシークレットとして登録します。

続いて登録先のデータベースを作成します。任意のページで以下のように作成します。

Inlineで作成した場合、矢印アイコンをクリックしてfull pageで開きます。

ページ右上の三点リーダーからメニューを開き、「Add connections」で先ほど作成したintegrationを選択します。

また、このデータベースのデータベースIDが必要になるので取得しておきます。

ページ右上の「Share」をクリックし、「Copy link」でURLを取得します。

URLは以下のような形式になっていますので、{database_id}の部分をどこかにコピーしておきます。こちらも後ほどシークレットに登録します。

https://www.notion.so/{workspace_name}/{database_id}?v={view_id}

データベースの列名は必要に応じて変更します。今回は以下のような列にしました。updateDtは作成日時、changesはテキストです。

これでNotionの準備は完了です。

コードの実装

続いてコードを実装します。

JavaScriptファイルの作成

まずはプルリクのタイトルと本文を元にしてリリースノートを生成するためのJavaScriptコードです。

以下のようなファイルを作成しました。

  • init.js
import OpenAI from "openai"
import { Client } from "@notionhq/client"
import 'dotenv/config'

export const OpenAiSource = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
})

export const NotionClient = new Client({
  auth: process.env.NOTION_API_KEY
})

export const NotionDatabaseId = process.env.NOTION_DATABASE_ID
  • generate-docs.js
import { OpenAiSource, NotionClient, NotionDatabaseId } from "./init.js";
import fs from 'fs';

// GitHub Actionsのイベント情報を読み込む
const eventPath = process.env.GITHUB_EVENT_PATH;
const eventData = JSON.parse(fs.readFileSync(eventPath, 'utf8'));

// プルリクエストの情報を取得
const prTitle = eventData.pull_request.title;
const prBody = eventData.pull_request.body;

const completion = await OpenAiSource.chat.completions.create({
  messages: [
    {
      "role": "system", "content": `
タイトルおよび本文を元にして、今回変更された内容について簡単にまとめてください。
まとめる際にはITについて詳しくないエンドユーザーでもわかりやすいように、技術的な表現や開発者向けの内容をできるだけ含まず、ユーザが知りたい内容のみにフォーカスするようにしてください。
複数の文章になった場合、改行を含まないでください。` },
    { "role": "user", "content": `タイトルは「${prTitle}、本文は「${prBody}」です。` },
  ],
  model: "gpt-3.5-turbo-1106",
  max_tokens: 300,
});

console.log(completion.choices[0]);

// Notionデータベースに登録
await NotionClient.pages.create({
  parent: {
    type: "database_id",
    database_id: NotionDatabaseId
  },
  properties: {
    changes: {
      type: "title",
      title: [
        {
          text: {
            content: completion.choices[0].message.content
          },
        }
      ],
    },
  }
})

今回はプルリクが閉じられたことをトリガーにしてGitHub Actionsを実行します。そのため下記コードのように、GitHub Actionsのイベント情報からプルリクに関する情報を得ることができます。

// GitHub Actionsのイベント情報を読み込む
const eventPath = process.env.GITHUB_EVENT_PATH;
const eventData = JSON.parse(fs.readFileSync(eventPath, 'utf8'));

// プルリクエストの情報を取得
const prTitle = eventData.pull_request.title;
const prBody = eventData.pull_request.body;

ここから得られた内容をOpenAIのAPIに渡し、リリースノートの内容を作成してもらいます。

Notionデータベースへの登録にはNotion SDKを使用しています。propertieschangesの部分は列名なので、必要に応じて変更してください。updateDt列は自動で作成日時が入るので、propertiesには含めていません。

GitHub Actionsワークフローの作成

そしてGitHub Actionsのワークフローを定義したymlファイルです。

name: Generate Documentation

on:
  pull_request:
    types:
      - closed

jobs:
  generate:
    if: ${{ github.event.pull_request.merged }}
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4

      - name: Set Up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: latest

      - name: Install Dependencies
        run: npm install

      - name: Run Documentation Generation
        run: node generate-docs.js
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
          NOTION_API_KEY: ${{ secrets.NOTION_API_KEY }}
          NOTION_DATABASE_ID: ${{ secrets.NOTION_DATABASE_ID }}

onのところでプルリクが閉じられたときに実行されるように定義しています。これだとマージせずに閉じられたときも実行されてしまうので、条件としてgithub.event.pull_request.mergedを加えています。こうすることで、マージされたときのみ実行されるようになります。

OPENAI_API_KEYNOTION_API_KEYNOTION_DATABASE_IDはGitHubのRepository secretsに登録しておきます。

動作確認

プルリクを以下のように作成し、マージします。

## 概要

- カテゴリ画面の追加

## 背景

- カテゴリを編集したいという要望があるため

## やったこと

- [x] ヘッダーにカテゴリメニューの追加
- [x] カテゴリの新規作成、更新、削除機能の追加
- [x] 開発環境で動作確認

## ユーザへの影響

- ヘッダーからカテゴリ画面に遷移できるようになった
- カテゴリの新規作成、更新、削除ができるようになった

## 備考
特になし

ワークフローは正常終了しました。

Notionデータベースを見ると、以下のようにレコードが追加されています。

次に、マージせずにクローズしてみます。

ワークフローが実行されずに終了しました。

おわりに

GitHub ActionsとOpenAIを使ってリリースノートを作成してみました。プロンプトを変えることで、他にも語調をそろえたり外国語対応したりと色々工夫の余地はあると思います。

この記事がどなたかの参考になれば幸いです。