mito’s blog

IT技術メインの雑記。思い立ったが吉日。

[GitLab] GitLabのAPIを使って設定投入をコード化する

はじめに

GitLabの以下設定をAPIで実施していきます。

API Docs | GitLab

  • APIによる設定
    • ユーザの作成
    • グループのインポート
    • グループにユーザを追加
    • グループにプロジェクト(リポジトリ)をインポート
    • リポジトリにWebhookを登録


環境


設定の流れ

  1. インポートするグループ、プロジェクトを用意します。
    ・他のGitLabより、任意のグループとプロジェクトをエクスポートしておきます。
    ・エクスポートされないデータ(例えばトークン類)があるので確認が必要です。
    プロジェクトのインポート/エクスポート | GitLab
    グループのインポート/エクスポート | GitLab
  2. 構築したGitLabを取り出します。
    ・t3.medium(メモリ4GB)では、アクセストークン作成の応答が返ってくるまで時間がかかります。
    GitLab installation minimum requirements | GitLab
  3. rootアカウントのアクセストークンを作成します。
    ・以降の手順で、作成したアクセストークンを使います。
  4. ユーザを作成します。
  5. グループをインポートします。
  6. グループにユーザを追加します。
  7. グループにプロジェクトをインポートします。
  8. プロジェクトにWebhookを登録します。


APIによる設定

rootのアクセストークン作成

アクセストークンの作成はgitlab-rails consoleを利用します。
また、トークンには任意の文字列(20文字以上)が指定できます。

今回は1行で実施します。

# コマンド
$ sudo gitlab-rails runner "token = User.find_by_username('【トークンが紐づくアカウント】').personal_access_tokens.create(scopes: [【トークンの権限】], name: '【トークンの名前】'); token.set_token('【トークン】'); token.save"
# API権限を持つトークンの作成例
$ sudo gitlab-rails runner "token = User.find_by_username('root').personal_access_tokens.create(scopes: [:api], name: 'AutomationToken'); token.set_token('token-string-1234567'); token.save"
  • 参考
    • Personal access tokens | GitLab
    • ドキュメントには「token.save!」と「!」がついていますが、環境によってはエラーになります。
    • エラーメッセージ
      • bash: !": event not found
      • 「!」はRailsメソッドで、付けると例外を発生させます。付けない場合はnilが返ってきます。


ユーザの作成

なるべく少ない設定でユーザを作成します。

  • skip_confirmation
    • デフォルト: false
    • trueにすると、メールアドレスの確認を検証済みにします。
# コマンド
$ curl --request POST --header "PRIVATE-TOKEN:【トークン】" --form "email=【メールアドレス】" --form "name=【アカウント名】" --form "username=【ユーザ名(ログインID)】" --form "password=【パスワード】" "http://xx.xx.xx.xx/api/v4/users"
# ユーザの作成例
$ curl --request POST --header "PRIVATE-TOKEN:token-string-1234567" --form "email=automation@example.com" --form "name=automation" --form "username=automation" --form "password=password1234" --form "skip_confirmation=true" "http://localhost/api/v4/users"


グループのインポート

グループをインポートします。
グループ名は2バイト文字も設定できます。

# コマンド
$ curl --request POST --header "PRIVATE-TOKEN:【トークン】" --form "name=【グループ名】" --form "path=【グループのURL】" --form "file=@./【ファイルパス/ファイル名】" "http://xx.xx.xx.xx/api/v4/groups/import"
# グループのインポート例
$ curl --request POST --header "PRIVATE-TOKEN:token-string-1234567" --form "name=test-group" --form "path=test-group" --form "file=@./test-group_export.tar.gz" "http://localhost/api/v4/groups/import"


グループへのユーザ追加

追加したいユーザのIDを調べ、そのIDを使ってグループにユーザを追加します。
また、グループに対するユーザのアクセス権限は以下が指定できます。

Group and project members API | GitLab

  • アクセス権限
    • No access (0)
    • Minimal access (5) (Introduced in GitLab 13.5.)
    • Guest (10)
    • Reporter (20)
    • Developer (30)
    • Maintainer (40)
    • Owner (50) - Only valid to set for groups
# コマンド
$ 【ユーザID】=`curl --request GET --header "PRIVATE-TOKEN:【トークン】" "http://xx.xx.xx.xx/api/v4/users?username=【ユーザ名】" | jq -r '.[].id'`
$ curl --request POST --header "PRIVATE-TOKEN:【トークン】" --data "user_id=【ユーザID】" --data "access_level=【アクセス権限】" "http://xx.xx.xx.xx/api/v4/groups/【グループのURL】/members"
# グループへのユーザ追加例
$ ID=`curl --request GET --header "PRIVATE-TOKEN:token-string-1234567" "http://localhost/api/v4/users?username=automation" | jq -r '.[].id'`
$ curl --request POST --header "PRIVATE-TOKEN:token-string-1234567" --data "user_id=${ID}" --data "access_level=20" "http://localhost/api/v4/groups/test-group/members"


グループへのプロジェクトインポート

作成したグループに、プロジェクトをインポートします。

# コマンド
$ curl --request POST --header "PRIVATE-TOKEN:【トークン】" --form "namespace=【グループのURL】" --form "path=【プロジェクトのURL】" --form "file=@./【ファイル名】" "http://xx.xx.xx.xx/api/v4/projects/import"
# グループへのプロジェクトインポート例
$ curl --request POST --header "PRIVATE-TOKEN:token-string-1234567" --form "namespace=test-group" --form "path=demo" --form "file=@./test-group_demo_export.tar.gz" "http://localhost/api/v4/projects/import"


リポジトリへのWebhook登録

リポジトリに、Webhookを登録します。 POST先URLのグループとプロジェクトの間の「/」は、「%2F」に置き換えます。

API Docs | GitLab

  • enable_ssl_verification
    • デフォルト:true
    • falseを指定することで、SSL検証を無効にできます。
# コマンド
$ curl --request POST --header "PRIVATE-TOKEN:【トークン】" --form "id=【リポジトリ名】" --form "url=【通知先のURL】" --form "push_events=true" --form "token=【通知先のトークン】" --form "enable_ssl_verification=false" "http://xx.xx.xx.xx/api/v4/projects/【グループ名】%2F【プロジェクト名】/hooks"
# JrenkinsのWebhook登録例
$ curl --request POST --header "PRIVATE-TOKEN:token-string-1234567" --form "id=test-group" --form "url=https://jenkins.XXX/project/XXX" --form "push_events=true" --form "token=XXX" --form "enable_ssl_verification=false" "http://localhost/api/v4/projects/test-group%2Fdemo/hooks"