gitlab-qa 0.5.0 → 0.6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 1c2b6de72f64ffc8c5b1400cb9a96ddf6734ca74
4
- data.tar.gz: da79c5ba4b2e2c6b2113213fce6ea51810979508
2
+ SHA256:
3
+ metadata.gz: a621d1f6282fb329b8f8ae089a113b66b5129017b4dc352d9afa3d21ce4a00b4
4
+ data.tar.gz: 51ee39c46554f5c32869c8ab96e53a1671b79790d1ee954ef1de744501ba32d9
5
5
  SHA512:
6
- metadata.gz: 8aa3ad66f489c2c4996e4dba9f937b6fef4fceced5ae2b4b2f2f9d25c5ff2b8d48d3ecf71ead553ded3e1efe8e7a632cbbf28063f5338b830e08e117d61c1572
7
- data.tar.gz: 463dbd089d21e6b49627b40b7cbbe04ecbd6f961e6605f90ef2ab0cc2066eb79118f4efee447ac627de3187f3e772a8f07fe4f23713f1cf09f4fb09f4e57bfc8
6
+ metadata.gz: be2da63340fc7348cc62698396eb295490f4e8955ca7fe27b50c3a7098827c74261fb4e6b38981346a273a8f9edc04a26783ec5c279f244679cf60d4085e24f1
7
+ data.tar.gz: f5362769d30beeeca1295783ea201b63ce5e3901bc553aa810863968fd9ea8011eac7fa98481f4cbef1b58fa3b1a1d88feab985d0e6ec24c45ecde1ddfbc37a2
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ /.idea
@@ -5,6 +5,7 @@ stages:
5
5
  - check
6
6
  - sanity
7
7
  - test
8
+ - qa
8
9
 
9
10
  variables:
10
11
  TEST_IMAGE: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-qa
@@ -15,6 +16,9 @@ variables:
15
16
 
16
17
  before_script:
17
18
  - bundle install
19
+ - if [ -n "$TRIGGERED_USER" ] && [ -n "$TRIGGER_SOURCE" ]; then
20
+ echo "Pipeline triggered by $TRIGGERED_USER at $TRIGGER_SOURCE";
21
+ fi
18
22
 
19
23
  check:rubocop:
20
24
  stage: check
@@ -37,8 +41,8 @@ check:rspec:
37
41
  .sanity: &sanity
38
42
  stage: sanity
39
43
  image: $TEST_IMAGE
40
- except:
41
- - triggers
44
+ only:
45
+ - schedules
42
46
  tags:
43
47
  - docker
44
48
 
@@ -55,55 +59,115 @@ ee:version:
55
59
  .test: &test
56
60
  stage: test
57
61
  image: $TEST_IMAGE
62
+ retry: 1
58
63
  tags:
59
64
  - docker
60
65
  artifacts:
61
66
  when: on_failure
62
67
  expire_in: 30d
63
68
  paths:
64
- - screenshots/*.png
65
- - logs/*.log
69
+ - screenshots/
70
+ - logs/
71
+
72
+ .high-capacity: &high-capacity
73
+ tags:
74
+ - docker
75
+ - 7gb
76
+ - triggered-packages
66
77
 
67
78
  ce:instance:
68
- script: bin/qa Test::Instance::Image ${RELEASE:=CE}
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
+ script:
83
+ - if $(echo ${RELEASE} | grep -q gitlab-ee); then exit 0; fi
84
+ - bin/qa Test::Instance::Image ${RELEASE:=CE}
69
85
  <<: *test
86
+ <<: *high-capacity
70
87
 
71
88
  ee:instance:
72
- script: bin/qa Test::Instance::Image ${RELEASE:=EE}
89
+ script:
90
+ - if $(echo ${RELEASE} | grep -q gitlab-ce); then exit 0; fi
91
+ - bin/qa Test::Instance::Image ${RELEASE:=EE}
73
92
  <<: *test
93
+ <<: *high-capacity
74
94
 
75
95
  ce:image:
76
- script: bin/qa Test::Omnibus::Image ${RELEASE:=CE}
96
+ script:
97
+ - if $(echo ${RELEASE} | grep -q gitlab-ee); then exit 0; fi
98
+ - bin/qa Test::Omnibus::Image ${RELEASE:=CE}
77
99
  <<: *test
78
100
 
79
101
  ee:image:
80
- script: bin/qa Test::Omnibus::Image ${RELEASE:=EE}
102
+ script:
103
+ - if $(echo ${RELEASE} | grep -q gitlab-ce); then exit 0; fi
104
+ - bin/qa Test::Omnibus::Image ${RELEASE:=EE}
81
105
  <<: *test
82
106
 
83
107
  ce:update:
84
- script: bin/qa Test::Omnibus::Update ${RELEASE:=CE}
108
+ script:
109
+ - if $(echo ${RELEASE} | grep -q gitlab-ee); then exit 0; fi
110
+ - bin/qa Test::Omnibus::Update ${RELEASE:=CE}
85
111
  <<: *test
112
+ <<: *high-capacity
86
113
 
87
114
  ee:update:
88
- script: bin/qa Test::Omnibus::Update ${RELEASE:=EE}
115
+ script:
116
+ - if $(echo ${RELEASE} | grep -q gitlab-ce); then exit 0; fi
117
+ - bin/qa Test::Omnibus::Update ${RELEASE:=EE}
89
118
  <<: *test
119
+ <<: *high-capacity
90
120
 
91
121
  ce:upgrade:
92
- script: bin/qa Test::Omnibus::Upgrade
122
+ script:
123
+ - if [[ $RELEASE ]]; then exit 0; fi
124
+ - bin/qa Test::Omnibus::Upgrade
93
125
  <<: *test
126
+ <<: *high-capacity
94
127
 
95
128
  ce:mattermost:
96
- script: bin/qa Test::Integration::Mattermost ${RELEASE:=CE}
129
+ script:
130
+ - if $(echo ${RELEASE} | grep -q gitlab-ee); then exit 0; fi
131
+ - bin/qa Test::Integration::Mattermost ${RELEASE:=CE}
97
132
  <<: *test
133
+ <<: *high-capacity
98
134
 
99
135
  ee:mattermost:
100
- script: bin/qa Test::Integration::Mattermost ${RELEASE:=EE}
136
+ script:
137
+ - if $(echo ${RELEASE} | grep -q gitlab-ce); then exit 0; fi
138
+ - bin/qa Test::Integration::Mattermost ${RELEASE:=EE}
101
139
  <<: *test
140
+ <<: *high-capacity
102
141
 
103
142
  ee:geo:
104
- script: bin/qa Test::Integration::Geo ${RELEASE:=EE}
143
+ script:
144
+ - if $(echo ${RELEASE} | grep -q gitlab-ce); then exit 0; fi
145
+ - bin/qa Test::Integration::Geo ${RELEASE:=EE}
105
146
  <<: *test
106
- tags:
107
- - docker
108
- - 7gb
109
- - triggered-packages
147
+ <<: *high-capacity
148
+
149
+ ce:ldap:
150
+ script:
151
+ - bin/qa Test::Integration::LDAP ${RELEASE:=CE}
152
+ <<: *test
153
+ <<: *high-capacity
154
+
155
+ ee:ldap:
156
+ script:
157
+ - bin/qa Test::Integration::LDAP ${RELEASE:=EE}
158
+ <<: *test
159
+ <<: *high-capacity
160
+
161
+ qa:staging:
162
+ script:
163
+ - if $(echo ${RELEASE} | grep -q gitlab-ce); then exit 0; fi
164
+ - export GITLAB_USERNAME="gitlab-qa"
165
+ - export GITLAB_PASSWORD="$GITLAB_QA_PASSWORD"
166
+ - unset EE_LICENSE
167
+ - bin/qa Test::Instance::Staging
168
+ <<: *test
169
+ retry: 0
170
+ stage: qa
171
+ when: manual
172
+ except:
173
+ - triggers
@@ -1,26 +1,30 @@
1
- AllCops:
2
- TargetRubyVersion: 2.3
1
+ require:
2
+ # Due to a probably bug in rubocop (https://github.com/bbatsov/rubocop/issues/5251)
3
+ # we need to require rubocop-rspec a second time so that RSpec/FilePath does
4
+ # not fallback to Rails/FilePath.
5
+ - rubocop-rspec
3
6
 
4
- Style/Documentation:
5
- Enabled: false
7
+ inherit_gem:
8
+ gitlab-styles:
9
+ - rubocop-default.yml
6
10
 
7
- Style/ModuleFunction:
11
+ Lint/ShadowingOuterLocalVariable:
8
12
  Enabled: false
9
13
 
10
- Style/SignalException:
11
- Enabled: false
14
+ Metrics/AbcSize:
15
+ Max: 18
12
16
 
13
- Lint/ShadowingOuterLocalVariable:
14
- Enabled: false
17
+ Metrics/MethodLength:
18
+ Max: 20
15
19
 
16
- Metrics/BlockLength:
20
+ Rails:
17
21
  Enabled: false
18
22
 
19
- Style/FrozenStringLiteralComment:
23
+ Style/ExtendSelf:
20
24
  Enabled: false
21
25
 
22
- Metrics/MethodLength:
23
- Max: 20
26
+ Style/ModuleFunction:
27
+ Enabled: false
24
28
 
25
- Metrics/AbcSize:
26
- Max: 18
29
+ Style/SignalException:
30
+ Enabled: false
data/README.md CHANGED
@@ -14,9 +14,63 @@ The purpose of this test suite is to verify that all pieces do integrate well to
14
14
 
15
15
  See the [GitLab QA architecture](/docs/architecture.md).
16
16
 
17
+ ## Goals and objectives
18
+
19
+ ### GitLab QA tests running in the CI/CD environment
20
+
21
+ GitLab QA is an automated end-to-end testing framework, which means that manual
22
+ steps should not be needed to run GitLab QA test suite. This framework is
23
+ CI/CD environment native, which means that we should add new features and tests
24
+ when we are comfortable with running new code in the CI/CD environment.
25
+
26
+ ### GitLab QA test failure are reproducible locally
27
+
28
+ Despite the fact that GitLab QA has been built to run in the CI/CD environment,
29
+ it is really important to make it easy for developers to reproduce GitLab QA
30
+ test failures locally. It is much easier to debug things locally, than in the
31
+ CI/CD.
32
+
33
+ To make it easier to reproduce test failures locally we have published
34
+ `gitlab-qa` gem [on rubygems.org](https://rubygems.org/gems/gitlab-qa) and we
35
+ are using exactly the same approach to run tests in the CI/CD environment.
36
+
37
+ It means that using `gitlab-qa` CLI tool, that orchestrates test environment and
38
+ runs GitLab QA test suite, is a reproducible way of running tests locally and
39
+ in the CI/CD.
40
+
41
+ It also means that we can not have a custom code in `.gitlab-ci.yml` to, for
42
+ example, start new containers / services.
43
+
44
+ ### Test installation / deployment process too
45
+
46
+ We distribute GitLab in a package (like Debian package or a Docker image) so
47
+ we want to test installation process to ensure that our package is not broken.
48
+
49
+ But we are also working on making GitLab be a cloud native product. This means
50
+ that using Helm becomes a yet another installation / deployment process that we
51
+ want to test with GitLab QA.
52
+
53
+ Keeping in mind that we want to test our Kubernetes deployments is especially
54
+ important with consideration of the need of testing changes in merge requests.
55
+
56
+ ### Testing changes in merge requests before the merge
57
+
58
+ The ultimate goal of GitLab QA is to make it possible to test changes in
59
+ merge requests, even before merging a code into the stable / master branch.
60
+
61
+ ### We can run tests against any instance of GitLab
62
+
63
+ GitLab QA is a click-driven, black-box testing tool. We also use it to run
64
+ tests against the staging, and we strive for making it useful for our users
65
+ as well.
66
+
17
67
  ## How do we use it
18
68
 
19
- Currently we trigger test suite against GitLab Docker images created by Omnibus nightly.
69
+ Currently we trigger test suite against GitLab Docker images created by Omnibus
70
+ nightly.
71
+
72
+ We also trigger GitLab QA pipelines whenever someone clicks `package-qa` manual
73
+ action in a merge request.
20
74
 
21
75
  ## How can you use it
22
76
 
@@ -25,6 +79,10 @@ GitLab QA tool is published as a [Ruby Gem](https://rubygems.org/gems/gitlab-qa)
25
79
  You can install it with `gem install gitlab-qa`. It will expose a `gitlab-qa`
26
80
  command in your system.
27
81
 
82
+ If you want to run the scenarios or develop them on Mac OS, please read
83
+ [Mac OS specific documentation](/docs/macos.md) as there are caveats and things
84
+ that may work differently.
85
+
28
86
  1. Run tests against a Docker image with GitLab:
29
87
 
30
88
  `gitlab-qa Test::Instance::Image CE|EE|<full image address>`
@@ -33,6 +91,12 @@ command in your system.
33
91
 
34
92
  `gitlab-qa Test::Integration::Mattermost CE|EE|<full image address>`
35
93
 
94
+ 1. Run tests agains a Docker image with GitLab Geo:
95
+
96
+ `export EE_LICENSE=$(cat /path/to/Geo.gitlab_license)`
97
+
98
+ `gitlab-qa Test::Integration::Geo EE`
99
+
36
100
  1. Test update process between two CE or EE subsequent versions:
37
101
 
38
102
  `gitlab-qa Test::Omnibus::Update CE|EE|<full image address>`
@@ -49,6 +113,13 @@ command in your system.
49
113
 
50
114
  `GITLAB_USERNAME=your_username GITLAB_PASSWORD=your_password gitlab-qa Test::Instance::Any EE latest https://staging.gitlab.com`
51
115
 
116
+ ### How to add new scenarios
117
+
118
+ Scenarios (test cases) and scripts to run them are located in
119
+ [CE](https://gitlab.com/gitlab-org/gitlab-ce/tree/master/qa) and
120
+ [EE](https://gitlab.com/gitlab-org/gitlab-ee/tree/master/qa)
121
+ repositories under qa/ directory, so please also check the documents there.
122
+
52
123
  ## How does it work?
53
124
 
54
125
  GitLab QA handles a few scenarios:
@@ -86,6 +157,17 @@ This scenario tests that GitLab instance works as expected when
86
157
  enabling the embedded Mattermost server (see `Test::Instance::Image`
87
158
  above).
88
159
 
160
+ ### `Test::Integration::LDAP CE|EE|<full image address>`
161
+
162
+ This scenario tests that GitLab instance works as expected with an external
163
+ LDAP server. The scenario spins up an OpenLDAP server, seeds users, and
164
+ attempts to LDAP-related tests against a GitLab instance.
165
+
166
+ In EE, both the GitLab standard and LDAP credentials are needed:
167
+
168
+ 1. The first is used to login as an Admin to enter in the EE license.
169
+ 2. The second is used to conduct LDAP-related tasks
170
+
89
171
  ### `Test::Instance::Any CE|EE|<full image address>`
90
172
 
91
173
  This scenario tests that the any GitLab instance works as expected by running
@@ -93,14 +175,19 @@ tests against it (see `Test::Instance::Image` above).
93
175
 
94
176
  ## Supported environment variables
95
177
 
96
- * `GITLAB_USERNAME` - username to use when signing in to GitLab
97
- * `GITLAB_PASSWORD` - password to use when signing in to GitLab
178
+ * `GITLAB_USERNAME` - username to use when signing into GitLab
179
+ * `GITLAB_PASSWORD` - password to use when signing into GitLab
180
+ * `GITLAB_USER_TYPE` - type of user to use when signing into GitLab: standard (default), ldap
181
+ * `GITLAB_LDAP_USERNAME` - LDAP username to use when signing into GitLab
182
+ * `GITLAB_LDAP_PASSWORD` - LDAP password to use when signing into GitLab
183
+ * `GITLAB_SANDBOX_NAME` - The sandbox group name test suite is going to use (default: `gitlab-qa-sandbox`)
98
184
  * `EE_LICENSE` - Enterprise Edition license
99
185
  * `QA_SCREENSHOTS_DIR` - Path to a directory where screenshots for failing tests
100
186
  will be saved (default: `/tmp/gitlab-qa/screenshots`)
101
187
  * `QA_LOGS_DIR` - Path to a directory where logs will be saved (default:
102
188
  `/tmp/gitlab-qa/logs`)
103
189
  * `DOCKER_HOST` - Docker host to run tests against (default: `http://localhost`)
190
+ * `CHROME_HEADLESS` - when running locally, set to `false` to allow Chrome tests to be visible - watch your tests being run
104
191
 
105
192
  ## Contributing
106
193
 
@@ -0,0 +1,114 @@
1
+ # Run Geo QA tests against your Geo GDK setup
2
+
3
+ Run from the `gdk-ee/gitlab/qa` directory with GDK primary and secondary running:
4
+
5
+ ```
6
+ # Run in the background
7
+ 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
8
+
9
+ # Run in visible Chrome browser
10
+ 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
+ ```
12
+
13
+ # QA Tool support on macOS
14
+
15
+ Most of our development for GitLab is done on macOS. This brings some challenges as Docker on
16
+ macOS doesn't have feature parity with it's Linux conterpart.
17
+
18
+ There are two ways of running Docker on a Mac. Use a docker-machine provisioned virtual-machine
19
+ or use "native" Docker GUI based support.
20
+
21
+ When using docker-machine you can run your machines in the cloud or locally using something like
22
+ VirtualBox. This brings some extra options on how to expose network between macOS and the Linux
23
+ host VM, but requires extra steps like mapping `$DOCKER_HOST`, booting up and down the VMs with
24
+ docker-machine and possibly customizing network settings in the virtualization platform of choice.
25
+
26
+ Native Docker bundles it's own lightweight virtualization technology that works just like VirtualBox,
27
+ but without requiring manual intervention. This provides less opportunity to customize network between
28
+ docker containers and the host machine, but works out of the box when mapping container ports to ports
29
+ on localhost.
30
+
31
+ The major difference is that it never exposes the network as `bridge` to macOS, and so `--hostname`
32
+ and `--network` only work inside docker, it has no effect when trying to access the containers from macOS.
33
+
34
+ There are people in Docker's forum that claim to be able to [expose the network][Docker Route]
35
+ when using a mix of docker-machine and `route` CLI command.
36
+
37
+ When using the `route` command to expose the internet network, you still need to glue the DNS part.
38
+ There is another tool called [dnsdock][dnsdock] that may do the trick. That means you need to change
39
+ your DNS and point to the IP/port of `dnsdock` application.
40
+
41
+ # Docker on macOS caveats
42
+
43
+ When using OS X Docker, you need to go to Preferences > Advanced and allocate at least **5.0 GB**,
44
+ otherwise some steps may fail to execute the `chrome-webdriver`.
45
+
46
+ When using docker-machine, see [this StackOverflow link for increasing memory]
47
+ (https://stackoverflow.com/questions/32834082/how-to-increase-docker-machine-memory-mac/36982696#36982696).
48
+
49
+ This is required because chrome-webdriver makes use of `/dev/shm` shared memory. The VM will normally use
50
+ ~ 3Gb but unless you allocate 5.0 or more some magic numbers may not enable a bigger /dev/shm in the
51
+ 'host' VM that "native" docker runs on.
52
+
53
+ Please note that while it's possible to run multi-node tests like Geo Primary and Secondary, you can't
54
+ access the machines from your host machine, as they are all exposed as `0.0.0.0:port`, and because
55
+ of that they don't match the configured VHOSTs in your GitLab installation, so the redirect login
56
+ fails.
57
+
58
+ It has to do with the lack of `bridge` support from Docker on macOS, also this is also something
59
+ Docker Inc [doesn't want to fix][Docker bridge issue].
60
+
61
+ To see if this limitation is still present, check the [documentation][Docker Networking].
62
+
63
+ ## Workarounds
64
+
65
+ One possible workaround to connect to a multi-node environment like Geo, is to run a reverse proxy on your
66
+ development machine that maps the VHOST to `localhost:port`, changing to the ports listed in `docker ps`.
67
+
68
+ You first need to map the hostnames to the local ip:
69
+
70
+ Edit the `/etc/hosts` file
71
+ ```
72
+ 127.0.0.1 gitlab-primary.geo gitlab-secondary.geo
73
+ ```
74
+ We are going to use [caddyserver](https://caddyserver.com/) in this example. You can install caddy with `brew install caddy`.
75
+
76
+ After booting-up your containers, list the assigned ports:
77
+
78
+ ```bash
79
+ $ docker ps
80
+
81
+ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82
+ d28cc97870b4 gitlab/gitlab-ee:nightly "/assets/wrapper" 1 second ago Up Less than a second (health: starting) 22/tcp, 443/tcp, 0.0.0.0:32775->80/tcp gitlab-secondary
83
+ 41f86bb951c5 gitlab/gitlab-ee:nightly "/assets/wrapper" 2 minutes ago Up 2 minutes (healthy) 22/tcp, 443/tcp, 0.0.0.0:32774->80/tcp gitlab-primary
84
+ ```
85
+
86
+ Create a Caddyfile, mapping the VHOSTs with the `localhost:port` combination:
87
+
88
+ ```
89
+ http://gitlab-primary.geo {
90
+ proxy / localhost:32774 {
91
+ transparent
92
+ }
93
+ }
94
+
95
+ http://gitlab-secondary.geo {
96
+ proxy / localhost:32775 {
97
+ transparent
98
+ }
99
+ }
100
+ ```
101
+
102
+ And run caddy:
103
+
104
+ ```bash
105
+ caddy -conf Caddyfile
106
+ ```
107
+
108
+ You should be able to use your navigator and point it to `http://gitlab-primary.geo` or `http://gitlab-secondary.geo`.
109
+
110
+ [Docker Route]: https://forums.docker.com/t/access-container-from-dev-machine-by-ip-dns-name/24631/5
111
+ [Docker Networking]: https://docs.docker.com/docker-for-mac/networking/#known-limitations-use-cases-and-workarounds
112
+ [Docker bridge issue]: https://github.com/moby/moby/issues/22753#issuecomment-253534261
113
+ [dnsdock]: https://github.com/aacebedo/dnsdock
114
+
@@ -0,0 +1,16 @@
1
+ dn: uid=tanuki,dc=example,dc=org
2
+ changetype: add
3
+ uid: tanuki
4
+ cn: tanuki
5
+ sn: 3
6
+ objectClass: top
7
+ objectClass: posixAccount
8
+ objectClass: inetOrgPerson
9
+ loginShell: /bin/bash
10
+ homeDirectory: /home/tanuki
11
+ uidNumber: 14583102
12
+ gidNumber: 14564100
13
+ # hashed value for 'password'
14
+ userPassword: {SSHA}ICMhr6Jxt5bk2awD7HL7GxRTM3BZ1pFI
15
+ mail: tanuki@example.org
16
+ gecos: Tanuki User
@@ -18,9 +18,11 @@ Gem::Specification.new do |spec|
18
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_development_dependency 'bundler', '~> 1.16'
21
+ # Some dependencies are pinned, to prevent new cops from breaking the CI pipelines
22
+ spec.add_development_dependency 'gitlab-styles', '2.2.0'
22
23
  spec.add_development_dependency 'pry', '~> 0.11'
23
24
  spec.add_development_dependency 'rake', '~> 12.2'
24
25
  spec.add_development_dependency 'rspec', '~> 3.7'
25
- spec.add_development_dependency 'rubocop', '~> 0.51'
26
+ spec.add_development_dependency 'rubocop', '0.52.0'
27
+ spec.add_development_dependency 'rubocop-rspec', '1.20.1'
26
28
  end
@@ -14,8 +14,9 @@ module Gitlab
14
14
 
15
15
  module Test
16
16
  module Instance
17
- autoload :Image, 'qa/scenario/test/instance/image'
18
17
  autoload :Any, 'qa/scenario/test/instance/any'
18
+ autoload :Image, 'qa/scenario/test/instance/image'
19
+ autoload :Staging, 'qa/scenario/test/instance/staging'
19
20
  end
20
21
 
21
22
  module Omnibus
@@ -25,8 +26,9 @@ module Gitlab
25
26
  end
26
27
 
27
28
  module Integration
28
- autoload :Mattermost, 'qa/scenario/test/integration/mattermost'
29
29
  autoload :Geo, 'qa/scenario/test/integration/geo'
30
+ autoload :LDAP, 'qa/scenario/test/integration/ldap'
31
+ autoload :Mattermost, 'qa/scenario/test/integration/mattermost'
30
32
  end
31
33
 
32
34
  module Sanity
@@ -37,12 +39,14 @@ module Gitlab
37
39
 
38
40
  module Component
39
41
  autoload :Gitlab, 'qa/component/gitlab'
42
+ autoload :LDAP, 'qa/component/ldap'
40
43
  autoload :Specs, 'qa/component/specs'
44
+ autoload :Staging, 'qa/component/staging'
41
45
  end
42
46
 
43
47
  module Docker
44
- autoload :Engine, 'qa/docker/engine'
45
48
  autoload :Command, 'qa/docker/command'
49
+ autoload :Engine, 'qa/docker/engine'
46
50
  autoload :Shellout, 'qa/docker/shellout'
47
51
  autoload :Volumes, 'qa/docker/volumes'
48
52
  end
@@ -10,8 +10,6 @@ module Gitlab
10
10
  extend Forwardable
11
11
  include Scenario::Actable
12
12
 
13
- # rubocop:disable Style/Semicolon
14
-
15
13
  attr_reader :release, :docker
16
14
  attr_accessor :volumes, :network, :environment
17
15
  attr_writer :name
@@ -54,7 +52,10 @@ module Gitlab
54
52
  def instance
55
53
  raise 'Please provide a block!' unless block_given?
56
54
 
57
- prepare; start; reconfigure; wait
55
+ prepare
56
+ start
57
+ reconfigure
58
+ wait
58
59
 
59
60
  yield self
60
61
 
@@ -65,11 +66,11 @@ module Gitlab
65
66
  @docker.pull(image, tag)
66
67
 
67
68
  return if @docker.network_exists?(network)
69
+
68
70
  @docker.network_create(network)
69
71
  end
70
72
 
71
- # rubocop:disable Metrics/AbcSize
72
- def start
73
+ def start # rubocop:disable Metrics/AbcSize
73
74
  ensure_configured!
74
75
 
75
76
  docker.run(image, tag) do |command|
@@ -79,11 +80,15 @@ module Gitlab
79
80
  command << "--hostname #{hostname}"
80
81
 
81
82
  @volumes.to_h.each do |to, from|
82
- command << "--volume #{to}:#{from}:Z"
83
+ command.volume(to, from, 'Z')
84
+ end
85
+
86
+ File.join(Runtime::Env.logs_dir, name).tap do |logs_dir|
87
+ command.volume(logs_dir, '/var/log/gitlab', 'Z')
83
88
  end
84
89
 
85
90
  @environment.to_h.each do |key, value|
86
- command << %(--env #{key}="#{value}")
91
+ command.env(key, value)
87
92
  end
88
93
 
89
94
  @network_aliases.to_a.each do |network_alias|
@@ -137,11 +142,8 @@ module Gitlab
137
142
 
138
143
  private
139
144
 
140
- # rubocop:disable Style/GuardClause
141
145
  def ensure_configured!
142
- unless [name, release, network].all?
143
- raise 'Please configure an instance first!'
144
- end
146
+ raise 'Please configure an instance first!' unless [name, release, network].all?
145
147
  end
146
148
 
147
149
  class Availability
@@ -0,0 +1,159 @@
1
+ require 'securerandom'
2
+
3
+ # This component sets up the docker-openldap (https://github.com/osixia/docker-openldap)
4
+ # image with the proper configuration for GitLab users to login.
5
+ #
6
+ # By default, the docker-openldap image configures the Docker image with a
7
+ # default admin user in the example.org domain. This user does not have a uid
8
+ # attribute that GitLab needs to authenticate, so we seed the LDAP server with
9
+ # a "tanuki" user via a LDIF file in the fixtures/ldap directory.
10
+ #
11
+ # The docker-openldap container has a startup script
12
+ # (https://github.com/osixia/docker-openldap/blob/v1.1.11/image/service/slapd/startup.sh#L74-L78)
13
+ # that looks for custom LDIF files in the BOOTSTRAP_LDIF directory. Note that the LDIF
14
+ # files must have a "changetype" option specified for the script to work.
15
+ module Gitlab
16
+ module QA
17
+ module Component
18
+ class LDAP
19
+ include Scenario::Actable
20
+
21
+ LDAP_IMAGE = 'osixia/openldap'.freeze
22
+ LDAP_IMAGE_TAG = 'latest'.freeze
23
+ LDAP_DOMAIN = 'example.org'.freeze
24
+ ADMIN_USER = 'admin'.freeze
25
+ ADMIN_PASSWORD = 'admin'.freeze
26
+ LDAP_USER = 'tanuki'.freeze
27
+ LDAP_PASSWORD = 'password'.freeze
28
+ LDAP_PORT = 389
29
+ BASE_DN = 'dc=example,dc=org'.freeze
30
+ BIND_DN = 'cn=admin,dc=example,dc=org'.freeze
31
+ BOOTSTRAP_LDIF = '/container/service/slapd/assets/config/bootstrap/ldif/custom'.freeze
32
+ GROUP_BASE = 'ou=groups,dc=example,dc=org'.freeze
33
+ ADMIN_GROUP = 'admin'.freeze
34
+ FIXTURE_PATH = File.expand_path('../../../../fixtures/ldap'.freeze, __dir__)
35
+
36
+ attr_reader :docker
37
+ attr_accessor :volumes, :network, :environment
38
+ attr_writer :name
39
+
40
+ def initialize
41
+ @docker = Docker::Engine.new
42
+ @environment = {}
43
+ @volumes = {}
44
+ @network_aliases = []
45
+
46
+ @volumes[FIXTURE_PATH] = BOOTSTRAP_LDIF
47
+ end
48
+
49
+ def enable_tls(status)
50
+ @environment['LDAP_TLS'] = 'false' unless status
51
+ end
52
+
53
+ def username
54
+ LDAP_USER
55
+ end
56
+
57
+ def password
58
+ LDAP_PASSWORD
59
+ end
60
+
61
+ def add_network_alias(name)
62
+ @network_aliases.push(name)
63
+ end
64
+
65
+ def name
66
+ @name ||= "openldap-#{SecureRandom.hex(4)}"
67
+ end
68
+
69
+ def hostname
70
+ "#{name}.#{network}"
71
+ end
72
+
73
+ def instance
74
+ raise 'Please provide a block!' unless block_given?
75
+
76
+ prepare
77
+ start
78
+
79
+ yield self
80
+
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)
90
+ end
91
+
92
+ def start
93
+ # copy-service needed for bootstraping LDAP user:
94
+ # https://github.com/osixia/docker-openldap#seed-ldap-database-with-ldif
95
+ docker.run(LDAP_IMAGE, LDAP_IMAGE_TAG, '--copy-service') do |command|
96
+ command << '-d '
97
+ command << "--name #{name}"
98
+ command << "--net #{network}"
99
+ command << "--hostname #{hostname}"
100
+
101
+ @volumes.to_h.each do |to, from|
102
+ command.volume(to, from, 'Z')
103
+ end
104
+
105
+ @environment.to_h.each do |key, value|
106
+ command.env(key, value)
107
+ end
108
+
109
+ @network_aliases.to_a.each do |network_alias|
110
+ command << "--network-alias #{network_alias}"
111
+ end
112
+ end
113
+ 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
129
+
130
+ def to_config
131
+ config = YAML.safe_load <<~CFG
132
+ main:
133
+ label: LDAP
134
+ host: #{hostname}
135
+ port: #{LDAP_PORT}
136
+ uid: 'uid'
137
+ bind_dn: #{BIND_DN}
138
+ password: #{ADMIN_PASSWORD}
139
+ method: 'plain'
140
+ base: #{BASE_DN}
141
+ user_filter: ''
142
+ group_base: #{GROUP_BASE}
143
+ admin_group: #{ADMIN_GROUP}
144
+ external_groups: ''
145
+ sync_ssh_keys: false
146
+ CFG
147
+
148
+ # Quotes get eaten up when the string is set in the environment
149
+ config.to_s.gsub("\"", "\\\"")
150
+ end
151
+
152
+ def set_gitlab_credentials
153
+ ::Gitlab::QA::Runtime::Env.ldap_username = username
154
+ ::Gitlab::QA::Runtime::Env.ldap_password = password
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
@@ -20,12 +20,12 @@ module Gitlab
20
20
  @docker.run(release.qa_image, release.tag, suite, *args) do |command|
21
21
  command << "-t --rm --net=#{network || 'bridge'}"
22
22
 
23
- Runtime::Env.delegated.each do |env|
24
- command.env(env, "$#{env}")
23
+ variables = Runtime::Env.variables
24
+ variables.each do |key, value|
25
+ command.env(key, value)
25
26
  end
26
27
 
27
28
  command.volume('/var/run/docker.sock', '/var/run/docker.sock')
28
- command.volume(Runtime::Env.logs_dir, '/var/log/gitlab')
29
29
  command.volume(Runtime::Env.screenshots_dir, '/home/qa/tmp')
30
30
  command.name("gitlab-specs-#{Time.now.to_i}")
31
31
  end
@@ -0,0 +1,63 @@
1
+ require 'net/http'
2
+ require 'json'
3
+ require 'uri'
4
+
5
+ module Gitlab
6
+ module QA
7
+ module Component
8
+ class Staging
9
+ ADDRESS = 'https://staging.gitlab.com'.freeze
10
+
11
+ def self.release
12
+ version = Version.new(ADDRESS).fetch!
13
+
14
+ Release.new("EE:#{version}")
15
+ rescue InvalidResponseError => ex
16
+ warn ex.message
17
+ warn "#{ex.response.code} #{ex.response.message}: #{ex.response.body}"
18
+ exit 1
19
+ end
20
+
21
+ class InvalidResponseError < StandardError
22
+ attr_reader :response
23
+
24
+ def initialize(address, response)
25
+ @response = response
26
+
27
+ super "Invalid response received from #{address}"
28
+ end
29
+ end
30
+
31
+ class Version
32
+ def initialize(address)
33
+ @uri = URI.join(address, '/api/v4/version')
34
+ end
35
+
36
+ def fetch!
37
+ response =
38
+ Net::HTTP.start(@uri.host, @uri.port, use_ssl: true) do |http|
39
+ http.request(request)
40
+ end
41
+
42
+ case response
43
+ when Net::HTTPSuccess
44
+ JSON.parse(response.body).fetch('version')
45
+ else
46
+ raise InvalidResponseError.new(@uri.to_s, response)
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def request
53
+ Runtime::Env.require_qa_access_token!
54
+
55
+ @request ||= Net::HTTP::Get.new(@uri.path).tap do |req|
56
+ req['PRIVATE-TOKEN'] = Runtime::Env.qa_access_token
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -12,16 +12,16 @@ module Gitlab
12
12
  tap { @args.concat(args) }
13
13
  end
14
14
 
15
- def volume(from, to)
16
- tap { @args << "-v #{from}:#{to}" }
15
+ def volume(from, to, opt = :z)
16
+ tap { @args.push("--volume #{from}:#{to}:#{opt}") }
17
17
  end
18
18
 
19
19
  def name(identity)
20
- tap { @args << "--name #{identity}" }
20
+ tap { @args.push("--name #{identity}") }
21
21
  end
22
22
 
23
23
  def env(name, value)
24
- tap { @args << %(-e #{name}="#{value}") }
24
+ tap { @args.push(%(--env #{name}="#{value}")) }
25
25
  end
26
26
 
27
27
  def to_s
@@ -4,7 +4,7 @@ module Gitlab
4
4
  module QA
5
5
  module Docker
6
6
  class Shellout
7
- class StatusError < StandardError; end
7
+ StatusError = Class.new(StandardError)
8
8
 
9
9
  def initialize(command)
10
10
  @command = command
@@ -5,7 +5,6 @@ module Gitlab
5
5
  module Docker
6
6
  class Volumes
7
7
  VOLUMES = { 'config' => '/etc/gitlab',
8
- 'logs' => '/var/log/gitlab',
9
8
  'data' => '/var/opt/gitlab' }.freeze
10
9
 
11
10
  def initialize(volumes = VOLUMES)
@@ -4,10 +4,25 @@ module Gitlab
4
4
  module Env
5
5
  extend self
6
6
 
7
- VARIABLES = %w[GITLAB_USERNAME
8
- GITLAB_PASSWORD
9
- GITLAB_URL
10
- EE_LICENSE].freeze
7
+ ENV_VARIABLES = {
8
+ 'GITLAB_USERNAME' => :user_username,
9
+ 'GITLAB_PASSWORD' => :user_password,
10
+ 'GITLAB_LDAP_USERNAME' => :ldap_username,
11
+ 'GITLAB_LDAP_PASSWORD' => :ldap_password,
12
+ 'GITLAB_USER_TYPE' => :user_type,
13
+ 'GITLAB_SANDBOX_NAME' => :gitlab_sandbox_name,
14
+ 'GITLAB_QA_ACCESS_TOKEN' => :qa_access_token,
15
+ 'GITLAB_URL' => :gitlab_url,
16
+ 'EE_LICENSE' => :ee_license
17
+ }.freeze
18
+
19
+ ENV_VARIABLES.each_value do |accessor|
20
+ send(:attr_accessor, accessor) # rubocop:disable GitlabSecurity/PublicSend
21
+ end
22
+
23
+ def qa_access_token
24
+ ENV['GITLAB_QA_ACCESS_TOKEN']
25
+ end
11
26
 
12
27
  def screenshots_dir
13
28
  ENV['QA_SCREENSHOTS_DIR'] || '/tmp/gitlab-qa/screenshots'
@@ -17,8 +32,42 @@ module Gitlab
17
32
  ENV['QA_LOGS_DIR'] || '/tmp/gitlab-qa/logs'
18
33
  end
19
34
 
20
- def delegated
21
- VARIABLES.select { |name| ENV[name] }
35
+ def variables
36
+ vars = {}
37
+
38
+ ENV_VARIABLES.each do |name, attribute|
39
+ # Variables that are overriden in the environment take precedence
40
+ # over the defaults specified by the QA runtime.
41
+ value = env_value_if_defined(name) || send(attribute) # rubocop:disable GitlabSecurity/PublicSend
42
+ vars[name] = value if value
43
+ end
44
+
45
+ vars
46
+ end
47
+
48
+ def require_license!
49
+ return if ENV.include?('EE_LICENSE')
50
+
51
+ raise ArgumentError, 'GitLab License is not available. Please load a license into EE_LICENSE env variable.'
52
+ end
53
+
54
+ def require_no_license!
55
+ return unless ENV.include?('EE_LICENSE')
56
+
57
+ raise ArgumentError, "Unexpected EE_LICENSE provided. Please unset it to continue."
58
+ end
59
+
60
+ def require_qa_access_token!
61
+ return unless ENV['GITLAB_QA_ACCESS_TOKEN'].to_s.strip.empty?
62
+
63
+ raise ArgumentError, "Please provide GITLAB_QA_ACCESS_TOKEN"
64
+ end
65
+
66
+ private
67
+
68
+ def env_value_if_defined(variable)
69
+ # Pass through the variables if they are defined in the environment
70
+ return "$#{variable}" if ENV[variable]
22
71
  end
23
72
  end
24
73
  end
@@ -0,0 +1,26 @@
1
+ module Gitlab
2
+ module QA
3
+ module Scenario
4
+ module Test
5
+ module Instance
6
+ ##
7
+ # Run test suite against staging.gitlab.com
8
+ #
9
+ class Staging < Scenario::Template
10
+ def perform(*)
11
+ Runtime::Env.require_no_license!
12
+
13
+ release = Component::Staging.release
14
+
15
+ Component::Specs.perform do |specs|
16
+ specs.suite = 'Test::Instance'
17
+ specs.release = release
18
+ specs.args = [Component::Staging::ADDRESS]
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -5,6 +5,7 @@ module Gitlab
5
5
  module Integration
6
6
  class Geo < Scenario::Template
7
7
  ##
8
+ # rubocop:disable Lint/MissingCopEnableDirective
8
9
  # rubocop:disable Metrics/MethodLength
9
10
  # rubocop:disable Metrics/AbcSize
10
11
  #
@@ -13,6 +14,8 @@ module Gitlab
13
14
 
14
15
  raise ArgumentError, 'Geo is EE only!' unless release.ee?
15
16
 
17
+ Runtime::Env.require_license!
18
+
16
19
  Component::Gitlab.perform do |primary|
17
20
  primary.release = release
18
21
  primary.name = 'gitlab-primary'
@@ -24,6 +27,8 @@ module Gitlab
24
27
  postgresql['md5_auth_cidr_addresses'] = ['0.0.0.0/0'];
25
28
  postgresql['max_replication_slots'] = 1;
26
29
  gitlab_rails['db_key_base'] = '4dd58204865eb41bca93bd38131d51cc';
30
+ sidekiq['concurrency'] = 2;
31
+ unicorn['worker_processes'] = 2;
27
32
  OMNIBUS
28
33
 
29
34
  primary.instance do
@@ -34,6 +39,8 @@ module Gitlab
34
39
  secondary.omnibus_config = <<~OMNIBUS
35
40
  geo_secondary_role['enable'] = true;
36
41
  gitlab_rails['db_key_base'] = '4dd58204865eb41bca93bd38131d51cc';
42
+ sidekiq['concurrency'] = 2;
43
+ unicorn['worker_processes'] = 2;
37
44
  OMNIBUS
38
45
 
39
46
  secondary.act do
@@ -0,0 +1,47 @@
1
+ require 'yaml'
2
+
3
+ module Gitlab
4
+ module QA
5
+ module Scenario
6
+ module Test
7
+ module Integration
8
+ class LDAP < Scenario::Template
9
+ # rubocop:disable Metrics/AbcSize
10
+ def perform(release)
11
+ Component::Gitlab.perform do |gitlab|
12
+ gitlab.release = release
13
+ gitlab.name = 'gitlab-ldap'
14
+ gitlab.network = 'test'
15
+
16
+ Component::LDAP.perform do |ldap|
17
+ ldap.enable_tls(false)
18
+ ldap.network = 'test'
19
+ ldap.set_gitlab_credentials
20
+
21
+ gitlab.omnibus_config = <<~OMNIBUS
22
+ gitlab_rails['ldap_enabled'] = true;
23
+ gitlab_rails['ldap_servers'] = #{ldap.to_config};
24
+ OMNIBUS
25
+
26
+ ldap.instance do
27
+ gitlab.instance do
28
+ puts 'Running LDAP specs!'
29
+
30
+ Component::Specs.perform do |specs|
31
+ specs.suite = 'Test::Integration::LDAP'
32
+ specs.release = gitlab.release
33
+ specs.network = gitlab.network
34
+ specs.args = [gitlab.address]
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ # rubocop:enable Metrics/AbcSize
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -4,15 +4,19 @@ module Gitlab
4
4
  module Test
5
5
  module Omnibus
6
6
  class Image < Scenario::Template
7
- # rubocop:disable Style/Semicolon
8
7
  def perform(release)
9
8
  Component::Gitlab.perform do |gitlab|
10
9
  gitlab.release = release
11
10
  gitlab.network = 'bridge'
12
11
 
13
12
  gitlab.act do
14
- prepare; start; reconfigure
15
- restart; wait; teardown
13
+ prepare
14
+ start
15
+ reconfigure
16
+
17
+ restart
18
+ wait
19
+ teardown
16
20
  end
17
21
  end
18
22
  end
@@ -15,11 +15,13 @@ module Gitlab
15
15
  HOURS_AGO = 24
16
16
  COMMITS = 10_000
17
17
 
18
- # rubocop:disable Style/Semicolon
19
18
  def perform(release)
20
19
  version = Component::Gitlab.perform do |gitlab|
21
20
  gitlab.release = release
22
- gitlab.act { pull; sha_version }
21
+ gitlab.act do
22
+ pull
23
+ sha_version
24
+ end
23
25
  end
24
26
 
25
27
  project = "gitlab-org/#{Release.new(release).project_name}"
@@ -1,5 +1,5 @@
1
1
  module Gitlab
2
2
  module QA
3
- VERSION = '0.5.0'.freeze
3
+ VERSION = '0.6.0'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-qa
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.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: 2017-12-12 00:00:00.000000000 Z
11
+ date: 2018-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
14
+ name: gitlab-styles
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: '1.16'
19
+ version: 2.2.0
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: '1.16'
26
+ version: 2.2.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: pry
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -70,16 +70,30 @@ dependencies:
70
70
  name: rubocop
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - '='
74
74
  - !ruby/object:Gem::Version
75
- version: '0.51'
75
+ version: 0.52.0
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 0.52.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop-rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
89
+ version: 1.20.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
81
95
  - !ruby/object:Gem::Version
82
- version: '0.51'
96
+ version: 1.20.1
83
97
  description:
84
98
  email:
85
99
  - grzesiek.bizon@gmail.com
@@ -104,12 +118,16 @@ files:
104
118
  - bin/setup
105
119
  - docs/README.md
106
120
  - docs/architecture.md
121
+ - docs/macos.md
107
122
  - docs/trainings.md
108
123
  - exe/gitlab-qa
124
+ - fixtures/ldap/tanuki.ldif
109
125
  - gitlab-qa.gemspec
110
126
  - lib/gitlab/qa.rb
111
127
  - lib/gitlab/qa/component/gitlab.rb
128
+ - lib/gitlab/qa/component/ldap.rb
112
129
  - lib/gitlab/qa/component/specs.rb
130
+ - lib/gitlab/qa/component/staging.rb
113
131
  - lib/gitlab/qa/docker/command.rb
114
132
  - lib/gitlab/qa/docker/engine.rb
115
133
  - lib/gitlab/qa/docker/shellout.rb
@@ -120,7 +138,9 @@ files:
120
138
  - lib/gitlab/qa/scenario/template.rb
121
139
  - lib/gitlab/qa/scenario/test/instance/any.rb
122
140
  - lib/gitlab/qa/scenario/test/instance/image.rb
141
+ - lib/gitlab/qa/scenario/test/instance/staging.rb
123
142
  - lib/gitlab/qa/scenario/test/integration/geo.rb
143
+ - lib/gitlab/qa/scenario/test/integration/ldap.rb
124
144
  - lib/gitlab/qa/scenario/test/integration/mattermost.rb
125
145
  - lib/gitlab/qa/scenario/test/omnibus/image.rb
126
146
  - lib/gitlab/qa/scenario/test/omnibus/update.rb
@@ -147,7 +167,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
147
167
  version: '0'
148
168
  requirements: []
149
169
  rubyforge_project:
150
- rubygems_version: 2.5.2
170
+ rubygems_version: 2.7.7
151
171
  signing_key:
152
172
  specification_version: 4
153
173
  summary: Integration tests for GitLab