gitlab-qa 1.0.1 → 2.0.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: 6f352f47419c62cba301b61f8dae9e8eaabeb5e9ec40def22f5770f158d027f6
4
- data.tar.gz: af84f87fe4e1cdfd58ed15f116e924d7cac299428d3b578be5c57e89ff9776f6
3
+ metadata.gz: c17e7bee760ef32484d6f507fd02608e47770000ec56f04b8ea24974e97c6c7d
4
+ data.tar.gz: cbacf02dfcda7387f1d0e9fcaad84d13ce95f123e25b36b8beb3ddcda6ac68ce
5
5
  SHA512:
6
- metadata.gz: 285d3c5aa401f083311d9aecb09e34758278cdadcaaca49ee53242a5883b2c08307e5010f64a155bc1113722671fee8d239a1e641e899e47d4d89813ae8c21a1
7
- data.tar.gz: 8848ec793a59d57c56d6e829eb5defb58591eb90675274d8528ee10d295515726baca2452138ebbd82c625cb71c774857ab614bc697f7816b325fa2d52320b4b
6
+ metadata.gz: c6dabae50aa76d1495294821144ba623244daaf523d17fe3ff9d4503df5734880e8c4b54017d303d898d192bc638636b0352254d24cf7f62e52bac6973a3e4a1
7
+ data.tar.gz: 83f9fa4f377e1503551acb8a3eba379e301553f95e4de95c811c86a5d63dd96e54dfed864a16800629d9c0fa3434851b14ee034f939f98904dba1c975dcfb105
data/.gitlab-ci.yml CHANGED
@@ -5,14 +5,12 @@ stages:
5
5
  - check
6
6
  - sanity
7
7
  - test
8
- - qa
9
8
 
10
9
  variables:
11
10
  TEST_IMAGE: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-qa
12
11
  DOCKER_DRIVER: overlay
13
12
  DOCKER_HOST: tcp://docker:2375
14
- QA_SCREENSHOTS_DIR: $CI_PROJECT_DIR/screenshots
15
- QA_LOGS_DIR: $CI_PROJECT_DIR/logs
13
+ QA_ARTIFACTS_DIR: $CI_PROJECT_DIR
16
14
 
17
15
  before_script:
18
16
  - bundle install
@@ -66,8 +64,24 @@ ee:version:
66
64
  when: on_failure
67
65
  expire_in: 30d
68
66
  paths:
69
- - screenshots/
70
- - logs/
67
+ - ./gitlab-qa-run-*
68
+
69
+ .ce-qa: &ce-qa
70
+ only:
71
+ variables:
72
+ - $RELEASE == null
73
+ - $RELEASE =~ /gitlab-ce/
74
+
75
+ .ee-qa: &ee-qa
76
+ only:
77
+ variables:
78
+ - $RELEASE == null
79
+ - $RELEASE =~ /gitlab-ee/
80
+
81
+ .only-qa: &only-qa
82
+ except:
83
+ variables:
84
+ - $RELEASE
71
85
 
72
86
  .high-capacity: &high-capacity
73
87
  tags:
@@ -76,104 +90,116 @@ ee:version:
76
90
  - triggered-packages
77
91
 
78
92
  ce:instance:
79
- # Checking if the build is triggered for a EE image. In that case, we need
80
- # not run CE specific tests. This doesn't apply to nightly/regular branch
81
- # builds as RELEASE will not match gitlab-ce in those cases.
82
93
  script:
83
- - if $(echo ${RELEASE} | grep -q gitlab-ee); then exit 0; fi
84
94
  - bin/qa Test::Instance::Image ${RELEASE:=CE}
85
95
  <<: *test
86
96
  <<: *high-capacity
97
+ <<: *ce-qa
87
98
 
88
99
  ee:instance:
89
100
  script:
90
- - if $(echo ${RELEASE} | grep -q gitlab-ce); then exit 0; fi
91
101
  - bin/qa Test::Instance::Image ${RELEASE:=EE}
92
102
  <<: *test
93
103
  <<: *high-capacity
104
+ <<: *ee-qa
94
105
 
95
106
  ce:image:
96
107
  script:
97
- - if $(echo ${RELEASE} | grep -q gitlab-ee); then exit 0; fi
98
108
  - bin/qa Test::Omnibus::Image ${RELEASE:=CE}
99
109
  <<: *test
110
+ <<: *ce-qa
100
111
 
101
112
  ee:image:
102
113
  script:
103
- - if $(echo ${RELEASE} | grep -q gitlab-ce); then exit 0; fi
104
114
  - bin/qa Test::Omnibus::Image ${RELEASE:=EE}
105
115
  <<: *test
116
+ <<: *ee-qa
106
117
 
107
118
  ce:update:
108
119
  script:
109
- - if $(echo ${RELEASE} | grep -q gitlab-ee); then exit 0; fi
110
120
  - bin/qa Test::Omnibus::Update ${RELEASE:=CE}
111
121
  <<: *test
112
122
  <<: *high-capacity
123
+ <<: *ce-qa
113
124
 
114
125
  ee:update:
115
126
  script:
116
- - if $(echo ${RELEASE} | grep -q gitlab-ce); then exit 0; fi
117
127
  - bin/qa Test::Omnibus::Update ${RELEASE:=EE}
118
128
  <<: *test
119
129
  <<: *high-capacity
130
+ <<: *ee-qa
120
131
 
121
- ee-previous-to-ce-next:update:
132
+ ce:upgrade:
122
133
  script:
123
- - bin/qa Test::Omnibus::Update EE CE
134
+ - bin/qa Test::Omnibus::Upgrade
124
135
  <<: *test
125
136
  <<: *high-capacity
137
+ <<: *only-qa
126
138
 
127
- ce:upgrade:
139
+ ee-previous-to-ce:update:
128
140
  script:
129
- - if [[ $RELEASE ]]; then exit 0; fi
130
- - bin/qa Test::Omnibus::Upgrade
141
+ - bin/qa Test::Omnibus::Update EE CE
131
142
  <<: *test
132
143
  <<: *high-capacity
144
+ <<: *only-qa
133
145
 
134
146
  ce:mattermost:
135
147
  script:
136
- - if $(echo ${RELEASE} | grep -q gitlab-ee); then exit 0; fi
137
148
  - bin/qa Test::Integration::Mattermost ${RELEASE:=CE}
138
149
  <<: *test
139
150
  <<: *high-capacity
151
+ <<: *ce-qa
140
152
 
141
153
  ee:mattermost:
142
154
  script:
143
- - if $(echo ${RELEASE} | grep -q gitlab-ce); then exit 0; fi
144
155
  - bin/qa Test::Integration::Mattermost ${RELEASE:=EE}
145
156
  <<: *test
146
157
  <<: *high-capacity
158
+ <<: *ee-qa
147
159
 
148
160
  ee:geo:
149
161
  script:
150
- - if $(echo ${RELEASE} | grep -q gitlab-ce); then exit 0; fi
151
162
  - bin/qa Test::Integration::Geo ${RELEASE:=EE}
152
163
  <<: *test
153
164
  <<: *high-capacity
165
+ <<: *ee-qa
154
166
 
155
167
  ce:ldap:
156
168
  script:
157
169
  - bin/qa Test::Integration::LDAP ${RELEASE:=CE}
158
170
  <<: *test
159
171
  <<: *high-capacity
172
+ <<: *ce-qa
160
173
 
161
174
  ee:ldap:
162
175
  script:
163
176
  - bin/qa Test::Integration::LDAP ${RELEASE:=EE}
164
177
  <<: *test
165
178
  <<: *high-capacity
179
+ <<: *ee-qa
180
+
181
+ ce:kubernetes:
182
+ script:
183
+ - bin/qa Test::Integration::Kubernetes ${RELEASE:=CE}
184
+ <<: *test
185
+ <<: *high-capacity
186
+ <<: *ce-qa
187
+
188
+ ee:kubernetes:
189
+ script:
190
+ - bin/qa Test::Integration::Kubernetes ${RELEASE:=EE}
191
+ <<: *test
192
+ <<: *high-capacity
193
+ <<: *ee-qa
166
194
 
