Skip to content

Instantly share code, notes, and snippets.

@tk0miya
Created May 9, 2025 10:45
Show Gist options
  • Save tk0miya/14b87cd5921438eb6d7414a6f3a36823 to your computer and use it in GitHub Desktop.
Save tk0miya/14b87cd5921438eb6d7414a6f3a36823 to your computer and use it in GitHub Desktop.
生成 AI でプログラムを書いてみた
  • GitHub にたくさんリポジトリを持っている
  • 今回、10個以上のリポジトリの設定を変更したかった
  • やりたいこと:
    • GitHub Actions 用の変数を設定する
    • GitHub Actions 用のシークレットを設定する
    • Dependabot 用のシークレットを設定する
  • 困りごと:
    • ひとつずつリポジトリを開いて設定を変えるのは面倒くさい
    • そのため、ずっと後回しにしていた
  • そうだ、生成AI プログラミングのお題にしてみよう
    • GitHub Copilot に「リポジトリの設定を変更するアプリ」を作らせる

    • 初回スクリプト

      GitHub Actions の環境変数とシークレットを設定する ruby スクリプトを書きたい。
      
      目的: dependabot が用意するバージョン更新スクリプトを自動的にマージする GitHub Actios を用意した。このスクリプトの実行には GitHub リポジトリに、以下の Actions 用の設定を施す必要がある
      
      * Action variables: PR_AUTO_MERGER_APP_ID に 1239986 を設定する
      * Action secrets: PR_AUTO_MERGER_PRIVATE_KEY に鍵情報を設定する。鍵情報は外部ファイルから読み出せるようにすること。
      * Dependabot secrets: PR_AUTO_MERGER_PRIVATE_KEY に鍵情報を設定する。これは Action secrets と同じ内容を設定する
      
      このようなスクリプトのたたき台を作ってください。
      依存関係を減らしたいため、なるべく標準ライブラリを使うようにしてください。
      
  • その後のやりとり
    • require の位置を手直しして
    • リポジトリ名は環境変数ではなく、コマンドライン引数として渡したい
    • 処理があちこちに散らばっていて読みづらい。main 関数を作って
    • リポジトリを表す変数をひとつにまとめて (repo_onwer, repo_name → repo_name)
    • GitHub のアクセストークンは環境変数経由で取得して
    • 環境変数 GITHUB_TOKEN が設定されていない場合はエラーメッセージを出してエラーにして
    • メッセージが日本語と英語入り混じりになっている。英語に統一して
    • 呼び出している GitHub API は存在しない。ドキュメントを確認して
    • 変数のリネームの意図がわからないので教えて
    • 意図はわかったが、そのリネームは必要ないのでもとに戻して
    • 外部ファイルへのパスは環境変数ではなく定数にして
    • main 関数で使っている関数類は main 関数の近くに移動して
    • API を呼び出す際、呼び出しに関わる変数は呼び出しの直前に書いて
    • ふたつの関数で共通になっているロジックを関数に括りだして
    • 関数の返り値を Hash からタプルに置き換えて
    • GitHub トークンが設定されていない場合のエラー時はこの URL を表示して
    • 変数とシークレットを設定するのに、トークンにどういう権限を追加したらいいのかおしえて
    • Actions 用のシークレットと Dependabot 用のシークレットに必要な暗号化は別物だということがわかったので手直しして
    • コマンドライン引数にリポジトリの URL を渡せるようにして
    • 変数が登録されていたときのエラーハンドリングが間違っている。手直しして
    • 変数を登録するときは HTTP PATCH を使うのは誤り。HTTP PUT を使うのが正しい
    • シークレットを更新する際、body が空になるため、正しく動作しない。手直しして。
    • body が空の場合のエラーハンドリングがまだ間違っています
    • エラーハンドリングのコードが読みづらい。こういうふうに手直しして
    • アクセストークンを生成する際にこの権限が必要だという説明を追加して
  • めっちゃ指示を出すことでスクリプトが完成した
  • 自分が出した指示を整理すると見えてくるものがある
    • どういうことをやりたいのかイメージを持っておくと早い
      • どういうコマンドにしたいのか
      • どういうふうにパラメータを渡すのか
    • やってほしいことを明示しておくとよい
      • 日本語? 英語?
      • 関数の位置に気をつけてほしい
    • 出力は疑って読む
      • 存在しない API を「あたかも存在するかのように」コードを書いてきた
      • API ドキュメントを渡すといくらかマシにはなった
      • HTTP メソッドが間違っている
      • 意味を理解してコードを書いているわけではなさそう
        • レスポンスの扱い、エラーの扱いが大雑把
      • 質のばらつきがひどい。一発で採用できるコードもあれば、何度も手直しが必要なものもある
  • 教訓 (?)
    • Copilot にプログラムを書かせることはできた
    • ただし、品質はあまり良くなかった
      • API を間違って覚えていて、最初は使い物にならなかった
      • 出てくるコードの品質もまばら
    • 指示の出し方のレベル上げをしたほうがよさそう
      • やりたいことをまとめる
    • 業務で使うとどうなるのかは気になる
      • 既存のコードがある程度揃っている
      • テストコードもある
      • やりたいことが (もう少し) 明らかである
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment