kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

Gitlab APIを使う

Gitlab APIのメモです。

ユーザを作成する

Admin権限を持ってないと多分できないです。"api"スコープを持ったアクセストークンを作ってやります。name, emailとパスワードに関するキー(passwordでパスワード指定するか、force_random_password&reset_passwordでランダムなパスワードを設定して初回ログイン時に変更させる)だけあれば登録できます。

$ curl -X POST -H 'Private-Token: アクセストークン' -H 'Content-Type: application/json' -d '
{
  "name":"john",
  "email":"john@ドメイン",
  "password":"xxxxx"
}' http://gitlabホスト名/api/v4/users

レスポンスです。

{
  "id": 7,
  "name": "john",
  "username": "john",
  "state": "active",
  "avatar_url": "https://www.gravatar.com/avatar/xxxxxxxxxxxxxxxxxxxxx?s=80&d=identicon",
  "web_url": "http://gitlabホスト名/john",
  "created_at": "2020-10-26T14:48:10.536Z",
  "bio": "",
  "bio_html": "",
  "location": null,
  "public_email": "",
  "skype": "",
  "linkedin": "",
  "twitter": "",
  "website_url": "",
  "organization": null,
  "job_title": "",
  "work_information": null,
  "last_sign_in_at": null,
  "confirmed_at": null,
  "last_activity_on": null,
  "email": "john@ドメイン",
  "theme_id": 1,
  "color_scheme_id": 1,
  "projects_limit": 100000,
  "current_sign_in_at": null,
  "identities": [],
  "can_create_group": true,
  "can_create_project": true,
  "two_factor_enabled": false,
  "external": false,
  "private_profile": false,
  "shared_runners_minutes_limit": null,
  "extra_shared_runners_minutes_limit": null,
  "is_admin": false,
  "note": null,
  "using_license_seat": false
}

ユーザの一覧を取得する

こちらはadministratorじゃなくてもできました(とはいいつつ厳密な権限は確認してません)。/api/v4/usersにGETするだけです。

$ curl -H 'Private-Token: アクセストークン' -sS http://gitlabホスト名/api/v4/users

レスポンスはこういう感じ。

[
  {
    "id": 29,
    "name": "tom",
    "username": "tom",
    "state": "active",
    "avatar_url": "https://www.gravatar.com/avatar/xxxxxxxxxxxxxxxxxxxx?s=80&d=identicon",
    "web_url": "http://gitlabホスト名/tom"
  },
  {
    "id": 28,
    "name": "steven",
    "username": "steven",
    "state": "active",
    "avatar_url": "https://www.gravatar.com/avatar/xxxxxxxxxxxxxxxxxxxx?s=80&d=identicon",
    "web_url": "http://gitlabホスト名/steven"
  },
  ...
]

ただし、最大で20件までしか返ってきません。20件以上の場合はページネーションする必要があります。レスポンスヘッダを見てみましょう。

$ curl -H 'Private-Token: アクセストークン' -sS -i http://gitlabホスト名/api/v4/users
HTTP/1.1 200 OK
...snip...
X-Next-Page: 2
X-Page: 1
X-Per-Page: 20
X-Prev-Page: 
...snip...
X-Total: 29
X-Total-Pages: 2
...snip...

29件のユーザがいて、1ページあたり20ユーザ、現在は1ページ目ということですね。2ページ目を指定するには以下のようにリクエストパラメータを付与します。

$ curl -H 'Private-Token: アクセストークン' -sS -i http://gitlabホスト名/api/v4/users?page=2

レスポンスヘッダが変わっていますね。

HTTP/1.1 200 OK
...snip...
X-Next-Page: 
X-Page: 2
X-Per-Page: 20
X-Prev-Page: 1
...snip...
X-Total: 29
X-Total-Pages: 2
...snip...

ユーザのSSH公開鍵を登録する

/api/v4/users/ユーザのID/keysにPOSTします。公開鍵文字列を埋め込んでるところのクォートがポイントですね。

$ curl -X POST -H 'Private-Token: アクセストークン' -H 'Content-Type: application/json' -d '{"title":"'test key, "key":"'"$(cat ~/.ssh/id_rsa.pub)"'"}' "http://gitlabホスト名/api/v4/users/7/keys"

ユーザのSSH公開鍵を参照する

GETするだけですね。

$ curl -X POST -H 'Private-Token: アクセストークン'  "http://gitlabホスト名/api/v4/users/7/keys"
[
  {
    "id": 27,
    "title": "test-key",
    "created_at": "2020-10-26T15:58:30.228Z",
    "expires_at": null,
    "key": "ssh-rsa ...(snip)... hogehoge (gitlabホスト名)"
  }
]

まとめ

Gitlab APIのメモでした。あとはグループ情報をうまく取って、これらと組み合わせると、STNSのユーザ設定ファイルが作成できますねぇ・・・

2020/11/06追記

ということで作りました。エラー処理とかちゃんとやってないですし、複数のグループに登録されていた場合どうなるのか?とかも考慮してませんが、とりあえず。

  • 事前にGitLabでトークンを取得しておきます。
  • groupはadminレベルじゃないと取れないのでご注意。
  • GitLabにユーザ・グループを作成して、各ユーザのSSH公開鍵を登録しておきます。
  • 以下のスクリプトを実行すると、グループごとにSTNS用の設定ファイルを出力します。