gitlab-qa 5.13.6 → 5.16.0
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/.gitlab-ci.yml +42 -1
- data/README.md +52 -5
- data/docs/run_qa_against_gdk.md +3 -0
- data/docs/what_tests_can_be_run.md +21 -6
- data/lib/gitlab/qa.rb +4 -1
- data/lib/gitlab/qa/component/base.rb +156 -0
- data/lib/gitlab/qa/component/elasticsearch.rb +5 -32
- data/lib/gitlab/qa/component/gitlab.rb +16 -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 +10 -11
- data/lib/gitlab/qa/docker/command.rb +15 -3
- data/lib/gitlab/qa/docker/engine.rb +24 -1
- data/lib/gitlab/qa/docker/shellout.rb +2 -2
- data/lib/gitlab/qa/release.rb +33 -0
- data/lib/gitlab/qa/runner.rb +23 -15
- data/lib/gitlab/qa/runtime/env.rb +32 -1
- data/lib/gitlab/qa/runtime/scenario.rb +36 -0
- data/lib/gitlab/qa/scenario/test/instance/airgapped.rb +68 -0
- data/lib/gitlab/qa/scenario/test/integration/geo.rb +4 -2
- data/lib/gitlab/qa/scenario/test/integration/gitaly_cluster.rb +201 -0
- data/lib/gitlab/qa/scenario/test/integration/praefect.rb +18 -7
- data/lib/gitlab/qa/scenario/test/sanity/version.rb +1 -1
- data/lib/gitlab/qa/version.rb +1 -1
- metadata +7 -4
- data/lib/gitlab/qa/scenario/test/integration/gitaly_ha.rb +0 -166
@@ -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
|