Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
		
							parent
							
								
									78d059aba9
								
							
						
					
					
						commit
						83315ad1b3
					
				|  | @ -1553,6 +1553,10 @@ class MergeRequest < ApplicationRecord | |||
|     %r{\Arefs/#{Repository::REF_MERGE_REQUEST}/\d+/train\z}o.match?(ref) | ||||
|   end | ||||
| 
 | ||||
|   def train | ||||
|     MergeTrains::Train.new(target_project.id, target_branch) | ||||
|   end | ||||
| 
 | ||||
|   def in_locked_state | ||||
|     lock_mr | ||||
|     yield | ||||
|  |  | |||
|  | @ -757,8 +757,8 @@ For more information, see the [GitLab API user method documentation](https://pyt | |||
| You can configure OIDC group membership to: | ||||
| 
 | ||||
| - Require users to be members of a certain group. | ||||
| - Assign users [external roles](../../user/admin_area/external_users.md), or as | ||||
|   administrators based on group membership. | ||||
| - Assign users [external](../../user/admin_area/external_users.md), administrator or | ||||
|   [auditor](../auditor_users.md) roles based on group membership. | ||||
| 
 | ||||
| GitLab checks these groups on each sign in and updates user attributes as necessary. | ||||
| This feature **does not** allow you to automatically add users to GitLab | ||||
|  | @ -921,6 +921,83 @@ For self-compiled installations: | |||
| 1. Save the file and [reconfigure GitLab](../restart_gitlab.md#installations-from-source) | ||||
|    for the changes to take effect. | ||||
| 
 | ||||
| ### Auditor groups **(PREMIUM SELF)** | ||||
| 
 | ||||
| Your IdP must pass group information to GitLab in the OIDC response. To use this | ||||
| response to assign users as auditors based on group membership, configure GitLab to identify: | ||||
| 
 | ||||
| - Where to look for the groups in the OIDC response, using the `groups_attribute` setting. | ||||
| - Which group memberships grant the user auditor access, using the `auditor_groups` | ||||
|   setting. | ||||
| 
 | ||||
| For Linux package installations: | ||||
| 
 | ||||
| 1. Edit `/etc/gitlab/gitlab.rb`: | ||||
| 
 | ||||
|    ```ruby | ||||
|    gitlab_rails['omniauth_providers'] = [ | ||||
|      { | ||||
|        name: "openid_connect", | ||||
|        label: "Provider name", | ||||
|        args: { | ||||
|          name: "openid_connect", | ||||
|          scope: ["openid","profile","email","groups"], | ||||
|          response_type: "code", | ||||
|          issuer: "<your_oidc_url>", | ||||
|          discovery: true, | ||||
|          client_auth_method: "query", | ||||
|          uid_field: "<uid_field>", | ||||
|          client_options: { | ||||
|            identifier: "<your_oidc_client_id>", | ||||
|            secret: "<your_oidc_client_secret>", | ||||
|            redirect_uri: "<your_gitlab_url>/users/auth/openid_connect/callback", | ||||
|            gitlab: { | ||||
|              groups_attribute: "groups", | ||||
|              auditor_groups: ["Auditor"] | ||||
|            } | ||||
|          } | ||||
|        } | ||||
|      } | ||||
|    ] | ||||
|    ``` | ||||
| 
 | ||||
| 1. Save the file and [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation) | ||||
|    for the changes to take effect. | ||||
| 
 | ||||
| For self-compiled installations: | ||||
| 
 | ||||
| 1. Edit `/home/git/gitlab/config/gitlab.yml`: | ||||
| 
 | ||||
|    ```yaml | ||||
|    production: &base | ||||
|      omniauth: | ||||
|        providers: | ||||
|         - { name: 'openid_connect', | ||||
|             label: 'Provider name', | ||||
|          args: { | ||||
|            name: 'openid_connect', | ||||
|            scope: ['openid','profile','email','groups'], | ||||
|            response_type: 'code', | ||||
|            issuer: '<your_oidc_url>', | ||||
|            discovery: true, | ||||
|            client_auth_method: 'query', | ||||
|            uid_field: '<uid_field>', | ||||
|            client_options: { | ||||
|              identifier: '<your_oidc_client_id>', | ||||
|              secret: '<your_oidc_client_secret>', | ||||
|              redirect_uri: '<your_gitlab_url>/users/auth/openid_connect/callback', | ||||
|              gitlab: { | ||||
|                groups_attribute: "groups", | ||||
|                auditor_groups: ["Auditor"] | ||||
|              } | ||||
|            } | ||||
|          } | ||||
|        } | ||||
|    ``` | ||||
| 
 | ||||
| 1. Save the file and [reconfigure GitLab](../restart_gitlab.md#installations-from-source) | ||||
|    for the changes to take effect. | ||||
| 
 | ||||
| ### Administrator groups | ||||
| 
 | ||||
| Your IdP must pass group information to GitLab in the OIDC response. To use this | ||||
|  |  | |||
|  | @ -165,7 +165,8 @@ require `Administrator` to approve every deployment job in `Production`. | |||
| 
 | ||||
| ### Allow self-approval **(PREMIUM)** | ||||
| 
 | ||||
| > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/381418) in GitLab 15.8. | ||||
| > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/381418) in GitLab 15.8. | ||||
| > - Automatic approval [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124638) in GitLab 16.2 due to [usability issues](https://gitlab.com/gitlab-org/gitlab/-/issues/391258). | ||||
| 
 | ||||
| By default, the user who triggers a deployment pipeline can't also approve the deployment job. | ||||
| To allow self-approval of a deployment job: | ||||
|  | @ -175,9 +176,6 @@ To allow self-approval of a deployment job: | |||
| 1. Expand **Protected environments**. | ||||
| 1. From the **Approval options**, select the **Allow pipeline triggerer to approve deployment** checkbox. | ||||
| 
 | ||||
| When a pipeline runs, deployment jobs are automatically approved in the pipeline if the user who | ||||
| triggered the deployment is allowed to approve. | ||||
| 
 | ||||
| ## Approve or reject a deployment | ||||
| 
 | ||||
| > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/342180/) in GitLab 14.9 | ||||
|  |  | |||
|  | @ -212,6 +212,75 @@ For authentication CI/CD variables, see [Authentication](authentication.md). | |||
| | `DAST_WEBSITE`                              | URL                                                      | `https://example.com`                  | The URL of the website to scan.                                                                                                                                                                                                                                               | | ||||
| | `SECURE_ANALYZERS_PREFIX`                   | URL                                                      | `registry.organization.com`            | Set the Docker registry base address from which to download the analyzer.                                                                                                                                                                                                     | | ||||
| 
 | ||||
| ## Managing scope | ||||
| 
 | ||||
| Scope controls what URLs DAST follows when crawling the target application. Properly managed scope minimizes scan run time while ensuring only the target application is checked for vulnerabilities. | ||||
| 
 | ||||
| ### Types of scope | ||||
| 
 | ||||
| There are three types of scope: | ||||
| 
 | ||||
| - in scope | ||||
| - out of scope | ||||
| - excluded from scope | ||||
| 
 | ||||
| #### In scope | ||||
| 
 | ||||
| DAST follows in-scope URLs and searches the DOM for subsequent actions to perform to continue the crawl. | ||||
| Recorded in-scope HTTP messages are passively checked for vulnerabilities and used to build attacks when running a full scan. | ||||
| 
 | ||||
| #### Out of scope | ||||
| 
 | ||||
| DAST follows out-of-scope URLs for non-document content types such as image, stylesheet, font, script, or AJAX request. | ||||
| [Authentication](#scope-works-differently-during-authentication) aside, DAST does not follow out-of-scope URLs for full page loads, such as when clicking a link to an external website. | ||||
| Except for passive checks that search for information leaks, recorded HTTP messages for out-of-scope URLs are not checked for vulnerabilities. | ||||
| 
 | ||||
| #### Excluded from scope | ||||
| 
 | ||||
| DAST does not follow excluded-from-scope URLs. Except for passive checks that search for information leaks, recorded HTTP messages for excluded-from-scope URLs are not checked for vulnerabilities. | ||||
| 
 | ||||
| ### Scope works differently during authentication | ||||
| 
 | ||||
| Many target applications have an authentication process that depends on external websites, such as when using an identity access management provider for single sign on (SSO). | ||||
| To ensure that DAST can authenticate with these providers, DAST follows out-of-scope URLs for full page loads during authentication. DAST does not follow excluded-from-scope URLs. | ||||
| 
 | ||||
| ### How DAST blocks HTTP requests | ||||
| 
 | ||||
| DAST instructs the browser to make the HTTP request as usual when blocking a request due to scope rules. The request is subsequently intercepted and rejected with the reason `BlockedByClient`. | ||||
| This approach allows DAST to record the HTTP request while ensuring it never reaches the target server. Passive checks such as [200.1](checks/200.1.md) use these recorded requests to verify information sent to external hosts. | ||||
| 
 | ||||
| ### How to configure scope | ||||
| 
 | ||||
| By default, URLs matching the host of the target application are considered in-scope. All other hosts are considered out-of-scope. | ||||
| 
 | ||||
| Scope is configured using the following variables: | ||||
| 
 | ||||
| - Use `DAST_BROWSER_ALLOWED_HOSTS` to add in-scope hosts. | ||||
| - Use `DAST_BROWSER_IGNORED_HOSTS` to add to out-of-scope hosts. | ||||
| - Use `DAST_BROWSER_EXCLUDED_HOSTS` to add to excluded-from-scope hosts. | ||||
| - Use `DAST_EXCLUDE_URLS` to set specific URLs to be excluded-from-scope. | ||||
| 
 | ||||
| Rules: | ||||
| 
 | ||||
| - Excluding a host is given priority over ignoring a host, which is given priority over allowing a host. | ||||
| - Configuring scope for a host does not configure scope for the subdomains of that host. | ||||
| - Configuring scope for a host does not configure scope for all ports on that host. | ||||
| 
 | ||||
| The following could be a typical configuration: | ||||
| 
 | ||||
| ```yaml | ||||
| include: | ||||
|   - template: DAST.gitlab-ci.yml | ||||
| 
 | ||||
| dast: | ||||
|   variables: | ||||
|     DAST_WEBSITE: "https://my.site.com"                   # my.site.com URLs are considered in-scope by default | ||||
|     DAST_BROWSER_ALLOWED_HOSTS: "api.site.com:8443"       # include the API as part of the scan | ||||
|     DAST_BROWSER_IGNORED_HOSTS: "analytics.site.com"      # explicitly disregard analytics from the scan | ||||
|     DAST_BROWSER_EXCLUDED_HOSTS: "ads.site.com"           # don't visit any URLs on the ads subdomain | ||||
|     DAST_EXCLUDE_URLS: "https://my.site.com/user/logout"  # don't visit this URL | ||||
| ``` | ||||
| 
 | ||||
| ## Vulnerability detection | ||||
| 
 | ||||
| Vulnerability detection is gradually being migrated from the default Zed Attack Proxy (ZAP) solution | ||||
|  |  | |||
|  | @ -15527,9 +15527,6 @@ msgstr "" | |||
| msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments." | ||||
| msgstr "" | ||||
| 
 | ||||
| msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve." | ||||
| msgstr "" | ||||
| 
 | ||||
| msgid "DeploymentApproval| Current approvals: %{current}" | ||||
| msgstr "" | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,51 @@ | |||
| plugins { | ||||
|     id 'java' | ||||
|     id 'maven-publish' | ||||
|     id 'application' | ||||
| } | ||||
| 
 | ||||
| repositories { | ||||
|     maven { | ||||
|         url "<%= gitlab_address_with_port %>/api/v4/projects/<%= project.id %>/packages/maven" | ||||
|         name "GitLab" | ||||
|         credentials(HttpHeaderCredentials) { | ||||
|             name = '<%= maven_header_name %>' | ||||
|             value = project.property('Token') | ||||
|         } | ||||
|         authentication { | ||||
|             header(HttpHeaderAuthentication) | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| dependencies { | ||||
|     implementation group: '<%= group_id %>', name: '<%= artifact_id %>', version: '<%= package_version %>' | ||||
|     testImplementation 'junit:junit:4.12' | ||||
| } | ||||
| 
 | ||||
| publishing { | ||||
|     publications { | ||||
|         mavenJava(MavenPublication) { | ||||
|             groupId '<%= group_id %>' | ||||
|             artifactId '<%= artifact_id %>' | ||||
|             version '<%= package_version %>' | ||||
|             from components.java | ||||
|         } | ||||
|     } | ||||
|     repositories { | ||||
|         maven { | ||||
|             url "<%= gitlab_address_with_port %>/api/v4/projects/<%= project.id %>/packages/maven" | ||||
|             credentials(HttpHeaderCredentials) { | ||||
|                 name = '<%= maven_header_name %>' | ||||
|                 value = project.property('Token') | ||||
|             } | ||||
|             authentication { | ||||
|                 header(HttpHeaderAuthentication) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| application { | ||||
|     mainClassName = 'gradle_maven_app.App' | ||||
| } | ||||
|  | @ -1,27 +0,0 @@ | |||
| plugins { | ||||
|     id 'java' | ||||
|     id 'application' | ||||
| } | ||||
| 
 | ||||
| repositories { | ||||
|     maven { | ||||
|         url "<%= gitlab_address_with_port %>/api/v4/projects/<%= package_project.id %>/packages/maven" | ||||
|         name "GitLab" | ||||
|         credentials(HttpHeaderCredentials) { | ||||
|             name = '<%= maven_header_name %>' | ||||
|             value = <%= token %> | ||||
|         } | ||||
|         authentication { | ||||
|             header(HttpHeaderAuthentication) | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| dependencies { | ||||
|     implementation group: '<%= group_id %>', name: '<%= artifact_id %>', version: '<%= package_version %>' | ||||
|     testImplementation 'junit:junit:4.12' | ||||
| } | ||||
| 
 | ||||
| application { | ||||
|   mainClassName = 'gradle_maven_app.App' | ||||
| } | ||||
|  | @ -1,27 +0,0 @@ | |||
| plugins { | ||||
|     id 'java' | ||||
|     id 'maven-publish' | ||||
| } | ||||
| 
 | ||||
| publishing { | ||||
|     publications { | ||||
|         library(MavenPublication) { | ||||
|             groupId '<%= group_id %>' | ||||
|             artifactId '<%= artifact_id %>' | ||||
|             version '<%= package_version %>' | ||||
|             from components.java | ||||
|         } | ||||
|     } | ||||
|     repositories { | ||||
|         maven { | ||||
|             url "<%= gitlab_address_with_port %>/api/v4/projects/<%= package_project.id %>/packages/maven" | ||||
|             credentials(HttpHeaderCredentials) { | ||||
|                 name = "Private-Token" | ||||
|                 value = "<%= personal_access_token %>" | ||||
|             } | ||||
|             authentication { | ||||
|                 header(HttpHeaderAuthentication) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -1,8 +0,0 @@ | |||
|  build: | ||||
|   image: gradle:6.5-jdk11 | ||||
|   script: | ||||
|   - 'gradle build' | ||||
|   only: | ||||
|   - "<%= client_project.default_branch %>" | ||||
|   tags: | ||||
|   - "runner-for-<%= client_project.group.name %>" | ||||
|  | @ -0,0 +1,23 @@ | |||
| stages: | ||||
|   - publish | ||||
|   - install | ||||
| 
 | ||||
| publish: | ||||
|   stage: publish | ||||
|   image: gradle:6.5-jdk11 | ||||
|   script: | ||||
|     - 'gradle -PToken=<%= token %> publish' | ||||
|   only: | ||||
|     - "<%= project.default_branch %>" | ||||
|   tags: | ||||
|     - "runner-for-<%= project.name %>" | ||||
| 
 | ||||
| install: | ||||
|   stage: install | ||||
|   image: gradle:6.5-jdk11 | ||||
|   script: | ||||
|    - 'gradle -PToken=<%= token %> build' | ||||
|   only: | ||||
|     - "<%= project.default_branch %>" | ||||
|   tags: | ||||
|     - "runner-for-<%= project.name %>" | ||||
|  | @ -1,8 +0,0 @@ | |||
| deploy: | ||||
|   image: gradle:6.5-jdk11 | ||||
|   script: | ||||
|   - 'gradle publish' | ||||
|   only: | ||||
|   - "<%= package_project.default_branch %>" | ||||
|   tags: | ||||
|   - "runner-for-<%= package_project.group.name %>" | ||||
|  | @ -1,8 +0,0 @@ | |||
| install: | ||||
|   image: maven:3.6-jdk-11 | ||||
|   script: | ||||
|     - "mvn install -U -s settings.xml" | ||||
|   only: | ||||
|     - "<%= imported_project.default_branch %>" | ||||
|   tags: | ||||
|     - "runner-for-<%= imported_project.group.name %>" | ||||
|  | @ -1,23 +0,0 @@ | |||
| <settings> | ||||
|   <servers> | ||||
|     <server> | ||||
|       <id>central-proxy</id> | ||||
|       <configuration> | ||||
|         <httpHeaders> | ||||
|           <property> | ||||
|             <name>Private-Token</name> | ||||
|             <value><%= personal_access_token %></value> | ||||
|           </property> | ||||
|         </httpHeaders> | ||||
|       </configuration> | ||||
|     </server> | ||||
|   </servers> | ||||
|   <mirrors> | ||||
|     <mirror> | ||||
|       <id>central-proxy</id> | ||||
|       <name>GitLab proxy of central repo</name> | ||||
|       <url><%= gitlab_address_with_port %>/api/v4/groups/<%= imported_project.group.id %>/-/packages/maven</url> | ||||
|       <mirrorOf>central</mirrorOf> | ||||
|     </mirror> | ||||
|   </mirrors> | ||||
| </settings> | ||||
|  | @ -1,8 +0,0 @@ | |||
| install: | ||||
|   image: maven:3.6-jdk-11 | ||||
|   script: | ||||
|     - 'mvn install -U -s settings.xml' | ||||
|   only: | ||||
|     - "<%= imported_project.default_branch %>" | ||||
|   tags: | ||||
|     - "runner-for-<%= imported_project.name %>" | ||||
|  | @ -1,23 +0,0 @@ | |||
| <settings> | ||||
|   <servers> | ||||
|     <server> | ||||
|       <id>central-proxy</id> | ||||
|       <configuration> | ||||
|         <httpHeaders> | ||||
|           <property> | ||||
|             <name>Private-Token</name> | ||||
|             <value><%= personal_access_token %></value> | ||||
|           </property> | ||||
|         </httpHeaders> | ||||
|       </configuration> | ||||
|     </server> | ||||
|   </servers> | ||||
|   <mirrors> | ||||
|     <mirror> | ||||
|       <id>central-proxy</id> | ||||
|       <name>GitLab proxy of central repo</name> | ||||
|       <url><%= gitlab_address_with_port %>/api/v4/projects/<%= imported_project.id %>/packages/maven</url> | ||||
|       <mirrorOf>central</mirrorOf> | ||||
|     </mirror> | ||||
|   </mirrors> | ||||
| </settings> | ||||
|  | @ -14,6 +14,6 @@ run: | |||
| install: | ||||
|   stage: install | ||||
|   script: | ||||
|   - "pip install <%= package.name %> --no-deps --index-url <%= uri.scheme %>://<%= personal_access_token %>:<%= personal_access_token %>@<%= gitlab_host_with_port %>/api/v4/projects/${CI_PROJECT_ID}/packages/pypi/simple --trusted-host <%= gitlab_host_with_port %>" | ||||
|   - "pip install <%= package.name %> --no-deps --index-url <%= uri.scheme %>://${PERSONAL_ACCESS_TOKEN}:${PERSONAL_ACCESS_TOKEN}@<%= gitlab_host_with_port %>/api/v4/projects/${CI_PROJECT_ID}/packages/pypi/simple --trusted-host <%= gitlab_host_with_port %>" | ||||
|   tags: | ||||
|   - runner-for-<%= project.name %> | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| # frozen_string_literal: true | ||||
| 
 | ||||
| module QA | ||||
|   RSpec.describe 'Package', :object_storage, :skip_live_env, except: { job: 'relative-url' } do | ||||
|   RSpec.describe 'Package', :object_storage, except: { job: 'relative-url' } do | ||||
|     describe 'Maven project level endpoint', product_group: :package_registry do | ||||
|       include Runtime::Fixtures | ||||
|       include Support::Helpers::MaskToken | ||||
|  |  | |||
|  | @ -1,11 +1,11 @@ | |||
| # frozen_string_literal: true | ||||
| 
 | ||||
| module QA | ||||
|   RSpec.describe 'Package', :object_storage, :skip_live_env, except: { job: 'relative-url' }, product_group: :package_registry do | ||||
|   RSpec.describe 'Package', :object_storage, except: { job: 'relative-url' }, product_group: :package_registry do | ||||
|     describe 'Maven Repository with Gradle' do | ||||
|       using RSpec::Parameterized::TableSyntax | ||||
|       include Runtime::Fixtures | ||||
|       include_context 'packages registry qa scenario' | ||||
|       include Support::Helpers::MaskToken | ||||
| 
 | ||||
|       let(:group_id) { 'com.gitlab.qa' } | ||||
|       let(:artifact_id) { "maven_gradle-#{SecureRandom.hex(8)}" } | ||||
|  | @ -13,6 +13,52 @@ module QA | |||
|       let(:package_version) { '1.3.7' } | ||||
|       let(:package_type) { 'maven_gradle' } | ||||
| 
 | ||||
|       let(:project) do | ||||
|         Resource::Project.fabricate_via_api! do |project| | ||||
|           project.name = "#{package_type}_project" | ||||
|           project.initialize_with_readme = true | ||||
|           project.visibility = :private | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       let(:runner) do | ||||
|         Resource::ProjectRunner.fabricate! do |runner| | ||||
|           runner.name = "qa-runner-#{Time.now.to_i}" | ||||
|           runner.tags = ["runner-for-#{project.name}"] | ||||
|           runner.executor = :docker | ||||
|           runner.project = project | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       let(:gitlab_address_with_port) do | ||||
|         uri = URI.parse(Runtime::Scenario.gitlab_address) | ||||
|         "#{uri.scheme}://#{uri.host}:#{uri.port}" | ||||
|       end | ||||
| 
 | ||||
|       let(:project_deploy_token) do | ||||
|         Resource::ProjectDeployToken.fabricate_via_api! do |deploy_token| | ||||
|           deploy_token.name = 'package-deploy-token' | ||||
|           deploy_token.project = project | ||||
|           deploy_token.scopes = %w[ | ||||
|             read_repository | ||||
|             read_package_registry | ||||
|             write_package_registry | ||||
|           ] | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       let(:project_inbound_job_token_disabled) do | ||||
|         Resource::CICDSettings.fabricate_via_api! do |settings| | ||||
|           settings.project_path = project.full_path | ||||
|           settings.inbound_job_token_scope_enabled = false | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       before do | ||||
|         Flow::Login.sign_in_unless_signed_in | ||||
|         runner | ||||
|       end | ||||
| 
 | ||||
|       where(:case_name, :authentication_token_type, :maven_header_name, :testcase) do | ||||
|         'using personal access token' | :personal_access_token | 'Private-Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347601' | ||||
|         'using ci job token'          | :ci_job_token          | 'Job-Token'     | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347603' | ||||
|  | @ -23,38 +69,47 @@ module QA | |||
|         let(:token) do | ||||
|           case authentication_token_type | ||||
|           when :personal_access_token | ||||
|             "\"#{personal_access_token}\"" | ||||
|             use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: Runtime::Env.personal_access_token, project: project) | ||||
|           when :ci_job_token | ||||
|             package_project_inbound_job_token_disabled | ||||
|             client_project_inbound_job_token_disabled | ||||
|             'System.getenv("CI_JOB_TOKEN")' | ||||
|             project_inbound_job_token_disabled | ||||
|             '${CI_JOB_TOKEN}' | ||||
|           when :project_deploy_token | ||||
|             "\"#{project_deploy_token.token}\"" | ||||
|             use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: project) | ||||
|           end | ||||
|         end | ||||
| 
 | ||||
|         it 'pushes and pulls a maven package via gradle', testcase: params[:testcase] do | ||||
|           Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do | ||||
|             Resource::Repository::Commit.fabricate_via_api! do |commit| | ||||
|               gradle_upload_yaml = ERB.new(read_fixture('package_managers/maven/gradle', 'gradle_upload_package.yaml.erb')).result(binding) | ||||
|               build_upload_gradle = ERB.new(read_fixture('package_managers/maven/gradle', 'build_upload.gradle.erb')).result(binding) | ||||
|               gradle_publish_install_yaml = ERB.new(read_fixture('package_managers/maven/gradle', 'gradle_upload_install_package.yaml.erb')).result(binding) | ||||
|               build_gradle = ERB.new(read_fixture('package_managers/maven/gradle', 'build.gradle.erb')).result(binding) | ||||
| 
 | ||||
|               commit.project = package_project | ||||
|               commit.project = project | ||||
|               commit.commit_message = 'Add .gitlab-ci.yml' | ||||
|               commit.add_files( | ||||
|                 [ | ||||
|                   { file_path: '.gitlab-ci.yml', content: gradle_upload_yaml }, | ||||
|                   { file_path: 'build.gradle', content: build_upload_gradle } | ||||
|                   { file_path: '.gitlab-ci.yml', content: gradle_publish_install_yaml }, | ||||
|                   { file_path: 'build.gradle', content: build_gradle } | ||||
|                 ]) | ||||
|             end | ||||
|           end | ||||
| 
 | ||||
|           package_project.visit! | ||||
|           project.visit! | ||||
| 
 | ||||
|           Flow::Pipeline.visit_latest_pipeline | ||||
| 
 | ||||
|           Page::Project::Pipeline::Show.perform do |pipeline| | ||||
|             pipeline.click_job('deploy') | ||||
|             pipeline.click_job('publish') | ||||
|           end | ||||
| 
 | ||||
|           Page::Project::Job::Show.perform do |job| | ||||
|             expect(job).to be_successful(timeout: 800) | ||||
| 
 | ||||
|             job.click_element(:pipeline_path) | ||||
|           end | ||||
| 
 | ||||
|           Page::Project::Pipeline::Show.perform do |pipeline| | ||||
|             pipeline.click_job('install') | ||||
|           end | ||||
| 
 | ||||
|           Page::Project::Job::Show.perform do |job| | ||||
|  | @ -72,33 +127,6 @@ module QA | |||
|           Page::Project::Packages::Show.perform do |show| | ||||
|             expect(show).to have_package_info(package_name, package_version) | ||||
|           end | ||||
| 
 | ||||
|           Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do | ||||
|             Resource::Repository::Commit.fabricate_via_api! do |commit| | ||||
|               gradle_install_yaml = ERB.new(read_fixture('package_managers/maven/gradle', 'gradle_install_package.yaml.erb')).result(binding) | ||||
|               build_install_gradle = ERB.new(read_fixture('package_managers/maven/gradle', 'build_install.gradle.erb')).result(binding) | ||||
| 
 | ||||
|               commit.project = client_project | ||||
|               commit.commit_message = 'Add files' | ||||
|               commit.add_files( | ||||
|                 [ | ||||
|                   { file_path: '.gitlab-ci.yml', content: gradle_install_yaml }, | ||||
|                   { file_path: 'build.gradle', content: build_install_gradle } | ||||
|                 ]) | ||||
|             end | ||||
|           end | ||||
| 
 | ||||
|           client_project.visit! | ||||
| 
 | ||||
|           Flow::Pipeline.visit_latest_pipeline | ||||
| 
 | ||||
|           Page::Project::Pipeline::Show.perform do |pipeline| | ||||
|             pipeline.click_job('build') | ||||
|           end | ||||
| 
 | ||||
|           Page::Project::Job::Show.perform do |job| | ||||
|             expect(job).to be_successful(timeout: 800) | ||||
|           end | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| # frozen_string_literal: true | ||||
| 
 | ||||
| module QA | ||||
|   RSpec.describe 'Package', :object_storage, :skip_live_env, except: { job: 'relative-url' }, product_group: :package_registry do | ||||
|   RSpec.describe 'Package', :object_storage, except: { job: 'relative-url' }, product_group: :package_registry do | ||||
|     describe 'PyPI Repository' do | ||||
|       include Runtime::Fixtures | ||||
|       include Support::Helpers::MaskToken | ||||
|  | @ -30,7 +30,11 @@ module QA | |||
|       end | ||||
| 
 | ||||
|       let(:uri) { URI.parse(Runtime::Scenario.gitlab_address) } | ||||
|       let(:personal_access_token) { use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: Runtime::Env.personal_access_token, project: project) } | ||||
| 
 | ||||
|       let!(:personal_access_token) do | ||||
|         use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: Runtime::Env.personal_access_token, project: project) | ||||
|       end | ||||
| 
 | ||||
|       let(:gitlab_address_with_port) { "#{uri.scheme}://#{uri.host}:#{uri.port}" } | ||||
|       let(:gitlab_host_with_port) do | ||||
|         # Don't specify port if it is a standard one | ||||
|  |  | |||
|  | @ -9,6 +9,7 @@ module QA | |||
|             ci_variable.project = project | ||||
|             ci_variable.key = name | ||||
|             ci_variable.value = value | ||||
|             ci_variable.masked = true | ||||
|           end | ||||
|           "${#{name}}" | ||||
|         end | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue