gitlab-qa 8.14.0 → 8.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitlab/ci/jobs/airgapped.gitlab-ci.yml +4 -4
- data/Gemfile.lock +4 -2
- data/docs/developer/http_mocking.md +28 -0
- data/docs/developer/ssl.md +32 -0
- data/docs/developer/style_guide.md +29 -0
- data/gitlab-qa.gemspec +1 -0
- data/lefthook.yml +12 -0
- data/lib/gitlab/qa/component/alpine.rb +36 -0
- data/lib/gitlab/qa/component/base.rb +21 -4
- data/lib/gitlab/qa/component/gitaly_cluster.rb +2 -1
- data/lib/gitlab/qa/component/gitlab.rb +37 -33
- data/lib/gitlab/qa/component/mock_server.rb +39 -2
- data/lib/gitlab/qa/runtime/env.rb +0 -1
- data/lib/gitlab/qa/scenario/test/instance/airgapped.rb +62 -9
- data/lib/gitlab/qa/scenario/test/integration/gitaly_cluster.rb +4 -1
- data/lib/gitlab/qa/scenario/test/integration/import.rb +20 -12
- data/lib/gitlab/qa/scenario/test/integration/mtls.rb +48 -35
- data/lib/gitlab/qa/version.rb +1 -1
- data/tls_certificates/smocker/smocker.crt +31 -0
- data/tls_certificates/smocker/smocker.csr +29 -0
- data/tls_certificates/smocker/smocker.key +51 -0
- metadata +24 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f8235a7dbc3c61a6f538089128dc4a5ba7219c435a2fd107b9be7a7f8e79a23
|
4
|
+
data.tar.gz: 3ce7fbdcc46f5f7b7a25e87af2b681c8ef314c48afef9a7e0c139361dcfed7bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a44d2a6d39df421e02e6dcb96b41aa32a53a65366f983e853376bde2c6b0e17ab1099ccd1b675c4c0b4b93e2bdd94bf661fff2e02edf8e68d43a7e2535ae756c
|
7
|
+
data.tar.gz: 919565630e715538ed4867339a27e553d90a80b3185b1caab4303aa65ef026a882f3fbb6446cbf5eb0e95944659da6adf6270ba2ecece62b85e60117248d9aee
|
@@ -5,9 +5,10 @@ ce:airgapped:
|
|
5
5
|
- .high-capacity
|
6
6
|
- .ce-variables
|
7
7
|
- .rspec-report-opts
|
8
|
+
parallel: 10
|
8
9
|
variables:
|
9
10
|
QA_SCENARIO: "Test::Instance::Airgapped"
|
10
|
-
QA_RSPEC_TAGS: "--tag
|
11
|
+
QA_RSPEC_TAGS: "--tag '~github' --tag '~skip_live_env'"
|
11
12
|
|
12
13
|
ee:airgapped:
|
13
14
|
extends:
|
@@ -16,8 +17,7 @@ ee:airgapped:
|
|
16
17
|
- .high-capacity
|
17
18
|
- .ee-variables
|
18
19
|
- .rspec-report-opts
|
20
|
+
parallel: 10
|
19
21
|
variables:
|
20
22
|
QA_SCENARIO: "Test::Instance::Airgapped"
|
21
|
-
QA_RSPEC_TAGS: "--tag
|
22
|
-
|
23
|
-
|
23
|
+
QA_RSPEC_TAGS: "--tag '~github' --tag '~skip_live_env'"
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
gitlab-qa (8.
|
4
|
+
gitlab-qa (8.15.0)
|
5
5
|
activesupport (~> 6.1)
|
6
6
|
gitlab (~> 4.18.0)
|
7
7
|
http (~> 5.0)
|
@@ -102,7 +102,7 @@ GEM
|
|
102
102
|
rubocop-rails (~> 2.9)
|
103
103
|
rubocop-rspec (~> 1.44)
|
104
104
|
hashdiff (1.0.1)
|
105
|
-
http (5.1.
|
105
|
+
http (5.1.1)
|
106
106
|
addressable (~> 2.8)
|
107
107
|
http-cookie (~> 1.0)
|
108
108
|
http-form_data (~> 2.2)
|
@@ -120,6 +120,7 @@ GEM
|
|
120
120
|
rexml
|
121
121
|
kramdown-parser-gfm (1.1.0)
|
122
122
|
kramdown (~> 2.0)
|
123
|
+
lefthook (1.2.6)
|
123
124
|
llhttp-ffi (0.4.0)
|
124
125
|
ffi-compiler (~> 1.0)
|
125
126
|
rake (~> 13.0)
|
@@ -240,6 +241,7 @@ DEPENDENCIES
|
|
240
241
|
gitlab-dangerfiles (~> 2.11)
|
241
242
|
gitlab-qa!
|
242
243
|
gitlab-styles (~> 6.2.1)
|
244
|
+
lefthook (~> 1.2.6)
|
243
245
|
pry (~> 0.11)
|
244
246
|
rake (~> 13.0)
|
245
247
|
rspec (~> 3.7)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# HTTP mocking
|
2
|
+
|
3
|
+
Some scenario types might require mocking third party services. [Mock server](../../lib/gitlab/qa/component/mock_server.rb) component
|
4
|
+
can be used for that. It is based on simple http mock server called [smocker](https://smocker.dev/).
|
5
|
+
|
6
|
+
## Using
|
7
|
+
|
8
|
+
Simple usage example:
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
Component::Gitlab.perform do |gitlab|
|
12
|
+
gitlab.network = 'test'
|
13
|
+
gitlab.instance do
|
14
|
+
Component::MockServer.perform do |mock|
|
15
|
+
mock.network = gitlab.network
|
16
|
+
mock.instance do
|
17
|
+
Component::Specs.perform do
|
18
|
+
...
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
```
|
25
|
+
|
26
|
+
Mock server will be accessible from within gitlab or qa test container via `http://smocker.test` url and admin interface will be
|
27
|
+
accessible via `http://smocker.test:8081`. Refer to [Getting Started](https://smocker.dev/guide/getting-started.html) guide on
|
28
|
+
how to use the server and define mocked requests and responses.
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# SSL
|
2
|
+
|
3
|
+
## Enabling https for services
|
4
|
+
|
5
|
+
In order to test services with ssl enabled, `certificate authority (CA)` certs as well as applicant key pairs have been created and are
|
6
|
+
located in [tls_certificates/](../../tls_certificates/) folder.
|
7
|
+
|
8
|
+
**All certificates are used for testing purposes only and are not present in any of release images.**
|
9
|
+
|
10
|
+
## Generating new key pairs
|
11
|
+
|
12
|
+
To create new key pair for a new service, following commands can be used:
|
13
|
+
|
14
|
+
* creating new private key:
|
15
|
+
|
16
|
+
```console
|
17
|
+
$ cd tls_certificates && mkdir service && cd service
|
18
|
+
```
|
19
|
+
|
20
|
+
```console
|
21
|
+
$ openssl genrsa -out service.key 4096
|
22
|
+
```
|
23
|
+
|
24
|
+
* creating public key and `certificate signing request (CSR)`
|
25
|
+
|
26
|
+
```console
|
27
|
+
$ openssl req -new -key service.key -out service.csr -subj "/C=US/ST=California/L=San Francisco/O=Gitlab Authors/CN=service.test" -addext "subjectAltName=DNS:service.test,DNS:extra.service.test"
|
28
|
+
```
|
29
|
+
|
30
|
+
```console
|
31
|
+
$ openssl x509 -req -days 3650 -in service.csr -CA ../authority/ca.crt -CAkey ../authority/ca.key -set_serial 1 -out service.crt -extfile <(printf "subjectAltName=DNS:service.test,DNS:extra.service.test")
|
32
|
+
```
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# Style Guide
|
2
|
+
|
3
|
+
## RuboCop rule development guide
|
4
|
+
|
5
|
+
Our codebase style is defined and enforced by [RuboCop](https://github.com/rubocop/rubocop).
|
6
|
+
|
7
|
+
You can check for any offenses locally with `bundle exec rubocop --parallel`.
|
8
|
+
On the CI, this is automatically checked by the `rubocop` jobs in the `check` stage.
|
9
|
+
|
10
|
+
### Lefthook
|
11
|
+
|
12
|
+
[Lefthook](https://github.com/evilmartians/lefthook) is a Git hooks manager that allows
|
13
|
+
custom logic to be executed prior to Git committing or pushing. GitLab comes with
|
14
|
+
Lefthook configuration (`lefthook.yml`), but it must be installed.
|
15
|
+
|
16
|
+
We have a `lefthook.yml` checked in but it is ignored until Lefthook is installed.
|
17
|
+
|
18
|
+
### Install Lefthook
|
19
|
+
|
20
|
+
```shell
|
21
|
+
# Install the `lefthook` Ruby gem:
|
22
|
+
bundle install
|
23
|
+
# Initialize the lefthook config and adds to .git/hooks dir
|
24
|
+
bundle exec lefthook install
|
25
|
+
# Verify hook execution works as expected
|
26
|
+
bundle exec lefthook run pre-push
|
27
|
+
```
|
28
|
+
|
29
|
+
For a detailed guide on left hook configuration see https://github.com/evilmartians/lefthook/blob/master/docs/configuration.md
|
data/gitlab-qa.gemspec
CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_development_dependency 'climate_control', '~> 1.0.1'
|
24
24
|
spec.add_development_dependency 'gitlab-dangerfiles', '~> 2.11'
|
25
25
|
spec.add_development_dependency 'gitlab-styles', '~> 6.2.1'
|
26
|
+
spec.add_development_dependency 'lefthook', '~> 1.2.6'
|
26
27
|
spec.add_development_dependency 'pry', '~> 0.11'
|
27
28
|
spec.add_development_dependency 'rake', '~> 13.0'
|
28
29
|
spec.add_development_dependency 'rspec', '~> 3.7'
|
data/lefthook.yml
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# EXAMPLE USAGE:
|
2
|
+
|
3
|
+
# Refer for explanation to following link:
|
4
|
+
# https://github.com/evilmartians/lefthook/blob/master/docs/configuration.md
|
5
|
+
#
|
6
|
+
pre-push:
|
7
|
+
commands:
|
8
|
+
rubocop:
|
9
|
+
tags: backend style
|
10
|
+
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
|
11
|
+
glob: '*.{rb,rake}'
|
12
|
+
run: REVEAL_RUBOCOP_TODO=0 bundle exec rubocop --parallel --force-exclusion {files}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "securerandom"
|
4
|
+
|
5
|
+
module Gitlab
|
6
|
+
module QA
|
7
|
+
module Component
|
8
|
+
# Generic helper component running alpine linux image
|
9
|
+
# Useful for populating volumes beforehand or running any other action that requires a running container
|
10
|
+
# and has to be performed before main component containers are started
|
11
|
+
#
|
12
|
+
class Alpine < Base
|
13
|
+
DOCKER_IMAGE = "alpine"
|
14
|
+
DOCKER_IMAGE_TAG = "latest"
|
15
|
+
|
16
|
+
def name
|
17
|
+
@name ||= "alpine-#{SecureRandom.hex(4)}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def start
|
21
|
+
docker.run(image: image, tag: tag, args: ["tail", "-f", "/dev/null"]) do |command|
|
22
|
+
command << "-d"
|
23
|
+
command << "--name #{name}"
|
24
|
+
|
25
|
+
volumes.each { |to, from| command.volume(to, from, 'Z') }
|
26
|
+
environment.each { |key, value| command.env(key, value) }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def prepare
|
31
|
+
prepare_docker_container
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -6,9 +6,18 @@ module Gitlab
|
|
6
6
|
class Base
|
7
7
|
include Scenario::Actable
|
8
8
|
|
9
|
+
CERTIFICATES_PATH = File.expand_path('../../../../tls_certificates', __dir__)
|
10
|
+
|
9
11
|
attr_reader :docker
|
10
|
-
attr_accessor :volumes, :ports, :network, :environment, :runner_network, :airgapped_network
|
11
12
|
attr_writer :name, :exec_commands
|
13
|
+
attr_accessor :volumes,
|
14
|
+
:ports,
|
15
|
+
:network,
|
16
|
+
:network_aliases,
|
17
|
+
:environment,
|
18
|
+
:runner_network,
|
19
|
+
:airgapped_network,
|
20
|
+
:additional_hosts
|
12
21
|
|
13
22
|
def initialize
|
14
23
|
@docker = Docker::Engine.new
|
@@ -17,6 +26,7 @@ module Gitlab
|
|
17
26
|
@ports = []
|
18
27
|
@network_aliases = []
|
19
28
|
@exec_commands = []
|
29
|
+
@additional_hosts = []
|
20
30
|
end
|
21
31
|
|
22
32
|
def add_network_alias(name)
|
@@ -74,18 +84,21 @@ module Gitlab
|
|
74
84
|
def prepare_network
|
75
85
|
prepare_airgapped_network
|
76
86
|
prepare_runner_network
|
77
|
-
|
78
87
|
return if docker.network_exists?(network)
|
79
88
|
|
80
89
|
docker.network_create(network)
|
81
90
|
end
|
82
91
|
|
83
92
|
def prepare_airgapped_network
|
84
|
-
|
93
|
+
return unless airgapped_network && !docker.network_exists?(network)
|
94
|
+
|
95
|
+
docker.network_create("--driver=bridge --internal #{network}")
|
85
96
|
end
|
86
97
|
|
87
98
|
def prepare_runner_network
|
88
|
-
|
99
|
+
return unless runner_network && !docker.network_exists?(runner_network)
|
100
|
+
|
101
|
+
docker.network_create("--driver=bridge --internal #{runner_network}")
|
89
102
|
end
|
90
103
|
|
91
104
|
def prepare_docker_container
|
@@ -118,6 +131,10 @@ module Gitlab
|
|
118
131
|
@network_aliases.to_a.each do |network_alias|
|
119
132
|
command << "--network-alias #{network_alias}"
|
120
133
|
end
|
134
|
+
|
135
|
+
@additional_hosts.each do |host|
|
136
|
+
command << "--add-host=#{host}"
|
137
|
+
end
|
121
138
|
end
|
122
139
|
end
|
123
140
|
|
@@ -6,7 +6,7 @@ module Gitlab
|
|
6
6
|
class GitalyCluster
|
7
7
|
class GitalyClusterConfig
|
8
8
|
attr_accessor :gitlab_name, :network, :airgapped_network,
|
9
|
-
:praefect_node_name, :praefect_port,
|
9
|
+
:praefect_node_name, :praefect_port, :praefect_ip,
|
10
10
|
:primary_node_name, :primary_node_port,
|
11
11
|
:secondary_node_name, :secondary_node_port,
|
12
12
|
:tertiary_node_name, :tertiary_node_port,
|
@@ -90,6 +90,7 @@ module Gitlab
|
|
90
90
|
end
|
91
91
|
|
92
92
|
@praefect_node = praefect(release)
|
93
|
+
config.praefect_ip = praefect_node.ip_address
|
93
94
|
Runtime::Logger.info("Gitaly Cluster Ready")
|
94
95
|
end
|
95
96
|
|
@@ -16,17 +16,28 @@ module Gitlab
|
|
16
16
|
extend Forwardable
|
17
17
|
using Rainbow
|
18
18
|
|
19
|
-
attr_reader :release,
|
20
|
-
|
19
|
+
attr_reader :release,
|
20
|
+
:omnibus_configuration,
|
21
|
+
:omnibus_gitlab_rails_env,
|
22
|
+
:authority_volume,
|
23
|
+
:ssl_volume
|
24
|
+
|
25
|
+
attr_accessor :tls,
|
26
|
+
:skip_availability_check,
|
27
|
+
:runner_network,
|
28
|
+
:seed_admin_token,
|
29
|
+
:seed_db,
|
30
|
+
:skip_server_hooks,
|
31
|
+
:gitaly_tls
|
32
|
+
|
21
33
|
attr_writer :name, :relative_path
|
22
34
|
|
23
35
|
def_delegators :release, :tag, :image, :edition
|
24
36
|
|
25
|
-
CERTIFICATES_PATH = File.expand_path('../../../../tls_certificates', __dir__)
|
26
37
|
DATA_SEED_PATH = File.expand_path('../../../../support/data', __dir__)
|
27
38
|
|
28
|
-
SSL_PATH = '/etc/gitlab/ssl'
|
29
39
|
TRUSTED_PATH = '/etc/gitlab/trusted-certs'
|
40
|
+
SSL_PATH = '/etc/gitlab/ssl'
|
30
41
|
DATA_PATH = '/tmp/data-seeds'
|
31
42
|
|
32
43
|
def initialize
|
@@ -34,17 +45,8 @@ module Gitlab
|
|
34
45
|
|
35
46
|
@skip_availability_check = false
|
36
47
|
@omnibus_gitlab_rails_env = {}
|
37
|
-
|
38
48
|
@omnibus_configuration = Runtime::OmnibusConfiguration.new(Runtime::Scenario.omnibus_configuration)
|
39
|
-
|
40
|
-
@working_dir_tmp_cert_path = Dir.mktmpdir('certs', FileUtils.mkdir_p("#{Dir.pwd}/tmp"))
|
41
|
-
@authority_cert_path = "#{@working_dir_tmp_cert_path}/authority"
|
42
|
-
@gitlab_cert_path = "#{@working_dir_tmp_cert_path}/gitlab"
|
43
|
-
@gitaly_cert_path = "#{@working_dir_tmp_cert_path}/gitaly"
|
44
|
-
|
45
|
-
@volumes[@gitlab_cert_path] = SSL_PATH
|
46
|
-
@volumes[@authority_cert_path] = TRUSTED_PATH
|
47
|
-
|
49
|
+
@cert_volumes = { "authority" => TRUSTED_PATH, "gitlab-ssl" => SSL_PATH }
|
48
50
|
@seed_admin_token = Runtime::Scenario.seed_admin_token
|
49
51
|
@seed_db = Runtime::Scenario.seed_db
|
50
52
|
@skip_server_hooks = Runtime::Scenario.skip_server_hooks
|
@@ -89,11 +91,6 @@ module Gitlab
|
|
89
91
|
tls ? ["443:443"] : ["80"]
|
90
92
|
end
|
91
93
|
|
92
|
-
def gitaly_tls
|
93
|
-
@volumes.delete(@gitlab_cert_path)
|
94
|
-
@volumes[@gitaly_cert_path] = SSL_PATH
|
95
|
-
end
|
96
|
-
|
97
94
|
def relative_path
|
98
95
|
@relative_path ||= ''
|
99
96
|
end
|
@@ -109,12 +106,6 @@ module Gitlab
|
|
109
106
|
super
|
110
107
|
end
|
111
108
|
|
112
|
-
def teardown!
|
113
|
-
FileUtils.rm_rf(@working_dir_tmp_cert_path)
|
114
|
-
|
115
|
-
super
|
116
|
-
end
|
117
|
-
|
118
109
|
def pull
|
119
110
|
docker.login(**release.login_params) if release.login_params
|
120
111
|
|
@@ -146,7 +137,7 @@ module Gitlab
|
|
146
137
|
command.port(mapping)
|
147
138
|
end
|
148
139
|
|
149
|
-
@volumes.to_h.each do |to, from|
|
140
|
+
@volumes.to_h.merge(cert_volumes).each do |to, from|
|
150
141
|
command.volume(to, from, 'Z')
|
151
142
|
end
|
152
143
|
|
@@ -159,6 +150,10 @@ module Gitlab
|
|
159
150
|
@network_aliases.to_a.each do |network_alias|
|
160
151
|
command << "--network-alias #{network_alias}"
|
161
152
|
end
|
153
|
+
|
154
|
+
@additional_hosts.each do |host|
|
155
|
+
command << "--add-host=#{host}"
|
156
|
+
end
|
162
157
|
end
|
163
158
|
|
164
159
|
return unless runner_network
|
@@ -239,19 +234,28 @@ module Gitlab
|
|
239
234
|
|
240
235
|
private
|
241
236
|
|
237
|
+
attr_reader :cert_volumes
|
238
|
+
|
242
239
|
def read_package_manifest
|
243
|
-
@docker.read_file(
|
244
|
-
@release.image, @release.tag,
|
245
|
-
'/opt/gitlab/version-manifest.json'
|
246
|
-
)
|
240
|
+
@docker.read_file(@release.image, @release.tag, '/opt/gitlab/version-manifest.json')
|
247
241
|
end
|
248
242
|
|
249
|
-
#
|
250
|
-
#
|
243
|
+
# Create cert files in separate volumes
|
244
|
+
#
|
245
|
+
# tls_certificates folder can't be mounted directly when remote docker context is used
|
246
|
+
# due to not having access to local dir
|
251
247
|
#
|
252
248
|
# @return [void]
|
253
249
|
def copy_certificates
|
254
|
-
|
250
|
+
Alpine.perform do |alpine|
|
251
|
+
alpine.volumes = cert_volumes
|
252
|
+
|
253
|
+
alpine.start_instance
|
254
|
+
docker.copy(alpine.name, "#{CERTIFICATES_PATH}/authority/.", TRUSTED_PATH)
|
255
|
+
docker.copy(alpine.name, "#{CERTIFICATES_PATH}/#{gitaly_tls ? 'gitaly' : 'gitlab'}/.", SSL_PATH)
|
256
|
+
ensure
|
257
|
+
alpine.teardown! # always remove container, even when global `--no-tests` flag was provided
|
258
|
+
end
|
255
259
|
end
|
256
260
|
|
257
261
|
def ensure_configured!
|
@@ -3,6 +3,9 @@
|
|
3
3
|
module Gitlab
|
4
4
|
module QA
|
5
5
|
module Component
|
6
|
+
# General purpose http mock server
|
7
|
+
# see: https://smocker.dev/
|
8
|
+
#
|
6
9
|
class MockServer < Base
|
7
10
|
DOCKER_IMAGE = "thiht/smocker"
|
8
11
|
DOCKER_IMAGE_TAG = "0.18.2"
|
@@ -10,11 +13,45 @@ module Gitlab
|
|
10
13
|
def initialize
|
11
14
|
super
|
12
15
|
|
13
|
-
@
|
14
|
-
@name = "smocker
|
16
|
+
@tls = false
|
17
|
+
@name = "smocker"
|
18
|
+
@tls_path = "/etc/smocker/tls"
|
19
|
+
@ports = [80, 8081]
|
20
|
+
@environment = { "SMOCKER_MOCK_SERVER_LISTEN_PORT" => 80 }
|
15
21
|
end
|
16
22
|
|
17
23
|
attr_reader :name
|
24
|
+
attr_writer :tls
|
25
|
+
|
26
|
+
def prepare
|
27
|
+
super
|
28
|
+
|
29
|
+
setup_tls if tls
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
attr_reader :tls_path, :tls
|
35
|
+
|
36
|
+
def setup_tls
|
37
|
+
@volumes = { "smocker-ssl" => tls_path }
|
38
|
+
@ports = [443, 8081]
|
39
|
+
@environment = {
|
40
|
+
"SMOCKER_MOCK_SERVER_LISTEN_PORT" => 443,
|
41
|
+
"SMOCKER_TLS_ENABLE" => "true",
|
42
|
+
"SMOCKER_TLS_CERT_FILE" => "#{@tls_path}/smocker.crt",
|
43
|
+
"SMOCKER_TLS_PRIVATE_KEY_FILE" => "#{@tls_path}/smocker.key"
|
44
|
+
}
|
45
|
+
|
46
|
+
Alpine.perform do |alpine|
|
47
|
+
alpine.volumes = volumes
|
48
|
+
|
49
|
+
alpine.start_instance
|
50
|
+
docker.copy(alpine.name, "#{CERTIFICATES_PATH}/smocker/.", tls_path)
|
51
|
+
ensure
|
52
|
+
alpine.teardown! # always remove container, even when global `--no-tests` flag was provided
|
53
|
+
end
|
54
|
+
end
|
18
55
|
end
|
19
56
|
end
|
20
57
|
end
|
@@ -39,7 +39,6 @@ module Gitlab
|
|
39
39
|
'QA_EXPORT_TEST_METRICS' => :qa_export_test_metrics,
|
40
40
|
'QA_INFLUXDB_URL' => :qa_influxdb_url,
|
41
41
|
'QA_INFLUXDB_TOKEN' => :qa_influxdb_token,
|
42
|
-
'QA_RUN_TYPE' => :qa_run_type,
|
43
42
|
'QA_SKIP_PULL' => :qa_skip_pull,
|
44
43
|
'QA_VALIDATE_RESOURCE_REUSE' => :qa_validate_resource_reuse,
|
45
44
|
'GITLAB_API_BASE' => :api_base,
|
@@ -7,31 +7,38 @@ module Gitlab
|
|
7
7
|
module Instance
|
8
8
|
class Airgapped < Scenario::Template
|
9
9
|
require 'resolv'
|
10
|
-
attr_reader :config, :gitlab_air_gap_commands
|
10
|
+
attr_reader :config, :gitlab_air_gap_commands, :iptables_restricted_network, :airgapped_network_name
|
11
11
|
|
12
12
|
def initialize
|
13
|
+
# Uses https://docs.docker.com/engine/reference/commandline/network_create/#network-internal-mode
|
14
|
+
@airgapped_network_name = 'airgapped'
|
15
|
+
# Uses iptables to deny all network traffic, with a number of exceptions for required ports and IPs
|
16
|
+
@iptables_restricted_network = 'test'
|
13
17
|
@config = Component::GitalyCluster::GitalyClusterConfig.new(
|
18
|
+
gitlab_name: "gitlab-airgapped-#{SecureRandom.hex(4)}",
|
14
19
|
airgapped_network: true,
|
15
|
-
network:
|
20
|
+
network: airgapped_network_name
|
16
21
|
)
|
17
22
|
end
|
18
23
|
|
19
24
|
def perform(release, *rspec_args)
|
20
25
|
Component::Gitlab.perform do |gitlab|
|
21
|
-
|
26
|
+
Component::GitalyCluster.perform do |cluster|
|
22
27
|
cluster.config = @config
|
23
|
-
cluster.
|
28
|
+
cluster.release = release
|
29
|
+
# we need to get an IP for praefect before proceeding so it cannot be run in parallel with gitlab
|
30
|
+
cluster.instance(true).join
|
24
31
|
end
|
25
32
|
gitlab.name = config.gitlab_name
|
26
33
|
gitlab.release = release
|
27
|
-
gitlab.
|
28
|
-
gitlab.
|
34
|
+
gitlab.network = iptables_restricted_network # we use iptables to restrict access on the gitlab instance
|
35
|
+
gitlab.runner_network = config.network
|
36
|
+
gitlab.exec_commands = airgap_gitlab_commands
|
37
|
+
gitlab.skip_availability_check = true
|
29
38
|
gitlab.omnibus_configuration << gitlab_omnibus_configuration
|
30
|
-
gitlab.skip_availability_check = true # airgapped environment cannot be pinged to check health
|
31
39
|
rspec_args << "--" unless rspec_args.include?('--')
|
32
40
|
rspec_args << %w[--tag ~orchestrated]
|
33
41
|
gitlab.instance do
|
34
|
-
cluster.join
|
35
42
|
Component::Specs.perform do |specs|
|
36
43
|
specs.suite = 'Test::Instance::Airgapped'
|
37
44
|
specs.release = gitlab.release
|
@@ -45,9 +52,55 @@ module Gitlab
|
|
45
52
|
|
46
53
|
private
|
47
54
|
|
55
|
+
def airgap_gitlab_commands
|
56
|
+
gitlab_ip = Resolv.getaddress('gitlab.com')
|
57
|
+
gitlab_registry_ip = Resolv.getaddress(QA::Release::COM_REGISTRY)
|
58
|
+
dev_gitlab_registry_ip = Resolv.getaddress(QA::Release::DEV_REGISTRY.split(':')[0])
|
59
|
+
praefect_ip = config.praefect_ip
|
60
|
+
@commands = <<~AIRGAP_AND_VERIFY_COMMAND.split(/\n+/)
|
61
|
+
# Should not fail before airgapping due to eg. DNS failure
|
62
|
+
# Ping and wget check
|
63
|
+
apt-get update && apt-get install -y iptables ncat
|
64
|
+
if ncat -zv -w 10 #{gitlab_ip} 80; then echo 'Airgapped connectivity check passed.'; else echo 'Airgapped connectivity check failed - should be able to access gitlab_ip'; exit 1; fi;
|
65
|
+
|
66
|
+
echo "Checking regular connectivity..." \
|
67
|
+
&& wget --retry-connrefused --waitretry=1 --read-timeout=15 --timeout=10 -t 2 http://registry.gitlab.com > /dev/null 2>&1 \
|
68
|
+
&& (echo "Regular connectivity wget check passed." && exit 0) || (echo "Regular connectivity wget check failed." && exit 1)
|
69
|
+
|
70
|
+
iptables -P INPUT DROP && iptables -P OUTPUT DROP
|
71
|
+
iptables -A INPUT -i lo -j ACCEPT && iptables -A OUTPUT -o lo -j ACCEPT # LOOPBACK
|
72
|
+
iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
|
73
|
+
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
|
74
|
+
|
75
|
+
# Jenkins on port 8080 and 50000
|
76
|
+
iptables -A OUTPUT -p tcp -m tcp --dport 8080 -m state --state NEW,ESTABLISHED -j ACCEPT \
|
77
|
+
&& iptables -A OUTPUT -p tcp -m tcp --dport 50000 -m state --state NEW,ESTABLISHED -j ACCEPT
|
78
|
+
iptables -A OUTPUT -p tcp -m tcp --sport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
|
79
|
+
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
|
80
|
+
iptables -A OUTPUT -p tcp -m tcp --sport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
|
81
|
+
iptables -A INPUT -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
|
82
|
+
|
83
|
+
# some exceptions to allow runners access network https://gitlab.com/gitlab-org/gitlab-qa/-/issues/700
|
84
|
+
iptables -A OUTPUT -p tcp -d #{gitlab_registry_ip} -j ACCEPT
|
85
|
+
iptables -A OUTPUT -p tcp -d #{dev_gitlab_registry_ip} -j ACCEPT
|
86
|
+
# allow access to praefect node
|
87
|
+
iptables -A OUTPUT -p tcp -d #{praefect_ip} -j ACCEPT
|
88
|
+
|
89
|
+
# Should now fail to ping gitlab_ip, port 22/80 should be open
|
90
|
+
if ncat -zv -w 10 #{gitlab_ip} 80; then echo 'Airgapped connectivity check failed - should not be able to access gitlab_ip'; exit 1; else echo 'Airgapped connectivity check passed.'; fi;
|
91
|
+
if ncat -zv -w 10 127.0.0.1 22; then echo 'Airgapped connectivity port 22 check passed.'; else echo 'Airgapped connectivity port 22 check failed.'; exit 1; fi;
|
92
|
+
if ncat -zv -w 10 127.0.0.1 80; then echo 'Airgapped connectivity port 80 check passed.'; else echo 'Airgapped connectivity port 80 check failed.'; exit 1 ; fi;
|
93
|
+
if ncat -zv -w 10 #{gitlab_registry_ip} 80; then echo 'Airgapped connectivity port gitlab_registry_ip check passed.'; else echo 'Airgapped connectivity port 80 check failed.'; exit 1; fi;
|
94
|
+
|
95
|
+
echo "Checking airgapped connectivity..." \
|
96
|
+
&& wget --retry-connrefused --waitretry=1 --read-timeout=15 --timeout=10 -t 2 http://registry.gitlab.com > /dev/null 2>&1 \
|
97
|
+
&& (echo "Airgapped network faulty. Connectivity wget check failed." && exit 1) || (echo "Airgapped network confirmed. Connectivity wget check passed." && exit 0)
|
98
|
+
AIRGAP_AND_VERIFY_COMMAND
|
99
|
+
end
|
100
|
+
|
48
101
|
def gitlab_omnibus_configuration
|
49
102
|
<<~OMNIBUS
|
50
|
-
external_url 'http://#{config.gitlab_name}.#{
|
103
|
+
external_url 'http://#{config.gitlab_name}.#{iptables_restricted_network}';
|
51
104
|
|
52
105
|
git_data_dirs({
|
53
106
|
'default' => {
|
@@ -21,7 +21,10 @@ module Gitlab
|
|
21
21
|
gitlab.name = config.gitlab_name
|
22
22
|
gitlab.network = config.network
|
23
23
|
gitlab.omnibus_configuration << gitlab_omnibus_configuration
|
24
|
-
cluster = Component::GitalyCluster.perform
|
24
|
+
cluster = Component::GitalyCluster.perform do |cluster|
|
25
|
+
cluster.release = release
|
26
|
+
cluster.instance
|
27
|
+
end
|
25
28
|
gitlab.instance do
|
26
29
|
cluster.join
|
27
30
|
Runtime::Logger.info('Running Gitaly Cluster specs!')
|
@@ -14,10 +14,13 @@ module Gitlab
|
|
14
14
|
#
|
15
15
|
class Import < Scenario::Template
|
16
16
|
def initialize
|
17
|
-
@source_gitlab = Component::Gitlab.new
|
18
|
-
@target_gitlab = Component::Gitlab.new
|
19
|
-
@mock_server = Component::MockServer.new
|
20
17
|
@network = "test"
|
18
|
+
@source_gitlab = Component::Gitlab.new.tap { |gitlab| gitlab.network = @network }
|
19
|
+
@target_gitlab = Component::Gitlab.new.tap { |gitlab| gitlab.network = @network }
|
20
|
+
@mock_server = Component::MockServer.new.tap do |server|
|
21
|
+
server.network = @network
|
22
|
+
server.tls = true
|
23
|
+
end
|
21
24
|
end
|
22
25
|
|
23
26
|
attr_reader :source_gitlab, :target_gitlab, :mock_server, :network
|
@@ -39,11 +42,7 @@ module Gitlab
|
|
39
42
|
#
|
40
43
|
# @return [void]
|
41
44
|
def start_mock_server
|
42
|
-
mock_server.
|
43
|
-
server.network = network
|
44
|
-
|
45
|
-
server.start_instance
|
46
|
-
end
|
45
|
+
mock_server.start_instance
|
47
46
|
end
|
48
47
|
|
49
48
|
# Start gitlab instance
|
@@ -52,14 +51,19 @@ module Gitlab
|
|
52
51
|
# @return [void]
|
53
52
|
def start_gitlab_instances(release)
|
54
53
|
instances = [
|
55
|
-
{ instance: source_gitlab, name: "import-source" },
|
56
|
-
{
|
54
|
+
{ instance: source_gitlab, name: "import-source", additional_hosts: [] },
|
55
|
+
{
|
56
|
+
instance: target_gitlab,
|
57
|
+
name: "import-target",
|
58
|
+
additional_hosts: ["api.github.com:#{mock_server.ip_address}"]
|
59
|
+
}
|
57
60
|
]
|
61
|
+
|
58
62
|
::Parallel.each(instances, in_threads: 2) do |gitlab_instance|
|
59
63
|
gitlab_instance[:instance].tap do |gitlab|
|
60
64
|
gitlab.name = gitlab_instance[:name]
|
61
|
-
gitlab.network = network
|
62
65
|
gitlab.release = release
|
66
|
+
gitlab.additional_hosts = gitlab_instance[:additional_hosts]
|
63
67
|
gitlab.seed_admin_token = true
|
64
68
|
|
65
69
|
gitlab.start_instance
|
@@ -76,8 +80,12 @@ module Gitlab
|
|
76
80
|
specs.suite = "Test::Integration::Import"
|
77
81
|
specs.release = target_gitlab.release
|
78
82
|
specs.network = network
|
79
|
-
specs.env = { "QA_IMPORT_SOURCE_URL" => source_gitlab.address, "QA_ALLOW_LOCAL_REQUESTS" => "true" }
|
80
83
|
specs.args = [target_gitlab.address, *rspec_args]
|
84
|
+
specs.env = {
|
85
|
+
"QA_ALLOW_LOCAL_REQUESTS" => "true",
|
86
|
+
"QA_IMPORT_SOURCE_URL" => source_gitlab.address,
|
87
|
+
"QA_SMOCKER_HOST" => mock_server.hostname
|
88
|
+
}
|
81
89
|
end
|
82
90
|
end
|
83
91
|
end
|
@@ -16,44 +16,57 @@ module Gitlab
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def perform(release, *rspec_args)
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
19
|
+
# You can create 2 networks with the same 'human friendly' name if you run network create in parallel
|
20
|
+
# However this causes 'ambiguous network' errors, so lets just create network manually earlier
|
21
|
+
# see https://github.com/moby/moby/issues/18864#issuecomment-167006094
|
22
|
+
# and also api docs https://github.com/moby/moby/blob/master/docs/api/v1.42.yaml#L9932-L9941
|
23
|
+
docker = Docker::Engine.new
|
24
|
+
docker.network_create(@network) unless docker.network_exists?(@network)
|
25
|
+
|
26
|
+
gitaly_thread = Thread.new do
|
27
|
+
Thread.current.abort_on_exception = true
|
28
|
+
@gitaly_node = Component::Gitlab.perform do |gitaly|
|
29
|
+
gitaly.release = QA::Release.new(release)
|
30
|
+
gitaly.name = @gitaly_name
|
31
|
+
gitaly.network = @network
|
32
|
+
gitaly.skip_availability_check = true
|
33
|
+
gitaly.seed_admin_token = false
|
34
|
+
|
35
|
+
gitaly.omnibus_configuration << gitaly_omnibus
|
36
|
+
gitaly.gitaly_tls = true
|
37
|
+
|
38
|
+
gitaly.instance(skip_teardown: true)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
Component::Gitlab.perform do |gitlab|
|
43
|
+
gitlab.release = QA::Release.new(release)
|
44
|
+
gitlab.name = @gitlab_name
|
45
|
+
gitlab.network = @network
|
46
|
+
|
47
|
+
gitlab.omnibus_configuration << gitlab_omnibus
|
48
|
+
gitlab.tls = true
|
49
|
+
|
50
|
+
gitlab.instance do
|
51
|
+
gitaly_thread.join
|
52
|
+
Runtime::Logger.info("Running mTLS specs!")
|
53
|
+
|
54
|
+
if @tag
|
55
|
+
rspec_args << "--" unless rspec_args.include?('--')
|
56
|
+
rspec_args << "--tag" << @tag
|
57
|
+
end
|
58
|
+
|
59
|
+
Component::Specs.perform do |specs|
|
60
|
+
specs.suite = @spec_suite
|
61
|
+
specs.release = gitlab.release
|
62
|
+
specs.network = gitlab.network
|
63
|
+
specs.args = [gitlab.address, *rspec_args]
|
64
|
+
specs.env = @env
|
54
65
|
end
|
55
66
|
end
|
56
67
|
end
|
68
|
+
ensure
|
69
|
+
@gitaly_node&.teardown
|
57
70
|
end
|
58
71
|
|
59
72
|
def gitlab_omnibus
|
data/lib/gitlab/qa/version.rb
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
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
|
31
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,29 @@
|
|
1
|
+
-----BEGIN CERTIFICATE REQUEST-----
|
2
|
+
MIIE6zCCAtMCAQAwbDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWEx
|
3
|
+
FjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xFzAVBgNVBAoMDkdpdGxhYiBBdXRob3Jz
|
4
|
+
MRcwFQYDVQQDDA5hcGkuZ2l0aHViLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
|
5
|
+
ADCCAgoCggIBALxwrEgBMPwRoxJSgow2EtOxD+JrBcFdH6vQEpaPMXpPF1hiXJT+
|
6
|
+
2cflMkDje5QgkOs7WXm90Uytn1d6bM3yoX+VSlNzd+cVA0T33w3NnN0bcOjeE5Nr
|
7
|
+
JNFiWN7s/EHdjx6SlsKpbmUmRH18L9PwJMCiDTArzAifTAKAHCK4zUg/My61gZRm
|
8
|
+
DECfDaHMgcIXryZ9mGqIobdlwpLBBy3YUvn/1lwLvUCTGikrRgE4ufutF4SELw/A
|
9
|
+
4hZ3EPgTIHcd3izHNP1k45LDJc78UBAUGKgeZ4joLFLgE44ErwoMYZnWC8hCrY4d
|
10
|
+
g3GrNcGInnNgQypev11XTMpnT7QS41kQQ7tPBbZaduIUOUHMYheMFVI9zbqlCMWc
|
11
|
+
LlieI9twoL4numRm1uJaWjn1YW+0t78VFOI37rik1cqIx4YFsp25g4A1w2PUg7tW
|
12
|
+
LqjmWfyzi2KUB7hMk2IgzIoEag/tf5SIR9rV8KBnypUGoNbE26mNTUrdPxUIfWsF
|
13
|
+
ElRqi0k3fLDjW6FU+MunHocE3V9tepgSQOgSkNFUJa2gjFVBG70m1Ufcoe9FJ2a3
|
14
|
+
Uq/68Evu4Rst4PqE2sLkakuKKRXojUdBTEzu/MCUGbPV2g5VPKn/1WlBs+ux3YXq
|
15
|
+
S4vf/E7spQPdTTFmHp1FQTH4+4J6cZhlVxCi3ir3h2/ehx2jUnrSfYOTAgMBAAGg
|
16
|
+
OjA4BgkqhkiG9w0BCQ4xKzApMCcGA1UdEQQgMB6CDmFwaS5naXRodWIuY29tggxz
|
17
|
+
bW9ja2VyLnRlc3QwDQYJKoZIhvcNAQELBQADggIBAENNxApAwNQsxmHa+q4ZjPax
|
18
|
+
4uUb3Q2sQUqRZN2IAP+HDmlKy8scuhvvCkxuxC7rxZhupoEUR3MJoDAURLfIQLPu
|
19
|
+
S3zj1H7iIsi1sY+HDaMKmgK22IudIV3WuVgYcs1bdYHUc+lp1k8Y+KHp80f/hzpU
|
20
|
+
nkFVMsddzLglA8Kgt9zqER05iTxBoJfZYbLBzI31aPtmm/DUkAccU19ututbmmtk
|
21
|
+
7XDcDp3FbsgbR/XtkrbuMJGvbs3nyQ6JXK9Mj4AHn+Iucs+mYBULyMYtNbGGCY5h
|
22
|
+
AmJdScWAxCxDXEelUpml29dytqZCRBcvcdLwM4srP+VE5lbAkLcR0aETDeRAEshO
|
23
|
+
wB8QMZXql8Tc1quKNOr0pxoJZSA0dIjv/tUap8HiuNeEYN0F938uWTb1TQHSs9Dt
|
24
|
+
8d6/SXZZNZNw9xWoeBwdJE1TdcozGnXp6W93+BmGHkOib98FYRWO581Tv12v/x8V
|
25
|
+
9Jys/wzTmH8xrjjHWYlRx+m3yFGMY+Ou0Ee0Tw3lSAOj5tY5IEliVm+c67K57HDY
|
26
|
+
zhXajuiRfAXe4bsQN/FjvOJmLGxltEX1q01xWD9kP513LMLJSHQXOj/Iw9WZIBul
|
27
|
+
zKVAWqpN4XyvPzu/QAymW95tYUb9ZmByUi9OXpfMuTipN6ogvI3XBEpGkPGVzbgR
|
28
|
+
6ypgdzU8dPZyrsdb0A8s
|
29
|
+
-----END CERTIFICATE REQUEST-----
|
@@ -0,0 +1,51 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
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
|
51
|
+
-----END RSA PRIVATE KEY-----
|
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: 8.
|
4
|
+
version: 8.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GitLab Quality
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-01-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: climate_control
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 6.2.1
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: lefthook
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.2.6
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.2.6
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: pry
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -310,6 +324,9 @@ files:
|
|
310
324
|
- docs/README.md
|
311
325
|
- docs/architecture.md
|
312
326
|
- docs/configuring_omnibus.md
|
327
|
+
- docs/developer/http_mocking.md
|
328
|
+
- docs/developer/ssl.md
|
329
|
+
- docs/developer/style_guide.md
|
313
330
|
- docs/how_it_works.md
|
314
331
|
- docs/omnibus_configurations/license_mode.md
|
315
332
|
- docs/release_process.md
|
@@ -325,7 +342,9 @@ files:
|
|
325
342
|
- fixtures/ldap/3_add_groups.ldif
|
326
343
|
- fixtures/ldap/tanuki.ldif
|
327
344
|
- gitlab-qa.gemspec
|
345
|
+
- lefthook.yml
|
328
346
|
- lib/gitlab/qa.rb
|
347
|
+
- lib/gitlab/qa/component/alpine.rb
|
329
348
|
- lib/gitlab/qa/component/base.rb
|
330
349
|
- lib/gitlab/qa/component/chaos.rb
|
331
350
|
- lib/gitlab/qa/component/elasticsearch.rb
|
@@ -467,6 +486,9 @@ files:
|
|
467
486
|
- tls_certificates/gitlab/gitlab.test.crt
|
468
487
|
- tls_certificates/gitlab/gitlab.test.csr
|
469
488
|
- tls_certificates/gitlab/gitlab.test.key
|
489
|
+
- tls_certificates/smocker/smocker.crt
|
490
|
+
- tls_certificates/smocker/smocker.csr
|
491
|
+
- tls_certificates/smocker/smocker.key
|
470
492
|
- tmp/.gitignore
|
471
493
|
homepage: http://about.gitlab.com/
|
472
494
|
licenses:
|