Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
		
							parent
							
								
									059cc73b5f
								
							
						
					
					
						commit
						daf5e72855
					
				|  | @ -39,7 +39,7 @@ export default { | |||
|     projectsFetchError: __('There was a problem fetching the projects'), | ||||
|     scopeFetchError: __('There was a problem fetching the job token scope value'), | ||||
|     outboundTokenAlertDeprecationMessage: s__( | ||||
|       `CICD|The %{boldStart}Limit CI_JOB_TOKEN%{boldEnd} scope is deprecated and will be removed the 17.0 milestone. Configure the %{boldStart}CI_JOB_TOKEN%{boldEnd} allowlist instead. %{linkStart}How do I do this?%{linkEnd}`, | ||||
|       `CICD|The %{boldStart}Limit access %{boldEnd}%{italicAndBoldStart}from%{italicAndBoldEnd}%{boldStart} this project%{boldEnd} setting is deprecated and will be removed in the 18.0 milestone. Use the %{boldStart}Limit access %{boldEnd}%{italicAndBoldStart}to%{italicAndBoldEnd}%{boldStart} this project%{boldEnd} setting and allowlist instead. %{linkStart}How do I do this?%{linkEnd}`, | ||||
|     ), | ||||
|     disableToggleWarning: s__('CICD|Disabling this feature is a permanent change.'), | ||||
|   }, | ||||
|  | @ -223,6 +223,11 @@ export default { | |||
|           <template #bold="{ content }"> | ||||
|             <strong>{{ content }}</strong> | ||||
|           </template> | ||||
|           <template #italicAndBold="{ content }"> | ||||
|             <i | ||||
|               ><strong>{{ content }}</strong></i | ||||
|             > | ||||
|           </template> | ||||
|           <template #link="{ content }"> | ||||
|             <gl-link | ||||
|               :href="$options.deprecationDocumentationLink" | ||||
|  |  | |||
|  | @ -298,8 +298,8 @@ class Namespace < ApplicationRecord | |||
|         .order( | ||||
|           Arel.sql(sanitize_sql( | ||||
|             [ | ||||
|               "CASE WHEN starts_with(REPLACE(routes.name, ' ', ''), :pattern) OR starts_with(routes.path, :pattern) THEN 1 ELSE 2 END", | ||||
|               { pattern: query } | ||||
|               "CASE WHEN REPLACE(routes.name, ' ', '') ILIKE :prefix_pattern OR routes.path ILIKE :prefix_pattern THEN 1 ELSE 2 END", | ||||
|               { prefix_pattern: "#{sanitize_sql_like(query)}%" } | ||||
|             ] | ||||
|           )), | ||||
|           'routes.path' | ||||
|  |  | |||
|  | @ -903,8 +903,8 @@ class User < MainClusterwide::ApplicationRecord | |||
|       ).order( | ||||
|         Arel.sql(sanitize_sql( | ||||
|           [ | ||||
|             "CASE WHEN starts_with(REPLACE(users.name, ' ', ''), :pattern) OR starts_with(users.username, :pattern) THEN 1 ELSE 2 END", | ||||
|             { pattern: query } | ||||
|             "CASE WHEN REPLACE(users.name, ' ', '') ILIKE :prefix_pattern OR users.username ILIKE :prefix_pattern THEN 1 ELSE 2 END", | ||||
|             { prefix_pattern: "#{sanitize_sql_like(query)}%" } | ||||
|           ] | ||||
|         )), | ||||
|         :username, | ||||
|  |  | |||
|  | @ -35,7 +35,7 @@ If successful, returns [`200`](rest/index.md#status-codes) and the following res | |||
| | Attribute          | Type    | Description | | ||||
| |--------------------|---------|-------------| | ||||
| | `inbound_enabled`  | boolean | Indicates if the [**Limit access _to_ this project** setting](../ci/jobs/ci_job_token.md#add-a-project-to-the-job-token-allowlist) is enabled. | | ||||
| | `outbound_enabled` | boolean | Indicates if the CI/CD job token generated in this project has access to other projects. [Deprecated and planned for removal in GitLab 17.0](../update/deprecations.md#default-cicd-job-token-ci_job_token-scope-changed). | | ||||
| | `outbound_enabled` | boolean | Indicates if the CI/CD job token generated in this project has access to other projects. [Deprecated and planned for removal in GitLab 18.0](../update/deprecations.md#default-cicd-job-token-ci_job_token-scope-changed). | | ||||
| 
 | ||||
| Example request: | ||||
| 
 | ||||
|  |  | |||
|  | @ -240,15 +240,19 @@ Check [`production.log`](../../administration/logs/index.md#productionlog) to se | |||
| 
 | ||||
| If that's the case, ensure the [**Due date** field is visible for issues](https://confluence.atlassian.com/jirakb/due-date-field-is-missing-189431917.html) in the integrated Jira project. | ||||
| 
 | ||||
| ### `An error occurred while requesting data from Jira` | ||||
| ### Error when requesting data from Jira | ||||
| 
 | ||||
| When you try to view the Jira issue list in GitLab, you might get this message: | ||||
| When you try to view the Jira issue list or create a Jira issue in GitLab, you might get one of the following errors: | ||||
| 
 | ||||
| ```plaintext | ||||
| An error occurred while requesting data from Jira | ||||
| ``` | ||||
| 
 | ||||
| This error occurs when the authentication for the Jira issue integration is not complete or correct. | ||||
| ```plaintext | ||||
| An error occurred while fetching issue list. Connection failed. Check your integration settings. | ||||
| ``` | ||||
| 
 | ||||
| These errors occur when the authentication for the Jira issue integration is not complete or correct. | ||||
| 
 | ||||
| To resolve this issue, [configure the Jira issue integration](configure.md#configure-the-integration) again. | ||||
| Ensure the authentication details are correct, enter your API token or password again, and save your changes. | ||||
|  |  | |||
|  | @ -40,10 +40,10 @@ The following languages are supported: | |||
| | C                | **{check-circle}** Yes | **{dotted-circle}** No | **{check-circle}** Yes | **{check-circle}** Yes | | ||||
| | C++              | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||
| | C#               | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||
| | CSS              | **{dotted-circle}** No  | **{check-circle}** Yes | **{dotted-circle}** No  | **{dotted-circle}** No  | | ||||
| | CSS              | **{dotted-circle}** No  | **{check-circle}** Yes | **{check-circle}** Yes  | **{check-circle}** Yes  | | ||||
| | Go               | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||
| | Google SQL       | **{dotted-circle}** No | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||
| | HTML             | **{dotted-circle}** No  | **{check-circle}** Yes | **{dotted-circle}** No  | **{dotted-circle}** No  | | ||||
| | HTML             | **{dotted-circle}** No  | **{check-circle}** Yes | **{check-circle}** Yes  | **{check-circle}** Yes  | | ||||
| | Java             | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||
| | JavaScript       | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||
| | Kotlin           | **{check-circle}** Yes <br><br>(Requires third-party extension providing Kotlin support) | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||
|  | @ -52,7 +52,7 @@ The following languages are supported: | |||
| | Ruby             | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||
| | Rust             | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||
| | Scala            | **{check-circle}** Yes <br><br>(Requires third-party extension providing Scala support) | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||
| | Shell scripts (`bash` only) | **{dotted-circle}** No  | **{check-circle}** Yes | **{dotted-circle}** No  | **{dotted-circle}** No  | | ||||
| | Shell scripts (`bash` only) | **{dotted-circle}** No  | **{check-circle}** Yes | **{check-circle}** Yes  | **{check-circle}** Yes  | | ||||
| | Swift            | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||
| | TypeScript       | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||
| | Terraform        | **{check-circle}** Yes <br><br>(Requires third-party extension providing Terraform support) | **{check-circle}** Yes | **{dotted-circle}** No | **{check-circle}** Yes <br><br>(Requires third-party extension providing the `terraform` file type) | | ||||
|  |  | |||
|  | @ -46,25 +46,32 @@ module Gitlab | |||
|         @queue ||= worker_class.sidekiq_options['queue'] | ||||
|       end | ||||
| 
 | ||||
|       def sidekiq_redis_pool | ||||
|         @sidekiq_redis_pool ||= | ||||
|           Gitlab::SidekiqSharding::Router.get_shard_instance(worker_class.sidekiq_options['store']).last | ||||
|       end | ||||
| 
 | ||||
|       def with_shared_connection(&block) | ||||
|         Gitlab::Database::SharedModel.using_connection(connection, &block) | ||||
|       end | ||||
| 
 | ||||
|       def pending_jobs(include_dead_jobs: false) | ||||
|         Enumerator.new do |y| | ||||
|           queues = [ | ||||
|             Sidekiq::ScheduledSet.new, | ||||
|             Sidekiq::Queue.new(self.queue) | ||||
|           ] | ||||
|           Sidekiq::Client.via(sidekiq_redis_pool) do | ||||
|             queues = [ | ||||
|               Sidekiq::ScheduledSet.new, | ||||
|               Sidekiq::Queue.new(self.queue) | ||||
|             ] | ||||
| 
 | ||||
|           if include_dead_jobs | ||||
|             queues << Sidekiq::RetrySet.new | ||||
|             queues << Sidekiq::DeadSet.new | ||||
|           end | ||||
|             if include_dead_jobs | ||||
|               queues << Sidekiq::RetrySet.new | ||||
|               queues << Sidekiq::DeadSet.new | ||||
|             end | ||||
| 
 | ||||
|           queues.each do |queue| | ||||
|             queue.each do |job| | ||||
|               y << job if job.klass == worker_class.name | ||||
|             queues.each do |queue| | ||||
|               queue.each do |job| | ||||
|                 y << job if job.klass == worker_class.name | ||||
|               end | ||||
|             end | ||||
|           end | ||||
|         end | ||||
|  | @ -72,19 +79,21 @@ module Gitlab | |||
| 
 | ||||
|       def steal(steal_class, retry_dead_jobs: false) | ||||
|         with_shared_connection do | ||||
|           pending_jobs(include_dead_jobs: retry_dead_jobs).each do |job| | ||||
|             migration_class, migration_args = job.args | ||||
|           Sidekiq::Client.via(sidekiq_redis_pool) do | ||||
|             pending_jobs(include_dead_jobs: retry_dead_jobs).each do |job| | ||||
|               migration_class, migration_args = job.args | ||||
| 
 | ||||
|             next unless migration_class == steal_class | ||||
|             next if block_given? && !(yield job) | ||||
|               next unless migration_class == steal_class | ||||
|               next if block_given? && !(yield job) | ||||
| 
 | ||||
|             begin | ||||
|               perform(migration_class, migration_args) if job.delete | ||||
|             rescue Exception # rubocop:disable Lint/RescueException | ||||
|               worker_class # enqueue this migration again | ||||
|                 .perform_async(migration_class, migration_args) | ||||
|               begin | ||||
|                 perform(migration_class, migration_args) if job.delete | ||||
|               rescue Exception # rubocop:disable Lint/RescueException | ||||
|                 worker_class # enqueue this migration again | ||||
|                   .perform_async(migration_class, migration_args) | ||||
| 
 | ||||
|               raise | ||||
|                 raise | ||||
|               end | ||||
|             end | ||||
|           end | ||||
|         end | ||||
|  |  | |||
|  | @ -9658,7 +9658,7 @@ msgstr "" | |||
| msgid "CICD|Prevent access to this project from other project CI/CD job tokens, unless the other project is added to the allowlist. It is a security risk to disable this feature, because unauthorized projects might attempt to retrieve an active token and access the API. %{linkStart}Learn more.%{linkEnd}" | ||||
| msgstr "" | ||||
| 
 | ||||
| msgid "CICD|The %{boldStart}Limit CI_JOB_TOKEN%{boldEnd} scope is deprecated and will be removed the 17.0 milestone. Configure the %{boldStart}CI_JOB_TOKEN%{boldEnd} allowlist instead. %{linkStart}How do I do this?%{linkEnd}" | ||||
| msgid "CICD|The %{boldStart}Limit access %{boldEnd}%{italicAndBoldStart}from%{italicAndBoldEnd}%{boldStart} this project%{boldEnd} setting is deprecated and will be removed in the 18.0 milestone. Use the %{boldStart}Limit access %{boldEnd}%{italicAndBoldStart}to%{italicAndBoldEnd}%{boldStart} this project%{boldEnd} setting and allowlist instead. %{linkStart}How do I do this?%{linkEnd}" | ||||
| msgstr "" | ||||
| 
 | ||||
| msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file. %{link_start}What is Auto DevOps?%{link_end}" | ||||
|  |  | |||
|  | @ -28,7 +28,7 @@ module QA | |||
|         ssh_key.remove_via_api! | ||||
|       end | ||||
| 
 | ||||
|       it 'clones, pushes, and pulls a snippet over HTTP, edits via UI', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347793' do | ||||
|       it 'clones, pushes, and pulls a snippet over HTTP, edits via UI', :blocking, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347793' do | ||||
|         push = Resource::Repository::Push.fabricate! do |push| | ||||
|           push.repository_http_uri = repository_uri_http | ||||
|           push.file_name = new_file | ||||
|  |  | |||
|  | @ -22,7 +22,7 @@ module QA | |||
|         Flow::Login.sign_in | ||||
|       end | ||||
| 
 | ||||
|       it 'creates a personal snippet with multiple files', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347723' do | ||||
|       it 'creates a personal snippet with multiple files', :blocking, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347723' do | ||||
|         snippet | ||||
| 
 | ||||
|         Page::Dashboard::Snippet::Show.perform do |snippet| | ||||
|  |  | |||
|  | @ -171,6 +171,7 @@ RSpec.describe '.gitlab/ci/rules.gitlab-ci.yml', feature_category: :tooling do | |||
|         '.gitlab/CODEOWNERS', | ||||
|         '.gitleaksignore', | ||||
|         '.gitpod.yml', | ||||
|         '.graphqlrc', | ||||
|         '.index.yml.example', | ||||
|         '.license_encryption_key.pub', | ||||
|         '.mailmap', | ||||
|  |  | |||
|  | @ -7,6 +7,12 @@ RSpec.describe Gitlab::BackgroundMigration::JobCoordinator do | |||
|   let(:tracking_database) { worker_class.tracking_database } | ||||
|   let(:coordinator) { described_class.new(worker_class) } | ||||
| 
 | ||||
|   let(:redis_pool) do | ||||
|     params = Gitlab::Redis::Queues.params | ||||
|     params[:db] = params[:db] + 1 if params[:db] | ||||
|     Sidekiq::RedisConnection.create(params) # rubocop:disable Rails/SaveBang -- RedisConnection only has .create | ||||
|   end | ||||
| 
 | ||||
|   describe '.for_tracking_database' do | ||||
|     it 'returns an executor with the correct worker class and database' do | ||||
|       coordinator = described_class.for_tracking_database(tracking_database) | ||||
|  | @ -74,8 +80,24 @@ RSpec.describe Gitlab::BackgroundMigration::JobCoordinator do | |||
|         allow(Sidekiq::DeadSet).to receive(:new).and_return(dead_set) | ||||
|       end | ||||
| 
 | ||||
|       context 'when using a different shard instance' do | ||||
|         before do | ||||
|           if coordinator.instance_variable_defined?(:@sidekiq_redis_pool) | ||||
|             coordinator.remove_instance_variable(:@sidekiq_redis_pool) | ||||
|           end | ||||
| 
 | ||||
|           allow(Gitlab::SidekiqSharding::Router).to receive(:get_shard_instance).and_return(['shard', redis_pool]) | ||||
|         end | ||||
| 
 | ||||
|         it 'uses the appropriate shard for the store' do | ||||
|           expect(Sidekiq::Client).to receive(:via).with(redis_pool) | ||||
| 
 | ||||
|           coordinator.pending_jobs.to_a | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       it 'does not include jobs for other workers' do | ||||
|         expect(coordinator.pending_jobs).not_to include(queue_incorrect_job_class.first) | ||||
|         expect(coordinator.pending_jobs.to_a).not_to include(queue_incorrect_job_class.first) | ||||
|       end | ||||
| 
 | ||||
|       context 'when not including dead jobs' do | ||||
|  | @ -108,6 +130,22 @@ RSpec.describe Gitlab::BackgroundMigration::JobCoordinator do | |||
|           .and_return(queue) | ||||
|       end | ||||
| 
 | ||||
|       context 'when using a different shard instance' do | ||||
|         before do | ||||
|           if coordinator.instance_variable_defined?(:@sidekiq_redis_pool) | ||||
|             coordinator.remove_instance_variable(:@sidekiq_redis_pool) | ||||
|           end | ||||
| 
 | ||||
|           allow(Gitlab::SidekiqSharding::Router).to receive(:get_shard_instance).and_return(['shard', redis_pool]) | ||||
|         end | ||||
| 
 | ||||
|         it 'wraps job processing within Sidekiq::Client.via' do | ||||
|           expect(Sidekiq::Client).to receive(:via).with(redis_pool) | ||||
| 
 | ||||
|           coordinator.steal('Foo') | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       context 'when queue contains unprocessed jobs' do | ||||
|         it 'steals jobs from a queue' do | ||||
|           expect(queue[0]).to receive(:delete).and_return(true) | ||||
|  |  | |||
|  | @ -1166,7 +1166,7 @@ RSpec.describe Namespace, feature_category: :groups_and_projects do | |||
|     end | ||||
| 
 | ||||
|     it 'prioritizes sorting of matches that start with the query' do | ||||
|       expect(described_class.gfm_autocomplete_search('pare')).to eq([parent_group, group_1, group_2]) | ||||
|       expect(described_class.gfm_autocomplete_search('pArE')).to eq([parent_group, group_1, group_2]) | ||||
|     end | ||||
| 
 | ||||
|     it 'falls back to sorting by full path' do | ||||
|  |  | |||
|  | @ -3570,7 +3570,7 @@ RSpec.describe User, feature_category: :user_profile do | |||
|     end | ||||
| 
 | ||||
|     it 'prioritizes sorting of matches that start with the query' do | ||||
|       expect(described_class.gfm_autocomplete_search('user')).to eq([user_2, user_1]) | ||||
|       expect(described_class.gfm_autocomplete_search('uSeR')).to eq([user_2, user_1]) | ||||
|     end | ||||
| 
 | ||||
|     it 'falls back to sorting by username' do | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue