gitlab-qa 5.13.4 → 5.14.1

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: 03d6616c7add937d18759fbccacdd71b5c988986b786b118702534e69148eaf4
4
- data.tar.gz: 2c586c2bd61b1562b10b538fb15f5a7d3e3443657a7270bc65381e6af37b2ea3
3
+ metadata.gz: 80b5afa85b80b6c367a00f9e0077782d761bf5ad69d851aa95e5ea4f7ec4af78
4
+ data.tar.gz: b6940307fb5981a4f7c4468be522916ae4a01f2e65ddb0a5847037ce7099556f
5
5
  SHA512:
6
- metadata.gz: bae9f63159c042699b10d8bd0d61abb4254846af3d427d958ca31dd1b0e8fc3e5eef60e735e737814fb8612f5177921cf856f56bd0e4e447dbca09027c621637
7
- data.tar.gz: ad061dc8fdfb338710e5286918084303e2eb5c3d2da087b0e79029ed26d913eb65e4deb1711e0025e7b2edb34d188d29bceb44a176b46c9b0f5e0e6a8fafd91d
6
+ metadata.gz: 95347f6df44ef53110ac29177e3373fecba8d0ea2535f5a642233519c87d4c97edef9120d6a48e22b05739a00e4b01eccd090743894f1f0db52ba6a1ee4e0995
7
+ data.tar.gz: a688557eb3fb7738f7288dfbd18bf804fbfdbf668ffd1e17f155f1df3fce5b38b5618af10460355f516e26091e93f290651f364ac5f09531827c6a06b4b0fee5
@@ -31,6 +31,8 @@ workflow:
31
31
  - if: '$CI_COMMIT_BRANCH == "master"'
32
32
  # For tags, create a pipeline.
33
33
  - if: '$CI_COMMIT_TAG'
34
+ # For triggers from GitLab MR pipelines (and pipelines from other projects), create a pipeline
35
+ - if: '$CI_PIPELINE_SOURCE == "pipeline"'
34
36
 
35
37
  .default-rules:
36
38
  rules:
@@ -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,14 +57,14 @@ 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` |- | 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` |- | Set to `false` to skip tests that require admin access. | No|
67
- | `QA_CAN_TEST_PRAEFECT` |- | Set to `false` to skip tests that require Praefect to be running. | No|
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|
@@ -618,6 +618,21 @@ $ export QA_ADDITIONAL_REPOSITORY_STORAGE=secondary
618
618
  $ gitlab-qa Test::Instance::RepositoryStorage
619
619
  ```
620
620
 
621
+ ### `Test::Instance::Airgapped`
622
+
623
+ This scenario will run tests from the test suite against an airgapped instance.
624
+ The airgapped instance is set up by using `iptables` in the GitLab container to block network traffic other than testable ports, and by using runners
625
+ in a shared internal network.
626
+
627
+ Example:
628
+
629
+ ```
630
+ # For EE
631
+ $ export EE_LICENSE=$(cat /path/to/gitlab_license)
632
+
633
+ $ gitlab-qa Test::Instance::Airgapped EE -- --tag smoke
634
+ ```
635
+
621
636
  ----
622
637
 
623
638
  [Back to README.md](../README.md)
@@ -29,6 +29,7 @@ module Gitlab
29
29
  autoload :Release, 'gitlab/qa/scenario/test/instance/release'
30
30
  autoload :Geo, 'gitlab/qa/scenario/test/instance/geo'
31
31
  autoload :StagingGeo, 'gitlab/qa/scenario/test/instance/staging_geo'
32
+ autoload :Airgapped, 'gitlab/qa/scenario/test/instance/airgapped'
32
33
  end
33
34
 
34
35
  module Omnibus
@@ -5,7 +5,7 @@ module Gitlab
5
5
  include Scenario::Actable
6
6
 
7
7
  attr_reader :docker
8
- attr_accessor :volumes, :network, :environment
8
+ attr_accessor :volumes, :network, :environment, :runner_network
9
9
  attr_writer :name, :exec_commands
10
10
 
11
11
  def initialize
@@ -67,6 +67,10 @@ module Gitlab
67
67
  end
68
68
 
69
69
  def prepare_network
70
+ if runner_network && !docker.network_exists?(runner_network)
71
+ docker.network_create("--driver=bridge --internal #{runner_network}")
72
+ end
73
+
70
74
  return if docker.network_exists?(network)
71
75
 
72
76
  docker.network_create(network)
@@ -11,7 +11,7 @@ module Gitlab
11
11
  extend Forwardable
12
12
 
13
13
  attr_reader :release
14
- attr_accessor :tls, :disable_animations, :skip_availability_check
14
+ attr_accessor :tls, :disable_animations, :skip_availability_check, :runner_network
15
15
  attr_writer :name, :relative_path
16
16
 
17
17
  def_delegators :release, :tag, :image, :edition
@@ -116,6 +116,7 @@ module Gitlab
116
116
  command << "--network-alias #{network_alias}"
117
117
  end
118
118
  end
119
+ Docker::Command.execute("network connect --alias #{name}.#{network} --alias #{name}.#{runner_network} #{runner_network} #{name}") if runner_network
119
120
  end
120
121
 
121
122
  def reconfigure
@@ -8,7 +8,7 @@ module Gitlab
8
8
  # the `qa/` directory located in GitLab CE / EE repositories.
9
9
  #
10
10
  class Specs < Scenario::Template
11
- attr_accessor :suite, :release, :network, :args, :volumes, :env
11
+ attr_accessor :suite, :release, :network, :args, :volumes, :env, :runner_network
12
12
 
13
13
  def initialize
14
14
  @docker = Docker::Engine.new
@@ -19,6 +19,8 @@ module Gitlab
19
19
  def perform # rubocop:disable Metrics/AbcSize
20
20
  raise ArgumentError unless [suite, release].all?
21
21
 
22
+ @docker.login(**release.login_params) if release.login_params
23
+
22
24
  puts "Running test suite `#{suite}` for #{release.project_name}"
23
25
 
24
26
  name = "#{release.project_name}-qa-#{SecureRandom.hex(4)}"
@@ -3,13 +3,14 @@ module Gitlab
3
3
  module Docker
4
4
  class Engine
5
5
  DOCKER_HOST = ENV['DOCKER_HOST'] || 'http://localhost'
6
+ PRIVILEGED_COMMANDS = [/^iptables.*/].freeze
6
7
 
7
8
  def hostname
8
9
  URI(DOCKER_HOST).host
9
10
  end
10
11
 
11
12
  def login(username:, password:, registry:)
12
- Docker::Command.execute("login --username '#{username}' --password '#{password}' #{registry}")
13
+ Docker::Command.execute(%(login --username "#{username}" --password "#{password}" #{registry}))
13
14
  end
14
15
 
15
16
  def pull(image, tag)
@@ -27,8 +28,18 @@ module Gitlab
27
28
  end
28
29
  end
29
30
 
31
+ def privileged_command?(command)
32
+ PRIVILEGED_COMMANDS.each do |privileged_regex|
33
+ return true if command.match(privileged_regex)
34
+ end
35
+
36
+ false
37
+ end
38
+
30
39
  def exec(name, command)
31
- Docker::Command.execute("exec #{name} bash -c '#{command}'")
40
+ cmd = ['exec']
41
+ cmd << '--privileged' if privileged_command?(command)
42
+ Docker::Command.execute("#{cmd.join(' ')} #{name} bash -c '#{command}'")
32
43
  end
33
44
 
34
45
  def read_file(image, tag, path, &block)
@@ -145,11 +145,17 @@ module Gitlab
145
145
  registry: DEV_REGISTRY
146
146
  }
147
147
  elsif omnibus_mirror?
148
- Runtime::Env.require_gitlab_bot_multi_project_pipeline_polling_token!
148
+ username, password = if Runtime::Env.ci_job_token
149
+ ['gitlab-ci-token', Runtime::Env.ci_job_token]
150
+ else
151
+ Runtime::Env.require_qa_access_token!
152
+
153
+ [Runtime::Env.gitlab_username, Runtime::Env.qa_access_token]
154
+ end
149
155
 
150
156
  {
151
- username: Runtime::Env.gitlab_username,
152
- password: Runtime::Env.gitlab_bot_multi_project_pipeline_polling_token,
157
+ username: username,
158
+ password: password,
153
159
  registry: COM_REGISTRY
154
160
  }
155
161
  end
@@ -104,6 +104,10 @@ module Gitlab
104
104
  ENV['CI_JOB_NAME']
105
105
  end
106
106
 
107
+ def ci_job_token
108
+ ENV['CI_JOB_TOKEN']
109
+ end
110
+
107
111
  def ci_job_url
108
112
  ENV['CI_JOB_URL']
109
113
  end
@@ -207,12 +211,6 @@ module Gitlab
207
211
  end
208
212
  end
209
213
 
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
-
216
214
  def skip_pull?
217
215
  enabled?(ENV['QA_SKIP_PULL'], default: false)
218
216
  end
@@ -0,0 +1,68 @@
1
+ module Gitlab
2
+ module QA
3
+ module Scenario
4
+ module Test
5
+ module Instance
6
+ class Airgapped < Scenario::Template
7
+ require 'resolv'
8
+ attr_accessor :commands
9
+
10
+ def initialize
11
+ gitlab_ip = Resolv.getaddress('registry.gitlab.com')
12
+ @commands = <<~AIRGAP_AND_VERIFY_COMMAND.split(/\n+/)
13
+ # Should not fail before airgapping due to eg. DNS failure
14
+ # Ping and wget check
15
+ apt-get update && apt-get install -y iptables netcat
16
+ nc -zv -w 10 #{gitlab_ip} 80 && (echo \"Regular connectivity netcat check passed.\" && exit 0) || (echo \"Regular connectivity netcat check failed.\" && exit 1)
17
+ echo "Checking regular connectivity..." \
18
+ && wget --retry-connrefused --waitretry=1 --read-timeout=15 --timeout=10 -t 2 http://registry.gitlab.com > /dev/null 2>&1 \
19
+ && (echo "Regular connectivity wget check passed." && exit 0) || (echo "Regular connectivity wget check failed." && exit 1)
20
+
21
+ iptables -P INPUT DROP && iptables -P OUTPUT DROP
22
+ iptables -A INPUT -i lo -j ACCEPT && iptables -A OUTPUT -o lo -j ACCEPT # LOOPBACK
23
+ iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
24
+ iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
25
+
26
+ # Jenkins on port 8080 and 50000
27
+ iptables -A OUTPUT -p tcp -m tcp --dport 8080 -m state --state NEW,ESTABLISHED -j ACCEPT \
28
+ && iptables -A OUTPUT -p tcp -m tcp --dport 50000 -m state --state NEW,ESTABLISHED -j ACCEPT
29
+ iptables -A OUTPUT -p tcp -m tcp --sport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
30
+ iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
31
+ iptables -A OUTPUT -p tcp -m tcp --sport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
32
+ iptables -A INPUT -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
33
+
34
+ # Should now fail to ping and wget, port 80 should be open
35
+ nc -zv -w 10 #{gitlab_ip} 80 && (echo \"Airgapped network faulty. Connectivity netcat check failed.\" && exit 1) || (echo \"Connectivity netcat check passed.\" && exit 0)
36
+ nc -zv -w 10 127.0.0.1 22 && (echo "Airgapped connectivity port 22 check passed." && exit 0) || (echo "Airgapped connectivity port 22 check failed." && exit 1)
37
+ nc -zv -w 10 127.0.0.1 80 && (echo "Airgapped connectivity port 80 check passed." && exit 0) || (echo "Airgapped connectivity port 80 check failed." && exit 1)
38
+ echo "Checking airgapped connectivity..." \
39
+ && wget --retry-connrefused --waitretry=1 --read-timeout=15 --timeout=10 -t 2 http://registry.gitlab.com > /dev/null 2>&1 \
40
+ && (echo "Airgapped network faulty. Connectivity wget check failed." && exit 1) || (echo "Airgapped network confirmed. Connectivity wget check passed." && exit 0)
41
+ AIRGAP_AND_VERIFY_COMMAND
42
+ end
43
+
44
+ def perform(release, *rspec_args)
45
+ Component::Gitlab.perform do |gitlab|
46
+ gitlab.release = release
47
+ gitlab.network = 'test'
48
+ gitlab.runner_network = 'airgapped'
49
+ gitlab.exec_commands = @commands
50
+ rspec_args << "--" unless rspec_args.include?('--')
51
+ rspec_args << %w[--tag ~orchestrated]
52
+ gitlab.instance do
53
+ Component::Specs.perform do |specs|
54
+ specs.suite = 'Test::Instance::Airgapped'
55
+ specs.release = gitlab.release
56
+ specs.network = gitlab.network
57
+ specs.runner_network = gitlab.runner_network
58
+ specs.args = [gitlab.address, *rspec_args]
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -1,5 +1,5 @@
1
1
  module Gitlab
2
2
  module QA
3
- VERSION = '5.13.4'.freeze
3
+ VERSION = '5.14.1'.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: 5.13.4
4
+ version: 5.14.1
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-02 00:00:00.000000000 Z
11
+ date: 2020-06-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: climate_control
@@ -269,6 +269,7 @@ files:
269
269
  - lib/gitlab/qa/scenario/actable.rb
270
270
  - lib/gitlab/qa/scenario/cli_commands.rb
271
271
  - lib/gitlab/qa/scenario/template.rb
272
+ - lib/gitlab/qa/scenario/test/instance/airgapped.rb
272
273
  - lib/gitlab/qa/scenario/test/instance/any.rb
273
274
  - lib/gitlab/qa/scenario/test/instance/deployment_base.rb
274
275
  - lib/gitlab/qa/scenario/test/instance/geo.rb
@@ -329,7 +330,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
329
330
  - !ruby/object:Gem::Version
330
331
  version: '0'
331
332
  requirements: []
332
- rubygems_version: 3.1.3
333
+ rubygems_version: 3.1.4
333
334
  signing_key:
334
335
  specification_version: 4
335
336
  summary: Integration tests for GitLab