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'),
|
projectsFetchError: __('There was a problem fetching the projects'),
|
||||||
scopeFetchError: __('There was a problem fetching the job token scope value'),
|
scopeFetchError: __('There was a problem fetching the job token scope value'),
|
||||||
outboundTokenAlertDeprecationMessage: s__(
|
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.'),
|
disableToggleWarning: s__('CICD|Disabling this feature is a permanent change.'),
|
||||||
},
|
},
|
||||||
|
|
@ -223,6 +223,11 @@ export default {
|
||||||
<template #bold="{ content }">
|
<template #bold="{ content }">
|
||||||
<strong>{{ content }}</strong>
|
<strong>{{ content }}</strong>
|
||||||
</template>
|
</template>
|
||||||
|
<template #italicAndBold="{ content }">
|
||||||
|
<i
|
||||||
|
><strong>{{ content }}</strong></i
|
||||||
|
>
|
||||||
|
</template>
|
||||||
<template #link="{ content }">
|
<template #link="{ content }">
|
||||||
<gl-link
|
<gl-link
|
||||||
:href="$options.deprecationDocumentationLink"
|
:href="$options.deprecationDocumentationLink"
|
||||||
|
|
|
||||||
|
|
@ -298,8 +298,8 @@ class Namespace < ApplicationRecord
|
||||||
.order(
|
.order(
|
||||||
Arel.sql(sanitize_sql(
|
Arel.sql(sanitize_sql(
|
||||||
[
|
[
|
||||||
"CASE WHEN starts_with(REPLACE(routes.name, ' ', ''), :pattern) OR starts_with(routes.path, :pattern) THEN 1 ELSE 2 END",
|
"CASE WHEN REPLACE(routes.name, ' ', '') ILIKE :prefix_pattern OR routes.path ILIKE :prefix_pattern THEN 1 ELSE 2 END",
|
||||||
{ pattern: query }
|
{ prefix_pattern: "#{sanitize_sql_like(query)}%" }
|
||||||
]
|
]
|
||||||
)),
|
)),
|
||||||
'routes.path'
|
'routes.path'
|
||||||
|
|
|
||||||
|
|
@ -903,8 +903,8 @@ class User < MainClusterwide::ApplicationRecord
|
||||||
).order(
|
).order(
|
||||||
Arel.sql(sanitize_sql(
|
Arel.sql(sanitize_sql(
|
||||||
[
|
[
|
||||||
"CASE WHEN starts_with(REPLACE(users.name, ' ', ''), :pattern) OR starts_with(users.username, :pattern) THEN 1 ELSE 2 END",
|
"CASE WHEN REPLACE(users.name, ' ', '') ILIKE :prefix_pattern OR users.username ILIKE :prefix_pattern THEN 1 ELSE 2 END",
|
||||||
{ pattern: query }
|
{ prefix_pattern: "#{sanitize_sql_like(query)}%" }
|
||||||
]
|
]
|
||||||
)),
|
)),
|
||||||
:username,
|
:username,
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ If successful, returns [`200`](rest/index.md#status-codes) and the following res
|
||||||
| Attribute | Type | Description |
|
| 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. |
|
| `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:
|
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.
|
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
|
```plaintext
|
||||||
An error occurred while requesting data from Jira
|
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.
|
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.
|
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 | **{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 |
|
||||||
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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) |
|
| 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,12 +46,18 @@ module Gitlab
|
||||||
@queue ||= worker_class.sidekiq_options['queue']
|
@queue ||= worker_class.sidekiq_options['queue']
|
||||||
end
|
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)
|
def with_shared_connection(&block)
|
||||||
Gitlab::Database::SharedModel.using_connection(connection, &block)
|
Gitlab::Database::SharedModel.using_connection(connection, &block)
|
||||||
end
|
end
|
||||||
|
|
||||||
def pending_jobs(include_dead_jobs: false)
|
def pending_jobs(include_dead_jobs: false)
|
||||||
Enumerator.new do |y|
|
Enumerator.new do |y|
|
||||||
|
Sidekiq::Client.via(sidekiq_redis_pool) do
|
||||||
queues = [
|
queues = [
|
||||||
Sidekiq::ScheduledSet.new,
|
Sidekiq::ScheduledSet.new,
|
||||||
Sidekiq::Queue.new(self.queue)
|
Sidekiq::Queue.new(self.queue)
|
||||||
|
|
@ -69,9 +75,11 @@ module Gitlab
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def steal(steal_class, retry_dead_jobs: false)
|
def steal(steal_class, retry_dead_jobs: false)
|
||||||
with_shared_connection do
|
with_shared_connection do
|
||||||
|
Sidekiq::Client.via(sidekiq_redis_pool) do
|
||||||
pending_jobs(include_dead_jobs: retry_dead_jobs).each do |job|
|
pending_jobs(include_dead_jobs: retry_dead_jobs).each do |job|
|
||||||
migration_class, migration_args = job.args
|
migration_class, migration_args = job.args
|
||||||
|
|
||||||
|
|
@ -89,6 +97,7 @@ module Gitlab
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def perform(class_name, arguments)
|
def perform(class_name, arguments)
|
||||||
with_shared_connection do
|
with_shared_connection do
|
||||||
|
|
|
||||||
|
|
@ -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}"
|
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 ""
|
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 ""
|
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}"
|
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!
|
ssh_key.remove_via_api!
|
||||||
end
|
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 = Resource::Repository::Push.fabricate! do |push|
|
||||||
push.repository_http_uri = repository_uri_http
|
push.repository_http_uri = repository_uri_http
|
||||||
push.file_name = new_file
|
push.file_name = new_file
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ module QA
|
||||||
Flow::Login.sign_in
|
Flow::Login.sign_in
|
||||||
end
|
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
|
snippet
|
||||||
|
|
||||||
Page::Dashboard::Snippet::Show.perform 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',
|
'.gitlab/CODEOWNERS',
|
||||||
'.gitleaksignore',
|
'.gitleaksignore',
|
||||||
'.gitpod.yml',
|
'.gitpod.yml',
|
||||||
|
'.graphqlrc',
|
||||||
'.index.yml.example',
|
'.index.yml.example',
|
||||||
'.license_encryption_key.pub',
|
'.license_encryption_key.pub',
|
||||||
'.mailmap',
|
'.mailmap',
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,12 @@ RSpec.describe Gitlab::BackgroundMigration::JobCoordinator do
|
||||||
let(:tracking_database) { worker_class.tracking_database }
|
let(:tracking_database) { worker_class.tracking_database }
|
||||||
let(:coordinator) { described_class.new(worker_class) }
|
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
|
describe '.for_tracking_database' do
|
||||||
it 'returns an executor with the correct worker class and database' do
|
it 'returns an executor with the correct worker class and database' do
|
||||||
coordinator = described_class.for_tracking_database(tracking_database)
|
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)
|
allow(Sidekiq::DeadSet).to receive(:new).and_return(dead_set)
|
||||||
end
|
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
|
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
|
end
|
||||||
|
|
||||||
context 'when not including dead jobs' do
|
context 'when not including dead jobs' do
|
||||||
|
|
@ -108,6 +130,22 @@ RSpec.describe Gitlab::BackgroundMigration::JobCoordinator do
|
||||||
.and_return(queue)
|
.and_return(queue)
|
||||||
end
|
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
|
context 'when queue contains unprocessed jobs' do
|
||||||
it 'steals jobs from a queue' do
|
it 'steals jobs from a queue' do
|
||||||
expect(queue[0]).to receive(:delete).and_return(true)
|
expect(queue[0]).to receive(:delete).and_return(true)
|
||||||
|
|
|
||||||
|
|
@ -1166,7 +1166,7 @@ RSpec.describe Namespace, feature_category: :groups_and_projects do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'prioritizes sorting of matches that start with the query' do
|
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
|
end
|
||||||
|
|
||||||
it 'falls back to sorting by full path' do
|
it 'falls back to sorting by full path' do
|
||||||
|
|
|
||||||
|
|
@ -3570,7 +3570,7 @@ RSpec.describe User, feature_category: :user_profile do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'prioritizes sorting of matches that start with the query' do
|
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
|
end
|
||||||
|
|
||||||
it 'falls back to sorting by username' do
|
it 'falls back to sorting by username' do
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue