GitLabの基礎

AIカスタム研修Day2/ 読み物

Day2の座学「GitLabの基礎」の読み物です。GitやGitLabを初めて使う方が、後から読み返しても追えるように書いています。研修リポジトリと、研修のために仕込んだ設定は「本Projectの仕組み」にあります。

バージョン管理とGitLab

基本

バージョン管理でできること

バージョン管理は、ファイルの変更を「いつ、誰が、何のために」と一緒に残す仕組みです。

できること無いと困ること
前の状態に戻せる壊した後に、どこまで戻せば動くのか分からない
何人かで同じファイルを並行して直せる上書きし合って、誰かの直しが消える
変更の理由が残る半年後に「なぜこの1行があるのか」を誰も説明できない
レビューしてから本線に入れられる確かめていない変更が、そのまま本番の元になる

Gitは、この履歴を自分のPCの中に持つ道具です。GitLabは、その履歴をチームで共有する置き場に、Issue(やること)、MR(変更の提案とレビュー)、CI/CD(自動の検査と実行)を一緒にしたものです。

今日の研修では、手元のGitの操作をClaude Desktopに頼み、GitLabの画面は受講者が自分で操作します。分担と頼み方は、下の「Gitの操作とClaude Desktop」にまとめています。

言葉

GitHubとの言葉の対応

GitHubGitLab中身
repositoryprojectコードと履歴の置き場
OrganizationGroupprojectをまとめる単位。下にサブグループも作れる
Pull Request(PR)Merge Request(MR)変更を本線に入れる提案。差分、議論、レビュー、パイプラインの結果が1か所に集まる
Actions(.github/workflows/*.yml)CI/CD(ルートの.gitlab-ci.yml)pushやMRのたびに自動で動く検査と処理
runnerGitLab Runnerジョブを実際に動かす機械。自社のサーバーに置ける
SecretsCI/CD variablesAPIキーなどの秘密。ジョブのログでは伏せ字になる(masked)
ProjectsのボードIssue boardsラベルを列にしてIssueを並べる

Community Edition

Edition

Community Editionでできることと、できないこと

研修のGitLabはCommunity Edition(無料版)です。AIと一緒に開発する体制に要る機能の多くは入っていますが、承認の強制やAIの機能は有料版にあります。

機能CE研修での代わり
保護ブランチ(mainに直接pushさせない)あるそのまま使う
パイプラインが通らないとマージできないあるそのまま使う
MRのパイプライン、条件で動かすジョブ(rules)あるそのまま使う
スケジュールでパイプラインを動かすあるAIの実装サイクルに使う
CI/CD変数(masked)、プロジェクトのアクセストークンあるAI用のトークンをDeveloperに絞って使う
Issueのラベルとボード、Closes #番号で閉じるあるそのまま使う
承認が何人要るかの強制、CODEOWNERS無い(Premium以上)マージできる人をMaintainerに絞る
push rules(ブランチ名やコミットの決まりの強制)無い(Premium以上)パイプラインのジョブで確かめる(レベル3)
スコープ付きラベル(ai::のように同じキーのラベルを1つに限る)無い(Premium以上)普通のラベルとして並べて付け、状態の付け外しはスクリプトが行う
GitLab Duo(GitLabの中のAI)無い(Premium以上)Claude CodeをCIのジョブで動かす
Tips:無い機能は、パイプラインのジョブで代えられることが多いです。止める場所をGitLabの側に置く、という考え方は同じです。
コア機能

AIと開発するときに使うGitLabの機能

機能今日の使い方
Issueやることと受け入れ条件を書く。人とAIが同じ文を読む
ラベルとボードIssueに付ける印と、印を列にした一覧。研修ではai::approvedでAIに渡すことを承認し、AIの進み具合もラベルで表す
MR差分、パイプライン、AIレビューを見て、人がマージを決める場所
パイプラインpushとMRのたびに、構文、ルール、テスト、AIレビューを動かす
保護ブランチとマージの条件mainに直接入れさせない。パイプラインが緑でないとマージできない
CI/CD変数APIキーとAI用のトークンを、リポジトリに書かずに渡す
スケジュール決まった時刻にパイプラインを動かす。研修ではAIの実装サイクルに使う
Runnerジョブを自分たちで用意したサーバーで動かす(研修では研修用のサーバー)。コードが外に出るのは、AIに渡す分(AnthropicのAPI)だけ

研修のGitLab(19.3.1)では、Issueは左のメニューのPlan → Work itemsに並びます。新しく作るボタンもNew itemです。

Work items の一覧。ラベル level::1 で絞り込み、テストを1本足す Issue が18本並んでいる
Plan → Work itemsの一覧です。上の検索欄でラベルlevel::1に絞ると、午前に取る18本が出ます。
Issue boards。左から Open、Doing、Review の列が並び、Open に level::1 の Issue のカードがある
Plan → Issue boardsです。ラベルDoingとReviewが列になっています。カードを列から列へ動かすと、ラベルが付け替わります。
MR の画面。題の下に Merged の印、その下に Overview、Commits、Pipelines、Changes の4つのタブ
MRの画面です。上の4つのタブで、説明(Overview)、コミット(Commits)、パイプラインの結果(Pipelines)、差分(Changes)を見ます。

Gitの操作とClaude Desktop

操作

Gitの操作と、今日のやり方

今日のGitの操作は、最初のcloneと、プチ演習7〜9で止め金を外す操作を除いて、受講者がClaude Desktopに頼みます。Claudeが手元のPCでコマンドを打ち、受講者は確認のダイアログに出たコマンドを読んで、許可するかを決めます。

操作何をするいつする今日のやり方
git cloneGitLabのリポジトリを、手元にまるごと写す最初に1回受講者がPowerShellで打つ(ガイドのStep 2)
git fetchGitLabの最新を取ってくるだけ。作業中のファイルは変わらないGitLabで作ったブランチに切り替える前。人の変更を見たいときClaude Desktopに頼む
git switch ブランチ名作業するブランチを切り替えるIssueの作業を始める前Claude Desktopに頼む
git addとgit commit次のコミットに入れる変更を選び、手元の履歴に区切りを1つ残す。まだ自分のPCの中だけテストが通る単位で1歩進んだとき実装を頼む文に「コミットまで」と書く
git push手元のコミットをGitLabのブランチに送る。パイプラインが動くMRで見せたい所まで来たとき。席を離れる前Claude Desktopに頼み、ダイアログで一度だけ許可する
git pullfetchしたうえで、今のブランチに取り込むmainを最新にするときClaude Desktopに頼む
マージ(MRの画面)ブランチの変更をmainに入れるパイプラインが緑で、人が読んで決めたとき講師がMRの画面で押す
コミットとpushは別の操作です。 コミットしただけでは、GitLabには何も届かず、パイプラインも動きません。Claude Desktopには「コミットまで」と「pushしてください」を、2つの文に分けて頼みます。
ブランチの決め事
  • 1つのIssueに1つのブランチ、1つのMR
  • ブランチはIssueの画面のCreate merge requestで作る。名前はIssue番号から始まり、題の日本語は落ちて英数字だけが残る(例29-fmt_money-8)。MRとIssueは自動でつながる
  • 作業中のMRはDraftにしておく。DraftのMRはマージできない
  • AIが作るブランチはai/issue-番号-… の形で、人のブランチと名前で見分けられる
  • mainには直接pushできない(保護ブランチ)。mainに入るのは、マージだけ
Issue の画面。本文に背景、やること、受け入れ条件。本文の下に Create merge request のボタン、右に Assignee と Labels
Issueの画面です。本文の下のCreate merge requestで、ブランチとMRを一度に作ります。右のAssigneeのassign yourselfで、自分の担当にします。
分担

GitLabの画面とClaude Desktopの分担

受講者が触るのは、GitLabの画面とClaude Desktopの2つです。Issue、ラベル、MRは、受講者がGitLabの画面で操作します。手元のファイルとGitの操作は、Claude Desktopに頼みます。

作業誰が、どこで
Issueを読み、自分の担当にする受講者がGitLabの画面で
Create merge requestで、ブランチとMRを作る受講者がGitLabの画面で
ブランチを切り替え、実装し、テストを流し、コミットするClaude Desktopに頼む。受講者はダイアログで許可するかを決める
pushするClaude Desktopに頼む。受講者はダイアログでブランチ名を確かめる
パイプラインの結果を見る受講者がMRの画面のPipelinesタブで。赤なら、ログをClaude Desktopに貼って直させる
ラベルai::approvedを付けて、AIのサイクルに任せる受講者がGitLabの画面で。承認は人の判断なので、Claudeには頼まない
Draftを外し、講師にマージを頼む受講者がGitLabの画面で
マージ講師がGitLabの画面で。受講者はDeveloperなので、マージのボタンが出ない
手元の検査を飛ばす、フックの本体の名前を変える、計画書の承認を記録する受講者がClaude Desktopの統合ターミナルで打つ(プチ演習7〜9)。止め金を外す操作と人の承認は、Claudeに頼まない

午後のAIのサイクルで動くClaudeは、手元のClaude Desktopとは別のものです。違いは、本Projectの仕組みの「手元のClaudeとサイクルのClaude」に並べています。

Claude Desktop の返事。git fetch のあとブランチを切り替え、今のブランチは 29-fmt_money-8 です
Claude Desktopにブランチの切り替えを頼んだときの返事です。Claudeがgit fetchとgit switchを打ち、今のブランチ名を返しています。
頼み方

Claude Desktopへの頼み方

Claude Desktopには、入力欄に日本語の文を送って頼みます。ハンズオンガイドの送る文は、そのまま貼れるように書いてあります。

したいこと送る文
GitLabで作ったブランチに切り替えるgit fetch してから、ブランチ 番号-… に切り替えてください。切り替えたら、今のブランチ名を教えてください。
Issueを実装して、コミットまで進めるGitLab の Issue #番号 を実装してください。本文は次のとおりです。 (ここに Issue の本文を貼る) 受け入れ条件を満たしたら、コミットまでしてください。push はまだしないでください。
手元の履歴を確かめるgit log --oneline -3 と git status を見せてください。
GitLabに送るpush してください。
パイプラインの赤を直すジョブのログの最後の数行を貼り、「このエラーを直して、コミットしてください」と送る。直ったら「pushしてください」と送る
頼むときの決め事
  • 1つの文で頼むのは1つの目的にする。コミットとpushは、必ず別の文で頼む
  • ブランチ名とIssue番号を文に書く。終わったら今のブランチ名やgit logを見せてもらい、自分の目で確かめる
  • Issueの本文は貼って渡す。研修のGitLabはログインしないと開けないので、手元のClaudeはIssueの画面を読めない
  • 確認のダイアログは、コマンドやファイルの中身を読んでから「一度だけ許可」を押す。「常に許可」は押さない
  • 権限のモードは「手動」、モデルはOpus 5.5にする。送る前に、入力欄の下の行で確かめる
  • 「mainのままで構いません。」と「講師の判断で今回だけ許可します。」は、プチ演習の送る文だけに使う。CLAUDE.mdの約束を、その1回だけ外す文だから
確認のダイアログ。Push the branch to origin の run を許可しますか、の下に git push を含むコマンド。拒否と一度だけ許可のボタン
pushを頼むと出る確認のダイアログです。コマンドにgit pushが入っていて、今のブランチが自分のものかを確かめてから「一度だけ許可」を押します。撮影したMacの画面で、Windowsではコマンドの形が少し違います。
Claude Desktopで使えるコマンドと、使えないコマンド

/hooks、/permissions、/configは、Claude Desktopの入力欄では使えません。設定を見るときは、.claude/settings.jsonをVSCodeで開いて読みます。戻すときの/rewindは使えますが、戻るのはEditとWriteで変えたファイルだけです。シェルのコマンドで変えたファイルは戻らず、Escを2回押す戻し方もClaude Desktopでは効きません。

頼んだ操作がそのまま動くか、ダイアログが出るか、止まるかは、研修リポジトリの設定とフックで決めてあります。一覧は本Projectの仕組みの「Claude Desktopに頼んだ操作の行き先」にあります。

動く図で見る

研修リポジトリの中身、手元のClaude DesktopとAIのサイクルで動くClaudeの違い、頼んだ操作がどこで止まるかは、本Projectの仕組みにまとめています。

パイプライン

パイプライン

パイプラインの読み方

パイプラインは、段(stage)の順に、ジョブ(job)を動かします。同じ段のジョブは並んで動き、前の段が赤なら次の段は動きません。

研修のパイプラインに並ぶ段とジョブは、本Projectの仕組みの「パイプラインの3種類」にあります。

パイプラインの画面。lint、test、review、gate の4つの段が左から右へ並び、ai_gate だけ黄色の印
MRのパイプラインです。段が左から右へ並び、同じ段のジョブは並んで動きます。ai_gateの黄色の印は、赤なのにマージを止めない印です。研修の準備で流したときの所要は1本1〜2分で、当日は混むと10分ほどかかります。
パイプラインが動くきっかけ
きっかけ変数CI_PIPELINE_SOURCEの値
ブランチへのpushpush
MRの作成と、MRがあるブランチへのpushmerge_request_event
スケジュールschedule
画面のNew pipelineweb

どのジョブをどのきっかけで動かすかは、ジョブのrulesに書きます。パイプライン全体を走らせるかどうかは、.gitlab-ci.ymlのworkflow:rulesで決めます。何も決めていないと、MRがあるブランチへのpushでブランチ用とMR用の2本が走る仕組みです。「パイプラインが通らないとマージできない」はMR用の1本しか見ないので、ブランチ用で赤のテストがあってもマージできてしまいます。研修リポジトリの決め方は、本Projectの仕組みの「パイプラインの3種類」にあります。

同じブランチに続けてpushしたとき、前のパイプラインを途中で止める設定が、ジョブのinterruptible: trueです。止まったパイプラインは、取り消し(canceled)と表示されます。最後にpushしたものだけが最後まで走るので、Runnerの順番待ちが積み上がらない仕組みです。

ジョブのログ

ジョブの名前を押すと、ログが開きます。赤のときは、下の方に何行目の何が悪いかが出ています。

test-phpunit のジョブのログ。黒い背景に、PHPUnit 7.5.20 の行、5 / 5 (100%)、OK (5 tests, 12 assertions) の行
test-phpunitのログの終わりです。OK (5 tests, 12 assertions)の行が出ていれば、テストが最後まで走っています。行の頭の時刻はUTCです。
動く図で見る

研修のGitLabで動く3種類のパイプラインと、それを支える設定を、本Projectの仕組みにまとめてあります。

用語

用語

用語

用語意味
Issueやることを書いたチケット。受け入れ条件を書く
MR(Merge Request)ブランチの変更をmainに入れる提案
Draft作業中のMR。マージできない
パイプラインpushやMRのたびに自動で動く、ジョブのまとまり
ジョブパイプラインの中の1つの処理
Runnerジョブを動かす機械
保護ブランチ直接pushできないブランチ。研修ではmain
MaintainerとDeveloperプロジェクトでの役割。受講者はDeveloperで、マージはMaintainer(講師)
フック(Claude Code)Claudeがツールを使う前や後に動く検査。使う前のフックは終了コード2で止め、使った後のフックは結果をClaudeに返して直させる
フック(git)コミットやpushの前に手元で動く検査。--no-verifyで飛ばせる
Claude Desktop受講者のPCで動くClaudeのアプリ。今日はCodeの画面で、手元のリポジトリを読み書きさせ、Gitの操作を頼む
権限のモードClaudeがファイルを書き換える前やコマンドを打つ前に、人に聞くかどうかの設定。今日は「手動」で、毎回聞く
確認のダイアログClaudeが許可の要る操作をする前に出る画面。コマンドや書き換えの中身を読み、「一度だけ許可」か「拒否」を選ぶ
claude -p画面を使わずにClaude Codeを動かす呼び方。AIのサイクルは、パイプラインの中でこれを使う
ページの先頭へ