Class: Gitlab::QA::Component::Gitlab

Inherits:
Base
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/gitlab/qa/component/gitlab.rb

Defined Under Namespace

Classes: Availability

Constant Summary collapse

CERTIFICATES_PATH =
File.expand_path('../../../../tls_certificates', __dir__)
DATA_SEED_PATH =
File.expand_path('../../../../support/data', __dir__)
SSL_PATH =
'/etc/gitlab/ssl'
TRUSTED_PATH =
'/etc/gitlab/trusted-certs'
DATA_PATH =
'/tmp/data-seeds'

Instance Attribute Summary collapse

Attributes inherited from Base

#docker, #environment, #network, #volumes

Instance Method Summary collapse

Methods inherited from Base

#add_network_alias, #hostname, #image, #instance, #prepare_docker_container, #prepare_docker_image, #prepare_network, #restart, #tag, #teardown

Methods included from Scenario::Actable

#act, included

Constructor Details

#initializeGitlab

Returns a new instance of Gitlab.



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/gitlab/qa/component/gitlab.rb', line 31

def initialize
  super

  @skip_availability_check = false
  @omnibus_gitlab_rails_env = {}

  @omnibus_configuration = Runtime::OmnibusConfiguration.new(Runtime::Scenario.omnibus_configuration)

  @working_dir_tmp_cert_path = Dir.mktmpdir('certs', FileUtils.mkdir_p("#{Dir.pwd}/tmp"))
  @authority_cert_path = "#{@working_dir_tmp_cert_path}/authority"
  @gitlab_cert_path = "#{@working_dir_tmp_cert_path}/gitlab"
  @gitaly_cert_path = "#{@working_dir_tmp_cert_path}/gitaly"

  @volumes[@gitlab_cert_path] = SSL_PATH
  @volumes[@authority_cert_path] = TRUSTED_PATH

  @seed_admin_token = Runtime::Scenario.seed_admin_token
  @seed_db = Runtime::Scenario.seed_db

  self.release = 'CE'
end

Instance Attribute Details

#nameObject



74
75
76
# File 'lib/gitlab/qa/component/gitlab.rb', line 74

def name
  @name ||= "gitlab-#{edition}-#{SecureRandom.hex(4)}"
end

#omnibus_configurationObject (readonly)

Returns the value of attribute omnibus_configuration.



18
19
20
# File 'lib/gitlab/qa/component/gitlab.rb', line 18

def omnibus_configuration
  @omnibus_configuration
end

#omnibus_gitlab_rails_envObject (readonly)

Returns the value of attribute omnibus_gitlab_rails_env.



18
19
20
# File 'lib/gitlab/qa/component/gitlab.rb', line 18

def omnibus_gitlab_rails_env
  @omnibus_gitlab_rails_env
end

#relative_pathObject



95
96
97
# File 'lib/gitlab/qa/component/gitlab.rb', line 95

def relative_path
  @relative_path ||= ''
end

#releaseObject

Returns the value of attribute release.



18
19
20
# File 'lib/gitlab/qa/component/gitlab.rb', line 18

def release
  @release
end

#runner_networkObject

Returns the value of attribute runner_network.



19
20
21
# File 'lib/gitlab/qa/component/gitlab.rb', line 19

def runner_network
  @runner_network
end

#seed_admin_tokenObject

Returns the value of attribute seed_admin_token.



19
20
21
# File 'lib/gitlab/qa/component/gitlab.rb', line 19

def seed_admin_token
  @seed_admin_token
end

#seed_dbObject

Returns the value of attribute seed_db.



19
20
21
# File 'lib/gitlab/qa/component/gitlab.rb', line 19

def seed_db
  @seed_db
end

#skip_availability_checkObject

Returns the value of attribute skip_availability_check.



19
20
21
# File 'lib/gitlab/qa/component/gitlab.rb', line 19

def skip_availability_check
  @skip_availability_check
end

#tlsObject

Returns the value of attribute tls.



19
20
21
# File 'lib/gitlab/qa/component/gitlab.rb', line 19

def tls
  @tls
end

Instance Method Details

#addressObject



78
79
80
# File 'lib/gitlab/qa/component/gitlab.rb', line 78

def address
  "#{scheme}://#{hostname}#{relative_path}"
end

#copy_key_file(env_key) ⇒ Object



217
218
219
220
221
222
223
224
225
226
227
228
# File 'lib/gitlab/qa/component/gitlab.rb', line 217

def copy_key_file(env_key)
  key_dir = ENV['CI_PROJECT_DIR'] || Dir.tmpdir
  key_file = Tempfile.new(env_key.downcase, key_dir)
  key_file.write(ENV.fetch(env_key))
  key_file.close

  File.chmod(0o744, key_file.path)

  @volumes[key_file.path] = key_file.path

  key_file.path
end

#elastic_url=(url) ⇒ Object



66
67
68
# File 'lib/gitlab/qa/component/gitlab.rb', line 66

def elastic_url=(url)
  @environment['ELASTIC_URL'] = url
end

#gitaly_tlsObject



90
91
92
93
# File 'lib/gitlab/qa/component/gitlab.rb', line 90

def gitaly_tls
  @volumes.delete(@gitlab_cert_path)
  @volumes[@gitaly_cert_path] = SSL_PATH
end

#portObject



86
87
88
# File 'lib/gitlab/qa/component/gitlab.rb', line 86

def port
  tls ? '443:443' : '80'
end

#prepareObject



103
104
105
106
107
108
# File 'lib/gitlab/qa/component/gitlab.rb', line 103

def prepare
  prepare_gitlab_omnibus_config
  copy_certificates

  super
end

#prepare_gitlab_omnibus_configObject



122
123
124
125
126
127
128
# File 'lib/gitlab/qa/component/gitlab.rb', line 122

def prepare_gitlab_omnibus_config
  
  set_license_mode
  return if omnibus_gitlab_rails_env.empty?

  @omnibus_configuration << "gitlab_rails['env'] = #{@omnibus_gitlab_rails_env}"
end

#process_exec_commandsObject



189
190
191
192
193
194
195
196
197
198
199
200
201
202
# File 'lib/gitlab/qa/component/gitlab.rb', line 189

def process_exec_commands
  @docker.copy(name, DATA_SEED_PATH, DATA_PATH) if seed_admin_token || seed_db

  exec_commands << seed_admin_token_command if seed_admin_token
  exec_commands << seed_test_data_command if seed_db
  exec_commands << Runtime::Scenario.omnibus_exec_commands
  exec_commands << add_git_server_hooks unless Runtime::Scenario.skip_server_hooks

  commands = exec_commands.flatten.uniq
  return if commands.empty?

  Runtime::Logger.info("Running exec_commands...")
  commands.each { |command| @docker.exec(name, command) }
end

#pullObject



116
117
118
119
120
# File 'lib/gitlab/qa/component/gitlab.rb', line 116

def pull
  docker.(**release.) if release.

  super
end

#rails_versionObject



204
205
206
207
208
209
210
211
212
213
214
215
# File 'lib/gitlab/qa/component/gitlab.rb', line 204

def rails_version
  json = @docker.read_file(
    @release.image, @release.tag,
    '/opt/gitlab/version-manifest.json'
  )

  manifest = JSON.parse(json)
  {
    sha: manifest['software']['gitlab-rails']['locked_version'],
    source: manifest['software']['gitlab-rails']['locked_source']['git']
  }
end

#reconfigureObject



161
162
163
164
165
166
167
168
# File 'lib/gitlab/qa/component/gitlab.rb', line 161

def reconfigure
  setup_omnibus

  @docker.attach(name) do |line, wait|
    # TODO, workaround which allows to detach from the container
    break if /gitlab Reconfigured!/.match?(line)
  end
end

#schemeObject



82
83
84
# File 'lib/gitlab/qa/component/gitlab.rb', line 82

def scheme
  tls ? 'https' : 'http'
end

#set_accept_insecure_certsObject



99
100
101
# File 'lib/gitlab/qa/component/gitlab.rb', line 99

def set_accept_insecure_certs
  Runtime::Env.accept_insecure_certs = 'true'
end

#set_formless_login_tokenObject



53
54
55
56
57
# File 'lib/gitlab/qa/component/gitlab.rb', line 53

def 
  return if Runtime::Env..to_s.strip.empty?

  @omnibus_gitlab_rails_env['GITLAB_QA_FORMLESS_LOGIN_TOKEN'] = Runtime::Env.
end

#set_license_modeObject



59
60
61
62
63
64
# File 'lib/gitlab/qa/component/gitlab.rb', line 59

def set_license_mode
  return unless Runtime::Env.test_license_mode?

  @omnibus_gitlab_rails_env['GITLAB_LICENSE_MODE'] = 'test'
  @omnibus_gitlab_rails_env['CUSTOMER_PORTAL_URL'] = 'https://customers.staging.gitlab.com'
end

#startObject

rubocop:disable Metrics/AbcSize



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/gitlab/qa/component/gitlab.rb', line 130

def start # rubocop:disable Metrics/AbcSize
  ensure_configured!

  docker.run(image: image, tag: tag) do |command|
    command << "-d -p #{port}"
    command << "--name #{name}"
    command << "--net #{network}"
    command << "--hostname #{hostname}"

    @volumes.to_h.each do |to, from|
      command.volume(to, from, 'Z')
    end

    command.volume(File.join(Runtime::Env.host_artifacts_dir, name, 'logs'), '/var/log/gitlab', 'Z')

    @environment.to_h.each do |key, value|
      command.env(key, value)
    end

    @network_aliases.to_a.each do |network_alias|
      command << "--network-alias #{network_alias}"
    end
  end

  return unless runner_network

  Docker::Command.execute(
    "network connect --alias #{name}.#{network} --alias #{name}.#{runner_network} #{runner_network} #{name}"
  )
end

#teardown!Object



110
111
112
113
114
# File 'lib/gitlab/qa/component/gitlab.rb', line 110

def teardown!
  FileUtils.rm_rf(@working_dir_tmp_cert_path)

  super
end

#wait_until_readyObject



170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/gitlab/qa/component/gitlab.rb', line 170

def wait_until_ready
  return if skip_availability_check

  availability = Availability.new(
    name,
    relative_path: relative_path,
    scheme: scheme,
    protocol_port: port.to_i
  )

  Runtime::Logger.info("Waiting for GitLab to become healthy ...")

  if availability.check(Runtime::Env.gitlab_availability_timeout)
    Runtime::Logger.info("-> GitLab is available at `#{availability.uri}`!".bright)
  else
    abort '-> GitLab unavailable!'.red
  end
end