Class: Gitlab::QA::Component::Specs
- Inherits:
-
Scenario::Template
- Object
- Scenario::Template
- Gitlab::QA::Component::Specs
- Defined in:
- lib/gitlab/qa/component/specs.rb
Overview
This class represents GitLab QA specs image that is implemented in the ‘qa/` directory located in GitLab CE / EE repositories.
Instance Attribute Summary collapse
-
#args ⇒ Object
Returns the value of attribute args.
-
#env ⇒ Object
Returns the value of attribute env.
-
#hostname ⇒ Object
Returns the value of attribute hostname.
-
#network ⇒ Object
Returns the value of attribute network.
-
#release ⇒ Object
Returns the value of attribute release.
-
#runner_network ⇒ Object
Returns the value of attribute runner_network.
-
#suite ⇒ Object
Returns the value of attribute suite.
-
#volumes ⇒ Object
Returns the value of attribute volumes.
Instance Method Summary collapse
-
#initialize ⇒ Specs
constructor
A new instance of Specs.
- #perform ⇒ Object
Methods inherited from Scenario::Template
Constructor Details
Instance Attribute Details
#args ⇒ Object
Returns the value of attribute args.
13 14 15 |
# File 'lib/gitlab/qa/component/specs.rb', line 13 def args @args end |
#env ⇒ Object
Returns the value of attribute env.
13 14 15 |
# File 'lib/gitlab/qa/component/specs.rb', line 13 def env @env end |
#hostname ⇒ Object
Returns the value of attribute hostname.
13 14 15 |
# File 'lib/gitlab/qa/component/specs.rb', line 13 def hostname @hostname end |
#network ⇒ Object
Returns the value of attribute network.
13 14 15 |
# File 'lib/gitlab/qa/component/specs.rb', line 13 def network @network end |
#release ⇒ Object
Returns the value of attribute release.
13 14 15 |
# File 'lib/gitlab/qa/component/specs.rb', line 13 def release @release end |
#runner_network ⇒ Object
Returns the value of attribute runner_network.
13 14 15 |
# File 'lib/gitlab/qa/component/specs.rb', line 13 def runner_network @runner_network end |
#suite ⇒ Object
Returns the value of attribute suite.
13 14 15 |
# File 'lib/gitlab/qa/component/specs.rb', line 13 def suite @suite end |
#volumes ⇒ Object
Returns the value of attribute volumes.
13 14 15 |
# File 'lib/gitlab/qa/component/specs.rb', line 13 def volumes @volumes end |
Instance Method Details
#perform ⇒ Object
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/gitlab/qa/component/specs.rb', line 21 def perform return Runtime::Logger.info("Skipping tests.") if skip_tests? raise ArgumentError unless [suite, release].all? docker_pull_qa_image_if_needed Runtime::Logger.info("Running test suite `#{suite}` for #{release.project_name}") name = "#{release.project_name}-qa-#{SecureRandom.hex(4)}" feature_flag_sets = [] # When `args` includes `[..., "--disable-feature", "a", "--enable-feature", "b", "--set-feature-flags", "c=enable", ...]` # `feature_flag_sets` will be set to `[["--disable-feature", "a"], ["--enable-feature", "b"], ["--set-feature-flags", "c=enable"]]` # This will result in tests running three times, once with each feature flag option. while (index = args&.index { |x| x =~ /--.*-feature/ }) feature_flag_sets << args.slice!(index, 2) end # When `args` do not have any feature flag options, we add [] so that test is run exactly once. feature_flag_sets << [] unless feature_flag_sets.any? feature_flag_sets.each do |feature_flag_set| @docker.run(image: qa_image, args: [suite, *args_with_flags(args, feature_flag_set)]) do |command| command << "-t --rm --net=#{network || 'bridge'}" unless hostname.nil? command << "--hostname #{hostname}" command.env('QA_HOSTNAME', hostname) end unless Runtime::Env.docker_add_hosts.empty? hosts = Runtime::Env.docker_add_hosts.map { |host| "--add-host=#{host} " }.join command << hosts # override /etc/hosts in docker container when test runs end env.merge(Runtime::Env.variables).each do |key, value| command.env(key, value) end command.volume('/var/run/docker.sock', '/var/run/docker.sock') command.volume(File.join(Runtime::Env.host_artifacts_dir, name), File.join(Docker::Volumes::QA_CONTAINER_WORKDIR, 'tmp')) @volumes.to_h.each do |to, from| command.volume(to, from) end command.name(name) end end end |