Skip to content

Instantly share code, notes, and snippets.

@y-yagi y-yagi/1_about_gitlab.md Secret
Last active May 15, 2018

Embed
What would you like to do?
[Ginzarb] GitLab memo

GitLab

概要みたいなの

Software stack

  • Ubuntu/Debian/CentOS/RHEL/OpenSUSE
  • Ruby (MRI) 2.3
  • Git 2.8.4+
  • Redis 2.8+
  • PostgreSQL (preferred) or MySQL
    • MySQLでも一応動く(全機能はサポートしていない)けど、基本的には非推奨らしい
  • Rails 4.2.10
    • 環境変数にRAILS5を指定すると5.0.6
  • Vue JS 2.5.16
  • (Elasticsearchがなくて、検索はDBで頑張ってる)
  • 詳細: Requirements
  • GitLab Architecture Overview

GitLab CI/CD

コード

Doc

./bin/rake stats
+----------------------+-------+-------+---------+---------+-----+-------+
| Name | Lines | LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Controllers | 15233 | 11865 | 203 | 1578 | 7 | 5 |
| Helpers | 8162 | 6403 | 0 | 854 | 0 | 5 |
| Models | 29716 | 21487 | 280 | 3213 | 11 | 4 |
| Mailers | 781 | 575 | 6 | 79 | 13 | 5 |
| Javascripts | 44897 | 25168 | 0 | 341 | 0 | 71 |
| Libraries | 81033 | 61323 | 1173 | 6223 | 5 | 7 |
| Initializer specs | 661 | 521 | 0 | 3 | 0 | 171 |
| Worker specs | 5234 | 4046 | 0 | 30 | 0 | 132 |
| Request specs | 38737 | 30367 | 0 | 82 | 0 | 368 |
| Task specs | 1513 | 1171 | 1 | 7 | 7 | 165 |
| Config specs | 85 | 64 | 0 | 2 | 0 | 30 |
| Uploader specs | 1702 | 1313 | 2 | 9 | 4 | 143 |
| Migration specs | 4036 | 3160 | 1 | 32 | 32 | 96 |
| Controller specs | 22698 | 17591 | 0 | 166 | 0 | 103 |
| View specs | 2493 | 1928 | 0 | 12 | 0 | 158 |
| Presenter specs | 1760 | 1374 | 0 | 0 | 0 | 0 |
| Feature specs | 51126 | 39215 | 0 | 291 | 0 | 132 |
| Mailer specs | 1843 | 1458 | 4 | 36 | 9 | 38 |
| Service specs | 30870 | 23931 | 1 | 108 | 108 | 219 |
| Bin specs | 106 | 82 | 0 | 0 | 0 | 0 |
| Rubocop specs | 2021 | 1604 | 19 | 33 | 1 | 46 |
| Routing specs | 1515 | 1014 | 0 | 2 | 0 | 505 |
| Support specs | 14666 | 11266 | 9 | 530 | 58 | 19 |
| Db specs | 63 | 47 | 0 | 0 | 0 | 0 |
| Sidekiq specs | 18 | 16 | 0 | 0 | 0 | 0 |
| Finder specs | 4257 | 3236 | 0 | 6 | 0 | 537 |
| Helper specs | 6178 | 4847 | 0 | 19 | 0 | 253 |
| Lib specs | 80973 | 63271 | 18 | 297 | 16 | 211 |
| Policy specs | 2377 | 1874 | 0 | 10 | 0 | 185 |
| Unicorn specs | 114 | 83 | 0 | 2 | 0 | 39 |
| Validator specs | 228 | 164 | 0 | 0 | 0 | 0 |
| Model specs | 48099 | 37358 | 6 | 86 | 14 | 432 |
| Serializer specs | 2738 | 2163 | 0 | 3 | 0 | 719 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total | 505933 | 379985 | 1723 | 14054 | 8 | 25 |
+----------------------+-------+-------+---------+---------+-----+-------+
Code LOC: 126821 Test LOC: 253164 Code to Test Ratio: 1:2.0

app

  • finders
    • README
    • コレクションアイテム処理用のクラス
    • intialize -> executeで実行出来るクラスが多い(全部ではない)
  • models
    • Active Recordの子クラスも素のRubyのクラスも混ざっている
  • policies
    • 権限管理まわりの処理、ライブラリを使わずに独自に実装している
    • 実装はlib/declarative_policy/配下
    • DeclarativePolicy framework
    • Ability.allowed?(user, action, suject)メソッドでチェックが出来るようになっている
      • e.g. Ability.allowed?(current_user, :push_code, source_project): 現在のユーザが対象のプロジェクトのソースにコミット出来るかチェック
  • presenters
    • README
    • これもライブラリを使わずに独自に実装している
    • 実装はlib/gitlab/view/presenter/配下
  • serializers
    • grape使ってる
  • services
    • 色々雑多においている
    • initialize -> executeで実行出来るクラスが多いような気はする
  • uploaders
    • CarrierWave
  • validators
    • これは普通にActiveModel::EachValidatorを使っている
  • workers
    • Sidekiq

config

initializers

  • モンキーパッチを直接initializeに記載していくスタイル
    • 6_validations.rb
    • active_record_avoid_type_casting_in_uniqueness_validator.rb
    • postgresql_cte.rb
  • アプリケーションサーバの起動時間を記録しておくのは良さそう

routes.rb

  • 分割していくスタイル

db

  • post_migrate
    • 名前の通りで、deploy後に任意のタイミングで実行出来るmigiration置き場
    • post_deployment_migrations.md
      • 列削除のような、インスタンスを停止してから行いたいmigrationの管理に使っている
    • down time checkの仕組みが入っている(これは後で)

features

  • いつ実行されるのかよくわからない

locale

qa

rubocop

  • Custom copがある

scripts

  • 単体で実行するファイルの置き場

shared

vendor

  • assetsだけじゃなく、Dockerfileの置き場にも使ってる

lib

api

  • Web API用ライブラリ
    • Grape使ってる。routesへのmountもここでやってる。

assets

backup

  • バックアップ処理用のライブラリ
  • これらのクラスを実行するタスクは lib/tasks/gitlab/backup.rake
  • ファイルのバックアップはrsyncでバックアップ先に同期するようになっている
  • dumpとrestoreがセットで提供されているの良い

banzai

bitbucket

constraints

  • これは普通にRailsのconstraints

container_registry

  • Docker Container Registryを操作する為のライブラリ

declarative_policy

generators

  • これは普通にRailsのgenerators
  • post_migrate用のgeneratorのみ

gitaly

gitlab

  • 長くなるんで別で

google_api

  • Google APIを使ってデータの取得、及び、そのデータの操作を行う為のライブラリ

haml_lint

  • Inline JavaScriptチェック用のLintを定義している

json_web_token

  • 名前の通りJSON web token用のライブラリ

mattermost

microsoft_teams

  • MicrosoftTeams用のライブラリ。通知とか。

omni_auth

  • Bitbucket用のStrategyを独自に定義している
  • あとJWT用の拡張

peek

rouge

  • jneen/rouge用のplugin置き場
    • CommonMark、HTML Gitlab plugin

rspec_flaky

  • flakyなexampleを管理する為のライブラリ
  • Class: RSpec::Core::Reporter)を使用して、複数回実行したexampleを記録している
    • rspec-retryを使用しており、exampleは複数回実行される
    • 記録したexampleはJSONで出力出来るようになっている
  • Flaky tests

support

  • deploy用のシェル、initスクリプト、logrotate用設定ファイル、nginx用設定ファイル

system_check

  • configが正しく設定されているか、ディレクトリの権限が期待通りの値になっているか、等各種チェック処理用のライブラリ

lib/gitlab

auth

  • 認証処理用ライブラリ
  • OAuthのラッパー、LDAP、SAMLまわりの処理や、IP毎のアクセス制御(Rate limiting)などもある

background_migration

  • Background Migrations用のクラス
    • 時間がかかるデータ移行を非同期で実行する為の仕組み
      • 外部サービスに依存するデータ移行や、あるカラムに保存されているカラムを別のカラムに移行する、等
  • Background Migration用のクラスにはperformメソッドを定義しておく必要がある
  • アプリケーションコードを使わない(ジョブ実行中にデプロイされてしまう可能性がある為)、実行内容は冪等である必要がある、等のルールがある

badge

  • バッジ(テスト結果とか、カバレッジとか)用のライブラリ

bare_repository_import

  • GitのベアリポジトリからGitLabにインポートする為のライブラリ

bitbucket_import

  • BitBucketからGitLabにインポートする為のライブラリ

cache

request_cache def can_push_to_branch?(ref)
  # ...
end
  • のようにして、メソッドの結果をcache出来る

checks

  • プロジェクトがforce push出来るかや、git tabの作成出来るか、等のユーザに紐付かないチェック処理

ci

  • GitLab CI用のライブラリ

conflict

  • Gitでコンフリしている場合に、その詳細(何行目かやシンタックスハイライト等)や、コンフリの結果をJSONで返す為のライブラリ

cross_project_access

  • 複数プロジェクトにまたがる処理用のライブラリ

cycle_analytics

  • Cycle Analytics | GitLab の為のライブラリ
  • プロジェクト毎のレポート機能
  • Issue が作られてから Milestone や Board に登録されるまでの時間や、Merge Requestが作られてからマージされるまでの時間が見れるらしい

data_builder

  • 各modelのデータをHashで返す為のmodule
    • e.g. Repository.update

database

  • database用各種ヘルパーメソッド
    • Arelゴリゴリ使ってる
  • Migration用ヘルパーメソッドも含まれている
    • migration_helpers.rb

dependency_linker

  • 依存しているライブラリのリンクを作成する為のライブラリ
  • ライセンスへのリンクとか、homepageへのリンク等々

diff

  • diff表示用のライブラリ

downtime_check

  • migrationの実行にダウンタイムが必要かどうかをチェックするためのライブラリ
  • migrationファイルでDOWNTIME定数にtrueが指定されている場合、ダウンタイムが必要になり、合わせて、理由(DOWNTIME_REASON)の記載が必要になる

email

  • emailからissue作ったら、Merge Request作ったり、返信メール解析したりするライブラリ

etag_caching

fogbugz_import

  • FogBugzからGitLabにインポートする為のライブラリ

gfm

  • GFM(GitHub Flavored Markdown)用のプラグイン

git

  • git操作用のライブラリ

gitaly_client

  • gitaly用ライブラリ

github_import

  • GitHubからGitLabにインポートする為のライブラリ

gitlab_import

  • GitLabからGitLabにインポートする為のライブラリ
  • プロジェクト移行用っぽい

google_code_import

  • GoogleCodeからGitLabにインポートする為のライブラリ

gpg

  • gpg: Signature操作用のライブラリ

grape_logging

  • grape用のlogger

graphs

  • コミットグラフを表示する為のデータを生成する為のクラス

health_checks

  • ヘルスチェック用のライブラリ
  • RDBMS、Redis、ファイルシステム等々

hook_data

  • hook処理用のデータを作成する為のライブラリ

i18n

  • i18n用のライブラリ
  • poファイル用のlinter、poファイル読み込み後のデータを保持する為のクラス等

import_export

  • Project import/export用のライブラリ
  • Project自身、及び、Projectに紐づく各種データをimport / exportする事が出来、これはその為のライブラリ

kubernetes

  • kubernetes用のライブラリ
  • Kubernetes Helmを操作する為のライブラリが主

legacy_github_import

  • legacy

metrics

middleware

  • rack middleware
  • go getされた場合のmiddlewareや、multipart用のmiddleware等

performance_bar

  • リクエスト毎にqueryの実行時間を記録する為のライブラリ

popen

  • popen3のラッパー。結果をStructで管理して、値を管理しやすくしている。
  • 合わせて、そのラッパーをまとめて実行するRunnerクラスがある。

project_authorizations

  • projectの権限を計算する為のライブラリ

prometheus

  • prometheusからデータを取得する処理の為のライブラリ

query_limiting

  • 一つのリクエストでDBへのqueryがしきい値以上実行された場合に、レポート(またはエラーをraise)する為のミドルウェア
    • テスト環境ではエラーをraise
    • しきい値は100

quick_actions

redis

  • redisにアクセスする為のライブラリ
    • configファイルの読み込みや、namespaceの管理等々

request_profiler

  • request毎のprofileを取得する為のミドルウェア

sanitizers

  • svg用のsanitizer

serializer

  • ページネーションをシリアライズする為のクラス、及び、CI用のyamlをパースする為のシリアライザ

sherlock

  • DBのtransactionsを記録する為の仕組み
  • Sherlock

sidekiq_logging

  • sidekiq用のlogger

sidekiq_middleware

  • sidekiq用のmiddleware
  • jobの引数を記録するlogger、sidekiqのworkerを外部から明示的にshutdownさせる為のmiddleware

sidekiq_status

  • sidekiq status取得用のライブラリ

sidekiq_versioning

  • Sidekiq::Managerに手をいれて、loggerを入れたり、queue毎に同じworkerを使うよう調整したいように見える
  • 名前と実装が一致してないのは、Versioningの為の対応がまだ対応中で、そこから一部対応をきりとって入れた為のもよう

slash_commands

  • スラッシュコマンド(slackでの"/deploy"みたいなの)を実行する為のライブラリ

sql

  • CTEやUNIONの為の独自クラス

storage_check

  • storageが正常に動作しているかチェックする為のライブラリ
  • excon/exconを使用して、UNIXソケット経由でチェックしている

template

  • テンプレートファイル管理用のライブラリ

testing

  • テスト用のライブラリ
  • リクエストの中身を見れるようにしたり、アクティブなリクエストの数を制限する為の仕組みがある
  • Tearing Down Capybara Tests of AJAX Pagesを参考にしているらしい

utils

  • その他ライブラリ
  • hashのmerge処理、ivar処理用のメソッド等々

verify

  • 汎用的なverifyの為の仕組み

view

  • presenterライブラリ

webpack

database.rb

  • PostgreSQL / MySQLの差分を吸収したり、bulk insert用のメソッドを定義したりしている

lazy.rb

Gemfile

default_value_for

  • Active Recordを継承しているmodelで、attributeのデフォルト値を指定出来る

rugged

  • libgit2のRubyバインディング

omniauth-cas3

akismet

rqrcode-rails3

  • QRコード生成処理

attr_encrypted

  • attributeの暗号/復号をよしなにやってくれる

u2f

  • U2F用ライブラリ

validates_hostname

  • hostname validator

browser

  • ブラウザ判定用ライブラリ

gpgme

  • GnuPG用ライブラリ

gitlab_omniauth-ldap

  • ldap

net-ldap

  • ldap

gitlab-gollum-lib

  • gollum/gollumというGitをデータストレージに使うWikiがあり、そのクライアントライブラリ

gitlab-gollum-rugged_adapter

  • gollumでrugged使うようにする為のライブラリ

hashie-forbidden_attributes

  • hashie用のForbiddenAttributesProtectionらしい

dropzonejs-rails

unf

  • Unicode正規化用ライブラリ

html-pipeline

  • HTMLのフィルター処理用のライブラリ

deckar01-task_list

  • markdownでタスクリストを表示する為のライブラリ

RedCloth

  • Textileライブラリ

org-ruby

creole

  • CreoleをHTMLに変換する為のライブラリ

wikicloth

  • MediaWiki記法用ライブラリ

asciidoctor

  • AsciiDoc用ライブラリ

asciidoctor-plantuml

  • AsciiDocでPlantUMLサポート
    • パーサーは持ってなくて、PlantUMLサーバは別に必要

rouge

  • コードハイライター

truncato

  • HTML文字列をトランケートする為のライブラリ

diffy

  • 二つの文字列からdiffを生成する為のライブラリ

sidekiq-limit_fetch

  • sidekiqの拡張
  • Queue毎の実行制限、一時的なQueueの実行の抑止、等が出来るらしい

rufus-scheduler

  • スレッドを使用したjob scheduler

rainbow

  • colorizing printed text on ANSI terminals

version_sorter

  • バージョン番号ソート用ライブラリ

device_detector

  • ブラウザだけじゃなく、OSや端末の判定が出来る

gitlab-flowdock-git-hook

gemnasium-gitlab-service

  • GemnasiumとGitLabを連携するためのライブラリ

asana

ruby-fogbugz

kubeclient

  • Kubernetes REST APIクライアント

sanitize

  • HTML and CSS sanitizer

babosa

  • slug生成用のライブラリ
    • ノーマライズ処理やサニタイズ処理

loofah

  • HTML/XMLサニタイズ

licensee

  • ライセンス検知用ライブラリ

ace-rails-ap

mousetrap-rails

charlock_holmes

  • 文字エンコーディング検出用ライブラリ

chronic

  • date/time パーサー

chronic_duration

  • 経過時間(e.g. 4 minutes and 30 seconds)をパースする為のライブラリ

webpack-rails

  • webpack
    • "No Longer Maintained"

rack-proxy

  • request / responseを書き換えるproxy

addressable

  • URI用ライブラリ

gemojione

jquery-atwho-rails

request_store

  • リクエスト毎のグローバル変数

select2-rails

premailer-rails

  • emailでcss使えるようにする為のライブラリ

gettext

  • GNU gettext用ライブラリ

batch-loader

  • HTTP requestやDB queryのN+1を避ける為のライブラリ

peek

  • profiling tool

allocations

  • Rubyのオブジェクトの生成数を確認出来る
Allocations.start
a = %w(a 1 9 39)
Allocations.to_hash
# => {IRB::Context=>2, IRB::WorkSpace=>2, NilClass=>1, IO=>2, RubyLex=>175, String=>128, IRB::Irb=>60, Integer=>6, Readline=>4, IRB::ReadlineInputMethod=>4, Array=>15, Module=>10, RubyToken=>10, Class=>10, IRB::SLex::Node=>50, Hash=>8, Object=>5, Kernel=>13}
Allocations.stop

influxdb

  • InfluxDB用クライアント

prometheus-client-mmap

  • prometheus/client_rubyのfork
  • 複数のプロセスでメトリクスを共有するのにmmapを使用しているらしい

raindrops

  • preforking rack serverのstatsが見れるライブラリ

awesome_print

  • pretty print

fuubar

  • RSpec用progress bar

spinach-rails

rspec_profiling

  • RSpec用プロファイラ
  • 実行時間、queryの実行数や実行時間の記録がとれる

rspec-set

  • example毎にresourceを作るのではなく、before(:all)で処理を行う事で、異なるexampleでresourceを使いまわせるようにする

ffaker

  • ダミーデータ

gitlab-styles

  • rubocop for GitLab

flay

  • 重複したコードを検出するライブラリ

knapsack

test_after_commit

  • fixtureを使用している場合にもafter_commit callbackを実行出来るようにする為のライブラリ
  • もういらないこ

sham_rack

  • Rackアプリケーションをプロセス内で実行する為のライブラリ
  • stubに便利

test-prof

  • testプロファイラ

mail_room

  • gmail IMAPからメールを取得して、それを特定のURLに投げたり、JOB workerを実行したりする為のライブラリ

html2text

  • HTML -> plain textに変換

health_check

  • health check用gem

vmstat

  • Memory、CPU等のシステム情報を取得する為のライブラリ

sys-filesystem

  • ファイルシステムの情報を取得する為のライブラリ

net-ssh

  • SSHクライアント

sshkey

  • SSH private / public key generator

rbnacl-libsodium

grpc

  • GRPCクライアントライブラリ

flipper

lograge

  • RailsのRequestログを綺麗にしてくれるやつ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.