fbpx

第1回 GitLab のAI支援機能を使って簡単なツールを作ってみた #gitlab #gitlabduo #ai

はじめに

GitLabサポートエンジニアの今井です。さてみなさん、開発に役立つAI支援ツールとして一番最初に思いつくものは何でしょうか?GitHub CopilotやCursorなど、人それぞれ思い浮かぶツールがあるかと思います。

数あるAI支援ツールの中で、今回ご紹介したいのはGitLabのAI支援機能であるGitLab Duoです。このGitLab Duoは「ソフトウェア開発ライフサイクル全体にわたってAIを使用し、より安全なソフトウェアをスピーディに出荷」と謳っており、単純なAIによるコード生成機能だけでなく、マージリクエストの要約、脆弱性の説明や修正、Issueコメントの要約、失敗したCI/CDパイプラインの根本原因の特定など多岐にわたるAI支援機能が提供されています。

このブログではコード提案機能であるCode Suggestionsと対話形式で開発を支援してくれるDuo Chatを使用して簡単なツールを作ることで、機能の使い勝手をご紹介していきたいと思います。

なお、Code SuggestionsとDuo Chatは有償版の機能であり、GitLab Premium以上の契約と、GitLab Duo Pro以上の契約が必要となります。ご関心のある方は弊社のお問い合わせページより、是非お気軽にご連絡ください。

どんなツールを作るか

私の所属するチームではチームのタスク管理にGitLabのEpicIssueの機能を使っています。タスクをIssueで定義して、EpicでIssueを束ねているのですが、このEpicとIssueを一気に作成する機能がなく、自前で実装してみようと考えました。実現したい要件としては以下のとおりです。

  • CSVファイルからEpicとIssueのデータを読み込む
  • GitLab APIを使って読み込んだデータでEpicを作成する
  • 作成したEpicに紐づくように、GitLab APIを使って読み込んだデータでIssueを作成する

CSVファイルのレイアウトはインポート機能に合わせました。理由としては余計なことを考えなくて良いですし、descriptionクイックアクションを埋め込むことで、Issueに対する大抵の操作は可能になるためツールの汎用性が上がると考えたためです。

第1回目の今回は、GitLab APIを使ってEpicとIssueを作成する機能を実装したいと思います。

開発環境

簡単に開発環境についても触れます。
GitLab APIの呼び出しにpython-gitlabを使うため、言語はPythonにしました。
もちろんCode SuggestionsもPythonに対応しています。Visual Studio CodeでCode Suggestionsを使うための設定方法については公式ドキュメントをご覧いただくとして、ここでは割愛します。

Epicを作成するコードを書く

では早速Epicを作成するコードを書いていきましょう。
Code Suggestionsを使ってコードの提案を受けるには、以下の2つのやり方があります。

  • 普通にコードを書く
  • コメントに提案してほしい内容を自然言語で書く

今回は何もない状態からコードを書いていきますので、コメントに提案してほしい内容を書きます。
Visual Studio Codeでepic_creator.pyという名前でファイルを作成し、エディタで「# python-gitlabでepicを作るコードを書いてください」と書きます。Enterで改行するとアイコンが表示され、

その後、Code Suggestionsよりコードが提案されます。

Tabキーを押下するとコード提案を受け入れることができます。以下が提案されたコードです。

# epic_creator.py
# python-gitlabでepicを作るコードを書いてください

import gitlab

# GitLab APIの設定
gl = gitlab.Gitlab('https://gitlab.com', private_token='YOUR_PRIVATE_TOKEN')

# プロジェクトの取得
project = gl.projects.get('your_project_id')

# Epicの作成
epic = project.epics.create({
    'title': 'New Epic Title',
    'description': 'This is a new epic created using python-gitlab',
    'labels': ['label1', 'label2'],
    'start_date': '2023-06-01',
    'due_date': '2023-12-31'
})

print(f"Epic created with ID: {epic.id}")

# Epicの詳細を表示
print(f"Epic Title: {epic.title}")
print(f"Epic Description: {epic.description}")
print(f"Epic Labels: {epic.labels}")
print(f"Epic Start Date: {epic.start_date}")
print(f"Epic Due Date: {epic.due_date}")

ぱっと見た限りおかしい箇所と言えばEpicをプロジェクトに対して作成しようとしている部分でしょうか。Epicはグループに紐づくリソースであるため、プロジェクトではなくグループに対して作成しなければなりません。これをCode Suggestionsではなく、Duo Chatを利用して修正したいと思います。

Duo Chatにはいくつかのコマンドが実装されており、選択箇所のリファクタリングやテストコードを書くなどの機能があります。今回は/refactorコマンドを使ってプロジェクトではなくグループに対してEpicを作成するように変更していきます。

Visual Studio CodeのDuo Chatアイコンをクリックし、チャットを開きます。

その後、エディタでリファクタリングしたい箇所を選択しますが、今回はコードを全選択してみましょう。全選択してからチャット欄に「/refactor Epicはグループにひもづいているためグループを取得しなければなりません」と入力します。

すると下図のような返信が返ってきました。

提案されているコードはきちんとグループを取得しているように見えるため、概ね正しいコードになっているようです。しかし、日本語の質問をしっかり解釈して提案してくれていますが、英語で返信が返ってきました。そこで「私の質問にはすべて日本語で答えてください」と入力してみます。

日本語で返信してくれました。コードのコメントまで日本語になっているのはご愛嬌です。
それではこのコードを実際に反映します。エディタのコードを全選択したまま下図の反映アイコンをクリックします。

するとコードの選択箇所がDuo Chatのコードに置き換わります。

これでグループに対してEpicを作成するコードになりました。以下が実際のコードです。

# epic_creator.py
# python-gitlabでepicを作るコードを書いてください

import gitlab

# GitLab APIの設定
gl = gitlab.Gitlab('https://gitlab.com', private_token='YOUR_PRIVATE_TOKEN')

# グループの取得
group = gl.groups.get('your_group_id')

# Epicの作成
epic = group.epics.create({
    'title': '新しいEpicのタイトル',
    'description': 'これはpython-gitlabを使用して作成された新しいEpicです',
    'labels': ['ラベル1', 'ラベル2'],
    'start_date': '2023-06-01',
    'due_date': '2023-12-31'
})

print(f"作成されたEpicのID: {epic.id}")

# Epicの詳細を表示
print(f"Epicのタイトル: {epic.title}")
print(f"Epicの説明: {epic.description}")
print(f"Epicのラベル: {epic.labels}")
print(f"Epic開始日: {epic.start_date}")
print(f"Epic終了日: {epic.due_date}")

実際に動かしてEpicが作成されるか確認してみましょう。GitLabのURL、アクセストークン、グループIDを指定している箇所を実際の環境のものに書き換えて実行します。

$ python epic_creator.py 
作成されたEpicのID: 368
Epicのタイトル: 新しいEpicのタイトル
Epicの説明: これはpython-gitlabを使用して作成された新しいEpicです
Epicのラベル: ['ラベル1', 'ラベル2']
Epic開始日: None
Epic終了日: None

このように無事Epicが作成されました。

最初からコードを書き始める状況や、実際に自分でコーディングする状況ではCode Suggestionsが有効ですが、コードの一部を修正する状況では選択箇所に提案コードを反映することができるDuo Chatの方が使い勝手が良さそうです。これは基本的なCode SuggestionsとDuo Chatの使い分けの判断基準になりそうです。

さて動作確認が終わったところで、もう少し踏み入ったリファクタリングをしたいと思います。
このコードでは「GitLab APIの設定」でURLとアクセストークンを、「グループの取得」でグループIDを直接指定しています。本来は設定ファイルに外出ししてしかるべき情報だと思いますので修正を加えます。

再度エディタでコードを全選択します。

チャット欄に「/refactor GitLabのURLとトークン、グループIDを指定している箇所を定数化し、config.pyファイルに外出ししてください」と入力します。

config.pyで定数を定義し、その定数を使うようにepic_creator.pyを修正するように提案しています。
(日本語で質問に答えてくださいというリクエストは無視されてますが、見なかったことにしましょう)
この提案を受け入れ修正したコードが以下の通りです。

# config.py

GITLAB_URL = 'https://gitlab.com'
GITLAB_PRIVATE_TOKEN = 'YOUR_PRIVATE_TOKEN'
GROUP_ID = 'your_group_id'
# epic_creator.py

import gitlab
from config import GITLAB_URL, GITLAB_PRIVATE_TOKEN, GROUP_ID

