fbpx

一定期間ログインしていないGitLabアカウントを検出/通知する #gitlab #gitlabjp #developers #Csharp #富山事業所

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

GitLabを運用していると、定期的に情報をチェック/確認したいケースが出てくることもあると思います。

例えば、ある利用者が居なくなった場合、その利用者を無効化もしくは削除する必要があるが利用可能なままになっていた…なんてケースもあるかと思います。
定期的にGUIで確認をするという方法もありますが、管理コストが発生してしまうのと、開発に専念できない状態に陥ることになります。
何より手作業での確認は抜け漏れが発生することに繋がります。

今回はその課題を解決するための1つの方法として
「GitLabに一定期間ログインしていないアカウントを機械的に把握する方法」
について投稿したいと思います。

GitLab APIを用いればこういうことが出来るんだという1ケースとして捉えていただければと思います。

今回説明する内容の大きな流れは以下となります。

  • GitLabユーザ情報の取得
  • 一定期間GitLabへログインしていないユーザ情報の絞り込み
  • 上記の結果をslackで通知

弊社ではslackを利用していることもあり、slackに結果の通知を行うことにします。
slackについてはこちらをご参照ください。

GitLabユーザ情報の取得

本記事では、GitLab APIを利用してユーザ情報を取得します。

Personal Access Tokenの作成

GitLab APIを実行するためには認証処理が必要です。
認証方法はいろいろあるのですが、今回はPersonal Access Tokenを利用して行います。
APIリクエストにPersonal Access Tokenを付与することで、APIの認証を行うことが出来ます。
Personal Access Tokenの作成方法はこちらをご参照ください。

Personal Access Token作成時に、scopeを指定することが出来ます。
scoreは「APIの実行をどの範囲まで許容するか」の設定となりますが、今回はユーザ情報を取得するのみですので、scopeについてはread_userのみで構いません。

今回はユーザ情報に含まれる最終ログイン日時情報を参照し、一定期間ログインしていないユーザを判断します。
そのための情報は、Administrator権限でのみ取得できますので、Administrator権限のアカウントでPersonal Access Tokenを作成する必要があります。

GitLab API(users)を実行し、ユーザ情報を取得

ユーザ情報を取得するAPIをcallして、最終ログイン日時を取得します。
ユーザ情報を取得するAPIのドキュメントはこちらをご参照ください。

URLリクエスト例は以下のようになります。

https://<GitLab host url>/api/v4/users?private_token=XXXXXXXXXX

一定期間ログインしていないユーザ情報の絞り込み

ユーザ情報を取得するAPIの応答に最終ログイン日時情報が格納されています。
最終ログイン日時情報は"current_sign_in_at"が該当します。
こちらの値と現在時刻を比較し、一定時間以上経過していた場合、一定期間ログインしていないユーザと判断することが出来ます。

絞り込んだユーザ情報をslackで通知

slackのIncoming Webhookを利用します。
詳細な説明は本記事では割愛しますが、大きく以下の流れになります。

  • Webhook URLを発行する
  • Webhook URLに対して、ユーザ情報をpostする。

サンプルアプリケーション

上記説明した処理を行うサンプルAPIを作成してみました。
ソースコード一式は以下から参照可能です。

https://gitlab.com/creationline/apindy

本記事では、ソースコードの技術的な説明は今回割愛します。コード自体はC#で書いています。
動作確認はGitLab CE 12.5.2 / GitLab API v4 で行っています。

実行結果

サンプルAPIを実行することで、GitLabユーザ情報取得~slack通知までの処理を行います。

APIリクエストの発行

用意したサンプルAPIはPOSTリクエストにのみ対応しています。
今回はpostmanを用いてPOSTリクエストを実行しています。
swaggerUIも用意してありますので分かる方はそちらを用いて実行することも可能です。

こちらがAPIを実行したあとの画面キャプチャになります。
※ セキュリティの観点からいくつかのパラメータは塗りつぶしています。

左側のウィンドウはリクエストの際に指定するパラメータです(パラメータに関しては後ほど説明します)

右側のウィンドウはサンプルAPIを実行した際のレスポンスです。
今回はユーザ名、Email、最終ログイン日時情報をJSON形式で返す処理になっています。

APIを実行したあとのslackのキャプチャが以下になります。

正しくslackに通知されていることが分かります。

リクエストパラメータの説明("*"は必須パラメータ)

private_token(*)

GitLab上から払い出したAdministator権限のアカウントのPersonal Access Tokenを指定します。

host(*)

APIを実行するGitLabのホスト名を指定します。"https://"は不要です。

interval_hours

何時間以上ログインしていないアカウントを抽出したいかの指定です。
上記例だと"1"を指定しているため、1時間になります。
未指定の場合は、全ユーザ情報の取得のみ行いslack通知を行いません。

slack_hook_url

Incoming Webhookで払い出したWebhookURLを指定します。
未指定の場合は、slack通知を行いません。

per_page

今回の実行では利用していませんが、1pageあたりの最大表示件数になります。
GitLab APIをcallする際にそのまま渡します。
per_page以外にもGitLab APIで利用可能なパラメータはいろいろありますが、本サンプルでは非対応となっています。

補足

あくまでサンプルレベルとなっております。
エラー系の作りこみは最低限程度となっており、また、slack通知先チャンネルはハードコーディングされています。

最後に

一定時間ログインしていないGitLabのユーザ情報を抽出し、slackに通知する流れを説明させていただきました。

今回は手動でサンプルAPIを実行していますが、定期的に自動でこの処理を実行する仕組みを取り入れることによって、自動でslack上に情報が流れてくることになります。
また、ユーザ情報の更新/削除もGitLab APIを用いれば行えるので、削除までのサイクルを自動化することも可能です。

GitLab APIでは今回ご紹介したユーザ情報以外にも様々な情報を取得することができます。
それらの情報を使用することによって、上手にGitLabを使っていただけると良いかなと思います。

新規CTA