GitLabしたい(glab

// ログイン
$ glab auth login

// イシューの確認
$ glab issue list
$ glab issue view issue番号

// ブランチを作成
$ glab issue checkout issue番号

// MRドラフトを作成
$ glab mr create --draft --fill
$ glab mr view --web

glabでGitLabリポジトリを操作できます。 プロジェクトの.git/configから自動でリポジトリを判別して、操作対象にしてくれます。

インストールしたい

$ brew install glab

ログインしたい(glab auth

// ログイン
$ glab auth login

// ログアウト
$ glab auth logout

// 確認
$ glab auth status

glabをはじめて使う場合は、認証が必要です。 認証には、ウェブ認証とトークン認証があります。

ちょっと使いたい場合はウェブ認証、 しっかり使いたい場合はトークン認証で設定するとよいです。

注釈

トークン認証にはGitLab上でPAT(Personal Access Token)を作成する必要があります。 トークンはページ上に1度しか表示されません。 もし、コピーに失敗した場合は、そのトークンを削除して、新しいトークンを作成してください。

トークンは「目的ごと」に個別に作成することが推奨されています。 何に使われているトークンか後から思い出しやすくするため、 トークン名は用途-機器名-作成日のような規則で命名するとよいです。

ウェブ認証したい

$ glab auth login --hostname gitlab.com
- Signing into gitlab.com
? How would you like to sign in?  # [Web | Token]
  // Webを選択 -> ブラウザで承認
? What domains ...(省略)...? # [gitlab.com,gitlab.com:443,registry.gitlab.com]
  // そのまま空欄でEnter
? Choose default protocol: # [SSH | HTTPS | HTTP]
  // SSHを選択

✓ Configured Git protocol.
✓ Configured API protocol.
✓ Logged in as <username>
✓ Configuration saved to /Users/<username>/.config/glab-cli

ウェブ認証を設定したときのログです。 --hostname gitlab.comで、GitLabホストをgitlab.comに指定して、loginコマンドを実行しました。 プロンプトが表示されたので、そのまま対話的に選択して進めました。

認証方法でWebを選択しました。 ブラウザが起動したので、画面にしたがって承認しました。 ドメイン選択では、そのままEnterを押しました。 デフォルト値([giblab.com,gitlab.com:443,registory.gitlab.com])が設定されました。 GitプロトコルはSSHを選択しました。 設定した内容が~/.config/glab-cli/config.ymlに保存されました。

注釈

GitLabプロトコルはSSHもしくはHTTPSから選択します。 HTTPは選択してはいけません。

また、SSHを選択する場合、あらかじめGitLabにSSH鍵を登録しておく必要があります。 ちょっと使いたい場合はHTTPSでも構いません。

トークン認証したい

$ glab auth login --hostname gitlab.com
- Signing into gitlab.com
? How would you like to sign in? # [Token | Web]
  // Tokenを選択
? What domains does this host use for the container registry and image dependency proxy? # [gitlab.com,gitlab.com:443,registry.gitlab.com]
  // そのまま空欄でEnter
? Paste your authentication token: ************************** // GitLabで生成したPATをペースト
? Choose default Git protocol: # [SSH | HTTPS | HTTP]
  // SSHを選択

✓ Configured Git protocol.
✓ Configured API protocol.
✓ Logged in as <username>
✓ Configuration saved to /Users/<username>/.config/glab-cli/config.yml

(あとで実行した結果を載せる) (トークンはほぼ同時にGitLab上で作成して待機しておくとよさそう)

注釈

トークンにはapiwrite_repository権限を付与する必要があります。 設定プロンプトで表示されるTipのURLをコピペしてアクセスすると、2つの権限にチェックの入った状態のページが表示されます。

Tip: generate a personal access token at https://gitlab.com/-/user_settings/personal_access_tokens?scopes=api,write_repository.
The minimum required scopes are 'api' and 'write_repository'.

イシューしたい(glab issue

// イシューを確認
$ glab issue list         # オープンなイシュー覧
$ glab issue list --all   # すべてのイシュー一覧(open/closed)
$ glab issue list --search "SEARCH_WARD"     # キーワード検索
$ glab issue list --label "bug,enhancement"  # ラベル検索

// イシューを表示
$ glab issue view <issue_id>                # イシューの詳細
$ glab issue view <issue_id> --web          # ブラウザで開く
$ glab issue note <issue_id> --message "comment"    # コメントを追加
$ glab issue note <issue_id>                # エディタを開く

// イシューを作成
$ glab issue create    # イシューを作成(interactive)
$ glab issue create --title "title" --description "desc"

// イシューを更新
$ glab issue update <id> --title "new title"
$ glab issue update <id> --description = "new desc"
$ glab issue update <id> --assignee @username
$ glab issue update <id> --label "bug,high"

// イシューの状態管理
$ glab issue close <id>
$ glab issue reopen <id>
$ glab issue delete <id>
$ glab issue subscribe <id>
$ glab issue unsubscribe <id>

glab issueでイシューを操作できます。 さらにサブコマンドを持ち、 listでイシューの一覧を取得し、 view 番号でイシューの詳細を確認できます。 createで新しいイシューを作成できます。

Tip

viewcreate--webオプションでブラウザが開きます。 ターミナルより、ブラウザのほうが確認しやすいと思います。

マージリクエストしたい(glab mr

// MRを確認
$ glab mr list
$ glab mr list --all

// MRの詳細
$ glab mr view <mr_id>
$ glab mr view <mr_id> --web
$ glab mr note <mr_id> --message "comment"

// MRを作成
$ glab mr create
$ glab mr create --title "feat: add feature" --description "Close #123"
$ glab mr create --draft
$ glab mr create --target-branch develop

// MRの状態管理
$ glab mr approve <mr_id>
$ glab mr merge <mr_id>
$ glab close <mr_id>
$ glab reopen <mr_id>
$ glab revoke <mr_id>
$ glab delete <mr_id>
$ glab subscribe <mr_id>
$ glab unsubscribe <mr_id>

glab mrコマンドでマージリクエスト(MR)を操作できます。

glab mrでマージリクエスト(MR)を操作ができます。 さらにサブコマンドを持ち、 listでMRの一覧を取得し、 view 番号でMRの詳細を確認できます。 createで新しいMRを作成できます。

// 作業ブランチに移動
$ git switch ブランチ名
$ glab mr create --draft --fill

git switchで作業ブランチに移動し、glab mr createで新しいMRを作成できます。 --draftオプションでMRドラフトを作成できます。 --fillオプションでコミットメッセージからタイトルと本文を自動入力してくれます。

$ git add ファイル名
$ git commit
$ git fetch origin
$ git merge origin/main  # or git rebase origin/main
$ git push  # or git push -u origin ブランチ名

ローカルにあるリポジトリの操作は、いつも通りgitを使います。

パイプラインしたい(glab ci

$ glab ci status
$ glab ci view --web

glab ciでパイプラインを操作できます。

ワークフロー

# 新issueを起票(「なぜやるのか」→「なにをやるのか」を明確にする)
$ glab issue create \
  --title "Add feature" \
  --description "## 概要 ...\n\n## 具体的 ..." \
  --label "Type::Feature" \
  --label "Priority::High"

# 既存のissueを確認
$ glab issue list --assignee <username>
$ glab issue view <id>

# worktreeを作成
$ git fetch origin
$ git worktree add -B <branch-name> worktrees/<branch-name> origin/main
$ cd worktrees/<branch-name>
(worktrees/branch-name)$ git push -u origin <branch-name>

# コーディング
# Make changes
(worktrees/branch-name)$ git add --all
(worktrees/branch-name)$ git commit -m "feat: summary (refs #<id>)"
(worktrees/branch-name)$ git push

# パイプラインの確認
(worktrees/branch-name)$ glab ci status
(worktrees/branch-name)$ glab pipeline list

# マージリクエスト(下書き)を作成
# パイプラインが成功したら、MRの下書きを作成
(worktrees/branch-name)$ glab mr create \
  --source-branch <branch-name> \
  --target-branch main \
  --title "feat: title"
  --fill \
  --draft \
  --assignee @me
(worktrees/branch-name)$ glab mr view --web

# レビュー対応
# Fix feedbacks
(worktrees/branch-name)$ git add -A
(worktrees/branch-name)$ git commit -m "fix: address review comments (refs #id)"
(worktrees/branch-name)$ git push

# マージリクエストを更新
$ glab mr update <id> \
  --description "## 概要...\n\n## 変更点 ...\n\nCloses #<id>"
  --ready
$ glab mr view <id>

# マージ
$ glab mr merge --delete-source-branch

# 片付け
$ git worktree remove worktrees/<branch-name>
$ git fetch --prune
$ git worktrees prune
$ git branch -d <branch-name>