GitLab Shell開発ガイドライン
GitLab ShellはGitLabのSSHセッションを処理し、作成者の鍵リストを変更します。GitLab ShellはUnixシェルではなく、BashやZshの代わりでもありません。
GitLabはSSHを通してGit LFS認証をサポートします。
要件
GitLab ShellはGoで書かれており、ビルドにはGoコンパイラが必要です。ビルドとテストにはRubyが必要ですが、実行には必要ありません。
GitLab ShellはOmnibusインストール上のport 22
。通常のSSHサービスを使うには、別のポートに設定してください。
Goの最新バージョンをダウンロードしてインストールしてください。Goのリリースポリシーとサポートに従ってください:
- 現在の安定バージョン。
- 過去の2つのメジャーバージョン。
バージョン
GitLab Shellには2つのバージョンファイルがあります:
GitLabチームメンバーは#announcements
内部Slackチャンネルも監視できます。
GitLab Shellの仕組み
SSHでGitLabサーバーにアクセスすると、GitLab Shellが起動します:
- あらかじめ定義された Git コマンド (
git push
,git pull
,git fetch
) に制限されます。 - GitLab Rails API を呼び出して、作成者が許可されているかどうか、リポジトリがどの Gitaly サーバー上にあるかをチェックします。
- SSH クライアントと Gitaly サーバーの間でデータをやり取りします。
HTTP(S) を使って GitLab サーバーにアクセスすると、次のようになります。 gitlab-workhorse
.
git pull
になります。
git push
になります。
git push
コマンドは、gitlab-rails
がプッシュを受け入れた後でないと実行されません:
変更点authorized_keys
GitLab Shell はクライアントマシンのauthorized_keys
ファイルを変更します。
GitLab Shellに貢献しましょう。
GitLab Shellに貢献するには:
- GitLab APIアクセスと内部API経由のRedisにアクセスできるか確認してください:
make check
-
gitlab-shell
のバイナリをコンパイルし、bin/
に配置します:make compile
-
make install
を実行してgitlab-shell
バイナリをビルドし、ファイルシステムにインストールします。デフォルトの場所は/usr/local
です。これを変更するには、PREFIX
とDESTDIR
環境変数を設定します。 - GitLabを単一のマシンにソースからインストールするには、
make setup
を実行します。GitLab Shellバイナリをコンパイルし、ファイルシステム上の様々なパスが正しい権限で存在することを確認します。インストール方法のドキュメントに指示がない限り、このコマンドは実行しないでください。
詳しくはCONTRIBUTING.mdを参照してください。
テストの実行
貢献したら、テストを実行しましょう:
-
bundle install
とmake test
でテストを実行してください。 - Gofmt を実行します:
make verify
-
testとverifyの両方を実行します(デフォルトのMakefileターゲット):
bundle install make validate
- 必要であれば、Gitalyを設定します。
ローカルテストのためのGitalyの設定
いくつかのテストはGitalyサーバーを必要とします。docker-compose.yml
ファイルはポート8075でGitalyを実行します。Gitalyがどこにあるかをテストに伝えるには、GITALY_CONNECTION_INFO
:
export GITALY_CONNECTION_INFO='{"address": "tcp://localhost:8075", "storage": "default"}'
make test
GITALY_CONNECTION_INFO
が設定されていない場合、テストスイートは実行されますが、Gitaly を必要とするテストはスキップされます。テストは常にCI環境で実行されます。
速度制限
GitLab ShellはGitオペレーションに対してユーザーアカウントとプロジェクトによるレート制限を行います。GitLab ShellはGitオペレーションリクエストを受け付けると、RedisによってバックアップされたRailsのレートリミッターを呼び出します。もしuser + project
レートリミットを超えた場合、GitLab Shellはその.Git操作に対するそれ以降の接続リクエストをドロップ user + project
します。
レートリミッターはGitコマンド(配管)レベルで適用されます。各コマンドは毎分600のレートリミットがあります。例えば、git push
は毎分600、git pull
は毎分600です。
これらは同じ配管コマンドを使っているので、git-upload-pack
、git pull
、git clone
はレート制限の目的上、実質的に同じコマンドです。
Gitalyにもレートリミッターがありますが、GitLab Shell (Rails)でレートリミットを超えてもGitalyへの呼び出しは行われません。
GitLab Shellのログ
一般的に、ログを調べることでGitLab Shellやgitlab-sshd
セッションの内部ではなく構造を知ることができます。いくつかのガイドラインがあります:
- ログの記録には
gitlab.com/gitlab-org/labkit/log
を使います。 - 必ず相関IDを含めてください。
- ログメッセージは不変かつ一意でなければなりません。
log.WithField
,log.WithFields
, またはlog.WithError
を使用して、アクセサリ情報をフィールドに含めます。 - 成功事例とエラー事例の両方をログに記録します。
- 十分なログを取らないよりは、取りすぎる方が良いでしょう。メッセージが冗長すぎるようであれば、メッセージを削除する前にログレベルを下げることを検討してください。
GitLab SaaS
GitLab.comのgitlab-shell
のフロー図: