Module: Gitlab::SetupHelper::Gitaly

Extended by:
Gitlab::SetupHelper
Defined in:
lib/gitlab/setup_helper.rb

Class Method Summary collapse

Methods included from Gitlab::SetupHelper

create_configuration, generate_configuration

Class Method Details

.configuration_toml(gitaly_dir, storage_paths, options, gitaly_ruby: true) ⇒ Object

We cannot create config.toml files for all possible Gitaly configuations. For instance, if Gitaly is running on another machine then it makes no sense to write a config.toml file on the current machine. This method will only generate a configuration for the most common and simplest case: when we have exactly one Gitaly process and we are sure it is running locally because it uses a Unix socket. For development and testing purposes, an extra storage is added to gitaly, which is not known to Rails, but must be explicitly stubbed.


83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/gitlab/setup_helper.rb', line 83

def configuration_toml(gitaly_dir, storage_paths, options, gitaly_ruby: true)
  storages = []
  address = nil

  Gitlab.config.repositories.storages.each do |key, val|
    if address
      if address != val['gitaly_address']
        raise ArgumentError, "Your gitlab.yml contains more than one gitaly_address."
      end
    elsif URI(val['gitaly_address']).scheme != 'unix'
      raise ArgumentError, "Automatic config.toml generation only supports 'unix:' addresses."
    else
      address = val['gitaly_address']
    end

    storages << { name: key, path: storage_paths[key] }
  end

  config = { socket_path: address.delete_prefix('unix:') }

  if Rails.env.test?
    socket_filename = options[:gitaly_socket] || "gitaly.socket"
    prometheus_listen_addr = options[:prometheus_listen_addr]

    config = {
      # Override the set gitaly_address since Praefect is in the loop
      socket_path: File.join(gitaly_dir, socket_filename),
      auth: { token: 'secret' },
      # Compared to production, tests run in constrained environments. This
      # number is meant to grow with the number of concurrent rails requests /
      # sidekiq jobs, and concurrency will be low anyway in test.
      git: {
        catfile_cache_size: 5,
        use_bundled_binaries: true
      },
      prometheus_listen_addr: prometheus_listen_addr
    }.compact

    storage_path = Rails.root.join('tmp', 'tests', 'second_storage').to_s
    storages << { name: 'test_second_storage', path: storage_path }
  end

  config[:storage] = storages

  runtime_dir = options[:runtime_dir] || File.join(gitaly_dir, 'run')
  FileUtils.mkdir(runtime_dir) unless File.exist?(runtime_dir)
  config[:runtime_dir] = runtime_dir

  config[:'gitaly-ruby'] = { dir: File.join(gitaly_dir, 'ruby') } if gitaly_ruby
  config[:'gitlab-shell'] = { dir: Gitlab.config.gitlab_shell.path }
  config[:bin_dir] = File.expand_path(File.join(gitaly_dir, '_build', 'bin')) # binaries by default are in `_build/bin`
  config[:gitlab] = { url: Gitlab.config.gitlab.url }
  config[:logging] = { dir: Rails.root.join('log').to_s }

  TomlRB.dump(config)
end