# GitLab APIの設定
gl = gitlab.Gitlab(GITLAB_URL, private_token=GITLAB_PRIVATE_TOKEN)

# グループの取得
group = gl.groups.get(GROUP_ID)

# Epicの作成
epic = group.epics.create({
    'title': '新しいEpicのタイトル',
    'description': 'これはpython-gitlabを使用して作成された新しいEpicです',
    'labels': ['ラベル1', 'ラベル2'],
    'start_date': '2023-06-01',
    'due_date': '2023-12-31'
})

print(f"作成されたEpicのID: {epic.id}")

# Epicの詳細を表示
print(f"Epicのタイトル: {epic.title}")
print(f"Epicの説明: {epic.description}")
print(f"Epicのラベル: {epic.labels}")
print(f"Epic開始日: {epic.start_date}")
print(f"Epic終了日: {epic.due_date}")

Issueを作成するコードを書く

これでGitLab APIを使ってEpicを作成する機能は実装できました。次に同様のやり方でIssueを作成する機能を実装していきましょう。

issue_creator.pyという名前のファイルを作成し、エディタで「# python-gitlabでissueを作るコードを書いてください」とコメントします。すると以下のコードが提案されました。

# issue_creator.py
# python-gitlabでissueを作るコードを書いてください
import gitlab

# GitLab API接続の設定
gl = gitlab.Gitlab('https://gitlab.com', private_token='YOUR_PRIVATE_TOKEN')

# プロジェクトの取得
project = gl.projects.get('your_project_id')

# 新しいissueの作成
issue = project.issues.create({
    'title': 'New Issue Title',
    'description': 'This is a new issue created using python-gitlab.',
    'labels': ['bug', 'critical']
})

print(f"Issue created with ID: {issue.id}")

Epicと同様のコードが提案されています。しかし、URLやアクセストークン、プロジェクトIDの指定は定数を使っていません。Duo Chatでリファクタリングしていきましょう。コードを全選択してDuo Chatに「/refactor config.pyの定数を使ってURLとアクセストークンとプロジェクトIDの指定箇所を修正してください。プロジェクトIDは新しくconfig.pyに定義を追加してください」と入力します。

概ね期待通りのコードが提案されました。GROUP_IDGITLAB_PROJECT_IDの命名規則に揺れが発生していますが許容範囲内でしょう。少し手を加えますが提案されたコードを反映しましょう。

# config.py

GITLAB_URL = 'https://gitlab.com'
GITLAB_PRIVATE_TOKEN = 'YOUR_PRIVATE_TOKEN'
GROUP_ID = 'your_group_id'
PROJECT_ID = 'your_project_id'
# issue_creator.py

import gitlab
from config import GITLAB_URL, GITLAB_PRIVATE_TOKEN, PROJECT_ID

# GitLab API接続の設定
gl = gitlab.Gitlab(GITLAB_URL, private_token=GITLAB_PRIVATE_TOKEN)

# プロジェクトの取得
project = gl.projects.get(PROJECT_ID)

# 新しいissueの作成
issue = project.issues.create({
    'title': 'New Issue Title',
    'description': 'This is a new issue created using python-gitlab.',
    'labels': ['bug', 'critical']
})

print(f"Issue created with ID: {issue.id}")

実行してみます。

$ python issue_creator.py 
Issue created with ID: 23162

Issueが作成されていました。

まとめ

今回はここまでにします。実際にCode SuggestionsとDuo Chatを使ってみた感想としては、要求している機能を大まかな日本語でしか伝えていないのにも関わらず、なかなか使えるコードを提案してくれるなと感じました。また以下のように2つの機能の基本的な使い分けもわかってきたのでより有効にAI支援機能を使って開発生産性を高められそうという期待を持てました。

  • まずはエディタ上でCode Suggestionsのコード提案を活用する
  • コードを手直ししたい場合はDuo Chatに修正内容を伝えてみる

また補足ではありますが、Visual Studio Codeで開いているタブもCode Suggestionsのコンテキストに含めてくれるそうなので、関連するファイルは開いたままにしておくとより精度の高いコード提案を受けられるかもしれません。

次回はもう少し複雑な要求をCode SuggestionsとGitLab Duoに伝えながら今回のコードをリファクタリングしていきたいと思います。

新規CTA