gitlab-qa 7.33.0 → 7.36.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitlab/ci/jobs/registry_with_cdn.gitlab-ci.yml +12 -0
- data/.rubocop_todo.yml +0 -7
- data/Dangerfile +2 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +1 -1
- data/Rakefile +2 -0
- data/exe/gitlab-qa +1 -0
- data/exe/gitlab-qa-report +1 -0
- data/lib/gitlab/qa/component/base.rb +3 -1
- data/lib/gitlab/qa/component/elasticsearch.rb +3 -1
- data/lib/gitlab/qa/component/gitlab.rb +42 -24
- data/lib/gitlab/qa/component/internet_tunnel.rb +4 -2
- data/lib/gitlab/qa/component/jira.rb +4 -2
- data/lib/gitlab/qa/component/mail_hog.rb +3 -2
- data/lib/gitlab/qa/component/minio.rb +7 -5
- data/lib/gitlab/qa/component/postgresql.rb +4 -2
- data/lib/gitlab/qa/component/preprod.rb +3 -1
- data/lib/gitlab/qa/component/production.rb +3 -1
- data/lib/gitlab/qa/component/release.rb +3 -1
- data/lib/gitlab/qa/component/saml.rb +4 -2
- data/lib/gitlab/qa/component/specs.rb +2 -0
- data/lib/gitlab/qa/component/staging.rb +4 -2
- data/lib/gitlab/qa/component/staging_ref.rb +4 -2
- data/lib/gitlab/qa/docker/command.rb +7 -1
- data/lib/gitlab/qa/docker/engine.rb +10 -0
- data/lib/gitlab/qa/docker/shellout.rb +24 -14
- data/lib/gitlab/qa/docker/volumes.rb +3 -1
- data/lib/gitlab/qa/release.rb +6 -4
- data/lib/gitlab/qa/report/prepare_stage_reports.rb +2 -0
- data/lib/gitlab/qa/report/summary_table.rb +2 -0
- data/lib/gitlab/qa/report/update_screenshot_path.rb +2 -0
- data/lib/gitlab/qa/reporter.rb +2 -0
- data/lib/gitlab/qa/runtime/env.rb +9 -4
- data/lib/gitlab/qa/scenario/actable.rb +2 -0
- data/lib/gitlab/qa/scenario/cli_commands.rb +3 -1
- data/lib/gitlab/qa/scenario/template.rb +2 -0
- data/lib/gitlab/qa/scenario/test/instance/airgapped.rb +2 -0
- data/lib/gitlab/qa/scenario/test/instance/any.rb +2 -0
- data/lib/gitlab/qa/scenario/test/instance/deployment_base.rb +2 -0
- data/lib/gitlab/qa/scenario/test/instance/geo.rb +2 -0
- data/lib/gitlab/qa/scenario/test/instance/image.rb +2 -0
- data/lib/gitlab/qa/scenario/test/instance/preprod.rb +2 -0
- data/lib/gitlab/qa/scenario/test/instance/production.rb +2 -0
- data/lib/gitlab/qa/scenario/test/instance/relative_url.rb +2 -0
- data/lib/gitlab/qa/scenario/test/instance/release.rb +2 -0
- data/lib/gitlab/qa/scenario/test/instance/repository_storage.rb +2 -0
- data/lib/gitlab/qa/scenario/test/instance/smoke.rb +2 -0
- data/lib/gitlab/qa/scenario/test/instance/staging.rb +2 -0
- data/lib/gitlab/qa/scenario/test/instance/staging_geo.rb +2 -0
- data/lib/gitlab/qa/scenario/test/instance/staging_ref.rb +2 -0
- data/lib/gitlab/qa/scenario/test/instance/staging_ref_geo.rb +2 -0
- data/lib/gitlab/qa/scenario/test/integration/client_ssl.rb +2 -0
- data/lib/gitlab/qa/scenario/test/integration/elasticsearch.rb +2 -0
- data/lib/gitlab/qa/scenario/test/integration/geo.rb +2 -0
- data/lib/gitlab/qa/scenario/test/integration/gitaly_cluster.rb +51 -27
- data/lib/gitlab/qa/scenario/test/integration/group_saml.rb +2 -0
- data/lib/gitlab/qa/scenario/test/integration/instance_saml.rb +2 -0
- data/lib/gitlab/qa/scenario/test/integration/jira.rb +2 -0
- data/lib/gitlab/qa/scenario/test/integration/kubernetes.rb +2 -0
- data/lib/gitlab/qa/scenario/test/integration/ldap.rb +8 -6
- data/lib/gitlab/qa/scenario/test/integration/ldap_no_server.rb +2 -0
- data/lib/gitlab/qa/scenario/test/integration/ldap_no_tls.rb +2 -0
- data/lib/gitlab/qa/scenario/test/integration/ldap_tls.rb +2 -0
- data/lib/gitlab/qa/scenario/test/integration/mattermost.rb +2 -0
- data/lib/gitlab/qa/scenario/test/integration/mtls.rb +2 -0
- data/lib/gitlab/qa/scenario/test/integration/praefect.rb +2 -0
- data/lib/gitlab/qa/scenario/test/integration/saml.rb +2 -0
- data/lib/gitlab/qa/scenario/test/integration/smtp.rb +2 -0
- data/lib/gitlab/qa/scenario/test/omnibus/image.rb +2 -0
- data/lib/gitlab/qa/scenario/test/omnibus/update.rb +2 -0
- data/lib/gitlab/qa/scenario/test/omnibus/upgrade.rb +2 -0
- data/lib/gitlab/qa/scenario/test/sanity/version.rb +2 -0
- data/lib/gitlab/qa/slack/post_to_slack.rb +2 -0
- data/lib/gitlab/qa/support/dev_ee_qa_image.rb +3 -1
- data/lib/gitlab/qa/support/get_request.rb +2 -0
- data/lib/gitlab/qa/support/http_request.rb +2 -0
- data/lib/gitlab/qa/support/invalid_response_error.rb +2 -0
- data/lib/gitlab/qa/version.rb +1 -1
- data/lib/gitlab/qa.rb +4 -0
- data/scripts/generate-qa-jobs.rb +1 -0
- data/support/data/admin_access_token_seed.rb +1 -1
- data/support/data/license_usage_seed.rb +2 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2da1e99ac1095fa5fdf7957a6d410be0d87147448008d157a297ac3dccf07372
|
4
|
+
data.tar.gz: d023d3fd12d927539f8d98e27fad01f679412902ba70c57d902475f7371c061c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bd5d590c1c0a108fc6d53bf58107cff1fdda671bb3c091a039e089e8b7983b81c630b56c8bea18a0959d67fc0486de5f2dbfd37eda6b88390d0ea7edb3c83b66
|
7
|
+
data.tar.gz: 40b458826df1197871a7c4b630cd38dbe1b3591f7d2405a1f3113a18d61814c9728d98be4158c70f3c741140c2f5bf7d828ec6de873cbb75208fe315e52ff545
|
@@ -1,4 +1,7 @@
|
|
1
1
|
ce:registry_with_cdn:
|
2
|
+
before_script:
|
3
|
+
- unset GITLAB_QA_ADMIN_ACCESS_TOKEN
|
4
|
+
- !reference [default, before_script]
|
2
5
|
extends:
|
3
6
|
- .rules:ce-never-when-triggered-by-feature-flag-definition-change
|
4
7
|
- .test
|
@@ -10,6 +13,9 @@ ce:registry_with_cdn:
|
|
10
13
|
allow_failure: true
|
11
14
|
|
12
15
|
ce:registry_with_cdn-quarantine:
|
16
|
+
before_script:
|
17
|
+
- unset GITLAB_QA_ADMIN_ACCESS_TOKEN
|
18
|
+
- !reference [default, before_script]
|
13
19
|
extends:
|
14
20
|
- .rules:ce-never-when-triggered-by-feature-flag-definition-change
|
15
21
|
- .test
|
@@ -21,6 +27,9 @@ ce:registry_with_cdn-quarantine:
|
|
21
27
|
QA_SCENARIO: "Test::Integration::RegistryWithCDN"
|
22
28
|
|
23
29
|
ee:registry_with_cdn:
|
30
|
+
before_script:
|
31
|
+
- unset GITLAB_QA_ADMIN_ACCESS_TOKEN
|
32
|
+
- !reference [default, before_script]
|
24
33
|
extends:
|
25
34
|
- .rules:ee-never-when-triggered-by-feature-flag-definition-change
|
26
35
|
- .test
|
@@ -32,6 +41,9 @@ ee:registry_with_cdn:
|
|
32
41
|
allow_failure: true
|
33
42
|
|
34
43
|
ee:registry_with_cdn-quarantine:
|
44
|
+
before_script:
|
45
|
+
- unset GITLAB_QA_ADMIN_ACCESS_TOKEN
|
46
|
+
- !reference [default, before_script]
|
35
47
|
extends:
|
36
48
|
- .rules:ee-never-when-triggered-by-feature-flag-definition-change
|
37
49
|
- .test
|
data/.rubocop_todo.yml
CHANGED
@@ -95,13 +95,6 @@ Style/ExplicitBlockArgument:
|
|
95
95
|
Exclude:
|
96
96
|
- 'lib/gitlab/qa/scenario/test/integration/ldap.rb'
|
97
97
|
|
98
|
-
# Offense count: 86
|
99
|
-
# Cop supports --auto-correct.
|
100
|
-
# Configuration parameters: EnforcedStyle.
|
101
|
-
# SupportedStyles: always, always_true, never
|
102
|
-
Style/FrozenStringLiteralComment:
|
103
|
-
Enabled: false
|
104
|
-
|
105
98
|
# Offense count: 1
|
106
99
|
# Cop supports --auto-correct.
|
107
100
|
Style/HashTransformKeys:
|
data/Dangerfile
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/Rakefile
CHANGED
data/exe/gitlab-qa
CHANGED
data/exe/gitlab-qa-report
CHANGED
@@ -155,7 +155,9 @@ module Gitlab
|
|
155
155
|
rescue Docker::Shellout::StatusError => e
|
156
156
|
# for scenarios where a service fails during startup, attempt to retry to avoid flaky failures
|
157
157
|
if (retries += 1) < 3
|
158
|
-
|
158
|
+
Runtime::Logger.warn(
|
159
|
+
"Retry instance_no_teardown due to Docker::Shellout::StatusError -- attempt #{retries}"
|
160
|
+
)
|
159
161
|
teardown!
|
160
162
|
retry
|
161
163
|
end
|
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Gitlab
|
2
4
|
module QA
|
3
5
|
module Component
|
4
6
|
class Elasticsearch < Base
|
5
|
-
DOCKER_IMAGE = 'docker.elastic.co/elasticsearch/elasticsearch'
|
7
|
+
DOCKER_IMAGE = 'docker.elastic.co/elasticsearch/elasticsearch'
|
6
8
|
|
7
9
|
def name
|
8
10
|
@name ||= "elastic68"
|
@@ -13,6 +13,7 @@ module Gitlab
|
|
13
13
|
module Component
|
14
14
|
class Gitlab < Base
|
15
15
|
extend Forwardable
|
16
|
+
using Rainbow
|
16
17
|
|
17
18
|
attr_reader :release, :omnibus_configuration, :omnibus_gitlab_rails_env
|
18
19
|
attr_accessor :tls, :skip_availability_check, :runner_network, :seed_admin_token, :seed_db
|
@@ -121,8 +122,9 @@ module Gitlab
|
|
121
122
|
def prepare_gitlab_omnibus_config
|
122
123
|
set_formless_login_token
|
123
124
|
set_license_mode
|
125
|
+
return if omnibus_gitlab_rails_env.empty?
|
124
126
|
|
125
|
-
@omnibus_configuration << "gitlab_rails['env'] = #{@omnibus_gitlab_rails_env}"
|
127
|
+
@omnibus_configuration << "gitlab_rails['env'] = #{@omnibus_gitlab_rails_env}"
|
126
128
|
end
|
127
129
|
|
128
130
|
def start # rubocop:disable Metrics/AbcSize
|
@@ -148,7 +150,12 @@ module Gitlab
|
|
148
150
|
command << "--network-alias #{network_alias}"
|
149
151
|
end
|
150
152
|
end
|
151
|
-
|
153
|
+
|
154
|
+
return unless runner_network
|
155
|
+
|
156
|
+
Docker::Command.execute(
|
157
|
+
"network connect --alias #{name}.#{network} --alias #{name}.#{runner_network} #{runner_network} #{name}"
|
158
|
+
)
|
152
159
|
end
|
153
160
|
|
154
161
|
def reconfigure
|
@@ -163,10 +170,19 @@ module Gitlab
|
|
163
170
|
def wait_until_ready
|
164
171
|
return if skip_availability_check
|
165
172
|
|
166
|
-
|
167
|
-
|
173
|
+
availability = Availability.new(
|
174
|
+
name,
|
175
|
+
relative_path: relative_path,
|
176
|
+
scheme: scheme,
|
177
|
+
protocol_port: port.to_i
|
178
|
+
)
|
179
|
+
|
180
|
+
Runtime::Logger.info("Waiting for GitLab to become healthy ...")
|
181
|
+
|
182
|
+
if availability.check(Runtime::Env.gitlab_availability_timeout)
|
183
|
+
Runtime::Logger.info("-> GitLab is available at `#{availability.uri}`!".bright)
|
168
184
|
else
|
169
|
-
abort '
|
185
|
+
abort '-> GitLab unavailable!'.red
|
170
186
|
end
|
171
187
|
end
|
172
188
|
|
@@ -260,7 +276,10 @@ module Gitlab
|
|
260
276
|
[
|
261
277
|
@docker.exec(name, 'mkdir -p /opt/gitlab/embedded/service/gitlab-shell/hooks/pre-receive.d'),
|
262
278
|
@docker.write_files(name) do |f|
|
263
|
-
f.write(
|
279
|
+
f.write(
|
280
|
+
'/opt/gitlab/embedded/service/gitlab-shell/hooks/pre-receive.d/pre-receive.d',
|
281
|
+
global_server_prereceive_hook, false
|
282
|
+
)
|
264
283
|
end,
|
265
284
|
@docker.exec(name, 'chmod +x /opt/gitlab/embedded/service/gitlab-shell/hooks/pre-receive.d/*')
|
266
285
|
]
|
@@ -270,42 +289,41 @@ module Gitlab
|
|
270
289
|
def initialize(name, relative_path: '', scheme: 'http', protocol_port: 80)
|
271
290
|
@docker = Docker::Engine.new
|
272
291
|
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
@
|
292
|
+
@name = name
|
293
|
+
@scheme = scheme
|
294
|
+
@relative_path = relative_path
|
295
|
+
@protocol_port = protocol_port
|
277
296
|
end
|
278
297
|
|
279
298
|
def check(retries)
|
280
|
-
print "Waiting for GitLab at `#{@uri}` to become available "
|
281
|
-
|
282
299
|
retries.times do
|
283
300
|
return true if service_available?
|
284
301
|
|
285
|
-
print '.'
|
286
302
|
sleep 1
|
287
303
|
end
|
288
304
|
|
289
305
|
false
|
290
306
|
end
|
291
307
|
|
308
|
+
def uri
|
309
|
+
@uri ||= begin
|
310
|
+
port = docker.port(name, protocol_port).split(':').last
|
311
|
+
|
312
|
+
URI.join("#{scheme}://#{docker.hostname}:#{port}", relative_path)
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
292
316
|
private
|
293
317
|
|
318
|
+
attr_reader :docker, :name, :relative_path, :scheme, :protocol_port
|
319
|
+
|
294
320
|
def service_available?
|
295
|
-
|
296
|
-
http.head2(@uri.request_uri)
|
297
|
-
end
|
321
|
+
output = docker.inspect(name) { |command| command << "--format='{{json .State.Health.Status}}'" }
|
298
322
|
|
299
|
-
|
300
|
-
|
301
|
-
rescue Errno::ECONNREFUSED, Errno::ECONNRESET, EOFError => e
|
302
|
-
print e.message
|
323
|
+
output == '"healthy"'
|
324
|
+
rescue Docker::Shellout::StatusError
|
303
325
|
false
|
304
326
|
end
|
305
|
-
|
306
|
-
def opts
|
307
|
-
@uri.scheme == 'https' ? { use_ssl: true, verify_mode: OpenSSL::SSL::VERIFY_NONE } : {}
|
308
|
-
end
|
309
327
|
end
|
310
328
|
end
|
311
329
|
end
|
@@ -1,11 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'tempfile'
|
2
4
|
|
3
5
|
module Gitlab
|
4
6
|
module QA
|
5
7
|
module Component
|
6
8
|
class InternetTunnel < Base
|
7
|
-
DOCKER_IMAGE = 'gitlab/ssh-tunnel'
|
8
|
-
DOCKER_IMAGE_TAG = '1.0.0'
|
9
|
+
DOCKER_IMAGE = 'gitlab/ssh-tunnel'
|
10
|
+
DOCKER_IMAGE_TAG = '1.0.0'
|
9
11
|
|
10
12
|
attr_writer :gitlab_hostname
|
11
13
|
|
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Gitlab
|
2
4
|
module QA
|
3
5
|
module Component
|
4
6
|
class Jira < Base
|
5
|
-
DOCKER_IMAGE = 'registry.gitlab.com/gitlab-org/gitlab-qa/jira-gitlab'
|
6
|
-
DOCKER_IMAGE_TAG = '8.8-project-and-issue'
|
7
|
+
DOCKER_IMAGE = 'registry.gitlab.com/gitlab-org/gitlab-qa/jira-gitlab'
|
8
|
+
DOCKER_IMAGE_TAG = '8.8-project-and-issue'
|
7
9
|
|
8
10
|
def name
|
9
11
|
@name ||= "jira"
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# This component sets up the MailHog (https://github.com/mailhog/MailHog)
|
2
3
|
# image with the proper configuration for SMTP email delivery from Gitlab
|
3
4
|
|
@@ -5,8 +6,8 @@ module Gitlab
|
|
5
6
|
module QA
|
6
7
|
module Component
|
7
8
|
class MailHog < Base
|
8
|
-
DOCKER_IMAGE = 'mailhog/mailhog'
|
9
|
-
DOCKER_IMAGE_TAG = 'v1.0.0'
|
9
|
+
DOCKER_IMAGE = 'mailhog/mailhog'
|
10
|
+
DOCKER_IMAGE_TAG = 'v1.0.0'
|
10
11
|
|
11
12
|
def name
|
12
13
|
@name ||= "mailhog"
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'securerandom'
|
2
4
|
require 'fileutils'
|
3
5
|
require 'yaml'
|
@@ -8,12 +10,12 @@ module Gitlab
|
|
8
10
|
module QA
|
9
11
|
module Component
|
10
12
|
class Minio < Base
|
11
|
-
DOCKER_IMAGE = 'minio/minio'
|
12
|
-
DOCKER_IMAGE_TAG = 'latest'
|
13
|
+
DOCKER_IMAGE = 'minio/minio'
|
14
|
+
DOCKER_IMAGE_TAG = 'latest'
|
13
15
|
# These are secrets used in a local Minio container, they're not used for any online S3 server.
|
14
|
-
AWS_ACCESS_KEY = 'AKIAIOSFODNN7EXAMPLE'
|
15
|
-
AWS_SECRET_KEY = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'
|
16
|
-
DATA_DIR = '/data'
|
16
|
+
AWS_ACCESS_KEY = 'AKIAIOSFODNN7EXAMPLE'
|
17
|
+
AWS_SECRET_KEY = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'
|
18
|
+
DATA_DIR = '/data'
|
17
19
|
DEFAULT_PORT = 9000
|
18
20
|
|
19
21
|
def initialize
|
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Gitlab
|
2
4
|
module QA
|
3
5
|
module Component
|
4
6
|
class PostgreSQL < Base
|
5
|
-
DOCKER_IMAGE = 'postgres'
|
6
|
-
DOCKER_IMAGE_TAG = '11'
|
7
|
+
DOCKER_IMAGE = 'postgres'
|
8
|
+
DOCKER_IMAGE_TAG = '11'
|
7
9
|
|
8
10
|
def name
|
9
11
|
@name ||= "postgres"
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'securerandom'
|
2
4
|
|
3
5
|
# This component sets up the docker-test-saml-idp (https://github.com/kristophjunge/docker-test-saml-idp)
|
@@ -7,8 +9,8 @@ module Gitlab
|
|
7
9
|
module QA
|
8
10
|
module Component
|
9
11
|
class SAML < Base
|
10
|
-
DOCKER_IMAGE = 'jamedjo/test-saml-idp'
|
11
|
-
DOCKER_IMAGE_TAG = 'latest'
|
12
|
+
DOCKER_IMAGE = 'jamedjo/test-saml-idp'
|
13
|
+
DOCKER_IMAGE_TAG = 'latest'
|
12
14
|
|
13
15
|
def set_entity_id(entity_id)
|
14
16
|
@environment['SIMPLESAMLPHP_SP_ENTITY_ID'] = entity_id
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'net/http'
|
2
4
|
require 'json'
|
3
5
|
require 'uri'
|
@@ -6,8 +8,8 @@ module Gitlab
|
|
6
8
|
module QA
|
7
9
|
module Component
|
8
10
|
class Staging
|
9
|
-
ADDRESS = 'https://staging.gitlab.com'
|
10
|
-
GEO_SECONDARY_ADDRESS = 'https://geo.staging.gitlab.com'
|
11
|
+
ADDRESS = 'https://staging.gitlab.com'
|
12
|
+
GEO_SECONDARY_ADDRESS = 'https://geo.staging.gitlab.com'
|
11
13
|
|
12
14
|
def self.release
|
13
15
|
QA::Release.new(image)
|
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Gitlab
|
2
4
|
module QA
|
3
5
|
module Component
|
4
6
|
class StagingRef < Staging
|
5
|
-
ADDRESS = 'https://staging-ref.gitlab.com'
|
6
|
-
GEO_SECONDARY_ADDRESS = 'https://geo.staging-ref.gitlab.com'
|
7
|
+
ADDRESS = 'https://staging-ref.gitlab.com'
|
8
|
+
GEO_SECONDARY_ADDRESS = 'https://geo.staging-ref.gitlab.com'
|
7
9
|
end
|
8
10
|
end
|
9
11
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Gitlab
|
2
4
|
module QA
|
3
5
|
module Docker
|
@@ -43,7 +45,7 @@ module Gitlab
|
|
43
45
|
#
|
44
46
|
# @return [String] The masked command string
|
45
47
|
def mask_secrets
|
46
|
-
@mask_secrets.each_with_object(to_s) { |secret, s| s.gsub!(secret, '*****') }
|
48
|
+
@mask_secrets.each_with_object(+to_s) { |secret, s| s.gsub!(secret, '*****') }
|
47
49
|
end
|
48
50
|
|
49
51
|
def ==(other)
|
@@ -52,6 +54,10 @@ module Gitlab
|
|
52
54
|
|
53
55
|
def execute!(&block)
|
54
56
|
Docker::Shellout.new(self).execute!(&block)
|
57
|
+
rescue Docker::Shellout::StatusError => e
|
58
|
+
e.set_backtrace([])
|
59
|
+
|
60
|
+
raise e
|
55
61
|
end
|
56
62
|
|
57
63
|
def self.execute(cmd, mask_secrets: nil, &block)
|
@@ -142,6 +142,16 @@ module Gitlab
|
|
142
142
|
Docker::Command.execute(['ps', name].compact.join(' '))
|
143
143
|
end
|
144
144
|
|
145
|
+
def inspect(name)
|
146
|
+
Docker::Command.new('inspect').then do |command|
|
147
|
+
yield command if block_given?
|
148
|
+
|
149
|
+
command << name
|
150
|
+
|
151
|
+
command.execute!
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
145
155
|
private
|
146
156
|
|
147
157
|
def full_image_name(image, tag)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'open3'
|
4
|
-
require '
|
4
|
+
require 'active_support/core_ext/string/filters'
|
5
5
|
|
6
6
|
module Gitlab
|
7
7
|
module QA
|
@@ -17,16 +17,16 @@ module Gitlab
|
|
17
17
|
@logger = Runtime::Logger.logger
|
18
18
|
end
|
19
19
|
|
20
|
-
attr_reader :command, :
|
20
|
+
attr_reader :command, :output
|
21
21
|
|
22
22
|
def execute! # rubocop:disable Metrics/AbcSize
|
23
|
-
raise StatusError, 'Command already executed' if
|
23
|
+
raise StatusError, 'Command already executed' if output.any?
|
24
24
|
|
25
|
-
logger.info("Docker shell command: `#{
|
25
|
+
logger.info("Docker shell command: `#{command.mask_secrets.cyan}`")
|
26
26
|
|
27
27
|
Open3.popen2e(@command.to_s) do |_in, out, wait|
|
28
28
|
out.each do |line|
|
29
|
-
|
29
|
+
output.push(line)
|
30
30
|
|
31
31
|
if stream_progress
|
32
32
|
print "."
|
@@ -36,21 +36,28 @@ module Gitlab
|
|
36
36
|
|
37
37
|
yield line, wait if block_given?
|
38
38
|
end
|
39
|
-
puts if stream_progress
|
39
|
+
puts if stream_progress && !output.empty?
|
40
40
|
|
41
|
-
if wait.value.exited? && wait.value.exitstatus.nonzero?
|
42
|
-
logger.error("Docker shell command output:\n#{output}") unless command.stream_output
|
43
|
-
raise StatusError, "Docker command `#{@command.mask_secrets[0..100]}` failed! ✘"
|
44
|
-
end
|
41
|
+
fail! if wait.value.exited? && wait.value.exitstatus.nonzero?
|
45
42
|
|
46
|
-
logger.debug("Docker shell command output:\n#{
|
43
|
+
logger.debug("Docker shell command output:\n#{string_output}") unless command.stream_output || output.empty?
|
47
44
|
end
|
48
45
|
|
49
|
-
|
46
|
+
string_output
|
50
47
|
end
|
51
48
|
|
52
49
|
private
|
53
50
|
|
51
|
+
attr_reader :logger
|
52
|
+
|
53
|
+
# Raise error and print output to error log level
|
54
|
+
#
|
55
|
+
# @return [void]
|
56
|
+
def fail!
|
57
|
+
logger.error("Docker shell command output:\n#{string_output}") unless command.stream_output
|
58
|
+
raise StatusError, "Docker command `#{command.mask_secrets.truncate(100)}` failed! " + "✘".red
|
59
|
+
end
|
60
|
+
|
54
61
|
# Stream only command execution progress and log output when command finished
|
55
62
|
#
|
56
63
|
# @return [Boolean]
|
@@ -58,8 +65,11 @@ module Gitlab
|
|
58
65
|
!(Runtime::Env.ci || command.stream_output)
|
59
66
|
end
|
60
67
|
|
61
|
-
|
62
|
-
|
68
|
+
# Stringified command output
|
69
|
+
#
|
70
|
+
# @return [String]
|
71
|
+
def string_output
|
72
|
+
output.join.chomp
|
63
73
|
end
|
64
74
|
end
|
65
75
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'tmpdir'
|
2
4
|
|
3
5
|
module Gitlab
|
@@ -7,7 +9,7 @@ module Gitlab
|
|
7
9
|
VOLUMES = { 'config' => '/etc/gitlab',
|
8
10
|
'data' => '/var/opt/gitlab' }.freeze
|
9
11
|
|
10
|
-
QA_CONTAINER_WORKDIR = '/home/gitlab/qa'
|
12
|
+
QA_CONTAINER_WORKDIR = '/home/gitlab/qa'
|
11
13
|
|
12
14
|
def initialize(volumes = VOLUMES)
|
13
15
|
@volumes = volumes
|
data/lib/gitlab/qa/release.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Gitlab
|
2
4
|
module QA
|
3
5
|
class Release
|
@@ -49,10 +51,10 @@ module Gitlab
|
|
49
51
|
\z
|
50
52
|
/xi
|
51
53
|
|
52
|
-
DEFAULT_TAG = 'latest'
|
53
|
-
DEFAULT_CANONICAL_TAG = 'nightly'
|
54
|
-
DEV_REGISTRY = 'dev.gitlab.org:5005'
|
55
|
-
COM_REGISTRY = 'registry.gitlab.com'
|
54
|
+
DEFAULT_TAG = 'latest'
|
55
|
+
DEFAULT_CANONICAL_TAG = 'nightly'
|
56
|
+
DEV_REGISTRY = 'dev.gitlab.org:5005'
|
57
|
+
COM_REGISTRY = 'registry.gitlab.com'
|
56
58
|
|
57
59
|
InvalidImageNameError = Class.new(RuntimeError)
|
58
60
|
|