GitLabしたい

リモートリポジトリのホスティグサービスのひとつにGitLabがあります。 GitLab.comでホスティングされていて、無料で使うことができます。 GitHubと比べて、チーム開発に必要なツールが揃っていて、ドキュメントも充実しています。

GitLab Pagesしたい

(あとで整理するので、とりあえずメモ)

  • .gitlab-ci.yml

  • https://docs.gitlab.com/ee/ci/jobs/job_control.html#common-if-clauses-for-rules

  • https://docs.gitlab.com/ee/ci/yaml/index.html

Personal Access Tokenしたい(PAT

  1. [設定] -> [Access Token]

  2. [新しいトークンを追加]

    • トークン名: わかりやすい名前を入力

    • 有効期限: 適切に設定 (空欄にするとたぶん無期限)

    • スコープを選択: api を選択

  3. [パーソナルアクセストークンを作成]

  4. [あなたの新しいパーソナルアクセストークン]

  • 必要なファイルにコピペ

Personal Access Token(PAT)は、 APIを使った操作やアプリを利用する場合に、 サービスごとに発行する認証用のトークンです。

トークンごとにスコープ(=権限)を設定できます。 HTTPリクエストを使ったAPI操作をする場合は、 apiを選択する必要がありました。

注釈

最初は write_repositoryのみ、 次に read_apiwrite_repositoryを試したのですが、API操作できずでした。

PATを管理したい

1# .env
2# GitLab PAT
3# expires: 2024-10-27
4# scope: api
5GITLAB_TOKEN=トークン
1import os
2token = os.environ["GITLAB_TOKEN"]

PATは認証用トークンなので、ソースコードにベタ書きしてはいけません。 プロジェクトごとの.envなどに保存し、 環境変数として呼べるようにします。

PATを再発行したい

トークンの値をあとから確認することはできません。 コピペをミスってしまった場合などでも、再発行する必要があります。

ヒント

サービスのパスワード変更と異なり、 気軽に削除・再発行できるところがトークンの利便性のひとつだと思います。 万が一、トークンが漏洩してしまった場合も、即削除して無効にしてしまえばOKです。

REST APIしたい

REST APIを使って、GitLabを操作できます。

エンドポイント

REST APIのURLの基本形は https://gitlab.com/api/v4/{エンドポイント} です。 現在はv4のAPIのみ利用可能です。

以下に、リモートリポジトリに対してよく使う操作とエンドポイントを整理しました。

リソース

エンドポイント

ブランチ

/projects/:id/repository/branches

コミット

/projects/:id/repository/commits

イシュー

/projects/:id/issues

マージリクエスト

/projects/:id/merge_requests

認証

 1import os
 2import requests
 3token = os.environ["GITLAB_TOKEN"]
 4
 5# アクセストークン
 6headers = {"PRIVATE-TOKEN": token}
 7
 8# OAuth準拠のヘッダ
 9headers = {"Authorization": "Bearer " + token}
10
11# リクエスト時にヘッダーを設定(必須)
12response = requests.get(..., headers=headers, ...)

PATを使ってAPI認証するときのヘッダー情報です。 PRIVATE-TOKENヘッダー、もしくは OAuth準拠のAuthorizationヘッダーを使用します。

プロジェクト情報を取得したい(GET

1url = f"https://gitlab.com/api/v4/projects/{project_id}"
2requests.get(url, headers=...)

ファイル操作したい

1url = f"https://gitlab.com/api/v4/projects/{project_id}/repository/files/{file_path}"
1# ファイルを取得
2headers = {"PRIVATE-TOKEN": token}
3requests.get(url, headers=...)

GETメソッドで、リポジトリにあるファイルを取得できます。

 1# ファイルを追加
 2headers = {"PRIVATE-TOKEN": token}
 3data = {
 4    "branch": "main",
 5    "content": "ファイルの内容",
 6    "commit_message": "コミットメッセージ",
 7    "encoding": "base64"
 8}
 9# ファイルを追加
10requests.post(url, headers=headers, data=data)
11
12# ファイルを更新
13requests.put(url, headers=headers, data=data)

POSTPUTメソッドで、リポジトリにファイル(file_path)を追加できます。 dataの設定が必要です。

1# ファイルを削除したい
2headers = {"PRIVATE-TOKEN": token}
3data = {
4    branch: "main",
5    commit_message: "コミットメッセージ(削除した理由)",
6}
7requests.delete(url, headers=headers, data=data)

ブランチ操作したい

1url = f"https://gitlab.com/api/v4/projects/{project_id}/repository/branches"
2
3headers = {"PRIVATE-TOKEN": token}
4data = {
5    "branch": 新しいブランチ名,
6    "ref": ベースとなるブランチ名
7}
8request.put(url, headers=headers, data=data)
  • ブランチを作成したい

コミットしたい

 1url = f"https://gitlab.com/api/v4/projects/{project_id}/repository/commits
 2
 3data = {
 4    "branch": "コミットするブランチ名",
 5    "commit_message": "コミットメッセージ",
 6    "actions": [
 7        {
 8            "action": "create",
 9            "file_path": "ファイルのフルパス”,
10            "content": "ファイルの内容",
11        },
12        {
13            "action": "update",
14            "file_path": "...",
15            "content": "ファイルの内容",
16        },
17        {
18            "action": "delete",
19            "file_path": ...,
20        }
21    }
22
23requests.post(url, headers=headers, data=data)

マージリクエストしたい

 1url = f"https://gitlab.com/api/v4/projects/{project_id}/merge_requests`
 2
 3headers = {"PRIVATE-TOKEN": token}
 4data = {
 5    # マージ元のブランチ名
 6    source_branch: "feature-branch",
 7    # マージ先のブランチ名
 8    target_branch: "main",
 9    title: "MRのタイトル",
10    description: "MRの説明。MRの説明。MRの説明。MRの説明。",
11    // MRに成功したらソースブランチを削除
12    remove_source_branch: true;
13}

リファレンス