167
195
  qa:staging:
168
196
  script:
169
- - if $(echo ${RELEASE} | grep -q gitlab-ce); then exit 0; fi
170
197
  - export GITLAB_USERNAME="gitlab-qa"
171
198
  - export GITLAB_PASSWORD="$GITLAB_QA_PASSWORD"
172
199
  - unset EE_LICENSE
173
200
  - bin/qa Test::Instance::Staging
174
201
  <<: *test
175
202
  retry: 0
176
- stage: qa
177
203
  when: manual
178
204
  except:
179
205
  - triggers
data/.rubocop.yml CHANGED
@@ -28,3 +28,6 @@ Style/ModuleFunction:
28
28
 
29
29
  Style/SignalException:
30
30
  Enabled: false
31
+
32
+ Layout/SpaceBeforeFirstArg:
33
+ Enabled: false
data/README.md CHANGED
@@ -98,9 +98,9 @@ GitLab QA tool is published as a [Ruby Gem](https://rubygems.org/gems/gitlab-qa)
98
98
  You can install it with `gem install gitlab-qa`. It will expose a `gitlab-qa`
99
99
  command in your system.
100
100
 
101
- If you want to run the scenarios or develop them on Mac OS, please read
102
- [Mac OS specific documentation](/docs/run_geo_qa_against_gdk.md) as there are caveats and things
103
- that may work differently.
101
+ If you want to run the scenarios against your GDK and/or develop them on Mac OS,
102
+ please read [Run QA tests against your GDK setup](/docs/run_qa_against_gdk.md)
103
+ as there are caveats and things that may work differently.
104
104
 
105
105
  All the scenarios you can run are described in the
106
106
  [What tests can be run?](/docs/what_tests_can_be_run.md) documentation.
data/docs/README.md CHANGED
@@ -3,6 +3,6 @@
3
3
  - [Architecture](architecture.md)
4
4
  - [How it works](how_it_works.md)
5
5
  - [What tests can be run?](what_tests_can_be_run.md)
6
- - [Run Geo QA tests against your Geo GDK setup](run_geo_qa_against_gdk.md)
6
+ - [Run QA tests against your GDK setup](run_qa_against_gdk.md)
7
7
  - [Trainings](trainings.md)
8
8
  - [Waits](waits.md)
@@ -1,4 +1,30 @@
1
- # Run Geo QA tests against your Geo GDK setup
1
+ # Run QA tests against your GDK setup
2
+
3
+ To run the `Test::Instance::Any` scenario against your local GDK, you'll need to
4
+ make a few changes to your `gdk/gitlab/config/gitlab.yml` file.
5
+
6
+ 1. Retrieve your current local IP with `ifconfig`, e.g. `192.168.0.12`.
7
+ 1. Edit `gdk/gitlab/config/gitlab.yml` and replace `host: localhost` with
8
+ `host: 192.168.0.12`.
9
+ 1. Restart your GDK
10
+ 1. Run the QA scenario as follows:
11
+
12
+ ```
13
+ $ gitlab-qa Test::Instance::Any CE http://192.168.0.12:3000 -- qa/specs/features/repository/protected_branches_spec.rb:30
14
+
15
+ # Or if you want to run your local `gitlab-qa/bin/qa`:
16
+ $ bin/qa Test::Instance::Any CE http://192.168.0.12:3000 -- qa/specs/features/repository/protected_branches_spec.rb:30
17
+
18
+ # And if you want to test your local `gdk/gitlab/qa` changes, you'll need to
19
+ # build the QA image first
20
+ # In gdk/gitlab/qa:
21
+ $ docker build -t gitlab/gitlab-ce-qa:your-custom-tag .
22
+
23
+ # Then in gitlab-qa:
24
+ $ bin/qa Test::Instance::Any gitlab/gitlab-ce:your-custom-tag http://192.168.0.12:3000 -- qa/specs/features/repository/protected_branches_spec.rb:30
25
+ ```
26
+
27
+ ## Run Geo QA tests against your Geo GDK setup
2
28
 
3
29
  Run from the `gdk-ee/gitlab/qa` directory with GDK primary and secondary running:
4
30
 
@@ -10,7 +36,7 @@ bin/qa QA::EE::Scenario::Test::Geo --primary-address http://localhost:3001 --sec
10
36
  CHROME_HEADLESS=false bin/qa QA::EE::Scenario::Test::Geo --primary-address http://localhost:3001 --secondary-address http://localhost:3002 --primary-name primary --secondary-name secondary --without-setup
11
37
  ```
12
38
 
13
- # QA Tool support on macOS
39
+ ### QA Tool support on macOS
14
40
 
15
41
  Most of our development for GitLab is done on macOS. This brings some challenges as Docker on
16
42
  macOS doesn't have feature parity with it's Linux conterpart.
@@ -38,7 +64,7 @@ When using the `route` command to expose the internet network, you still need to
38
64
  There is another tool called [dnsdock][dnsdock] that may do the trick. That means you need to change
39
65
  your DNS and point to the IP/port of `dnsdock` application.
40
66
 
41
- # Docker on macOS caveats
67
+ ### Docker on macOS caveats
42
68
 
43
69
  When using OS X Docker, you need to go to Preferences > Advanced and allocate at least **5.0 GB**,
44
70
  otherwise some steps may fail to execute the `chrome-webdriver`.
@@ -59,7 +85,7 @@ Docker Inc [doesn't want to fix][Docker bridge issue].
59
85
 
60
86
  To see if this limitation is still present, check the [documentation][Docker Networking].
61
87
 
62
- ## Workarounds
88
+ #### Workarounds
63
89
 
64
90
  One possible workaround to connect to a multi-node environment like Geo, is to run a reverse proxy on your
65
91
  development machine that maps the VHOST to `localhost:port`, changing to the ports listed in `docker ps`.
@@ -35,10 +35,8 @@ For more details on the internals, please read the
35
35
  * `GITLAB_LDAP_PASSWORD` - LDAP password to use when signing into GitLab
36
36
  * `GITLAB_SANDBOX_NAME` - The sandbox group name the test suite is going to use (default: `gitlab-qa-sandbox`)
37
37
  * `EE_LICENSE` - Enterprise Edition license
38
- * `QA_SCREENSHOTS_DIR` - Path to a directory where screenshots for failing tests
39
- will be saved (default: `/tmp/gitlab-qa/screenshots`)
40
- * `QA_LOGS_DIR` - Path to a directory where logs will be saved (default:
41
- `/tmp/gitlab-qa/logs`)
38
+ * `QA_ARTIFACTS_DIR` - Path to a directory where artifacts (logs and screenshots)
39
+ for failing tests will be saved (default: `/tmp/gitlab-qa`)
42
40
  * `DOCKER_HOST` - Docker host to run tests against (default: `http://localhost`)
43
41
  * `CHROME_HEADLESS` - when running locally, set to `false` to allow Chrome tests to be visible - watch your tests being run
44
42
 
@@ -248,11 +246,21 @@ in the GitLab CE project).
248
246
 
