gitlab-qa 5.13.6 → 5.13.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/docs/run_qa_against_gdk.md +3 -0
- data/docs/what_tests_can_be_run.md +6 -6
- data/lib/gitlab/qa.rb +2 -0
- data/lib/gitlab/qa/component/base.rb +131 -0
- data/lib/gitlab/qa/component/elasticsearch.rb +5 -32
- data/lib/gitlab/qa/component/gitlab.rb +15 -88
- data/lib/gitlab/qa/component/internet_tunnel.rb +6 -29
- data/lib/gitlab/qa/component/jira.rb +5 -44
- data/lib/gitlab/qa/component/ldap.rb +8 -51
- data/lib/gitlab/qa/component/mail_hog.rb +5 -44
- data/lib/gitlab/qa/component/minio.rb +9 -34
- data/lib/gitlab/qa/component/postgresql.rb +4 -36
- data/lib/gitlab/qa/component/saml.rb +5 -54
- data/lib/gitlab/qa/component/specs.rb +1 -10
- data/lib/gitlab/qa/docker/engine.rb +8 -0
- data/lib/gitlab/qa/release.rb +20 -0
- data/lib/gitlab/qa/runtime/env.rb +25 -1
- data/lib/gitlab/qa/runtime/scenario.rb +36 -0
- data/lib/gitlab/qa/scenario/test/integration/gitaly_ha.rb +2 -2
- data/lib/gitlab/qa/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80567a3f14ce823c574bf448dd57339aa9ac95d39514b2c18ec4f8d9094c5e95
|
4
|
+
data.tar.gz: 4aa694b95e7bc667a58d63d7ac4c2606dbbd3d9a5819cd49e160dfae60b919cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a9f28e68a1717e93f7df4dda6de613185b3175417092517d56338d35af67679eed4a8d074e6ee5b6efd1f9d425b761aec3d9a8803d9d993341a9a28b1abde4c
|
7
|
+
data.tar.gz: da4ca897e44bd8c398c42f431370b73bb482fdb032b059053b759eb0c97646500057961b8a378a789b39cf5ab093e00a4a8577c36fbb6ef9353ce9116b24f98a
|
data/docs/run_qa_against_gdk.md
CHANGED
@@ -42,6 +42,9 @@ make a few changes to your `gdk/gitlab/config/gitlab.yml` file.
|
|
42
42
|
$ exe/gitlab-qa Test::Instance::Any gitlab/gitlab-ce:your-custom-tag http://192.168.0.12:3000 -- qa/specs/features/browser_ui/1_manage/login/log_in_spec.rb
|
43
43
|
```
|
44
44
|
|
45
|
+
**Note:** The hostname of the URL provided to `gitlab-qa` must match the hostname configured for GDK.
|
46
|
+
If they do not match, a test will be signed out when it visits a page directly because the hostname of the URL visited will be different from the hostname that was used when signing in.
|
47
|
+
|
45
48
|
### Running EE tests
|
46
49
|
|
47
50
|
When running EE tests you'll need to have a license available. GitLab engineers can [request a license](https://about.gitlab.com/handbook/developer-onboarding/#working-on-gitlab-ee).
|
@@ -57,19 +57,19 @@ For more details on the internals, please read the
|
|
57
57
|
| `QA_ARTIFACTS_DIR` |`/tmp/gitlab-qa`| Path to a directory where artifacts (logs and screenshots) for failing tests will be saved. | No|
|
58
58
|
| `DOCKER_HOST` |`http://localhost`| Docker host to run tests against. | No|
|
59
59
|
| `CHROME_HEADLESS` |- | When running locally, set to `false` to allow Chrome tests to be visible - watch your tests being run. | No|
|
60
|
-
| `QA_ADDITIONAL_REPOSITORY_STORAGE` |- | The name of additional, non-default storage to be used with tests tagged `repository_storage`, run via the `Test::Instance::RepositoryStorage` scenario. | No|
|
61
|
-
| `QA_PRAEFECT_REPOSITORY_STORAGE` |- | The name of repository storage using Praefect. | No|
|
60
|
+
| `QA_ADDITIONAL_REPOSITORY_STORAGE` |- | The name of additional, non-default storage to be used with tests tagged `repository_storage`, run via the `Test::Instance::RepositoryStorage` scenario. Note: Admin access is required to change repository storage. | No|
|
61
|
+
| `QA_PRAEFECT_REPOSITORY_STORAGE` |- | The name of repository storage using Praefect. Note: Admin access is required to change repository storage. | No|
|
62
62
|
| `QA_COOKIES` |- | Optionally set to "cookie1=value;cookie2=value" in order to add a cookie to every request. This can be used to set the canary cookie by setting it to "gitlab_canary=true". | No|
|
63
63
|
| `QA_DEBUG` |- | Set to `true` to verbosely log page object actions. Note: if enabled be aware that sensitive data might be logged. If an input element has a QA selector with `password` in the name, data entered into the input element will be masked. If the element doesn't have `password` in its name it won't be masked. | No|
|
64
64
|
| `QA_LOG_PATH` |- | Path to output debug logging to. If not set logging will be output to STDOUT. | No|
|
65
|
-
| `QA_CAN_TEST_GIT_PROTOCOL_V2`
|
66
|
-
| `QA_CAN_TEST_ADMIN_FEATURES`
|
67
|
-
| `QA_CAN_TEST_PRAEFECT`
|
65
|
+
| `QA_CAN_TEST_GIT_PROTOCOL_V2` | `true` | Set to `false` to skip tests that require Git protocol v2 if your environment doesn't support it. | No|
|
66
|
+
| `QA_CAN_TEST_ADMIN_FEATURES` | `true` | Set to `false` to skip tests that require admin access. | No|
|
67
|
+
| `QA_CAN_TEST_PRAEFECT` | `true` | Set to `false` to skip tests that require Praefect to be running. | No|
|
68
68
|
| `QA_DISABLE_RSPEC_RETRY` |- | Set to `true` to turn off retrying tests on failure. | No|
|
69
69
|
| `QA_SIMULATE_SLOW_CONNECTION` |- | Set to `true` to configure Chrome's network settings to simulate a slow connection. | No|
|
70
70
|
| `QA_SLOW_CONNECTION_LATENCY_MS` | `2000` | The additional latency (in ms) of the simulated slow connection. | No|
|
71
71
|
| `QA_SLOW_CONNECTION_THROUGHPUT_KBPS` | `32` | The maximum throughput (in kbps) of the simulated slow connection. | No|
|
72
|
-
| `QA_SKIP_PULL`
|
72
|
+
| `QA_SKIP_PULL` | `false` | Set to `true` to skip pulling docker images (e.g., to use one you built locally). | No|
|
73
73
|
| `GITHUB_USERNAME` |- | Username for authenticating with GitHub. | No|
|
74
74
|
| `GITHUB_PASSWORD` |- | Password for authenticating with GitHub. | No|
|
75
75
|
| `GITLAB_QA_LOOP_RUNNER_MINUTES` | `1` | Minutes to run and repeat a spec while using the '--loop' option; default value is 1 minute. | No|
|
data/lib/gitlab/qa.rb
CHANGED
@@ -6,6 +6,7 @@ module Gitlab
|
|
6
6
|
|
7
7
|
module Runtime
|
8
8
|
autoload :Env, 'gitlab/qa/runtime/env'
|
9
|
+
autoload :Scenario, 'gitlab/qa/runtime/scenario'
|
9
10
|
autoload :TokenFinder, 'gitlab/qa/runtime/token_finder'
|
10
11
|
end
|
11
12
|
|
@@ -63,6 +64,7 @@ module Gitlab
|
|
63
64
|
end
|
64
65
|
|
65
66
|
module Component
|
67
|
+
autoload :Base, 'gitlab/qa/component/base'
|
66
68
|
autoload :Gitlab, 'gitlab/qa/component/gitlab'
|
67
69
|
autoload :InternetTunnel, 'gitlab/qa/component/internet_tunnel'
|
68
70
|
autoload :LDAP, 'gitlab/qa/component/ldap'
|
@@ -0,0 +1,131 @@
|
|
1
|
+
module Gitlab
|
2
|
+
module QA
|
3
|
+
module Component
|
4
|
+
class Base
|
5
|
+
include Scenario::Actable
|
6
|
+
|
7
|
+
attr_reader :docker
|
8
|
+
attr_accessor :volumes, :network, :environment
|
9
|
+
attr_writer :name, :exec_commands
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@docker = Docker::Engine.new
|
13
|
+
@environment = {}
|
14
|
+
@volumes = {}
|
15
|
+
@network_aliases = []
|
16
|
+
|
17
|
+
self.exec_commands = []
|
18
|
+
end
|
19
|
+
|
20
|
+
def add_network_alias(name)
|
21
|
+
@network_aliases.push(name)
|
22
|
+
end
|
23
|
+
|
24
|
+
def name
|
25
|
+
raise NotImplementedError, "#{self.class.name} must specify a default name"
|
26
|
+
end
|
27
|
+
|
28
|
+
def hostname
|
29
|
+
"#{name}.#{network}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def image
|
33
|
+
return self.class.const_get('DOCKER_IMAGE') if self.class.const_defined?('DOCKER_IMAGE')
|
34
|
+
|
35
|
+
raise NotImplementedError, "#{self.class.name} must specify a docker image as DOCKER_IMAGE"
|
36
|
+
end
|
37
|
+
|
38
|
+
def tag
|
39
|
+
return self.class.const_get('DOCKER_IMAGE_TAG') if self.class.const_defined?('DOCKER_IMAGE_TAG')
|
40
|
+
|
41
|
+
raise NotImplementedError, "#{self.class.name} must specify a docker image tag as DOCKER_IMAGE_TAG"
|
42
|
+
end
|
43
|
+
|
44
|
+
def instance
|
45
|
+
prepare
|
46
|
+
start
|
47
|
+
reconfigure
|
48
|
+
wait_until_ready
|
49
|
+
process_exec_commands
|
50
|
+
|
51
|
+
yield self if block_given?
|
52
|
+
ensure
|
53
|
+
teardown
|
54
|
+
end
|
55
|
+
|
56
|
+
alias_method :launch_and_teardown_instance, :instance
|
57
|
+
|
58
|
+
def prepare
|
59
|
+
prepare_docker_image
|
60
|
+
prepare_network
|
61
|
+
end
|
62
|
+
|
63
|
+
def prepare_docker_image
|
64
|
+
return if Runtime::Env.skip_pull?
|
65
|
+
|
66
|
+
pull
|
67
|
+
end
|
68
|
+
|
69
|
+
def prepare_network
|
70
|
+
return if docker.network_exists?(network)
|
71
|
+
|
72
|
+
docker.network_create(network)
|
73
|
+
end
|
74
|
+
|
75
|
+
def start # rubocop:disable Metrics/AbcSize
|
76
|
+
docker.run(image, tag) do |command|
|
77
|
+
command << "-d"
|
78
|
+
command << "--name #{name}"
|
79
|
+
command << "--net #{network}"
|
80
|
+
command << "--hostname #{hostname}"
|
81
|
+
|
82
|
+
@volumes.to_h.each do |to, from|
|
83
|
+
command.volume(to, from, 'Z')
|
84
|
+
end
|
85
|
+
|
86
|
+
command.volume(File.join(Runtime::Env.host_artifacts_dir, name, 'logs'), '/var/log/gitlab', 'Z')
|
87
|
+
|
88
|
+
@environment.to_h.each do |key, value|
|
89
|
+
command.env(key, value)
|
90
|
+
end
|
91
|
+
|
92
|
+
@network_aliases.to_a.each do |network_alias|
|
93
|
+
command << "--network-alias #{network_alias}"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def restart
|
99
|
+
assert_name!
|
100
|
+
|
101
|
+
docker.restart(name)
|
102
|
+
end
|
103
|
+
|
104
|
+
def teardown
|
105
|
+
assert_name!
|
106
|
+
|
107
|
+
return unless docker.running?(name)
|
108
|
+
|
109
|
+
docker.stop(name)
|
110
|
+
docker.remove(name)
|
111
|
+
end
|
112
|
+
|
113
|
+
def pull
|
114
|
+
docker.pull(image, tag)
|
115
|
+
end
|
116
|
+
|
117
|
+
def process_exec_commands
|
118
|
+
exec_commands.each { |command| docker.exec(name, command) }
|
119
|
+
end
|
120
|
+
|
121
|
+
private
|
122
|
+
|
123
|
+
attr_reader :exec_commands, :wait_until_ready, :reconfigure
|
124
|
+
|
125
|
+
def assert_name!
|
126
|
+
raise 'Invalid instance name!' unless name
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
@@ -1,41 +1,19 @@
|
|
1
1
|
module Gitlab
|
2
2
|
module QA
|
3
3
|
module Component
|
4
|
-
class Elasticsearch
|
5
|
-
|
6
|
-
|
7
|
-
ELASTIC_IMAGE = 'docker.elastic.co/elasticsearch/elasticsearch'.freeze
|
8
|
-
|
9
|
-
attr_reader :docker
|
10
|
-
attr_accessor :environment, :network
|
11
|
-
attr_writer :name
|
12
|
-
|
13
|
-
def initialize
|
14
|
-
@docker = Docker::Engine.new
|
15
|
-
@environment = {}
|
16
|
-
end
|
4
|
+
class Elasticsearch < Base
|
5
|
+
DOCKER_IMAGE = 'docker.elastic.co/elasticsearch/elasticsearch'.freeze
|
17
6
|
|
18
7
|
def name
|
19
8
|
@name ||= "elastic68"
|
20
9
|
end
|
21
10
|
|
22
|
-
def
|
23
|
-
|
24
|
-
start
|
25
|
-
yield self
|
26
|
-
ensure
|
27
|
-
teardown
|
28
|
-
end
|
29
|
-
|
30
|
-
def prepare
|
31
|
-
@docker.pull(ELASTIC_IMAGE, Runtime::Env.elastic_version)
|
32
|
-
return if @docker.network_exists?(network)
|
33
|
-
|
34
|
-
@docker.network_create(network)
|
11
|
+
def tag
|
12
|
+
Runtime::Env.elastic_version
|
35
13
|
end
|
36
14
|
|
37
15
|
def start
|
38
|
-
@docker.run(
|
16
|
+
@docker.run(image, tag) do |command|
|
39
17
|
command << "-d"
|
40
18
|
command << "--name #{name}"
|
41
19
|
command << "--net #{network}"
|
@@ -45,11 +23,6 @@ module Gitlab
|
|
45
23
|
command.env("discovery.type", "single-node")
|
46
24
|
end
|
47
25
|
end
|
48
|
-
|
49
|
-
def teardown
|
50
|
-
@docker.stop(name)
|
51
|
-
@docker.remove(name)
|
52
|
-
end
|
53
26
|
end
|
54
27
|
end
|
55
28
|
end
|
@@ -7,13 +7,12 @@ require 'openssl'
|
|
7
7
|
module Gitlab
|
8
8
|
module QA
|
9
9
|
module Component
|
10
|
-
class Gitlab
|
10
|
+
class Gitlab < Base
|
11
11
|
extend Forwardable
|
12
|
-
include Scenario::Actable
|
13
12
|
|
14
|
-
attr_reader :release
|
15
|
-
attr_accessor :
|
16
|
-
attr_writer :name, :relative_path
|
13
|
+
attr_reader :release
|
14
|
+
attr_accessor :tls, :disable_animations, :skip_availability_check
|
15
|
+
attr_writer :name, :relative_path
|
17
16
|
|
18
17
|
def_delegators :release, :tag, :image, :edition
|
19
18
|
|
@@ -21,17 +20,14 @@ module Gitlab
|
|
21
20
|
SSL_PATH = '/etc/gitlab/ssl'.freeze
|
22
21
|
|
23
22
|
def initialize
|
24
|
-
|
25
|
-
|
26
|
-
@volumes = {}
|
27
|
-
@network_aliases = []
|
23
|
+
super
|
24
|
+
|
28
25
|
@disable_animations = true
|
29
|
-
@
|
26
|
+
@skip_availability_check = false
|
30
27
|
|
31
28
|
@volumes[CERTIFICATES_PATH] = SSL_PATH
|
32
29
|
|
33
30
|
self.release = 'CE'
|
34
|
-
self.exec_commands = []
|
35
31
|
end
|
36
32
|
|
37
33
|
def omnibus_config=(config)
|
@@ -48,10 +44,6 @@ module Gitlab
|
|
48
44
|
@environment['ELASTIC_URL'] = url
|
49
45
|
end
|
50
46
|
|
51
|
-
def add_network_alias(name)
|
52
|
-
@network_aliases.push(name)
|
53
|
-
end
|
54
|
-
|
55
47
|
def release=(release)
|
56
48
|
@release = QA::Release.new(release)
|
57
49
|
end
|
@@ -72,10 +64,6 @@ module Gitlab
|
|
72
64
|
tls ? '443' : '80'
|
73
65
|
end
|
74
66
|
|
75
|
-
def hostname
|
76
|
-
"#{name}.#{network}"
|
77
|
-
end
|
78
|
-
|
79
67
|
def relative_path
|
80
68
|
@relative_path ||= ''
|
81
69
|
end
|
@@ -84,24 +72,16 @@ module Gitlab
|
|
84
72
|
Runtime::Env.accept_insecure_certs = 'true'
|
85
73
|
end
|
86
74
|
|
87
|
-
def
|
88
|
-
|
89
|
-
start
|
90
|
-
reconfigure
|
91
|
-
wait unless @skip_check
|
92
|
-
process_exec_commands
|
75
|
+
def prepare
|
76
|
+
prepare_gitlab_omnibus_config
|
93
77
|
|
94
|
-
|
95
|
-
ensure
|
96
|
-
teardown
|
78
|
+
super
|
97
79
|
end
|
98
80
|
|
99
|
-
|
81
|
+
def pull
|
82
|
+
docker.login(**release.login_params) if release.login_params
|
100
83
|
|
101
|
-
|
102
|
-
prepare_gitlab_omnibus_config
|
103
|
-
prepare_docker_image
|
104
|
-
prepare_network
|
84
|
+
super
|
105
85
|
end
|
106
86
|
|
107
87
|
def prepare_gitlab_omnibus_config
|
@@ -109,18 +89,6 @@ module Gitlab
|
|
109
89
|
set_formless_login_token
|
110
90
|
end
|
111
91
|
|
112
|
-
def prepare_docker_image
|
113
|
-
return if Runtime::Env.skip_pull?
|
114
|
-
|
115
|
-
@docker.pull(image, tag)
|
116
|
-
end
|
117
|
-
|
118
|
-
def prepare_network
|
119
|
-
return if @docker.network_exists?(network)
|
120
|
-
|
121
|
-
@docker.network_create(network)
|
122
|
-
end
|
123
|
-
|
124
92
|
def setup_disable_animations
|
125
93
|
@environment['GITLAB_OMNIBUS_CONFIG'] = "gitlab_rails['gitlab_disable_animations'] = true; #{@environment['GITLAB_OMNIBUS_CONFIG'] || ''}"
|
126
94
|
end
|
@@ -128,28 +96,6 @@ module Gitlab
|
|
128
96
|
def start # rubocop:disable Metrics/AbcSize
|
129
97
|
ensure_configured!
|
130
98
|
|
131
|
-
if release.dev_gitlab_org?
|
132
|
-
Docker::Command.execute(
|
133
|
-
[
|
134
|
-
'login',
|
135
|
-
'--username gitlab-qa-bot',
|
136
|
-
%(--password "#{Runtime::Env.dev_access_token_variable}"),
|
137
|
-
QA::Release::DEV_REGISTRY
|
138
|
-
]
|
139
|
-
)
|
140
|
-
elsif release.omnibus_mirror?
|
141
|
-
bot_token = ENV['GITLAB_BOT_MULTI_PROJECT_PIPELINE_POLLING_TOKEN']
|
142
|
-
|
143
|
-
Docker::Command.execute(
|
144
|
-
[
|
145
|
-
'login',
|
146
|
-
'--username gitlab-bot',
|
147
|
-
%(--password "#{bot_token}"),
|
148
|
-
QA::Release::COM_REGISTRY
|
149
|
-
]
|
150
|
-
)
|
151
|
-
end
|
152
|
-
|
153
99
|
docker.run(image, tag) do |command|
|
154
100
|
command << "-d -p #{port}"
|
155
101
|
command << "--name #{name}"
|
@@ -181,18 +127,9 @@ module Gitlab
|
|
181
127
|
end
|
182
128
|
end
|
183
129
|
|
184
|
-
def restart
|
185
|
-
@docker.restart(name)
|
186
|
-
end
|
187
|
-
|
188
|
-
def teardown
|
189
|
-
raise 'Invalid instance name!' unless name
|
190
|
-
|
191
|
-
@docker.stop(name)
|
192
|
-
@docker.remove(name)
|
193
|
-
end
|
194
|
-
|
195
130
|
def wait
|
131
|
+
return if skip_availability_check
|
132
|
+
|
196
133
|
if Availability.new(name, relative_path: relative_path, scheme: scheme, protocol_port: port.to_i).check(180)
|
197
134
|
sleep 12 # TODO, handle that better
|
198
135
|
puts ' -> GitLab is available.'
|
@@ -201,10 +138,6 @@ module Gitlab
|
|
201
138
|
end
|
202
139
|
end
|
203
140
|
|
204
|
-
def pull
|
205
|
-
@docker.pull(@release.image, @release.tag)
|
206
|
-
end
|
207
|
-
|
208
141
|
def sha_version
|
209
142
|
json = @docker.read_file(
|
210
143
|
@release.image, @release.tag,
|
@@ -215,14 +148,8 @@ module Gitlab
|
|
215
148
|
manifest['software']['gitlab-rails']['locked_version']
|
216
149
|
end
|
217
150
|
|
218
|
-
def process_exec_commands
|
219
|
-
exec_commands.each { |command| @docker.exec(name, command) }
|
220
|
-
end
|
221
|
-
|
222
151
|
private
|
223
152
|
|
224
|
-
attr_reader :exec_commands
|
225
|
-
|
226
153
|
def ensure_configured!
|
227
154
|
raise 'Please configure an instance first!' unless [name, release, network].all?
|
228
155
|
end
|
@@ -3,18 +3,14 @@ require 'tempfile'
|
|
3
3
|
module Gitlab
|
4
4
|
module QA
|
5
5
|
module Component
|
6
|
-
class InternetTunnel
|
7
|
-
include Scenario::Actable
|
8
|
-
|
6
|
+
class InternetTunnel < Base
|
9
7
|
DOCKER_IMAGE = 'gitlab/ssh-tunnel'.freeze
|
10
8
|
DOCKER_IMAGE_TAG = '1.0.0'.freeze
|
11
9
|
|
12
|
-
attr_writer :gitlab_hostname
|
13
|
-
attr_accessor :network
|
10
|
+
attr_writer :gitlab_hostname
|
14
11
|
|
15
12
|
def initialize
|
16
|
-
|
17
|
-
@volumes = {}
|
13
|
+
super
|
18
14
|
|
19
15
|
key_dir = ENV['CI_PROJECT_DIR'] || Dir.tmpdir
|
20
16
|
@ssh_key = Tempfile.new('tunnel-ssh-private-key', key_dir)
|
@@ -27,14 +23,9 @@ module Gitlab
|
|
27
23
|
end
|
28
24
|
|
29
25
|
def instance
|
30
|
-
raise
|
31
|
-
|
32
|
-
prepare
|
33
|
-
start
|
26
|
+
raise 'Please provide a block!' unless block_given?
|
34
27
|
|
35
|
-
|
36
|
-
ensure
|
37
|
-
teardown
|
28
|
+
super
|
38
29
|
end
|
39
30
|
|
40
31
|
def url
|
@@ -47,14 +38,6 @@ module Gitlab
|
|
47
38
|
@name ||= "ssh-tunnel-#{SecureRandom.hex(4)}"
|
48
39
|
end
|
49
40
|
|
50
|
-
def prepare
|
51
|
-
@docker.pull(DOCKER_IMAGE, DOCKER_IMAGE_TAG)
|
52
|
-
|
53
|
-
return if @docker.network_exists?(network)
|
54
|
-
|
55
|
-
@docker.network_create(network)
|
56
|
-
end
|
57
|
-
|
58
41
|
def tunnel_server_hostname
|
59
42
|
ENV.fetch("TUNNEL_SERVER_HOSTNAME")
|
60
43
|
end
|
@@ -77,15 +60,9 @@ module Gitlab
|
|
77
60
|
end
|
78
61
|
end
|
79
62
|
|
80
|
-
def restart
|
81
|
-
@docker.restart(name)
|
82
|
-
end
|
83
|
-
|
84
63
|
def teardown
|
85
|
-
|
64
|
+
super
|
86
65
|
|
87
|
-
@docker.stop(name)
|
88
|
-
@docker.remove(name)
|
89
66
|
@ssh_key.unlink
|
90
67
|
end
|
91
68
|
end
|
@@ -1,50 +1,22 @@
|
|
1
1
|
module Gitlab
|
2
2
|
module QA
|
3
3
|
module Component
|
4
|
-
class Jira
|
5
|
-
|
6
|
-
|
7
|
-
JIRA_IMAGE = 'registry.gitlab.com/gitlab-org/gitlab-qa/jira-gitlab'.freeze
|
8
|
-
JIRA_IMAGE_TAG = '8.8-project-and-issue'.freeze
|
9
|
-
|
10
|
-
attr_reader :docker
|
11
|
-
attr_accessor :environment, :network
|
12
|
-
attr_writer :name
|
13
|
-
|
14
|
-
def initialize
|
15
|
-
@docker = Docker::Engine.new
|
16
|
-
@environment = {}
|
17
|
-
end
|
4
|
+
class Jira < Base
|
5
|
+
DOCKER_IMAGE = 'registry.gitlab.com/gitlab-org/gitlab-qa/jira-gitlab'.freeze
|
6
|
+
DOCKER_IMAGE_TAG = '8.8-project-and-issue'.freeze
|
18
7
|
|
19
8
|
def name
|
20
9
|
@name ||= "jira"
|
21
10
|
end
|
22
11
|
|
23
|
-
def hostname
|
24
|
-
"#{name}.#{network}"
|
25
|
-
end
|
26
|
-
|
27
12
|
def instance
|
28
13
|
raise 'Please provide a block!' unless block_given?
|
29
14
|
|
30
|
-
|
31
|
-
start
|
32
|
-
|
33
|
-
yield self
|
34
|
-
ensure
|
35
|
-
teardown
|
36
|
-
end
|
37
|
-
|
38
|
-
def prepare
|
39
|
-
@docker.pull(JIRA_IMAGE, JIRA_IMAGE_TAG)
|
40
|
-
|
41
|
-
return if @docker.network_exists?(network)
|
42
|
-
|
43
|
-
@docker.network_create(network)
|
15
|
+
super
|
44
16
|
end
|
45
17
|
|
46
18
|
def start
|
47
|
-
docker.run(
|
19
|
+
docker.run(image, tag) do |command|
|
48
20
|
command << '-d '
|
49
21
|
command << "--name #{name}"
|
50
22
|
command << "--net #{network}"
|
@@ -53,17 +25,6 @@ module Gitlab
|
|
53
25
|
end
|
54
26
|
end
|
55
27
|
|
56
|
-
def restart
|
57
|
-
@docker.restart(name)
|
58
|
-
end
|
59
|
-
|
60
|
-
def teardown
|
61
|
-
raise 'Invalid instance name!' unless name
|
62
|
-
|
63
|
-
@docker.stop(name)
|
64
|
-
@docker.remove(name)
|
65
|
-
end
|
66
|
-
|
67
28
|
def set_jira_hostname
|
68
29
|
::Gitlab::QA::Runtime::Env.jira_hostname = hostname
|
69
30
|
end
|
@@ -15,25 +15,16 @@ require 'securerandom'
|
|
15
15
|
module Gitlab
|
16
16
|
module QA
|
17
17
|
module Component
|
18
|
-
class LDAP
|
19
|
-
|
20
|
-
|
21
|
-
LDAP_IMAGE = 'osixia/openldap'.freeze
|
22
|
-
LDAP_IMAGE_TAG = 'latest'.freeze
|
18
|
+
class LDAP < Base
|
19
|
+
DOCKER_IMAGE = 'osixia/openldap'.freeze
|
20
|
+
DOCKER_IMAGE_TAG = 'latest'.freeze
|
23
21
|
LDAP_USER = 'tanuki'.freeze
|
24
22
|
LDAP_PASSWORD = 'password'.freeze
|
25
23
|
BOOTSTRAP_LDIF = '/container/service/slapd/assets/config/bootstrap/ldif/custom'.freeze
|
26
24
|
FIXTURE_PATH = File.expand_path('../../../../fixtures/ldap'.freeze, __dir__)
|
27
25
|
|
28
|
-
attr_reader :docker
|
29
|
-
attr_accessor :volumes, :network, :environment
|
30
|
-
attr_writer :name
|
31
|
-
|
32
26
|
def initialize
|
33
|
-
|
34
|
-
@environment = {}
|
35
|
-
@volumes = {}
|
36
|
-
@network_aliases = []
|
27
|
+
super
|
37
28
|
|
38
29
|
@volumes[FIXTURE_PATH] = BOOTSTRAP_LDIF
|
39
30
|
end
|
@@ -58,41 +49,21 @@ module Gitlab
|
|
58
49
|
LDAP_PASSWORD
|
59
50
|
end
|
60
51
|
|
61
|
-
def add_network_alias(name)
|
62
|
-
@network_aliases.push(name)
|
63
|
-
end
|
64
|
-
|
65
52
|
def name
|
66
53
|
@name ||= "openldap-#{SecureRandom.hex(4)}"
|
67
54
|
end
|
68
55
|
|
69
|
-
def hostname
|
70
|
-
"#{name}.#{network}"
|
71
|
-
end
|
72
|
-
|
73
56
|
def instance
|
74
57
|
raise 'Please provide a block!' unless block_given?
|
75
58
|
|
76
|
-
|
77
|
-
start
|
78
|
-
|
79
|
-
yield self
|
80
|
-
ensure
|
81
|
-
teardown
|
82
|
-
end
|
83
|
-
|
84
|
-
def prepare
|
85
|
-
@docker.pull(LDAP_IMAGE, LDAP_IMAGE_TAG)
|
86
|
-
|
87
|
-
return if @docker.network_exists?(network)
|
88
|
-
|
89
|
-
@docker.network_create(network)
|
59
|
+
super
|
90
60
|
end
|
91
61
|
|
62
|
+
# rubocop:disable Metrics/AbcSize
|
92
63
|
def start
|
93
64
|
# copy-service needed for bootstraping LDAP user:
|
94
65
|
# https://github.com/osixia/docker-openldap#seed-ldap-database-with-ldif
|
95
|
-
docker.run(
|
66
|
+
docker.run(image, tag, '--copy-service') do |command|
|
96
67
|
command << '-d '
|
97
68
|
command << "--name #{name}"
|
98
69
|
command << "--net #{network}"
|
@@ -111,21 +82,7 @@ module Gitlab
|
|
111
82
|
end
|
112
83
|
end
|
113
84
|
end
|
114
|
-
|
115
|
-
def restart
|
116
|
-
@docker.restart(name)
|
117
|
-
end
|
118
|
-
|
119
|
-
def teardown
|
120
|
-
raise 'Invalid instance name!' unless name
|
121
|
-
|
122
|
-
@docker.stop(name)
|
123
|
-
@docker.remove(name)
|
124
|
-
end
|
125
|
-
|
126
|
-
def pull
|
127
|
-
@docker.pull(LDAP_IMAGE, LDAP_IMAGE_TAG)
|
128
|
-
end
|
85
|
+
# rubocop:enable Metrics/AbcSize
|
129
86
|
|
130
87
|
def set_gitlab_credentials
|
131
88
|
::Gitlab::QA::Runtime::Env.ldap_username = username
|
@@ -4,50 +4,22 @@
|
|
4
4
|
module Gitlab
|
5
5
|
module QA
|
6
6
|
module Component
|
7
|
-
class MailHog
|
8
|
-
|
9
|
-
|
10
|
-
MAILHOG_IMAGE = 'mailhog/mailhog'.freeze
|
11
|
-
MAILHOG_IMAGE_TAG = 'v1.0.0'.freeze
|
12
|
-
|
13
|
-
attr_reader :docker
|
14
|
-
attr_accessor :environment, :network
|
15
|
-
attr_writer :name
|
16
|
-
|
17
|
-
def initialize
|
18
|
-
@docker = Docker::Engine.new
|
19
|
-
@environment = {}
|
20
|
-
end
|
7
|
+
class MailHog < Base
|
8
|
+
DOCKER_IMAGE = 'mailhog/mailhog'.freeze
|
9
|
+
DOCKER_IMAGE_TAG = 'v1.0.0'.freeze
|
21
10
|
|
22
11
|
def name
|
23
12
|
@name ||= "mailhog"
|
24
13
|
end
|
25
14
|
|
26
|
-
def hostname
|
27
|
-
"#{name}.#{network}"
|
28
|
-
end
|
29
|
-
|
30
15
|
def instance
|
31
16
|
raise 'Please provide a block!' unless block_given?
|
32
17
|
|
33
|
-
|
34
|
-
start
|
35
|
-
|
36
|
-
yield self
|
37
|
-
ensure
|
38
|
-
teardown
|
39
|
-
end
|
40
|
-
|
41
|
-
def prepare
|
42
|
-
@docker.pull(MAILHOG_IMAGE, MAILHOG_IMAGE_TAG)
|
43
|
-
|
44
|
-
return if @docker.network_exists?(network)
|
45
|
-
|
46
|
-
@docker.network_create(network)
|
18
|
+
super
|
47
19
|
end
|
48
20
|
|
49
21
|
def start
|
50
|
-
docker.run(
|
22
|
+
docker.run(image, tag) do |command|
|
51
23
|
command << '-d '
|
52
24
|
command << "--name #{name}"
|
53
25
|
command << "--net #{network}"
|
@@ -57,17 +29,6 @@ module Gitlab
|
|
57
29
|
end
|
58
30
|
end
|
59
31
|
|
60
|
-
def restart
|
61
|
-
@docker.restart(name)
|
62
|
-
end
|
63
|
-
|
64
|
-
def teardown
|
65
|
-
raise 'Invalid instance name!' unless name
|
66
|
-
|
67
|
-
@docker.stop(name)
|
68
|
-
@docker.remove(name)
|
69
|
-
end
|
70
|
-
|
71
32
|
def set_mailhog_hostname
|
72
33
|
::Gitlab::QA::Runtime::Env.mailhog_hostname = hostname
|
73
34
|
end
|
@@ -6,23 +6,18 @@ require 'fileutils'
|
|
6
6
|
module Gitlab
|
7
7
|
module QA
|
8
8
|
module Component
|
9
|
-
class Minio
|
10
|
-
|
11
|
-
|
12
|
-
MINIO_IMAGE = 'minio/minio'.freeze
|
13
|
-
MINIO_IMAGE_TAG = 'latest'.freeze
|
9
|
+
class Minio < Base
|
10
|
+
DOCKER_IMAGE = 'minio/minio'.freeze
|
11
|
+
DOCKER_IMAGE_TAG = 'latest'.freeze
|
14
12
|
# These are secrets used in a local Minio container, they're not used for any online S3 server.
|
15
13
|
AWS_ACCESS_KEY = 'AKIAIOSFODNN7EXAMPLE'.freeze
|
16
14
|
AWS_SECRET_KEY = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'.freeze
|
17
15
|
DATA_DIR = '/data'.freeze
|
18
16
|
DEFAULT_PORT = 9000
|
19
17
|
|
20
|
-
attr_reader :docker
|
21
|
-
attr_accessor :volumes, :network, :environment
|
22
|
-
attr_writer :name
|
23
|
-
|
24
18
|
def initialize
|
25
|
-
|
19
|
+
super
|
20
|
+
|
26
21
|
@environment = { MINIO_ACCESS_KEY: AWS_ACCESS_KEY, MINIO_SECRET_KEY: AWS_SECRET_KEY }
|
27
22
|
@volumes = { host_data_dir => DATA_DIR }
|
28
23
|
@buckets = []
|
@@ -31,12 +26,7 @@ module Gitlab
|
|
31
26
|
def instance
|
32
27
|
raise 'Please provide a block!' unless block_given?
|
33
28
|
|
34
|
-
|
35
|
-
start
|
36
|
-
|
37
|
-
yield self
|
38
|
-
ensure
|
39
|
-
teardown
|
29
|
+
super
|
40
30
|
end
|
41
31
|
|
42
32
|
def add_bucket(name)
|
@@ -70,16 +60,12 @@ module Gitlab
|
|
70
60
|
@name ||= "minio-#{SecureRandom.hex(4)}"
|
71
61
|
end
|
72
62
|
|
73
|
-
def hostname
|
74
|
-
"#{name}.#{network}"
|
75
|
-
end
|
76
|
-
|
77
63
|
def port
|
78
64
|
DEFAULT_PORT
|
79
65
|
end
|
80
66
|
|
81
67
|
def prepare
|
82
|
-
|
68
|
+
super
|
83
69
|
|
84
70
|
FileUtils.mkdir_p(host_data_dir)
|
85
71
|
|
@@ -87,16 +73,12 @@ module Gitlab
|
|
87
73
|
puts "Creating Minio bucket: #{bucket}"
|
88
74
|
FileUtils.mkdir_p(File.join(host_data_dir, bucket))
|
89
75
|
end
|
90
|
-
|
91
|
-
return if @docker.network_exists?(network)
|
92
|
-
|
93
|
-
@docker.network_create(network)
|
94
76
|
end
|
95
77
|
|
96
|
-
def start
|
78
|
+
def start # rubocop:disable Metrics/AbcSize
|
97
79
|
# --compat needed until https://gitlab.com/gitlab-org/gitlab-workhorse/issues/210
|
98
80
|
# is resolved
|
99
|
-
docker.run(
|
81
|
+
docker.run(image, tag, "server", "--compat", DATA_DIR) do |command|
|
100
82
|
command << '-d '
|
101
83
|
command << "--name #{name}"
|
102
84
|
command << "--net #{network}"
|
@@ -115,13 +97,6 @@ module Gitlab
|
|
115
97
|
end
|
116
98
|
end
|
117
99
|
end
|
118
|
-
|
119
|
-
def teardown
|
120
|
-
raise 'Invalid instance name!' unless name
|
121
|
-
|
122
|
-
@docker.stop(name)
|
123
|
-
@docker.remove(name)
|
124
|
-
end
|
125
100
|
end
|
126
101
|
end
|
127
102
|
end
|
@@ -1,43 +1,16 @@
|
|
1
1
|
module Gitlab
|
2
2
|
module QA
|
3
3
|
module Component
|
4
|
-
class PostgreSQL
|
5
|
-
|
6
|
-
|
7
|
-
POSTGRES_IMAGE = 'postgres'.freeze
|
8
|
-
POSTGRES_IMAGE_TAG = '11'.freeze
|
9
|
-
|
10
|
-
attr_reader :docker
|
11
|
-
attr_accessor :environment, :network
|
12
|
-
attr_writer :name
|
13
|
-
|
14
|
-
def initialize
|
15
|
-
@docker = Docker::Engine.new
|
16
|
-
@environment = {}
|
17
|
-
end
|
4
|
+
class PostgreSQL < Base
|
5
|
+
DOCKER_IMAGE = 'postgres'.freeze
|
6
|
+
DOCKER_IMAGE_TAG = '11'.freeze
|
18
7
|
|
19
8
|
def name
|
20
9
|
@name ||= "postgres"
|
21
10
|
end
|
22
11
|
|
23
|
-
def instance
|
24
|
-
prepare
|
25
|
-
start
|
26
|
-
wait_until_ready
|
27
|
-
yield self
|
28
|
-
ensure
|
29
|
-
teardown
|
30
|
-
end
|
31
|
-
|
32
|
-
def prepare
|
33
|
-
@docker.pull(POSTGRES_IMAGE, POSTGRES_IMAGE_TAG)
|
34
|
-
return if @docker.network_exists?(network)
|
35
|
-
|
36
|
-
@docker.network_create(network)
|
37
|
-
end
|
38
|
-
|
39
12
|
def start
|
40
|
-
@docker.run(
|
13
|
+
@docker.run(image, tag) do |command|
|
41
14
|
command << "-d"
|
42
15
|
command << "--name #{name}"
|
43
16
|
command << "--net #{network}"
|
@@ -46,11 +19,6 @@ module Gitlab
|
|
46
19
|
end
|
47
20
|
end
|
48
21
|
|
49
|
-
def teardown
|
50
|
-
@docker.stop(name)
|
51
|
-
@docker.remove(name)
|
52
|
-
end
|
53
|
-
|
54
22
|
def run_psql(command)
|
55
23
|
@docker.exec(name, %(psql -U postgres #{command}))
|
56
24
|
end
|
@@ -6,22 +6,9 @@ require 'securerandom'
|
|
6
6
|
module Gitlab
|
7
7
|
module QA
|
8
8
|
module Component
|
9
|
-
class SAML
|
10
|
-
|
11
|
-
|
12
|
-
SAML_IMAGE = 'jamedjo/test-saml-idp'.freeze
|
13
|
-
SAML_IMAGE_TAG = 'latest'.freeze
|
14
|
-
|
15
|
-
attr_reader :docker
|
16
|
-
attr_accessor :volumes, :network, :environment
|
17
|
-
attr_writer :name
|
18
|
-
|
19
|
-
def initialize
|
20
|
-
@docker = Docker::Engine.new
|
21
|
-
@environment = {}
|
22
|
-
@volumes = {}
|
23
|
-
@network_aliases = []
|
24
|
-
end
|
9
|
+
class SAML < Base
|
10
|
+
DOCKER_IMAGE = 'jamedjo/test-saml-idp'.freeze
|
11
|
+
DOCKER_IMAGE_TAG = 'latest'.freeze
|
25
12
|
|
26
13
|
def set_entity_id(entity_id)
|
27
14
|
@environment['SIMPLESAMLPHP_SP_ENTITY_ID'] = entity_id
|
@@ -31,18 +18,10 @@ module Gitlab
|
|
31
18
|
@environment['SIMPLESAMLPHP_SP_ASSERTION_CONSUMER_SERVICE'] = assertion_con_service
|
32
19
|
end
|
33
20
|
|
34
|
-
def add_network_alias(name)
|
35
|
-
@network_aliases.push(name)
|
36
|
-
end
|
37
|
-
|
38
21
|
def name
|
39
22
|
@name ||= "saml-qa-idp"
|
40
23
|
end
|
41
24
|
|
42
|
-
def hostname
|
43
|
-
"#{name}.#{network}"
|
44
|
-
end
|
45
|
-
|
46
25
|
def group_name
|
47
26
|
@group_name ||= "saml_sso_group-#{SecureRandom.hex(4)}"
|
48
27
|
end
|
@@ -50,25 +29,12 @@ module Gitlab
|
|
50
29
|
def instance
|
51
30
|
raise 'Please provide a block!' unless block_given?
|
52
31
|
|
53
|
-
|
54
|
-
start
|
55
|
-
|
56
|
-
yield self
|
57
|
-
ensure
|
58
|
-
teardown
|
59
|
-
end
|
60
|
-
|
61
|
-
def prepare
|
62
|
-
pull
|
63
|
-
|
64
|
-
return if @docker.network_exists?(network)
|
65
|
-
|
66
|
-
@docker.network_create(network)
|
32
|
+
super
|
67
33
|
end
|
68
34
|
|
69
35
|
# rubocop:disable Metrics/AbcSize
|
70
36
|
def start
|
71
|
-
docker.run(
|
37
|
+
docker.run(image, tag) do |command|
|
72
38
|
command << '-d '
|
73
39
|
command << "--name #{name}"
|
74
40
|
command << "--net #{network}"
|
@@ -91,21 +57,6 @@ module Gitlab
|
|
91
57
|
end
|
92
58
|
# rubocop:enable Metrics/AbcSize
|
93
59
|
|
94
|
-
def restart
|
95
|
-
@docker.restart(name)
|
96
|
-
end
|
97
|
-
|
98
|
-
def teardown
|
99
|
-
raise 'Invalid instance name!' unless name
|
100
|
-
|
101
|
-
@docker.stop(name)
|
102
|
-
@docker.remove(name)
|
103
|
-
end
|
104
|
-
|
105
|
-
def pull
|
106
|
-
@docker.pull(SAML_IMAGE, SAML_IMAGE_TAG)
|
107
|
-
end
|
108
|
-
|
109
60
|
def set_sandbox_name(sandbox_name)
|
110
61
|
::Gitlab::QA::Runtime::Env.gitlab_sandbox_name = sandbox_name
|
111
62
|
end
|
@@ -19,16 +19,7 @@ module Gitlab
|
|
19
19
|
def perform # rubocop:disable Metrics/AbcSize
|
20
20
|
raise ArgumentError unless [suite, release].all?
|
21
21
|
|
22
|
-
if release.
|
23
|
-
Docker::Command.execute(
|
24
|
-
[
|
25
|
-
'login',
|
26
|
-
'--username gitlab-qa-bot',
|
27
|
-
%(--password "#{Runtime::Env.dev_access_token_variable}"),
|
28
|
-
QA::Release::DEV_REGISTRY
|
29
|
-
]
|
30
|
-
)
|
31
|
-
end
|
22
|
+
@docker.login(**release.login_params) if release.login_params
|
32
23
|
|
33
24
|
puts "Running test suite `#{suite}` for #{release.project_name}"
|
34
25
|
|
@@ -8,6 +8,10 @@ module Gitlab
|
|
8
8
|
URI(DOCKER_HOST).host
|
9
9
|
end
|
10
10
|
|
11
|
+
def login(username:, password:, registry:)
|
12
|
+
Docker::Command.execute(%(login --username "#{username}" --password "#{password}" #{registry}))
|
13
|
+
end
|
14
|
+
|
11
15
|
def pull(image, tag)
|
12
16
|
Docker::Command.execute("pull #{image}:#{tag}")
|
13
17
|
end
|
@@ -63,6 +67,10 @@ module Gitlab
|
|
63
67
|
def port(name, port)
|
64
68
|
Docker::Command.execute("port #{name} #{port}/tcp")
|
65
69
|
end
|
70
|
+
|
71
|
+
def running?(name)
|
72
|
+
Docker::Command.execute("ps -f name=#{name}").include?(name)
|
73
|
+
end
|
66
74
|
end
|
67
75
|
end
|
68
76
|
end
|
data/lib/gitlab/qa/release.rb
CHANGED
@@ -135,6 +135,26 @@ module Gitlab
|
|
135
135
|
end
|
136
136
|
end
|
137
137
|
|
138
|
+
def login_params
|
139
|
+
if dev_gitlab_org?
|
140
|
+
Runtime::Env.require_qa_dev_access_token!
|
141
|
+
|
142
|
+
{
|
143
|
+
username: Runtime::Env.gitlab_dev_username,
|
144
|
+
password: Runtime::Env.dev_access_token_variable,
|
145
|
+
registry: DEV_REGISTRY
|
146
|
+
}
|
147
|
+
elsif omnibus_mirror?
|
148
|
+
Runtime::Env.require_gitlab_bot_multi_project_pipeline_polling_token!
|
149
|
+
|
150
|
+
{
|
151
|
+
username: Runtime::Env.gitlab_username,
|
152
|
+
password: Runtime::Env.gitlab_bot_multi_project_pipeline_polling_token,
|
153
|
+
registry: COM_REGISTRY
|
154
|
+
}
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
138
158
|
def dev_gitlab_org?
|
139
159
|
image.start_with?(DEV_REGISTRY)
|
140
160
|
end
|
@@ -84,10 +84,22 @@ module Gitlab
|
|
84
84
|
send(:attr_accessor, accessor) # rubocop:disable GitlabSecurity/PublicSend
|
85
85
|
end
|
86
86
|
|
87
|
+
def gitlab_username
|
88
|
+
ENV['GITLAB_USERNAME'] || 'gitlab-qa'
|
89
|
+
end
|
90
|
+
|
91
|
+
def gitlab_dev_username
|
92
|
+
ENV['GITLAB_DEV_USERNAME'] || 'gitlab-qa-bot'
|
93
|
+
end
|
94
|
+
|
87
95
|
def gitlab_api_base
|
88
96
|
ENV['GITLAB_API_BASE'] || 'https://gitlab.com/api/v4'
|
89
97
|
end
|
90
98
|
|
99
|
+
def gitlab_bot_multi_project_pipeline_polling_token
|
100
|
+
ENV['GITLAB_BOT_MULTI_PROJECT_PIPELINE_POLLING_TOKEN']
|
101
|
+
end
|
102
|
+
|
91
103
|
def ci_job_name
|
92
104
|
ENV['CI_JOB_NAME']
|
93
105
|
end
|
@@ -195,8 +207,14 @@ module Gitlab
|
|
195
207
|
end
|
196
208
|
end
|
197
209
|
|
210
|
+
def require_gitlab_bot_multi_project_pipeline_polling_token!
|
211
|
+
return unless ENV['GITLAB_BOT_MULTI_PROJECT_PIPELINE_POLLING_TOKEN'].to_s.strip.empty?
|
212
|
+
|
213
|
+
raise ArgumentError, "Please provide GITLAB_BOT_MULTI_PROJECT_PIPELINE_POLLING_TOKEN"
|
214
|
+
end
|
215
|
+
|
198
216
|
def skip_pull?
|
199
|
-
(ENV['QA_SKIP_PULL']
|
217
|
+
enabled?(ENV['QA_SKIP_PULL'], default: false)
|
200
218
|
end
|
201
219
|
|
202
220
|
def gitlab_qa_formless_login_token
|
@@ -205,6 +223,12 @@ module Gitlab
|
|
205
223
|
|
206
224
|
private
|
207
225
|
|
226
|
+
def enabled?(value, default: true)
|
227
|
+
return default if value.nil?
|
228
|
+
|
229
|
+
(value =~ /^(false|no|0)$/i) != 0
|
230
|
+
end
|
231
|
+
|
208
232
|
def env_value_if_defined(variable)
|
209
233
|
# Pass through the variables if they are defined in the environment
|
210
234
|
return "$#{variable}" if ENV[variable]
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Gitlab
|
4
|
+
module QA
|
5
|
+
module Runtime
|
6
|
+
##
|
7
|
+
# Singleton approach to global test scenario arguments.
|
8
|
+
#
|
9
|
+
module Scenario
|
10
|
+
extend self
|
11
|
+
|
12
|
+
def attributes
|
13
|
+
@attributes ||= {}
|
14
|
+
end
|
15
|
+
|
16
|
+
def define(attribute, value)
|
17
|
+
attributes.store(attribute.to_sym, value)
|
18
|
+
|
19
|
+
define_singleton_method(attribute) do
|
20
|
+
attributes[attribute.to_sym].tap do |value|
|
21
|
+
if value.to_s.empty?
|
22
|
+
raise ArgumentError, "Empty `#{attribute}` attribute!"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# rubocop:disable Style/MethodMissing
|
29
|
+
def method_missing(name, *)
|
30
|
+
raise ArgumentError, "Scenario attribute `#{name}` not defined!"
|
31
|
+
end
|
32
|
+
# rubocop:enable Style/MethodMissing
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -31,7 +31,7 @@ module Gitlab
|
|
31
31
|
praefect.release = QA::Release.new(release)
|
32
32
|
praefect.name = @praefect_node
|
33
33
|
praefect.network = @network
|
34
|
-
praefect.
|
34
|
+
praefect.skip_availability_check = true
|
35
35
|
|
36
36
|
praefect.omnibus_config = praefect_omnibus_configuration
|
37
37
|
|
@@ -149,7 +149,7 @@ module Gitlab
|
|
149
149
|
gitaly.release = QA::Release.new(release)
|
150
150
|
gitaly.name = name
|
151
151
|
gitaly.network = @network
|
152
|
-
gitaly.
|
152
|
+
gitaly.skip_availability_check = true
|
153
153
|
|
154
154
|
gitaly.omnibus_config = gitaly_omnibus_configuration
|
155
155
|
|
data/lib/gitlab/qa/version.rb
CHANGED
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: 5.13.
|
4
|
+
version: 5.13.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Grzegorz Bizon
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-06-
|
11
|
+
date: 2020-06-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: climate_control
|
@@ -237,6 +237,7 @@ files:
|
|
237
237
|
- fixtures/ldap/tanuki.ldif
|
238
238
|
- gitlab-qa.gemspec
|
239
239
|
- lib/gitlab/qa.rb
|
240
|
+
- lib/gitlab/qa/component/base.rb
|
240
241
|
- lib/gitlab/qa/component/elasticsearch.rb
|
241
242
|
- lib/gitlab/qa/component/gitlab.rb
|
242
243
|
- lib/gitlab/qa/component/internet_tunnel.rb
|
@@ -263,6 +264,7 @@ files:
|
|
263
264
|
- lib/gitlab/qa/reporter.rb
|
264
265
|
- lib/gitlab/qa/runner.rb
|
265
266
|
- lib/gitlab/qa/runtime/env.rb
|
267
|
+
- lib/gitlab/qa/runtime/scenario.rb
|
266
268
|
- lib/gitlab/qa/runtime/token_finder.rb
|
267
269
|
- lib/gitlab/qa/scenario/actable.rb
|
268
270
|
- lib/gitlab/qa/scenario/cli_commands.rb
|
@@ -327,7 +329,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
327
329
|
- !ruby/object:Gem::Version
|
328
330
|
version: '0'
|
329
331
|
requirements: []
|
330
|
-
rubygems_version: 3.1.
|
332
|
+
rubygems_version: 3.1.4
|
331
333
|
signing_key:
|
332
334
|
specification_version: 4
|
333
335
|
summary: Integration tests for GitLab
|