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
などとして調べれば十分かもしれません。
今後の見通し
公式ドキュメントでの記載はないのですが、実際に使っている人はいるようで、あるMRでGL_ID
が参照出来なくなった際には、参照できるように再修正が行われました。
実際にユーザがいて再修正も通っていますので急に使えなくなる可能性は低いと思われます。
ちなみに環境変数REMOTE_USER
もMRには上がっているので、将来的にはこちらが本命かもしれません。
サンプル
最後に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