249
247
  - `GITLAB_QA_ACCESS_TOKEN`: A valid personal access token with the `api` scope.
250
248
  This is used to retrieve the version that staging is currently running.
249
+ This can be found in the shared 1Password vault.
250
+
251
+ **Optional environment variables:**
252
+
253
+ - `GITLAB_QA_DEV_ACCESS_TOKEN`: A valid personal access token for the
254
+ `gitlab-qa-bot` on `dev.gitlab.org` with the `registry` scope.
255
+ This is used to pull the QA Docker from the Omnibus GitLab `dev` Container Registry.
256
+ If the variable isn't present, the QA image from Docker Hub will be used.
257
+ This can be found in the shared 1Password vault.
251
258
 
252
259
  Example:
253
260
 
254
261
  ```
255
262
  $ export GITLAB_QA_ACCESS_TOKEN=your_api_access_token
263
+ $ export GITLAB_QA_DEV_ACCESS_TOKEN=your_dev_registry_access_token
256
264
  $ export GITLAB_USERNAME="gitlab-qa"
257
265
  $ export GITLAB_PASSWORD="$GITLAB_QA_PASSWORD"
258
266
 
data/lib/gitlab/qa.rb CHANGED
@@ -29,6 +29,7 @@ module Gitlab
29
29
  autoload :Geo, 'qa/scenario/test/integration/geo'
30
30
  autoload :LDAP, 'qa/scenario/test/integration/ldap'
31
31
  autoload :Mattermost, 'qa/scenario/test/integration/mattermost'
32
+ autoload :Kubernetes, 'qa/scenario/test/integration/kubernetes'
32
33
  end
33
34
 
34
35
  module Sanity
@@ -39,6 +40,7 @@ module Gitlab
39
40
 
40
41
  module Component
41
42
  autoload :Gitlab, 'qa/component/gitlab'
43
+ autoload :InternetTunnel, 'qa/component/internet_tunnel'
42
44
  autoload :LDAP, 'qa/component/ldap'
43
45
  autoload :Specs, 'qa/component/specs'
44
46
  autoload :Staging, 'qa/component/staging'
@@ -38,7 +38,7 @@ module Gitlab
38
38
  end
39
39
 
40
40
  def name
41
- @name ||= "gitlab-qa-#{edition}-#{SecureRandom.hex(4)}"
41
+ @name ||= "gitlab-#{edition}-#{SecureRandom.hex(4)}"
42
42
  end
43
43
 
44
44
  def address
@@ -83,9 +83,7 @@ module Gitlab
83
83
  command.volume(to, from, 'Z')
84
84
  end
85
85
 
86
- File.join(Runtime::Env.logs_dir, name).tap do |logs_dir|
87
- command.volume(logs_dir, '/var/log/gitlab', 'Z')
88
- end
86
+ command.volume(File.join(Runtime::Env.host_artifacts_dir, name, 'logs'), '/var/log/gitlab', 'Z')
89
87
 
90
88
  @environment.to_h.each do |key, value|
91
89
  command.env(key, value)
@@ -0,0 +1,94 @@
1
+ require 'tempfile'
2
+
3
+ module Gitlab
4
+ module QA
5
+ module Component
6
+ class InternetTunnel
7
+ include Scenario::Actable
8
+
9
+ DOCKER_IMAGE = 'dylangriffith/ssh'.freeze
10
+ DOCKER_IMAGE_TAG = 'latest'.freeze
11
+
12
+ attr_writer :gitlab_hostname, :name
13
+ attr_accessor :network
14
+
15
+ def initialize
16
+ @docker = Docker::Engine.new
17
+ @volumes = {}
18
+
19
+ key_dir = ENV['CI_PROJECT_DIR'] || Dir.tmpdir
20
+ @ssh_key = Tempfile.new('tunnel-ssh-private-key', key_dir)
21
+ @ssh_key.write(ENV.fetch('TUNNEL_SSH_PRIVATE_KEY'))
22
+ @ssh_key.close
23
+
24
+ File.chmod(0o600, @ssh_key.path)
25
+
26
+ @volumes['/root/.ssh/id_rsa'] = @ssh_key.path
27
+ end
28
+
29
+ def instance
30
+ raise ArgumentError, 'Please provide a block!' unless block_given?
31
+
32
+ prepare
33
+ start
34
+
35
+ yield self
36
+
37
+ teardown
38
+ end
39
+
40
+ def url
41
+ "https://#{subdomain}.#{tunnel_server_hostname}"
42
+ end
43
+
44
+ private
45
+
46
+ def name
47
+ @name ||= "ssh-tunnel-#{SecureRandom.hex(4)}"
48
+ end
49
+
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
+ def tunnel_server_hostname
59
+ ENV.fetch("TUNNEL_SERVER_HOSTNAME")
60
+ end
61
+
62
+ def subdomain
63
+ @subdomain ||= rand(20_000..30_000)
64
+ end
65
+
66
+ def start
67
+ raise "Must set gitlab_hostname" unless @gitlab_hostname
68
+
69
+ @docker.run(DOCKER_IMAGE, DOCKER_IMAGE_TAG, "-o StrictHostKeyChecking=no -N -R #{subdomain}:#{@gitlab_hostname}:80 #{ENV.fetch('TUNNEL_SSH_USER')}@#{tunnel_server_hostname}") do |command|
70
+ command << '-d '
71
+ command << "--name #{name}"
72
+ command << "--net #{network}"
73
+
74
+ @volumes.to_h.each do |to, from|
75
+ command.volume(from, to, 'Z')
76
+ end
77
+ end
78
+ end
79
+
80
+ def restart
81
+ @docker.restart(name)
82
+ end
83
+
84
+ def teardown
85
+ raise 'Invalid instance name!' unless name
86
+
87
+ @docker.stop(name)
88
+ @docker.remove(name)
89
+ @ssh_key.unlink
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -1,3 +1,5 @@
1
+ require 'securerandom'
2
+
1
3
  module Gitlab
2
4
  module QA
3
5
  module Component
@@ -17,17 +19,19 @@ module Gitlab
17
19
 
18
20
  puts "Running test suite `#{suite}` for #{release.project_name}"
19
21
 
22
+ name = "gitlab-#{release.edition}-qa-#{SecureRandom.hex(4)}"
23
+
20
24
  @docker.run(release.qa_image, release.qa_tag, suite, *args) do |command|
21
25
  command << "-t --rm --net=#{network || 'bridge'}"
22
26
 
23
- variables = Runtime::Env.variables
24
- variables.each do |key, value|
27
+ Runtime::Env.variables.each do |key, value|
25
28
  command.env(key, value)
26
29
  end
27
30
 
28
31
  command.volume('/var/run/docker.sock', '/var/run/docker.sock')
29
- command.volume(Runtime::Env.screenshots_dir, '/home/qa/tmp')
30
- command.name("gitlab-specs-#{Time.now.to_i}")
32
+ command.volume(File.join(Runtime::Env.host_artifacts_dir, name), '/home/qa/tmp')
33
+
34
+ command.name(name)
31
35
  end
32
36
  end
33
37
  end
@@ -10,8 +10,14 @@ module Gitlab
10
10
 
11
11
  def self.release
12
12
  version = Version.new(ADDRESS).fetch!
13
+ image =
14
+ if Runtime::Env.dev_access_token_variable
15
+ "dev.gitlab.org:5005/gitlab/omnibus-gitlab/gitlab-ee:#{version}"
16
+ else
17
+ "ee:#{version}"
18
+ end
13
19
 
14
- Release.new("EE:#{version}")
20
+ Release.new(image)
15
21
  rescue InvalidResponseError => ex
16
22
  warn ex.message
17
23
  warn "#{ex.response.code} #{ex.response.message}: #{ex.response.body}"
@@ -5,6 +5,7 @@ module Gitlab
5
5
  CUSTOM_GITLAB_IMAGE_REGEX = %r{/gitlab-(?<edition>[ce]e):(?<tag>.+)\z}
6
6
  DEFAULT_TAG = 'latest'.freeze
7
7
  DEFAULT_CANONICAL_TAG = 'nightly'.freeze
8
+ DEV_REGISTRY = 'dev.gitlab.org:5005'.freeze
8
9
 
9
10
  attr_reader :release
10
11
  attr_writer :tag
@@ -72,6 +73,10 @@ module Gitlab
72
73
  tag.sub(/\.([ce]e)/, '-\1').sub(/\.(\d+)\z/, '')
73
74
  end
74
75
 
76
+ def dev_gitlab_org?
77
+ image.start_with?(DEV_REGISTRY)
78
+ end
79
+
75
80
  private
76
81
 
77
82
  def canonical?
@@ -1,3 +1,5 @@
1
+ require 'securerandom'
2
+
1
3
  module Gitlab
2
4
  module QA
3
5
  module Runtime
@@ -14,23 +16,31 @@ module Gitlab
14
16
  'GITLAB_QA_ACCESS_TOKEN' => :qa_access_token,
15
17
  'GITHUB_ACCESS_TOKEN' => :github_access_token,
16
18
  'GITLAB_URL' => :gitlab_url,
17
- 'EE_LICENSE' => :ee_license
19
+ 'EE_LICENSE' => :ee_license,
20
+ 'GCLOUD_ACCOUNT_EMAIL' => :gcloud_account_email,
21
+ 'GCLOUD_ACCOUNT_KEY' => :gcloud_account_key,
22
+ 'CLOUDSDK_CORE_PROJECT' => :cloudsdk_core_project,
23
+ 'GCLOUD_ZONE' => :gcloud_zone
18
24
  }.freeze
19
25
 
20
26
  ENV_VARIABLES.each_value do |accessor|
21
27
  send(:attr_accessor, accessor) # rubocop:disable GitlabSecurity/PublicSend
22
28
  end
23
29
 
30
+ def run_id
31
+ @run_id ||= "gitlab-qa-run-#{Time.now.strftime('%Y-%m-%d-%H-%M-%S')}-#{SecureRandom.hex(4)}"
32
+ end
33
+
24
34
  def qa_access_token
25
35
  ENV['GITLAB_QA_ACCESS_TOKEN']
26
36
  end
27
37
 
28
- def screenshots_dir
29
- ENV['QA_SCREENSHOTS_DIR'] || '/tmp/gitlab-qa/screenshots'
38
+ def dev_access_token_variable
39
+ env_value_if_defined('GITLAB_QA_DEV_ACCESS_TOKEN')
30
40
  end
31
41
 
32
- def logs_dir
33
- ENV['QA_LOGS_DIR'] || '/tmp/gitlab-qa/logs'
42
+ def host_artifacts_dir
43
+ @host_artifacts_dir ||= File.join(ENV['QA_ARTIFACTS_DIR'] || '/tmp/gitlab-qa', Runtime::Env.run_id)
34
44
  end
35
45
 
36
46
  def variables
@@ -64,6 +74,12 @@ module Gitlab
64
74
  raise ArgumentError, "Please provide GITLAB_QA_ACCESS_TOKEN"
65
75
  end
66
76
 
77
+ def require_kubernetes_environment!
78
+ %w[GCLOUD_ACCOUNT_EMAIL GCLOUD_ACCOUNT_KEY CLOUDSDK_CORE_PROJECT GCLOUD_ZONE].each do |env_key|
79
+ raise ArgumentError, "Environment variable #{env_key} must be set to run kubernetes specs" unless ENV.key?(env_key)
80
+ end
81
+ end
82
+
67
83
  private
68
84
 
69
85
  def env_value_if_defined(variable)
@@ -7,15 +7,26 @@ module Gitlab
7
7
  # Run test suite against staging.gitlab.com
8
8
  #
9
9
  class Staging < Scenario::Template
10
- def perform(*)
10
+ def perform(*rspec_args)
11
11
  Runtime::Env.require_no_license!
12
12
 
13
13
  release = Component::Staging.release
14
14
 
15
+ if release.dev_gitlab_org?
16
+ Docker::Command.execute(
17
+ [
18
+ 'login',
19
+ '--username gitlab-qa-bot',
20
+ %(--password "#{Runtime::Env.dev_access_token_variable}"),
21
+ Release::DEV_REGISTRY
22
+ ]
23
+ )
24
+ end
25
+
15
26
  Component::Specs.perform do |specs|
16
27
  specs.suite = 'Test::Instance'
17
28
  specs.release = release
18
- specs.args = [Component::Staging::ADDRESS]
29
+ specs.args = [Component::Staging::ADDRESS, *rspec_args]
19
30
  end
20
31
  end
21
32
  end
@@ -0,0 +1,56 @@
1
+ require 'yaml'
2
+
3
+ module Gitlab
4
+ module QA
5
+ module Scenario
6
+ module Test
7
+ module Integration
8
+ class Kubernetes < Scenario::Template
9
+ # rubocop:disable Metrics/AbcSize
10
+ def perform(release)
11
+ Runtime::Env.require_kubernetes_environment!
12
+
13
+ Component::Gitlab.perform do |gitlab|
14
+ gitlab.release = release
15
+ gitlab.network = 'test'
16
+
17
+ Component::InternetTunnel.perform do |tunnel_gitlab|
18
+ Component::InternetTunnel.perform do |tunnel_registry|
19
+ tunnel_gitlab.gitlab_hostname = gitlab.hostname
20
+ tunnel_gitlab.network = 'test'
21
+ tunnel_registry.gitlab_hostname = gitlab.hostname
22
+ tunnel_registry.network = 'test'
23
+
24
+ gitlab.omnibus_config = <<~OMNIBUS
25
+ external_url '#{tunnel_gitlab.url}';
26
+ nginx['listen_port'] = 80;
27
+ nginx['listen_https'] = false;
28
+
29
+ registry_external_url '#{tunnel_registry.url}';
30
+ registry_nginx['listen_port'] = 80;
31
+ registry_nginx['listen_https'] = false;
32
+ OMNIBUS
33
+
34
+ tunnel_gitlab.instance do
35
+ tunnel_registry.instance do
36
+ gitlab.instance do
37
+ Component::Specs.perform do |specs|
38
+ specs.suite = 'Test::Integration::Kubernetes'
39
+ specs.release = gitlab.release
40
+ specs.network = gitlab.network
41
+ specs.args = [tunnel_gitlab.url]
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ # rubocop:enable Metrics/AbcSize
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -7,11 +7,9 @@ module Gitlab
7
7
  module Test
8
8
  module Omnibus
9
9
  class Update < Scenario::Template
10
- def perform(previous_edition, next_edition = nil)
11
- next_edition ||= previous_edition
12
-
13
- previous_release = Release.new(previous_edition).previous_stable
14
- next_release = Release.new(next_edition)
10
+ def perform(from_release, to_release = nil)
11
+ previous_release = Release.new(from_release).previous_stable
12
+ current_release = Release.new(to_release || from_release)
15
13
 
16
14
  Docker::Volumes.new.with_temporary_volumes do |volumes|
17
15
  Scenario::Test::Instance::Image
@@ -20,7 +18,7 @@ module Gitlab
20
18
  end
21
19
 
22
20
  Scenario::Test::Instance::Image
23
- .perform(next_release) do |scenario|
21
+ .perform(current_release) do |scenario|
24
22
  scenario.volumes = volumes
25
23
  end
26
24
  end
@@ -1,5 +1,5 @@
1
1
  module Gitlab
2
2
  module QA
3
- VERSION = '1.0.1'.freeze
3
+ VERSION = '2.0.0'.freeze
4
4
  end
5
5
  end
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: 1.0.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Grzegorz Bizon
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-07-05 00:00:00.000000000 Z
11
+ date: 2018-07-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: climate_control
@@ -133,7 +133,7 @@ files:
133
133
  - docs/README.md
134
134
  - docs/architecture.md
135
135
  - docs/how_it_works.md
136
- - docs/run_geo_qa_against_gdk.md
136
+ - docs/run_qa_against_gdk.md
137
137
  - docs/trainings.md
138
138
  - docs/waits.md
139
139
  - docs/what_tests_can_be_run.md
@@ -142,6 +142,7 @@ files:
142
142
  - gitlab-qa.gemspec
143
143
  - lib/gitlab/qa.rb
144
144
  - lib/gitlab/qa/component/gitlab.rb
145
+ - lib/gitlab/qa/component/internet_tunnel.rb
145
146
  - lib/gitlab/qa/component/ldap.rb
146
147
  - lib/gitlab/qa/component/specs.rb
147
148
  - lib/gitlab/qa/component/staging.rb
@@ -157,6 +158,7 @@ files:
157
158
  - lib/gitlab/qa/scenario/test/instance/image.rb
158
159
  - lib/gitlab/qa/scenario/test/instance/staging.rb
159
160
  - lib/gitlab/qa/scenario/test/integration/geo.rb
161
+ - lib/gitlab/qa/scenario/test/integration/kubernetes.rb
160
162
  - lib/gitlab/qa/scenario/test/integration/ldap.rb
161
163
  - lib/gitlab/qa/scenario/test/integration/mattermost.rb
162
164
  - lib/gitlab/qa/scenario/test/omnibus/image.rb