gitlab-qa 8.14.1 → 8.15.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b7fcc8c586127f3c1883786b303610fd2360293a4e2ee2727225a0f50a865947
4
- data.tar.gz: 7928dcd357359e99bc3e8c921bf3cda138d1cf5dee9746760a097c34c92be323
3
+ metadata.gz: 6f8235a7dbc3c61a6f538089128dc4a5ba7219c435a2fd107b9be7a7f8e79a23
4
+ data.tar.gz: 3ce7fbdcc46f5f7b7a25e87af2b681c8ef314c48afef9a7e0c139361dcfed7bc
5
5
  SHA512:
6
- metadata.gz: 65877f46a7c942ada94490ffcbdcdc74f757cc51000879e4f5030030fcbd0fb59e5be9f8ebd1550d0effe332cad61ff043eb7f8434aaddc72b6094d269048850
7
- data.tar.gz: 837d053e553827cd507ba10e12056ae8bb8dbe32b22903f89c5eb67e59f57230a561897e34eb97f6ba67b5b67b8d66562a773c5fc487525ca1a0c83a006656d9
6
+ metadata.gz: a44d2a6d39df421e02e6dcb96b41aa32a53a65366f983e853376bde2c6b0e17ab1099ccd1b675c4c0b4b93e2bdd94bf661fff2e02edf8e68d43a7e2535ae756c
7
+ data.tar.gz: 919565630e715538ed4867339a27e553d90a80b3185b1caab4303aa65ef026a882f3fbb6446cbf5eb0e95944659da6adf6270ba2ecece62b85e60117248d9aee
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gitlab-qa (8.14.1)
4
+ gitlab-qa (8.15.0)
5
5
  activesupport (~> 6.1)
6
6
  gitlab (~> 4.18.0)
7
7
  http (~> 5.0)
@@ -102,7 +102,7 @@ GEM
102
102
  rubocop-rails (~> 2.9)
103
103
  rubocop-rspec (~> 1.44)
104
104
  hashdiff (1.0.1)
105
- http (5.1.0)
105
+ http (5.1.1)
106
106
  addressable (~> 2.8)
107
107
  http-cookie (~> 1.0)
108
108
  http-form_data (~> 2.2)
@@ -120,6 +120,7 @@ GEM
120
120
  rexml
121
121
  kramdown-parser-gfm (1.1.0)
122
122
  kramdown (~> 2.0)
123
+ lefthook (1.2.6)
123
124
  llhttp-ffi (0.4.0)
124
125
  ffi-compiler (~> 1.0)
125
126
  rake (~> 13.0)
@@ -240,6 +241,7 @@ DEPENDENCIES
240
241
  gitlab-dangerfiles (~> 2.11)
241
242
  gitlab-qa!
242
243
  gitlab-styles (~> 6.2.1)
244
+ lefthook (~> 1.2.6)
243
245
  pry (~> 0.11)
244
246
  rake (~> 13.0)
245
247
  rspec (~> 3.7)
@@ -0,0 +1,28 @@
1
+ # HTTP mocking
2
+
3
+ Some scenario types might require mocking third party services. [Mock server](../../lib/gitlab/qa/component/mock_server.rb) component
4
+ can be used for that. It is based on simple http mock server called [smocker](https://smocker.dev/).
5
+
6
+ ## Using
7
+
8
+ Simple usage example:
9
+
10
+ ```ruby
11
+ Component::Gitlab.perform do |gitlab|
12
+ gitlab.network = 'test'
13
+ gitlab.instance do
14
+ Component::MockServer.perform do |mock|
15
+ mock.network = gitlab.network
16
+ mock.instance do
17
+ Component::Specs.perform do
18
+ ...
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ ```
25
+
26
+ Mock server will be accessible from within gitlab or qa test container via `http://smocker.test` url and admin interface will be
27
+ accessible via `http://smocker.test:8081`. Refer to [Getting Started](https://smocker.dev/guide/getting-started.html) guide on
28
+ how to use the server and define mocked requests and responses.
@@ -0,0 +1,32 @@
1
+ # SSL
2
+
3
+ ## Enabling https for services
4
+
5
+ In order to test services with ssl enabled, `certificate authority (CA)` certs as well as applicant key pairs have been created and are
6
+ located in [tls_certificates/](../../tls_certificates/) folder.
7
+
8
+ **All certificates are used for testing purposes only and are not present in any of release images.**
9
+
10
+ ## Generating new key pairs
11
+
12
+ To create new key pair for a new service, following commands can be used:
13
+
14
+ * creating new private key:
15
+
16
+ ```console
17
+ $ cd tls_certificates && mkdir service && cd service
18
+ ```
19
+
20
+ ```console
21
+ $ openssl genrsa -out service.key 4096
22
+ ```
23
+
24
+ * creating public key and `certificate signing request (CSR)`
25
+
26
+ ```console
27
+ $ openssl req -new -key service.key -out service.csr -subj "/C=US/ST=California/L=San Francisco/O=Gitlab Authors/CN=service.test" -addext "subjectAltName=DNS:service.test,DNS:extra.service.test"
28
+ ```
29
+
30
+ ```console
31
+ $ openssl x509 -req -days 3650 -in service.csr -CA ../authority/ca.crt -CAkey ../authority/ca.key -set_serial 1 -out service.crt -extfile <(printf "subjectAltName=DNS:service.test,DNS:extra.service.test")
32
+ ```
@@ -0,0 +1,29 @@
1
+ # Style Guide
2
+
3
+ ## RuboCop rule development guide
4
+
5
+ Our codebase style is defined and enforced by [RuboCop](https://github.com/rubocop/rubocop).
6
+
7
+ You can check for any offenses locally with `bundle exec rubocop --parallel`.
8
+ On the CI, this is automatically checked by the `rubocop` jobs in the `check` stage.
9
+
10
+ ### Lefthook
11
+
12
+ [Lefthook](https://github.com/evilmartians/lefthook) is a Git hooks manager that allows
13
+ custom logic to be executed prior to Git committing or pushing. GitLab comes with
14
+ Lefthook configuration (`lefthook.yml`), but it must be installed.
15
+
16
+ We have a `lefthook.yml` checked in but it is ignored until Lefthook is installed.
17
+
18
+ ### Install Lefthook
19
+
20
+ ```shell
21
+ # Install the `lefthook` Ruby gem:
22
+ bundle install
23
+ # Initialize the lefthook config and adds to .git/hooks dir
24
+ bundle exec lefthook install
25
+ # Verify hook execution works as expected
26
+ bundle exec lefthook run pre-push
27
+ ```
28
+
29
+ For a detailed guide on left hook configuration see https://github.com/evilmartians/lefthook/blob/master/docs/configuration.md
data/gitlab-qa.gemspec CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency 'climate_control', '~> 1.0.1'
24
24
  spec.add_development_dependency 'gitlab-dangerfiles', '~> 2.11'
25
25
  spec.add_development_dependency 'gitlab-styles', '~> 6.2.1'
26
+ spec.add_development_dependency 'lefthook', '~> 1.2.6'
26
27
  spec.add_development_dependency 'pry', '~> 0.11'
27
28
  spec.add_development_dependency 'rake', '~> 13.0'
28
29
  spec.add_development_dependency 'rspec', '~> 3.7'
data/lefthook.yml ADDED
@@ -0,0 +1,12 @@
1
+ # EXAMPLE USAGE:
2
+
3
+ # Refer for explanation to following link:
4
+ # https://github.com/evilmartians/lefthook/blob/master/docs/configuration.md
5
+ #
6
+ pre-push:
7
+ commands:
8
+ rubocop:
9
+ tags: backend style
10
+ files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
11
+ glob: '*.{rb,rake}'
12
+ run: REVEAL_RUBOCOP_TODO=0 bundle exec rubocop --parallel --force-exclusion {files}
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "securerandom"
4
+
5
+ module Gitlab
6
+ module QA
7
+ module Component
8
+ # Generic helper component running alpine linux image
9
+ # Useful for populating volumes beforehand or running any other action that requires a running container
10
+ # and has to be performed before main component containers are started
11
+ #
12
+ class Alpine < Base
13
+ DOCKER_IMAGE = "alpine"
14
+ DOCKER_IMAGE_TAG = "latest"
15
+
16
+ def name
17
+ @name ||= "alpine-#{SecureRandom.hex(4)}"
18
+ end
19
+
20
+ def start
21
+ docker.run(image: image, tag: tag, args: ["tail", "-f", "/dev/null"]) do |command|
22
+ command << "-d"
23
+ command << "--name #{name}"
24
+
25
+ volumes.each { |to, from| command.volume(to, from, 'Z') }
26
+ environment.each { |key, value| command.env(key, value) }
27
+ end
28
+ end
29
+
30
+ def prepare
31
+ prepare_docker_container
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -6,9 +6,18 @@ module Gitlab
6
6
  class Base
7
7
  include Scenario::Actable
8
8
 
9
+ CERTIFICATES_PATH = File.expand_path('../../../../tls_certificates', __dir__)
10
+
9
11
  attr_reader :docker
10
- attr_accessor :volumes, :ports, :network, :environment, :runner_network, :airgapped_network
11
12
  attr_writer :name, :exec_commands
13
+ attr_accessor :volumes,
14
+ :ports,
15
+ :network,
16
+ :network_aliases,
17
+ :environment,
18
+ :runner_network,
19
+ :airgapped_network,
20
+ :additional_hosts
12
21
 
13
22
  def initialize
14
23
  @docker = Docker::Engine.new
@@ -17,6 +26,7 @@ module Gitlab
17
26
  @ports = []
18
27
  @network_aliases = []
19
28
  @exec_commands = []
29
+ @additional_hosts = []
20
30
  end
21
31
 
22
32
  def add_network_alias(name)
@@ -74,18 +84,21 @@ module Gitlab
74
84
  def prepare_network
75
85
  prepare_airgapped_network
76
86
  prepare_runner_network
77
-
78
87
  return if docker.network_exists?(network)
79
88
 
80
89
  docker.network_create(network)
81
90
  end
82
91
 
83
92
  def prepare_airgapped_network
84
- docker.network_create("--driver=bridge --internal #{network}") if airgapped_network && !docker.network_exists?(network)
93
+ return unless airgapped_network && !docker.network_exists?(network)
94
+
95
+ docker.network_create("--driver=bridge --internal #{network}")
85
96
  end
86
97
 
87
98
  def prepare_runner_network
88
- docker.network_create("--driver=bridge --internal #{runner_network}") if runner_network && !docker.network_exists?(runner_network)
99
+ return unless runner_network && !docker.network_exists?(runner_network)
100
+
101
+ docker.network_create("--driver=bridge --internal #{runner_network}")
89
102
  end
90
103
 
91
104
  def prepare_docker_container
@@ -118,6 +131,10 @@ module Gitlab
118
131
  @network_aliases.to_a.each do |network_alias|
119
132
  command << "--network-alias #{network_alias}"
120
133
  end
134
+
135
+ @additional_hosts.each do |host|
136
+ command << "--add-host=#{host}"
137
+ end
121
138
  end
122
139
  end
123
140
 
@@ -16,17 +16,28 @@ module Gitlab
16
16
  extend Forwardable
17
17
  using Rainbow
18
18
 
19
- attr_reader :release, :omnibus_configuration, :omnibus_gitlab_rails_env
20
- attr_accessor :tls, :skip_availability_check, :runner_network, :seed_admin_token, :seed_db, :skip_server_hooks
19
+ attr_reader :release,
20
+ :omnibus_configuration,
21
+ :omnibus_gitlab_rails_env,
22
+ :authority_volume,
23
+ :ssl_volume
24
+
25
+ attr_accessor :tls,
26
+ :skip_availability_check,
27
+ :runner_network,
28
+ :seed_admin_token,
29
+ :seed_db,
30
+ :skip_server_hooks,
31
+ :gitaly_tls
32
+
21
33
  attr_writer :name, :relative_path
22
34
 
23
35
  def_delegators :release, :tag, :image, :edition
24
36
 
25
- CERTIFICATES_PATH = File.expand_path('../../../../tls_certificates', __dir__)
26
37
  DATA_SEED_PATH = File.expand_path('../../../../support/data', __dir__)
27
38
 
28
- SSL_PATH = '/etc/gitlab/ssl'
29
39
  TRUSTED_PATH = '/etc/gitlab/trusted-certs'
40
+ SSL_PATH = '/etc/gitlab/ssl'
30
41
  DATA_PATH = '/tmp/data-seeds'
31
42
 
32
43
  def initialize
@@ -34,17 +45,8 @@ module Gitlab
34
45
 
35
46
  @skip_availability_check = false
36
47
  @omnibus_gitlab_rails_env = {}
37
-
38
48
  @omnibus_configuration = Runtime::OmnibusConfiguration.new(Runtime::Scenario.omnibus_configuration)
39
-
40
- @working_dir_tmp_cert_path = Dir.mktmpdir('certs', FileUtils.mkdir_p("#{Dir.pwd}/tmp"))
41
- @authority_cert_path = "#{@working_dir_tmp_cert_path}/authority"
42
- @gitlab_cert_path = "#{@working_dir_tmp_cert_path}/gitlab"
43
- @gitaly_cert_path = "#{@working_dir_tmp_cert_path}/gitaly"
44
-
45
- @volumes[@gitlab_cert_path] = SSL_PATH
46
- @volumes[@authority_cert_path] = TRUSTED_PATH
47
-
49
+ @cert_volumes = { "authority" => TRUSTED_PATH, "gitlab-ssl" => SSL_PATH }
48
50
  @seed_admin_token = Runtime::Scenario.seed_admin_token
49
51
  @seed_db = Runtime::Scenario.seed_db
50
52
  @skip_server_hooks = Runtime::Scenario.skip_server_hooks
@@ -89,11 +91,6 @@ module Gitlab
89
91
  tls ? ["443:443"] : ["80"]
90
92
  end
91
93
 
92
- def gitaly_tls
93
- @volumes.delete(@gitlab_cert_path)
94
- @volumes[@gitaly_cert_path] = SSL_PATH
95
- end
96
-
97
94
  def relative_path
98
95
  @relative_path ||= ''
99
96
  end
@@ -109,12 +106,6 @@ module Gitlab
109
106
  super
110
107
  end
111
108
 
112
- def teardown!
113
- FileUtils.rm_rf(@working_dir_tmp_cert_path)
114
-
115
- super
116
- end
117
-
118
109
  def pull
119
110
  docker.login(**release.login_params) if release.login_params
120
111
 
@@ -146,7 +137,7 @@ module Gitlab
146
137
  command.port(mapping)
147
138
  end
148
139
 
149
- @volumes.to_h.each do |to, from|
140
+ @volumes.to_h.merge(cert_volumes).each do |to, from|
150
141
  command.volume(to, from, 'Z')
151
142
  end
152
143
 
@@ -159,6 +150,10 @@ module Gitlab
159
150
  @network_aliases.to_a.each do |network_alias|
160
151
  command << "--network-alias #{network_alias}"
161
152
  end
153
+
154
+ @additional_hosts.each do |host|
155
+ command << "--add-host=#{host}"
156
+ end
162
157
  end
163
158
 
164
159
  return unless runner_network
@@ -239,19 +234,28 @@ module Gitlab
239
234
 
240
235
  private
241
236
 
237
+ attr_reader :cert_volumes
238
+
242
239
  def read_package_manifest
243
- @docker.read_file(
244
- @release.image, @release.tag,
245
- '/opt/gitlab/version-manifest.json'
246
- )
240
+ @docker.read_file(@release.image, @release.tag, '/opt/gitlab/version-manifest.json')
247
241
  end
248
242
 
249
- # Copy certs to a temporary directory in current working directory.
250
- # This is needed for docker-in-docker ci environments where mount points outside of build dir are not accessible
243
+ # Create cert files in separate volumes
244
+ #
245
+ # tls_certificates folder can't be mounted directly when remote docker context is used
246
+ # due to not having access to local dir
251
247
  #
252
248
  # @return [void]
253
249
  def copy_certificates
254
- FileUtils.cp_r("#{CERTIFICATES_PATH}/.", @working_dir_tmp_cert_path)
250
+ Alpine.perform do |alpine|
251
+ alpine.volumes = cert_volumes
252
+
253
+ alpine.start_instance
254
+ docker.copy(alpine.name, "#{CERTIFICATES_PATH}/authority/.", TRUSTED_PATH)
255
+ docker.copy(alpine.name, "#{CERTIFICATES_PATH}/#{gitaly_tls ? 'gitaly' : 'gitlab'}/.", SSL_PATH)
256
+ ensure
257
+ alpine.teardown! # always remove container, even when global `--no-tests` flag was provided
258
+ end
255
259
  end
256
260
 
257
261
  def ensure_configured!
@@ -3,6 +3,9 @@
3
3
  module Gitlab
4
4
  module QA
5
5
  module Component
6
+ # General purpose http mock server
7
+ # see: https://smocker.dev/
8
+ #
6
9
  class MockServer < Base
7
10
  DOCKER_IMAGE = "thiht/smocker"
8
11
  DOCKER_IMAGE_TAG = "0.18.2"
@@ -10,11 +13,45 @@ module Gitlab
10
13
  def initialize
11
14
  super
12
15
 
13
- @ports = %w[8080 8081]
14
- @name = "smocker-server"
16
+ @tls = false
17
+ @name = "smocker"
18
+ @tls_path = "/etc/smocker/tls"
19
+ @ports = [80, 8081]
20
+ @environment = { "SMOCKER_MOCK_SERVER_LISTEN_PORT" => 80 }
15
21
  end
16
22
 
17
23
  attr_reader :name
24
+ attr_writer :tls
25
+
26
+ def prepare
27
+ super
28
+
29
+ setup_tls if tls
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :tls_path, :tls
35
+
36
+ def setup_tls
37
+ @volumes = { "smocker-ssl" => tls_path }
38
+ @ports = [443, 8081]
39
+ @environment = {
40
+ "SMOCKER_MOCK_SERVER_LISTEN_PORT" => 443,
41
+ "SMOCKER_TLS_ENABLE" => "true",
42
+ "SMOCKER_TLS_CERT_FILE" => "#{@tls_path}/smocker.crt",
43
+ "SMOCKER_TLS_PRIVATE_KEY_FILE" => "#{@tls_path}/smocker.key"
44
+ }
45
+
46
+ Alpine.perform do |alpine|
47
+ alpine.volumes = volumes
48
+
49
+ alpine.start_instance
50
+ docker.copy(alpine.name, "#{CERTIFICATES_PATH}/smocker/.", tls_path)
51
+ ensure
52
+ alpine.teardown! # always remove container, even when global `--no-tests` flag was provided
53
+ end
54
+ end
18
55
  end
19
56
  end
20
57
  end
@@ -39,7 +39,6 @@ module Gitlab
39
39
  'QA_EXPORT_TEST_METRICS' => :qa_export_test_metrics,
40
40
  'QA_INFLUXDB_URL' => :qa_influxdb_url,
41
41
  'QA_INFLUXDB_TOKEN' => :qa_influxdb_token,
42
- 'QA_RUN_TYPE' => :qa_run_type,
43
42
  'QA_SKIP_PULL' => :qa_skip_pull,
44
43
  'QA_VALIDATE_RESOURCE_REUSE' => :qa_validate_resource_reuse,
45
44
  'GITLAB_API_BASE' => :api_base,
@@ -25,6 +25,7 @@ module Gitlab
25
25
  Component::Gitlab.perform do |gitlab|
26
26
  Component::GitalyCluster.perform do |cluster|
27
27
  cluster.config = @config
28
+ cluster.release = release
28
29
  # we need to get an IP for praefect before proceeding so it cannot be run in parallel with gitlab
29
30
  cluster.instance(true).join
30
31
  end
@@ -21,7 +21,10 @@ module Gitlab
21
21
  gitlab.name = config.gitlab_name
22
22
  gitlab.network = config.network
23
23
  gitlab.omnibus_configuration << gitlab_omnibus_configuration
24
- cluster = Component::GitalyCluster.perform(&:instance)
24
+ cluster = Component::GitalyCluster.perform do |cluster|
25
+ cluster.release = release
26
+ cluster.instance
27
+ end
25
28
  gitlab.instance do
26
29
  cluster.join
27
30
  Runtime::Logger.info('Running Gitaly Cluster specs!')
@@ -14,10 +14,13 @@ module Gitlab
14
14
  #
15
15
  class Import < Scenario::Template
16
16
  def initialize
17
- @source_gitlab = Component::Gitlab.new
18
- @target_gitlab = Component::Gitlab.new
19
- @mock_server = Component::MockServer.new
20
17
  @network = "test"
18
+ @source_gitlab = Component::Gitlab.new.tap { |gitlab| gitlab.network = @network }
19
+ @target_gitlab = Component::Gitlab.new.tap { |gitlab| gitlab.network = @network }
20
+ @mock_server = Component::MockServer.new.tap do |server|
21
+ server.network = @network
22
+ server.tls = true
23
+ end
21
24
  end
22
25
 
23
26
  attr_reader :source_gitlab, :target_gitlab, :mock_server, :network
@@ -39,11 +42,7 @@ module Gitlab
39
42
  #
40
43
  # @return [void]
41
44
  def start_mock_server
42
- mock_server.tap do |server|
43
- server.network = network
44
-
45
- server.start_instance
46
- end
45
+ mock_server.start_instance
47
46
  end
48
47
 
49
48
  # Start gitlab instance
@@ -52,14 +51,19 @@ module Gitlab
52
51
  # @return [void]
53
52
  def start_gitlab_instances(release)
54
53
  instances = [
55
- { instance: source_gitlab, name: "import-source" },
56
- { instance: target_gitlab, name: "import-target" }
54
+ { instance: source_gitlab, name: "import-source", additional_hosts: [] },
55
+ {
56
+ instance: target_gitlab,
57
+ name: "import-target",
58
+ additional_hosts: ["api.github.com:#{mock_server.ip_address}"]
59
+ }
57
60
  ]
61
+
58
62
  ::Parallel.each(instances, in_threads: 2) do |gitlab_instance|
59
63
  gitlab_instance[:instance].tap do |gitlab|
60
64
  gitlab.name = gitlab_instance[:name]
61
- gitlab.network = network
62
65
  gitlab.release = release
66
+ gitlab.additional_hosts = gitlab_instance[:additional_hosts]
63
67
  gitlab.seed_admin_token = true
64
68
 
65
69
  gitlab.start_instance
@@ -76,8 +80,12 @@ module Gitlab
76
80
  specs.suite = "Test::Integration::Import"
77
81
  specs.release = target_gitlab.release
78
82
  specs.network = network
79
- specs.env = { "QA_IMPORT_SOURCE_URL" => source_gitlab.address, "QA_ALLOW_LOCAL_REQUESTS" => "true" }
80
83
  specs.args = [target_gitlab.address, *rspec_args]
84
+ specs.env = {
85
+ "QA_ALLOW_LOCAL_REQUESTS" => "true",
86
+ "QA_IMPORT_SOURCE_URL" => source_gitlab.address,
87
+ "QA_SMOCKER_HOST" => mock_server.hostname
88
+ }
81
89
  end
82
90
  end
83
91
  end
@@ -16,44 +16,57 @@ module Gitlab
16
16
  end
17
17
 
18
18
  def perform(release, *rspec_args)
19
- Component::Gitlab.perform do |gitaly|
20
- gitaly.release = QA::Release.new(release)
21
- gitaly.name = @gitaly_name
22
- gitaly.network = @network
23
- gitaly.skip_availability_check = true
24
- gitaly.seed_admin_token = false
25
-
26
- gitaly.omnibus_configuration << gitaly_omnibus
27
- gitaly.gitaly_tls
28
-
29
- gitaly.instance do
30
- Component::Gitlab.perform do |gitlab|
31
- gitlab.release = QA::Release.new(release)
32
- gitlab.name = @gitlab_name
33
- gitlab.network = @network
34
-
35
- gitlab.omnibus_configuration << gitlab_omnibus
36
- gitlab.tls = true
37
-
38
- gitlab.instance do
39
- Runtime::Logger.info("Running mTLS specs!")
40
-
41
- if @tag
42
- rspec_args << "--" unless rspec_args.include?('--')
43
- rspec_args << "--tag" << @tag
44
- end
45
-
46
- Component::Specs.perform do |specs|
47
- specs.suite = @spec_suite
48
- specs.release = gitlab.release
49
- specs.network = gitlab.network
50
- specs.args = [gitlab.address, *rspec_args]
51
- specs.env = @env
52
- end
53
- end
19
+ # You can create 2 networks with the same 'human friendly' name if you run network create in parallel
20
+ # However this causes 'ambiguous network' errors, so lets just create network manually earlier
21
+ # see https://github.com/moby/moby/issues/18864#issuecomment-167006094
22
+ # and also api docs https://github.com/moby/moby/blob/master/docs/api/v1.42.yaml#L9932-L9941
23
+ docker = Docker::Engine.new
24
+ docker.network_create(@network) unless docker.network_exists?(@network)
25
+
26
+ gitaly_thread = Thread.new do
27
+ Thread.current.abort_on_exception = true
28
+ @gitaly_node = Component::Gitlab.perform do |gitaly|
29
+ gitaly.release = QA::Release.new(release)
30
+ gitaly.name = @gitaly_name
31
+ gitaly.network = @network
32
+ gitaly.skip_availability_check = true
33
+ gitaly.seed_admin_token = false
34
+
35
+ gitaly.omnibus_configuration << gitaly_omnibus
36
+ gitaly.gitaly_tls = true
37
+
38
+ gitaly.instance(skip_teardown: true)
39
+ end
40
+ end
41
+
42
+ Component::Gitlab.perform do |gitlab|
43
+ gitlab.release = QA::Release.new(release)
44
+ gitlab.name = @gitlab_name
45
+ gitlab.network = @network
46
+
47
+ gitlab.omnibus_configuration << gitlab_omnibus
48
+ gitlab.tls = true
49
+
50
+ gitlab.instance do
51
+ gitaly_thread.join
52
+ Runtime::Logger.info("Running mTLS specs!")
53
+
54
+ if @tag
55
+ rspec_args << "--" unless rspec_args.include?('--')
56
+ rspec_args << "--tag" << @tag
57
+ end
58
+
59
+ Component::Specs.perform do |specs|
60
+ specs.suite = @spec_suite
61
+ specs.release = gitlab.release
62
+ specs.network = gitlab.network
63
+ specs.args = [gitlab.address, *rspec_args]
64
+ specs.env = @env
54
65
  end
55
66
  end
56
67
  end
68
+ ensure
69
+ @gitaly_node&.teardown
57
70
  end
58
71
 
59
72
  def gitlab_omnibus
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Gitlab
4
4
  module QA
5
- VERSION = '8.14.1'
5
+ VERSION = '8.15.0'
6
6
  end
7
7
  end
@@ -0,0 +1,31 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFZzCCA0+gAwIBAgIBATANBgkqhkiG9w0BAQsFADBVMQswCQYDVQQGEwJVUzET
3
+ MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEZMBcG
4
+ A1UECgwQR2l0TGFiIEF1dGhvcml0eTAeFw0yMzAxMDIxMDEyNDRaFw0zMjEyMzAx
5
+ MDEyNDRaMGwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYD
6
+ VQQHDA1TYW4gRnJhbmNpc2NvMRcwFQYDVQQKDA5HaXRsYWIgQXV0aG9yczEXMBUG
7
+ A1UEAwwOYXBpLmdpdGh1Yi5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
8
+ AoICAQC8cKxIATD8EaMSUoKMNhLTsQ/iawXBXR+r0BKWjzF6TxdYYlyU/tnH5TJA
9
+ 43uUIJDrO1l5vdFMrZ9XemzN8qF/lUpTc3fnFQNE998NzZzdG3Do3hOTayTRYlje
10
+ 7PxB3Y8ekpbCqW5lJkR9fC/T8CTAog0wK8wIn0wCgBwiuM1IPzMutYGUZgxAnw2h
11
+ zIHCF68mfZhqiKG3ZcKSwQct2FL5/9ZcC71AkxopK0YBOLn7rReEhC8PwOIWdxD4
12
+ EyB3Hd4sxzT9ZOOSwyXO/FAQFBioHmeI6CxS4BOOBK8KDGGZ1gvIQq2OHYNxqzXB
13
+ iJ5zYEMqXr9dV0zKZ0+0EuNZEEO7TwW2WnbiFDlBzGIXjBVSPc26pQjFnC5YniPb
14
+ cKC+J7pkZtbiWlo59WFvtLe/FRTiN+64pNXKiMeGBbKduYOANcNj1IO7Vi6o5ln8
15
+ s4tilAe4TJNiIMyKBGoP7X+UiEfa1fCgZ8qVBqDWxNupjU1K3T8VCH1rBRJUaotJ
16
+ N3yw41uhVPjLpx6HBN1fbXqYEkDoEpDRVCWtoIxVQRu9JtVH3KHvRSdmt1Kv+vBL
17
+ 7uEbLeD6hNrC5GpLiikV6I1HQUxM7vzAlBmz1doOVTyp/9VpQbPrsd2F6kuL3/xO
18
+ 7KUD3U0xZh6dRUEx+PuCenGYZVcQot4q94dv3ocdo1J60n2DkwIDAQABoyswKTAn
19
+ BgNVHREEIDAegg5hcGkuZ2l0aHViLmNvbYIMc21vY2tlci50ZXN0MA0GCSqGSIb3
20
+ DQEBCwUAA4ICAQA8CzfqD5QsM2/Kz79b4JDhfUafp8oOJdufjiQxCjRn9qZuEqtT
21
+ Qf5GEjEPnV8FH6Oux8qTxWMQQLGdDHzQ217jUtvqdpDog1v+QPVRkoPeP+QTQSfK
22
+ kC+ANGdDt+dbzyRM8b7pxz5KcyMwHHZitAKE2f1xf1gbc70RiJDmif+W4B8lcaWG
23
+ IGoQPB8kAAMhV9r91u49Em3+jKXrhw8J5JBZG7t9006N1ix6ZkocvDqI3mSE9KeY
24
+ dgVzSQdz6KK9BtezqZjpYdRwAJEeoOABsnP7rnTQjDUNb2G/53TOmypORAZXm8sn
25
+ VLuFtP+IymsfFzsSI1H9YhQqd8NN6bDWHH4vttVP1ZXnMZQ2sR4dTLoAkoSMziEF
26
+ EUw24+KI3I9P/hSu6sUIO8WsDdQFV6BECrMrzTN7mIMAg7/JGYDU/LtD7dgeBTuy
27
+ pdxzWVdnrp4WixyHunBuzHo8g8o1ZqHX+HZrfyD3ywTkoWuxoKf0aGpSCallS1Uz
28
+ 2+yRNSzZkEZKEWEljWrToFzazLN/4xRL9GtxGlKEU+xOX0of0LZ+Jx5xNI7iztka
29
+ kPLtItClCEq3S1KixdoYE2Zjkkx17H3qu59zbYrXtF7/3C4UYDL29+Hv6E8YPnUM
30
+ LXlvldSQN3MDScFEFYmT5uxvZcQVhU6TMljNL+qllRjQUj3Z3VTLkR3iiw==
31
+ -----END CERTIFICATE-----
@@ -0,0 +1,29 @@
1
+ -----BEGIN CERTIFICATE REQUEST-----
2
+ MIIE6zCCAtMCAQAwbDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWEx
3
+ FjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xFzAVBgNVBAoMDkdpdGxhYiBBdXRob3Jz
4
+ MRcwFQYDVQQDDA5hcGkuZ2l0aHViLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
5
+ ADCCAgoCggIBALxwrEgBMPwRoxJSgow2EtOxD+JrBcFdH6vQEpaPMXpPF1hiXJT+
6
+ 2cflMkDje5QgkOs7WXm90Uytn1d6bM3yoX+VSlNzd+cVA0T33w3NnN0bcOjeE5Nr
7
+ JNFiWN7s/EHdjx6SlsKpbmUmRH18L9PwJMCiDTArzAifTAKAHCK4zUg/My61gZRm
8
+ DECfDaHMgcIXryZ9mGqIobdlwpLBBy3YUvn/1lwLvUCTGikrRgE4ufutF4SELw/A
9
+ 4hZ3EPgTIHcd3izHNP1k45LDJc78UBAUGKgeZ4joLFLgE44ErwoMYZnWC8hCrY4d
10
+ g3GrNcGInnNgQypev11XTMpnT7QS41kQQ7tPBbZaduIUOUHMYheMFVI9zbqlCMWc
11
+ LlieI9twoL4numRm1uJaWjn1YW+0t78VFOI37rik1cqIx4YFsp25g4A1w2PUg7tW
12
+ LqjmWfyzi2KUB7hMk2IgzIoEag/tf5SIR9rV8KBnypUGoNbE26mNTUrdPxUIfWsF
13
+ ElRqi0k3fLDjW6FU+MunHocE3V9tepgSQOgSkNFUJa2gjFVBG70m1Ufcoe9FJ2a3
14
+ Uq/68Evu4Rst4PqE2sLkakuKKRXojUdBTEzu/MCUGbPV2g5VPKn/1WlBs+ux3YXq
15
+ S4vf/E7spQPdTTFmHp1FQTH4+4J6cZhlVxCi3ir3h2/ehx2jUnrSfYOTAgMBAAGg
16
+ OjA4BgkqhkiG9w0BCQ4xKzApMCcGA1UdEQQgMB6CDmFwaS5naXRodWIuY29tggxz
17
+ bW9ja2VyLnRlc3QwDQYJKoZIhvcNAQELBQADggIBAENNxApAwNQsxmHa+q4ZjPax
18
+ 4uUb3Q2sQUqRZN2IAP+HDmlKy8scuhvvCkxuxC7rxZhupoEUR3MJoDAURLfIQLPu
19
+ S3zj1H7iIsi1sY+HDaMKmgK22IudIV3WuVgYcs1bdYHUc+lp1k8Y+KHp80f/hzpU
20
+ nkFVMsddzLglA8Kgt9zqER05iTxBoJfZYbLBzI31aPtmm/DUkAccU19ututbmmtk
21
+ 7XDcDp3FbsgbR/XtkrbuMJGvbs3nyQ6JXK9Mj4AHn+Iucs+mYBULyMYtNbGGCY5h
22
+ AmJdScWAxCxDXEelUpml29dytqZCRBcvcdLwM4srP+VE5lbAkLcR0aETDeRAEshO
23
+ wB8QMZXql8Tc1quKNOr0pxoJZSA0dIjv/tUap8HiuNeEYN0F938uWTb1TQHSs9Dt
24
+ 8d6/SXZZNZNw9xWoeBwdJE1TdcozGnXp6W93+BmGHkOib98FYRWO581Tv12v/x8V
25
+ 9Jys/wzTmH8xrjjHWYlRx+m3yFGMY+Ou0Ee0Tw3lSAOj5tY5IEliVm+c67K57HDY
26
+ zhXajuiRfAXe4bsQN/FjvOJmLGxltEX1q01xWD9kP513LMLJSHQXOj/Iw9WZIBul
27
+ zKVAWqpN4XyvPzu/QAymW95tYUb9ZmByUi9OXpfMuTipN6ogvI3XBEpGkPGVzbgR
28
+ 6ypgdzU8dPZyrsdb0A8s
29
+ -----END CERTIFICATE REQUEST-----
@@ -0,0 +1,51 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ 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
51
+ -----END RSA PRIVATE KEY-----
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-qa
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.14.1
4
+ version: 8.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitLab Quality
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-12-16 00:00:00.000000000 Z
11
+ date: 2023-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: climate_control
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 6.2.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: lefthook
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.2.6
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.2.6
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: pry
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -310,6 +324,9 @@ files:
310
324
  - docs/README.md
311
325
  - docs/architecture.md
312
326
  - docs/configuring_omnibus.md
327
+ - docs/developer/http_mocking.md
328
+ - docs/developer/ssl.md
329
+ - docs/developer/style_guide.md
313
330
  - docs/how_it_works.md
314
331
  - docs/omnibus_configurations/license_mode.md
315
332
  - docs/release_process.md
@@ -325,7 +342,9 @@ files:
325
342
  - fixtures/ldap/3_add_groups.ldif
326
343
  - fixtures/ldap/tanuki.ldif
327
344
  - gitlab-qa.gemspec
345
+ - lefthook.yml
328
346
  - lib/gitlab/qa.rb
347
+ - lib/gitlab/qa/component/alpine.rb
329
348
  - lib/gitlab/qa/component/base.rb
330
349
  - lib/gitlab/qa/component/chaos.rb
331
350
  - lib/gitlab/qa/component/elasticsearch.rb
@@ -467,6 +486,9 @@ files:
467
486
  - tls_certificates/gitlab/gitlab.test.crt
468
487
  - tls_certificates/gitlab/gitlab.test.csr
469
488
  - tls_certificates/gitlab/gitlab.test.key
489
+ - tls_certificates/smocker/smocker.crt
490
+ - tls_certificates/smocker/smocker.csr
491
+ - tls_certificates/smocker/smocker.key
470
492
  - tmp/.gitignore
471
493
  homepage: http://about.gitlab.com/
472
494
  licenses: