LoginSignup
3
1

More than 5 years have passed since last update.

Gitlabのサーバサイドフックでユーザ情報を得る

Last updated at Posted at 2017-08-27

2017/11/16追記
Gitlabのアップデートによりユーザ名を直接得ることができるようになりました。
詳細はこちら(Gitlabのサーバサイドフックでユーザ名を得る

はじめに

Gitlabのrole/permissionはかなり大雑把で、branchへのpushに関するアクセス制御は2種類のrole(Develop/Master)による区別しかできません。そのため「特定branchについてDevelopのうち一部ユーザのみpushを許可する」といった運用はGitlab上では困難です。
(もちろんその一部ユーザをMasterにすれば出来ないことはないのですが、不必要な権限までついてきてしまいますし、すでにMasterのユーザに対して制限をかけることはできません)

そのような場合はgitのサーバサイドフックを使うことができます。
(Gitlabにおけるサーバサイドフックの設定はこちら
例えばupdateフックでpushしたユーザに応じてpushを拒否することが可能ですが、そのためにはフックスクリプトでpushしたユーザの情報を得る必要があります。

Gitlabのサーバサイドフックにおけるユーザ情報

注意事項

この情報は公式ドキュメントには未記載のため、バージョンアップ等で使えなくなる可能性があります。動作確認した環境は以下の通りです。

version
Gitlab CE 9.4.5
Gitlab CE 9.5.1

環境変数GL_ID

ユーザ情報はフックスクリプトの実行環境に環境変数GL_IDとして渡されます。
GL_IDの値はkey-Xです。Xはssh鍵認証での鍵番号とのことで、手元の環境ではUser ID(User SettingsページのNameの隣に出ています)と同じになりましたが、詳細不明です。
API経由でユーザアカウントまで得られるようなのですが、フックスクリプトに
echo $GL_IDなどとして調べれば十分かもしれません。

今後の見通し

公式ドキュメントでの記載はないのですが、実際に使っている人はいるようで、あるMRGL_IDが参照出来なくなった際には、参照できるように再修正が行われました。
実際にユーザがいて再修正も通っていますので急に使えなくなる可能性は低いと思われます。

ちなみに環境変数REMOTE_USERMRには上がっているので、将来的にはこちらが本命かもしれません。

サンプル

最後にGL_IDを使ったupdateスクリプトのサンプルを置いておきます。
以下ではmasterブランチに対してkey-10ユーザのみpushを許可します。

#!/bin/bash

branch="$1"

if [ "$branch" == "refs/heads/master" ]; then
    if [ "$GL_ID" == "key-10" ]; then
        exit 0
    else
        echo "-------------------------------------"
        echo "[$branch] is protected"
        echo "-------------------------------------"
        exit 1
    fi
fi

exit 0
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1