GitLab Runnerを使って、ChatGPTにマージリクエストのレビューをしてもらう / 作業ログ編
はじめに
ChatGPT
を使用して、マージリクエストのレビューをしてもらいたいという気持ちがあり、
実際にできそうなので構築をしてみる。
環境
|
|
GitLab-runner の登録
- gitlab-runner コンテナへ入る。
|
|
gitlab-runner register
を実行する
|
|
- URL と token を入力する。
|
|
|
|
項目名 | 設定値 |
---|---|
URL | http://gitlab.example.com/ |
token | XXXXXXXXXXXX |
runner name | mr-review |
executor | docker |
Docker image | python:3.11.4-buster |
image
は python3.11.4-buster
を使用した。DockerHub から使用できるイメージを参照する。
Personal Access Tokenを取得する
CI/CDの設定
プロジェクト → 「CI/CD」から「Variables」で変数を設定する。
エラー
Docker が実行できないみたいなエラー
|
|
ホスト側の docker.sock
をマウントする必要がある。
そうすることで、ホスト側の Docker のソケットを共有し、gitlab-runner
コンテナからもdocker
が使用できる。
gitlab.example.com で gitlab のコンテナアクセスする。
|
|
アクセスできるように
|
|
|
|
※しかし、後述の手順のエラーを解消できるわけではないので、必ずしも設定する必要はなさそう。
JobでGit cloneができないエラー
CI/CD
が走ったあとに、Job
では下記のエラーが出た。
|
|
gitlab.example.com
の ドメインに対する git clone
ができていないみたい。
runner
コンテナで git clone
ができるのかを調査。
|
|
いけるみたい。gitlab-runner
ユーザでプロジェクトが見えない可能性?
→gitlab-runner
で使用しているGitのユーザは何なのか?
※プロジェクトの可視性を public にしてみたけどだめだった。
解決方法url
, clone_url
をホストの IP にした。
ドメインだとうまく解決できないみたい。runner
のコンテナに入ると gitlab.example.com
はうまく行っているのだが・・・。
- 参考
https://qiita.com/pike3/items/0953f167cf67058eb8a7 - 参考
https://gitlab-docs.creationline.com/runner/faq/
toml
を下記のように修正, url
, clone_url
を修正した。
|
|
.gitlab-ci.yml
|
|
うまく行っているみたい。
test
のジョブ
|
|
build
のジョブ
|
|
GitLabAPI を使うテスト
|
|
pip install
する必要がある。
|
|
上記を追加する。
requirements.txt
は下記のとおりに作成した。
|
|
yml
を書き直し。
|
|
これで、 mr-review-gpt
はマージリクエストを作成したときのみ実行される。
マージリクエストを作成する
適当なブランチを作ってプッシュし、マージリクエストを作成する。
|
|
エラーが出るのでスクリプトを見直す。
merge_request_id
なのに、 merge_request_iid
で参照していたので修正した。
|
|
gitlab.example.comが参照できないエラー
|
|
gitlab.example.com
が参照できないエラー。
うーん、やっぱりホストの IP アドレスで直接参照させるのが良さそうか。
というわけでスクリプトのurl
を変える。
|
|
できた、が Project Not Found
になった・・・!
あと、pip
をroot
で実行しないで、venv
使ってみたいなのが出た。
venv を使うように修正
とりあえず、 venv
使うように yml
を修正する。
|
|
|
|
これで良さそう。
Project Not Found を直す。
おそらく、 Personal Access Token
が悪そうか?
下記でアクセストークンとかを表示させてみた。
|
|
|
|
コンソールを見ると、 None
になっていた。
これが原因みたい。
どうやら、「CI/CD」の設定の「Variables」で下記のチェックが入っていたので変数が展開されなかったみたい。
変更すると下記のように表示された。
|
|
今度は、アクセストークンの権限が足りないみたい。
|
|
しか許可していないので・・・。
最終的に、 MR に書き込みをするので、 「api」の権限を与える。
|
|
が最終的な権限。
変わらずだめみたい。
|
|
https://gitlab.com/gitlab-org/gitlab-foss/-/issues/29022
↑ みたいに、同じ人がいるみたいだ。
解決方法は・・・?
curl
でアクセスできるか試す。
|
|
|
|
curl
でもアクセスできないみたい。
この API URL になにか問題があるのかを調査。
ChatGPT にきいたやつなので、情報が古いかもと思い、API の Reference を見る。
https://docs.gitlab.com/ee/api/rest/
https://docs.gitlab.com/ee/api/merge_requests.html#get-single-mrGET /projects/:id/merge_requests/:merge_request_iid
みたい。
|
|
どっちもアクセスできた。JSON が返ってきた。
PersonalAccessToken
などの問題ではなさそう。
|
|
projects
の ID と MR の ID を適当に変えて実行してみた。
※Web 上で見える ID と JOB で取得される、 CI_MERGE_REQUEST_ID
が異なっているから。
適当に変えたら取れた。
ということは、JOB で取得される MR の ID が悪そうだ。
API の URL を見る限り、 CI_MERGE_REQUEST_ID
ではなく、 CI_MERGE_REQUEST_IID
を使う必要がありそうだ。
ChatGPT に相違点を聞いてみる。
|
|
なるほどな。
というわけでコードを直した。
|
|
最終的に下記のように修正
|
|
↓ いけた!
|
|
よしよし。
次は、この変更を ChatGPT に食わせることをやってみる。
変更を送信して ChatGPT にレビューしてもらう。
|
|
コードを変更した。
あとは、GitLab の CI/CD に OpenAI の APIKEY を設定する。
|
|
なんかエラーでた。
|
|
openai.error.RateLimitError: You exceeded your current quota, please check your plan and billing details.
ということなので、発行したやつを見てみる。
OpenAPI
の API_KEY
にて料金を設定していないみたい。
クレジットカードの設定をしていなかったのでした。Usage Limit
は $10.00
に設定。
これでもう一回 Job
を実行してみる。
|
|
エラーが出た・・・。
CompletionsAPI
のコールの仕方がこれではないらしい。
|
|
|
|
こんなレスポンスが得られていた。
しかし、コメントには反映されず・・・。
コメントのAPIを見てみる。
/api/v4
のURLになっていなかったので修正する。
|
|
参考
- GitLab の CI/CD で超重要な rules の全てを理解する
https://dev.classmethod.jp/articles/sample-to-understand-rules/ - pip を用いて、複数の Python ライブラリを一括インストールする
https://take-tech-engineer.com/pip-requirements/ - 【GitLab CI】Gitへの接続失敗でジョブが失敗するときの対処法
https://qiita.com/pike3/items/0953f167cf67058eb8a7 - Troubleshoot GitLab Runner
https://gitlab-docs.creationline.com/runner/faq/ - GitLab CIでPythonコードの静的解析
https://qiita.com/momomo_rimoto/items/cf2b40c0a235a40fc1ae - token access with api returns “404 Project Not Found” on an internal project or public project with member only access to repository or private project
https://gitlab.com/gitlab-org/gitlab-foss/-/issues/29022 - REST API
https://docs.gitlab.com/ee/api/rest/ - Get single MR
https://docs.gitlab.com/ee/api/merge_requests.html#get-single-mr - GitLab CI/CD Variables を翻訳しました。
https://qiita.com/ynott/items/4c5085b4cd6221bb71c5 - malywut/gpt_mr_reviewer
https://github.com/malywut/gpt_mr_reviewer/blob/main/mr_reviewer.py - ChatGPT API の使い方
https://note.com/npaka/n/n0dd2b226e8ae#e192f0b5-54af-41d1-84a7-c55e5989a64c - GPT models
https://platform.openai.com/docs/guides/gpt
改善点
- コメントするアカウントを変更する。→ レビューコメント用のユーザを作成し、そのユーザの
Personal Access Token
を使えば良さそう。 - プロジェクト間で
Runner
を共有したい。→Group Runner
,Shared Runner
を使う。 - 現状だと MRに変更があった場合にレビューが都度入る。→その都度コメントされてしまうため。良いレビューの仕方を考えたい。
- ChatGPTがレビューコメントしたものに返信があった場合に、そのレビューを返したい。
Reviewer
が特定のユーザの場合のみにChatGPT
のレビューを有効にしたい。→.gitlab-ci.yml
を変えればよい?
おわりに
作業ログという形で今回の作業のエラー解消や構築までの流れを記録しておいた。
これを基に、スムーズに構築できる記事を次回は記載する。