-
{{ $options.i18n.headerText }}
+
+
{{ $options.i18n.headerText }}
diff --git a/app/assets/javascripts/sidebar/components/labels/labels_select_widget/dropdown_footer.vue b/app/assets/javascripts/sidebar/components/labels/labels_select_widget/dropdown_footer.vue
index d6b43698766..1de50894ecc 100644
--- a/app/assets/javascripts/sidebar/components/labels/labels_select_widget/dropdown_footer.vue
+++ b/app/assets/javascripts/sidebar/components/labels/labels_select_widget/dropdown_footer.vue
@@ -29,6 +29,7 @@ export default {
@@ -36,6 +37,7 @@ export default {
created_at);
+CREATE INDEX index_mrs_approval_rules_approver_users_on_project_id ON merge_requests_approval_rules_approver_users USING btree (project_id);
+
CREATE INDEX index_mrs_approval_rules_mrs_on_mr_id ON merge_requests_approval_rules_merge_requests USING btree (merge_request_id);
CREATE INDEX index_mrs_approval_rules_mrs_on_project_id ON merge_requests_approval_rules_merge_requests USING btree (project_id);
CREATE INDEX index_mrs_approval_rules_projects_on_project_id ON merge_requests_approval_rules_projects USING btree (project_id);
+CREATE UNIQUE INDEX index_mrs_ars_approver_groups_on_ar_id_and_group_id ON merge_requests_approval_rules_approver_groups USING btree (approval_rule_id, group_id);
+
CREATE UNIQUE INDEX index_mrs_ars_groups_on_ar_id_and_group_id ON merge_requests_approval_rules_groups USING btree (approval_rule_id, group_id);
CREATE UNIQUE INDEX index_mrs_ars_mrs_on_ar_id_and_mr_id ON merge_requests_approval_rules_merge_requests USING btree (approval_rule_id, merge_request_id);
CREATE UNIQUE INDEX index_mrs_ars_projects_on_ar_id_and_project_id ON merge_requests_approval_rules_projects USING btree (approval_rule_id, project_id);
+CREATE UNIQUE INDEX index_mrs_ars_users_on_ar_id_and_user_id ON merge_requests_approval_rules_approver_users USING btree (approval_rule_id, user_id);
+
CREATE INDEX index_namespace_admin_notes_on_namespace_id ON namespace_admin_notes USING btree (namespace_id);
CREATE UNIQUE INDEX index_namespace_aggregation_schedules_on_namespace_id ON namespace_aggregation_schedules USING btree (namespace_id);
@@ -39332,6 +39389,9 @@ ALTER TABLE ONLY zoekt_enabled_namespaces
ALTER TABLE ONLY import_placeholder_memberships
ADD CONSTRAINT fk_1f4659deee FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+ALTER TABLE ONLY merge_requests_approval_rules_approver_groups
+ ADD CONSTRAINT fk_1f8729ebf4 FOREIGN KEY (approval_rule_id) REFERENCES merge_requests_approval_rules(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY epics
ADD CONSTRAINT fk_1fbed67632 FOREIGN KEY (start_date_sourcing_milestone_id) REFERENCES milestones(id) ON DELETE SET NULL;
@@ -39611,6 +39671,9 @@ ALTER TABLE ONLY security_orchestration_policy_rule_schedules
ALTER TABLE ONLY abuse_reports
ADD CONSTRAINT fk_3fe6467b93 FOREIGN KEY (assignee_id) REFERENCES users(id) ON DELETE SET NULL;
+ALTER TABLE ONLY merge_requests_approval_rules_approver_users
+ ADD CONSTRAINT fk_4025feea5b FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY protected_environment_approval_rules
ADD CONSTRAINT fk_405568b491 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
@@ -39767,6 +39830,9 @@ ALTER TABLE ONLY abuse_report_notes
ALTER TABLE ONLY approval_merge_request_rules
ADD CONSTRAINT fk_5822f009ea FOREIGN KEY (security_orchestration_policy_configuration_id) REFERENCES security_orchestration_policy_configurations(id) ON DELETE CASCADE;
+ALTER TABLE ONLY merge_requests_approval_rules_approver_users
+ ADD CONSTRAINT fk_582e5f36e8 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY deploy_keys_projects
ADD CONSTRAINT fk_58a901ca7e FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -39887,6 +39953,9 @@ ALTER TABLE p_ci_builds
ALTER TABLE ONLY routes
ADD CONSTRAINT fk_679ff8213d FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE NOT VALID;
+ALTER TABLE ONLY merge_requests_approval_rules_approver_groups
+ ADD CONSTRAINT fk_67fa93ad4b FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY ai_conversation_messages
ADD CONSTRAINT fk_68774ec148 FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE CASCADE;
@@ -39944,6 +40013,9 @@ ALTER TABLE ONLY packages_conan_package_references
ALTER TABLE ONLY subscription_user_add_on_assignments
ADD CONSTRAINT fk_724c2df9a8 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+ALTER TABLE ONLY merge_requests_approval_rules_approver_users
+ ADD CONSTRAINT fk_725cca295c FOREIGN KEY (approval_rule_id) REFERENCES merge_requests_approval_rules(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY zentao_tracker_data
ADD CONSTRAINT fk_72a0e59cd8 FOREIGN KEY (instance_integration_id) REFERENCES instance_integrations(id) ON DELETE CASCADE;
@@ -40097,6 +40169,9 @@ ALTER TABLE ONLY import_export_uploads
ALTER TABLE ONLY packages_npm_metadata
ADD CONSTRAINT fk_83625a27c0 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY merge_requests_approval_rules_approver_users
+ ADD CONSTRAINT fk_836efc3006 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY push_rules
ADD CONSTRAINT fk_83b29894de FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
diff --git a/doc/administration/gitlab_duo_self_hosted/supported_models_and_hardware_requirements.md b/doc/administration/gitlab_duo_self_hosted/supported_models_and_hardware_requirements.md
index e524e065645..df6d961b67f 100644
--- a/doc/administration/gitlab_duo_self_hosted/supported_models_and_hardware_requirements.md
+++ b/doc/administration/gitlab_duo_self_hosted/supported_models_and_hardware_requirements.md
@@ -44,14 +44,15 @@ Support for the following GitLab-supported large language models (LLMs) is gener
| Mistral | [Mistral 7B-it v0.3](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.3) | [vLLM](supported_llm_serving_platforms.md#for-self-hosted-model-deployments) | {{< icon name="check-circle-dashed" >}} Largely compatible | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="dash-circle" >}} Not compatible |
| Mistral | [Mixtral 8x7B-it v0.1](https://huggingface.co/mistralai/Mixtral-8x7B-Instruct-v0.1) | [vLLM](supported_llm_serving_platforms.md#for-self-hosted-model-deployments), [AWS Bedrock](https://aws.amazon.com/bedrock/mistral/) | {{< icon name="check-circle-dashed" >}} Largely compatible | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="check-circle-dashed" >}} Largely compatible |
| Mistral | [Mixtral 8x22B-it v0.1](https://huggingface.co/mistralai/Mixtral-8x22B-Instruct-v0.1) | [vLLM](supported_llm_serving_platforms.md#for-self-hosted-model-deployments) | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="check-circle-dashed" >}} Largely compatible |
-| Claude 3 | [Claude 3.5 Sonnet](https://www.anthropic.com/news/claude-3-5-sonnet) | [AWS Bedrock](https://aws.amazon.com/bedrock/claude/) | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="check-circle-filled" >}} Fully compatible |
+| Claude 3 | [Claude 3.5 Sonnet](https://www.anthropic.com/news/claude-3-5-sonnet) | [AWS Bedrock](https://aws.amazon.com/bedrock/claude/) | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="check-circle-filled" >}} Fully compatible |
+| Claude 3 | [Claude 3.7 Sonnet](https://www.anthropic.com/news/claude-3-7-sonnet) | [AWS Bedrock](https://aws.amazon.com/bedrock/claude/) | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="check-circle-filled" >}} Fully compatible |
| GPT | [GPT-4 Turbo](https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models?tabs=python-secure#gpt-4) | [Azure OpenAI](https://learn.microsoft.com/en-us/azure/ai-services/openai/overview) | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="check-circle-dashed" >}} Largely compatible |
| GPT | [GPT-4o](https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models?tabs=python-secure#gpt-4o-and-gpt-4-turbo) | [Azure OpenAI](https://learn.microsoft.com/en-us/azure/ai-services/openai/overview) | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="check-circle-filled" >}} Fully compatible |
| GPT | [GPT-4o-mini](https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models?tabs=python-secure#gpt-4o-and-gpt-4-turbo) | [Azure OpenAI](https://learn.microsoft.com/en-us/azure/ai-services/openai/overview) | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="check-circle-dashed" >}} Largely compatible |
-| Llama | [Llama 3 8B](https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct) | [AWS Bedrock](https://aws.amazon.com/bedrock/llama/) | {{< icon name="check-circle-dashed" >}} Largely compatible | {{< icon name="check-circle-dashed" >}} Largely compatible | Not applicable |
-| Llama | [Llama 3.1 8B](https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct) | [AWS Bedrock](https://aws.amazon.com/bedrock/llama/) | {{< icon name="check-circle-dashed" >}} Largely compatible | {{< icon name="check-circle-filled" >}} Fully compatible | Not applicable |
-| Llama | [Llama 3 70B](https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct) | [AWS Bedrock](https://aws.amazon.com/bedrock/llama/) | {{< icon name="check-circle-dashed" >}} Largely compatible| {{< icon name="check-circle-filled" >}} Fully compatible | Not applicable |
-| Llama | [Llama 3.1 70B](https://huggingface.co/meta-llama/Llama-3.1-70B-Instruct) | [AWS Bedrock](https://aws.amazon.com/bedrock/llama/) | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="check-circle-filled" >}} Fully compatible | Not applicable |
+| Llama | [Llama 3 8B](https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct) | [vLLM](supported_llm_serving_platforms.md#for-self-hosted-model-deployments), [AWS Bedrock](https://aws.amazon.com/bedrock/llama/) | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="check-circle-filled" >}} Fully compatible | Under evaluation. For more information, see [epic 14486](https://gitlab.com/groups/gitlab-org/-/epics/14486) |
+| Llama | [Llama 3.1 8B](https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct) | [vLLM](supported_llm_serving_platforms.md#for-self-hosted-model-deployments), [AWS Bedrock](https://aws.amazon.com/bedrock/llama/) | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="check-circle-filled" >}} Fully compatible | Under evaluation. For more information, see [epic 14486](https://gitlab.com/groups/gitlab-org/-/epics/14486) |
+| Llama | [Llama 3 70B](https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct) | [vLLM](supported_llm_serving_platforms.md#for-self-hosted-model-deployments), [AWS Bedrock](https://aws.amazon.com/bedrock/llama/) | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="check-circle-filled" >}} Fully compatible | Under evaluation. For more information, see [epic 14486](https://gitlab.com/groups/gitlab-org/-/epics/14486) |
+| Llama | [Llama 3.1 70B](https://huggingface.co/meta-llama/Llama-3.1-70B-Instruct) | [vLLM](supported_llm_serving_platforms.md#for-self-hosted-model-deployments), [AWS Bedrock](https://aws.amazon.com/bedrock/llama/) | {{< icon name="check-circle-filled" >}} Fully compatible | {{< icon name="check-circle-filled" >}} Fully compatible | Under evaluation. For more information, see [epic 14486](https://gitlab.com/groups/gitlab-org/-/epics/14486) |
### Experimental and beta models
diff --git a/doc/administration/gitlab_duo_self_hosted/troubleshooting.md b/doc/administration/gitlab_duo_self_hosted/troubleshooting.md
index 7c88c2fe1e9..e6ea15e9d49 100644
--- a/doc/administration/gitlab_duo_self_hosted/troubleshooting.md
+++ b/doc/administration/gitlab_duo_self_hosted/troubleshooting.md
@@ -88,7 +88,7 @@ We provide two debugging scripts to help administrators verify their self-hosted
```shell
poetry run troubleshoot \
--model-family=claude_3 \
- --model-identifier=bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0
+ --model-identifier=bedrock/anthropic.claude-3-7-sonnet-20250219-v1:0
```
For a `mixtral` model running on vLLM:
diff --git a/doc/administration/settings/continuous_integration.md b/doc/administration/settings/continuous_integration.md
index c5bec80713c..fec7bd1d682 100644
--- a/doc/administration/settings/continuous_integration.md
+++ b/doc/administration/settings/continuous_integration.md
@@ -172,35 +172,43 @@ you can allow runner registration tokens. This setting and support for runner re
### Maximum artifacts size
-An administrator can set the maximum size of the
-[job artifacts](../cicd/job_artifacts.md) for:
+You can set the maximum size of distinct [job artifacts](../cicd/job_artifacts.md) for:
-- The entire instance
-- Each project
-- Each group
+- An instance
+- Projects
+- Groups
-For the setting on GitLab.com, see [Artifacts maximum size](../../user/gitlab_com/_index.md#gitlab-cicd).
+The default maximum size for each artifact file in a job is 100 MB.
+For GitLab.com, see [Artifacts maximum size](../../user/gitlab_com/_index.md#gitlab-cicd).
-The value is in MB, and the default value is 100 MB per job. An administrator can change the default value for the:
+Job artifacts defined with `artifacts:reports` can have [different limits](../../administration/instance_limits.md#maximum-file-size-per-type-of-artifact).
+In this case, the smaller value is used.
-- Instance:
+{{< alert type="note" >}}
+
+This setting applies to individual artifacts in a job, not the final archive file.
+
+{{< /alert >}}
+
+To modify the maximum artifacts size:
+
+- For an instance:
1. On the left sidebar, at the bottom, select **Admin**.
- 1. On the left sidebar, select **Settings > CI/CD > Continuous Integration and Deployment**.
+ 1. Select **Settings > CI/CD**.
+ 1. Expand **Continuous Integration and Deployment**.
1. Change the value of **Maximum artifacts size (MB)**.
- 1. Select **Save changes** for the changes to take effect.
+ 1. Select **Save changes**.
-- Group (this overrides the instance setting):
+- For a group or project:
- 1. Go to the group's **Settings > CI/CD > General Pipelines**.
+ Group settings override instance settings. Project settings override both instance and group settings.
+
+ 1. On the left sidebar, select **Search or go to** and find your project or group.
+ 1. Select **Settings > CI/CD**.
+ 1. Expand **General pipelines**
1. Change the value of **Maximum artifacts size** (in MB).
- 1. Select **Save changes** for the changes to take effect.
-
-- Project (this overrides the instance and group settings):
-
- 1. Go to the project's **Settings > CI/CD > General Pipelines**.
- 1. Change the value of **Maximum artifacts size** (in MB).
- 1. Select **Save changes** for the changes to take effect.
+ 1. Select **Save changes**.
### Default artifacts expiration
diff --git a/doc/ci/cloud_deployment/_index.md b/doc/ci/cloud_deployment/_index.md
index 647aec19e8b..d9421cc22db 100644
--- a/doc/ci/cloud_deployment/_index.md
+++ b/doc/ci/cloud_deployment/_index.md
@@ -168,9 +168,10 @@ When you configure related JSON objects and use the template, the pipeline:
the [AWS CloudFormation](https://aws.amazon.com/cloudformation/) API.
1. **Pushes to an S3 bucket**: When your build runs, it creates an artifact.
The artifact is pushed to an [AWS S3](https://aws.amazon.com/s3/) bucket.
-1. **Deploys to EC2**: The content is deployed on an [AWS EC2](https://aws.amazon.com/ec2/) instance.
+1. **Deploys to EC2**: The content is deployed on an [AWS EC2](https://aws.amazon.com/ec2/) instance,
+ as shown in this diagram:
-
+
### Configure the template and JSON
diff --git a/doc/ci/environments/_index.md b/doc/ci/environments/_index.md
index d81f435e605..0ba973e7073 100644
--- a/doc/ci/environments/_index.md
+++ b/doc/ci/environments/_index.md
@@ -894,7 +894,7 @@ If you deploy to your environments with the help of a deployment service (for ex
the [Kubernetes integration](../../user/infrastructure/clusters/_index.md)), GitLab can open
a terminal session to your environment. You can then debug issues without leaving your web browser.
-The Web terminal is a container-based deployment, which often lack basic tools (like an editor),
+The Web terminal is a container-based deployment, which often lacks basic tools (like an editor),
and can be stopped or restarted at any time. If this happens, you lose all your
changes. Treat the Web terminal as a debugging tool, not a comprehensive online IDE.
@@ -903,19 +903,16 @@ Web terminals:
- Are available to project Maintainers and Owners only.
- Must [be enabled](../../administration/integration/terminal.md).
-In the UI, you can view the Web terminal by selecting **Terminal** from the actions menu:
+In the UI, to view the Web terminal, either:
-
+- From the **Actions** menu, select **Terminal**:
-You can also access the terminal button from the page for a specific environment:
+ 
-
+- On the page for a specific environment, on the right, select **Terminal** ({{< icon name="terminal">}}).
-Select the button to establish the terminal session:
-
-
-
-This works like any other terminal. You're in the container created
+Select the button to establish the terminal session.
+It works like any other terminal. You're in the container created
by your deployment so you can:
- Run shell commands and get responses in real time.
diff --git a/doc/ci/environments/img/environments_terminal_button_on_show_v13_10.png b/doc/ci/environments/img/environments_terminal_button_on_show_v13_10.png
deleted file mode 100644
index e725720846a..00000000000
Binary files a/doc/ci/environments/img/environments_terminal_button_on_show_v13_10.png and /dev/null differ
diff --git a/doc/ci/img/environments_terminal_page_v8_15.png b/doc/ci/img/environments_terminal_page_v8_15.png
deleted file mode 100644
index 736b2d01a99..00000000000
Binary files a/doc/ci/img/environments_terminal_page_v8_15.png and /dev/null differ
diff --git a/doc/ci/triggers/_index.md b/doc/ci/triggers/_index.md
index 81391632d73..a92a176a1ba 100644
--- a/doc/ci/triggers/_index.md
+++ b/doc/ci/triggers/_index.md
@@ -194,9 +194,7 @@ in pipelines triggered with a pipeline trigger token.
## See which pipeline trigger token was used
You can see which pipeline trigger token caused a job to run by visiting the single job page.
-A part of the trigger token displays on the right of the page, under the job details:
-
-
+A part of the trigger token displays on the right sidebar, under **Job details**.
In pipelines triggered with a trigger token, jobs are labeled as `triggered` in
**Build > Jobs**.
diff --git a/doc/ci/triggers/img/trigger_single_job_v8.png b/doc/ci/triggers/img/trigger_single_job_v8.png
deleted file mode 100644
index b760782afdc..00000000000
Binary files a/doc/ci/triggers/img/trigger_single_job_v8.png and /dev/null differ
diff --git a/doc/development/ai_features/glossary.md b/doc/development/ai_features/glossary.md
index e3f78f32340..3ba482f3a16 100644
--- a/doc/development/ai_features/glossary.md
+++ b/doc/development/ai_features/glossary.md
@@ -69,7 +69,7 @@ Altering an existing model using a supervised learning process that utilizes a d
### Foundational Model
-A general purpose LLM trained using a generic objective, typically next token prediction. These models are capable and flexible, and can be adjusted to solved many domain-specific tasks (through finetuning or prompt engineering). This means that these general purpose models are ideal to serve as the foundation of many downstream models. Examples of foundational models are: GPT-4o, Claude 3.5 Sonnet.
+A general purpose LLM trained using a generic objective, typically next token prediction. These models are capable and flexible, and can be adjusted to solved many domain-specific tasks (through finetuning or prompt engineering). This means that these general purpose models are ideal to serve as the foundation of many downstream models. Examples of foundational models are: GPT-4o, Claude 3.7 Sonnet.
### Frozen Model
diff --git a/doc/solutions/integrations/aws_googlecloud_ollama.md b/doc/solutions/integrations/aws_googlecloud_ollama.md
index 8f47aad572d..261518c6cf6 100644
--- a/doc/solutions/integrations/aws_googlecloud_ollama.md
+++ b/doc/solutions/integrations/aws_googlecloud_ollama.md
@@ -136,7 +136,7 @@ For example:
When you host an AI model yourself, you'll also need to choose a serving platform. A popular option for self-hosted models is Ollama.
-In this analogy, the brain part for ChatGPT is the GPT-4 model, while in the Anthropic ecosystem, it's the Claude 3.5 Sonnet model. The serving platform acts as the vital framework that connects the brain to the world, enabling it to "think" and interact effectively.
+In this analogy, the brain part for ChatGPT is the GPT-4 model, while in the Anthropic ecosystem, it's the Claude 3.7 Sonnet model. The serving platform acts as the vital framework that connects the brain to the world, enabling it to "think" and interact effectively.
For further information about supported serving platforms and models, please refer to the documentation for [LLM Serving Platforms](../../administration/gitlab_duo_self_hosted/supported_llm_serving_platforms.md) and [Models](../../administration/gitlab_duo_self_hosted/supported_models_and_hardware_requirements.md).
diff --git a/doc/update/_index.md b/doc/update/_index.md
index 0f92f8bcb79..2e249bf7584 100644
--- a/doc/update/_index.md
+++ b/doc/update/_index.md
@@ -209,7 +209,7 @@ Edition, follow the guides below based on the installation method:
to a version upgrade: stop the server, get the code, update configuration files for
the new functionality, install libraries and do migrations, update the init
script, start the application and check its status.
-- [Omnibus CE to EE](package/convert_to_ee.md) - Follow this guide to upgrade your Omnibus
+- [Linux package CE to EE](package/convert_to_ee.md) - Follow this guide to upgrade your Linux package
GitLab Community Edition to the Enterprise Edition.
- [Docker CE to EE](../install/docker/upgrade.md#convert-community-edition-to-enterprise-edition) -
Follow this guide to upgrade your GitLab Community Edition container to an Enterprise Edition container.
diff --git a/doc/user/discussions/_index.md b/doc/user/discussions/_index.md
index 936ec46730c..2ac4ea4429f 100644
--- a/doc/user/discussions/_index.md
+++ b/doc/user/discussions/_index.md
@@ -355,7 +355,7 @@ such as:
- Tier: Ultimate with GitLab Duo Enterprise - [Start a trial](https://about.gitlab.com/solutions/gitlab-duo-pro/sales/?type=free-trial)
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
-- LLM: Anthropic [Claude 3.5 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-5-sonnet)
+- LLM: Anthropic [Claude 3.7 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-7-sonnet)
{{< /details >}}
diff --git a/doc/user/duo_workflow/_index.md b/doc/user/duo_workflow/_index.md
index f50e9ed55f6..5efe68c0fcc 100644
--- a/doc/user/duo_workflow/_index.md
+++ b/doc/user/duo_workflow/_index.md
@@ -10,7 +10,7 @@ title: GitLab Duo Workflow
- Tier: Ultimate
- Offering: GitLab.com
- Status: Experiment
-- LLM: Anthropic [Claude 3.5 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-5-sonnet)
+- LLM: Anthropic [Claude 3.7 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-7-sonnet)
{{< /details >}}
diff --git a/doc/user/gitlab_duo_chat/_index.md b/doc/user/gitlab_duo_chat/_index.md
index d0f2474f638..f590424c388 100644
--- a/doc/user/gitlab_duo_chat/_index.md
+++ b/doc/user/gitlab_duo_chat/_index.md
@@ -9,7 +9,7 @@ title: GitLab Duo Chat
- Tier: Premium with GitLab Duo Pro, Ultimate with GitLab Duo Pro or Enterprise - [Start a trial](https://about.gitlab.com/solutions/gitlab-duo-pro/sales/?type=free-trial)
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
-- LLMs: Anthropic [Claude 3.5 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-5-sonnet), Anthropic [Claude 3 Haiku](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-haiku), and [Vertex AI Search](https://cloud.google.com/enterprise-search). The LLM depends on the question asked.
+- LLMs: Anthropic [Claude 3.7 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-7-sonnet), Anthropic [Claude 3 Haiku](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-haiku), and [Vertex AI Search](https://cloud.google.com/enterprise-search). The LLM depends on the question asked.
{{< /details >}}
diff --git a/doc/user/gitlab_duo_chat/examples.md b/doc/user/gitlab_duo_chat/examples.md
index c52bc16e55a..9b15c41b54e 100644
--- a/doc/user/gitlab_duo_chat/examples.md
+++ b/doc/user/gitlab_duo_chat/examples.md
@@ -30,7 +30,7 @@ The example questions on this page, including the [slash commands](#gitlab-duo-c
- Tier: Premium with GitLab Duo Pro, Ultimate with GitLab Duo Pro or Enterprise - [Start a trial](https://about.gitlab.com/solutions/gitlab-duo-pro/sales/?type=free-trial)
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
- Editors: GitLab UI, Web IDE, VS Code, and JetBrains IDEs
-- LLMs: Anthropic [Claude 3.5 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-5-sonnet), [Vertex AI Search](https://cloud.google.com/enterprise-search)
+- LLMs: Anthropic [Claude 3.7 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-7-sonnet), [Vertex AI Search](https://cloud.google.com/enterprise-search)
{{< /details >}}
@@ -131,7 +131,7 @@ If the epic contains a large amount of text (more than 40,000 words), GitLab Duo
- Tier: Ultimate with GitLab Duo Enterprise - [Start a trial](https://about.gitlab.com/solutions/gitlab-duo-pro/sales/?type=free-trial)
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
- Editors: GitLab UI
-- LLM: Anthropic [Claude 3.5 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-5-sonnet)
+- LLM: Anthropic [Claude 3.7 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-7-sonnet)
{{< /details >}}
@@ -163,7 +163,7 @@ While in the merge request, open Chat and type your question. For example:
- Tier: Ultimate with GitLab Duo Enterprise - [Start a trial](https://about.gitlab.com/solutions/gitlab-duo-pro/sales/?type=free-trial)
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
- Editors: GitLab UI
-- LLM: Anthropic [Claude 3.5 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-5-sonnet)
+- LLM: Anthropic [Claude 3.7 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-7-sonnet)
{{< /details >}}
@@ -186,7 +186,7 @@ You can ask about a specific GitLab commit. For example:
- Tier: Ultimate with GitLab Duo Enterprise - [Start a trial](https://about.gitlab.com/solutions/gitlab-duo-pro/sales/?type=free-trial)
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
- Editors: GitLab UI
-- LLM: Anthropic [Claude 3.5 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-5-sonnet)
+- LLM: Anthropic [Claude 3.7 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-7-sonnet)
{{< /details >}}
@@ -210,7 +210,7 @@ You can ask about a specific GitLab pipeline job. For example:
- Tier: Premium with GitLab Duo Pro, Ultimate with GitLab Duo Pro or Enterprise - [Start a trial](https://about.gitlab.com/solutions/gitlab-duo-pro/sales/?type=free-trial)
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
- Editors: GitLab UI, Web IDE, VS Code, JetBrains IDEs
-- LLM: Anthropic [Claude 3.5 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-5-sonnet)
+- LLM: Anthropic [Claude 3.7 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-7-sonnet)
{{< /details >}}
@@ -255,7 +255,7 @@ In the GitLab UI, you can also explain code in:
- Tier: Premium with GitLab Duo Pro, Ultimate with GitLab Duo Pro or Enterprise - [Start a trial](https://about.gitlab.com/solutions/gitlab-duo-pro/sales/?type=free-trial)
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
- Editors: GitLab UI, Web IDE, VS Code, JetBrains IDEs
-- LLM: Anthropic [Claude 3.5 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-5-sonnet)
+- LLM: Anthropic [Claude 3.7 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-7-sonnet)
{{< /details >}}
@@ -328,7 +328,7 @@ Programming languages that require compiling the source code may throw cryptic e
- Tier: Premium with GitLab Duo Pro, Ultimate with GitLab Duo Pro or Enterprise - [Start a trial](https://about.gitlab.com/solutions/gitlab-duo-pro/sales/?type=free-trial)
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
- Editors: VS Code, JetBrains IDEs
-- LLM: Anthropic [Claude 3.5 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-5-sonnet)
+- LLM: Anthropic [Claude 3.7 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-7-sonnet)
{{< /details >}}
@@ -380,7 +380,7 @@ You cannot use [Quick Chat](_index.md#in-gitlab-duo-quick-chat-in-the-editor-vie
- Tier: Premium with GitLab Duo Pro, Ultimate with GitLab Duo Pro or Enterprise - [Start a trial](https://about.gitlab.com/solutions/gitlab-duo-pro/sales/?type=free-trial)
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
- Editors: Web IDE, VS Code, JetBrains IDEs
-- LLM: Anthropic [Claude 3.5 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-5-sonnet)
+- LLM: Anthropic [Claude 3.7 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-7-sonnet)
{{< /details >}}
@@ -414,7 +414,7 @@ You can include additional instructions to be considered. For example:
- Tier: Premium with GitLab Duo Pro, Ultimate with GitLab Duo Pro or Enterprise - [Start a trial](https://about.gitlab.com/solutions/gitlab-duo-pro/sales/?type=free-trial)
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
- Editors: Web IDE, VS Code, JetBrains IDEs
-- LLM: Anthropic [Claude 3.5 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-5-sonnet)
+- LLM: Anthropic [Claude 3.7 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-7-sonnet)
{{< /details >}}
@@ -446,7 +446,7 @@ You can include additional instructions to be considered. For example:
- Tier: Premium with GitLab Duo Pro, Ultimate with GitLab Duo Pro or Enterprise - [Start a trial](https://about.gitlab.com/solutions/gitlab-duo-pro/sales/?type=free-trial)
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
- Editors: Web IDE, VS Code, JetBrains IDEs
-- LLM: Anthropic [Claude 3.5 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-5-sonnet)
+- LLM: Anthropic [Claude 3.7 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-7-sonnet)
{{< /details >}}
@@ -480,7 +480,7 @@ For more information, see [Use GitLab Duo Chat in VS Code](_index.md#use-gitlab-
- Tier: Premium with GitLab Duo Pro, Ultimate with GitLab Duo Pro or Enterprise - [Start a trial](https://about.gitlab.com/solutions/gitlab-duo-pro/sales/?type=free-trial)
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
- Editors: GitLab UI, Web IDE, VS Code, JetBrains IDEs
-- LLM: Anthropic [Claude 3.5 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-5-sonnet)
+- LLM: Anthropic [Claude 3.7 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-7-sonnet)
{{< /details >}}
@@ -489,7 +489,7 @@ For more information, see [Use GitLab Duo Chat in VS Code](_index.md#use-gitlab-
- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/423524) for GitLab.com in GitLab 16.7.
- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/423524) for GitLab Self-Managed and GitLab Dedicated in GitLab 16.8.
- [Updated LLM](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/149619) from Claude 2.1 to Claude 3 Sonnet in GitLab 17.2.
-- [Updated LLM](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/157696) from Claude 3 Sonnet to Claude 3.5 Sonnet in GitLab 17.2.
+- [Updated LLM](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/157696) from Claude 3 Sonnet to Claude 3.7 Sonnet in GitLab 17.2.
- Changed to require GitLab Duo add-on in GitLab 17.6.
- [Enabled](https://gitlab.com/groups/gitlab-org/-/epics/15227) for [self-hosted model configuration](../../administration/gitlab_duo_self_hosted/_index.md#self-hosted-ai-gateway-and-llms) as well as the [default GitLab external AI vendor configuration](../../administration/gitlab_duo_self_hosted/_index.md#gitlabcom-ai-gateway-with-default-gitlab-external-vendor-llms) in GitLab 17.9.
@@ -517,7 +517,7 @@ Alternatively, you can use GitLab Duo Root Cause Analysis to [troubleshoot faile
- Tier: Ultimate with GitLab Duo Enterprise - [Start a trial](https://about.gitlab.com/solutions/gitlab-duo-pro/sales/?type=free-trial)
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
- Editors: GitLab UI
-- LLM: Anthropic [Claude 3.5 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-5-sonnet)
+- LLM: Anthropic [Claude 3.7 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-7-sonnet)
{{< /details >}}
diff --git a/doc/user/project/merge_requests/changes.md b/doc/user/project/merge_requests/changes.md
index a0a313a1f67..9c952bf7e3a 100644
--- a/doc/user/project/merge_requests/changes.md
+++ b/doc/user/project/merge_requests/changes.md
@@ -248,7 +248,7 @@ To change how a merge request shows changed lines:
- Tier: Premium with GitLab Duo Pro, Ultimate with GitLab Duo Pro or Enterprise - [Start a trial](https://about.gitlab.com/solutions/gitlab-duo-pro/sales/?type=free-trial)
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
-- LLM: Anthropic [Claude 3.5 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-5-sonnet)
+- LLM: Anthropic [Claude 3.7 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-7-sonnet)
{{< /details >}}
diff --git a/doc/user/project/merge_requests/duo_in_merge_requests.md b/doc/user/project/merge_requests/duo_in_merge_requests.md
index f862ce24c2f..6711eefb18d 100644
--- a/doc/user/project/merge_requests/duo_in_merge_requests.md
+++ b/doc/user/project/merge_requests/duo_in_merge_requests.md
@@ -54,7 +54,7 @@ Provide feedback on this feature in [issue 443236](https://gitlab.com/gitlab-org
{{< details >}}
- Status: Beta
-- LLM: Anthropic [Claude 3.5 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-5-sonnet)
+- LLM: Anthropic [Claude 3.7 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-7-sonnet)
{{< /details >}}
@@ -111,7 +111,7 @@ Additional settings and configuration are planned. To that work, see
{{< details >}}
- Status: Experiment
-- LLM: Anthropic [Claude 3.5 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-5-sonnet)
+- LLM: Anthropic [Claude 3.7 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-7-sonnet)
{{< /details >}}
diff --git a/doc/user/project/repository/code_explain.md b/doc/user/project/repository/code_explain.md
index c4206090f99..bf452c180ab 100644
--- a/doc/user/project/repository/code_explain.md
+++ b/doc/user/project/repository/code_explain.md
@@ -9,7 +9,7 @@ title: Explain code in a file
- Tier: Premium with GitLab Duo Pro, Ultimate with GitLab Duo Pro or Enterprise - [Start a trial](https://about.gitlab.com/solutions/gitlab-duo-pro/sales/?type=free-trial)
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
-- LLM: Anthropic [Claude 3.5 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-5-sonnet)
+- LLM: Anthropic [Claude 3.7 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-7-sonnet)
{{< /details >}}
diff --git a/doc/user/project/repository/code_suggestions/_index.md b/doc/user/project/repository/code_suggestions/_index.md
index 85ad3e3e482..2073e0caaf0 100644
--- a/doc/user/project/repository/code_suggestions/_index.md
+++ b/doc/user/project/repository/code_suggestions/_index.md
@@ -10,7 +10,7 @@ title: Code Suggestions
- Tier: Premium with GitLab Duo Pro, Ultimate with GitLab Duo Pro or Enterprise - [Start a trial](https://about.gitlab.com/solutions/gitlab-duo-pro/sales/?type=free-trial)
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
-- LLMs: For code completion, Fireworks AI-hosted [`Qwen2.5 7B`](https://fireworks.ai/models/fireworks/qwen2p5-coder-7b) and Vertex AI Codey [`code-gecko`](https://console.cloud.google.com/vertex-ai/publishers/google/model-garden/code-gecko). For code generation, Anthropic [Claude 3.5 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-5-sonnet).
+- LLMs: For code completion, Fireworks AI-hosted [`Qwen2.5 7B`](https://fireworks.ai/models/fireworks/qwen2p5-coder-7b) and Vertex AI Codey [`code-gecko`](https://console.cloud.google.com/vertex-ai/publishers/google/model-garden/code-gecko). For code generation, Anthropic [Claude 3.7 Sonnet](https://console.cloud.google.com/vertex-ai/publishers/anthropic/model-garden/claude-3-7-sonnet).
{{< /details >}}
diff --git a/gems/click_house-client/lib/click_house/client/query_like.rb b/gems/click_house-client/lib/click_house/client/query_like.rb
index 9e9ee46a338..b33c45ee0f8 100644
--- a/gems/click_house-client/lib/click_house/client/query_like.rb
+++ b/gems/click_house-client/lib/click_house/client/query_like.rb
@@ -14,6 +14,11 @@ module ClickHouse
def to_redacted_sql(bind_index_manager = BindIndexManager.new)
raise NotImplementedError
end
+
+ # Override when placeholders should be supported
+ def placeholders
+ {}
+ end
end
end
end
diff --git a/gems/click_house-client/spec/click_house/client/query_like_spec.rb b/gems/click_house-client/spec/click_house/client/query_like_spec.rb
index 8b8426bd5fd..b2c99fc8189 100644
--- a/gems/click_house-client/spec/click_house/client/query_like_spec.rb
+++ b/gems/click_house-client/spec/click_house/client/query_like_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ClickHouse::Client::QueryLike do
+RSpec.describe ClickHouse::Client::QueryLike, feature_category: :database do
subject(:query) { described_class.new }
describe '#to_sql' do
@@ -12,4 +12,8 @@ RSpec.describe ClickHouse::Client::QueryLike do
describe '#to_redacted_sql' do
it { expect { query.to_redacted_sql }.to raise_error(NotImplementedError) }
end
+
+ describe '#placeholders' do
+ it { expect(query.placeholders).to eq({}) }
+ end
end
diff --git a/lib/click_house/models/base_model.rb b/lib/click_house/models/base_model.rb
index ec453bb638b..044c434701d 100644
--- a/lib/click_house/models/base_model.rb
+++ b/lib/click_house/models/base_model.rb
@@ -3,10 +3,10 @@
# rubocop: disable CodeReuse/ActiveRecord
module ClickHouse
module Models
- class BaseModel
+ class BaseModel < ClickHouse::Client::QueryLike
extend Forwardable
- def_delegators :@query_builder, :to_sql
+ def_delegators :@query_builder, :to_sql, :to_redacted_sql
def initialize(query_builder = ClickHouse::QueryBuilder.new(self.class.table_name))
@query_builder = query_builder
diff --git a/lib/click_house/redactor.rb b/lib/click_house/redactor.rb
index 6ca7c46e747..32e442d4b6f 100644
--- a/lib/click_house/redactor.rb
+++ b/lib/click_house/redactor.rb
@@ -43,10 +43,26 @@ module ClickHouse
condition.left.gt(Arel.sql(bind_manager.next_bind_str))
when Arel::Nodes::GreaterThanOrEqual
condition.left.gteq(Arel.sql(bind_manager.next_bind_str))
+ when Arel::Nodes::NamedFunction
+ redact_named_function(condition, bind_manager)
else
raise ArgumentError, "Unsupported Arel node type for Redactor: #{condition.class}"
end
end
+
+ def self.redact_named_function(condition, bind_manager)
+ redacted_condition =
+ Arel::Nodes::NamedFunction.new(condition.name, condition.expressions.dup)
+
+ case redacted_condition.name
+ when 'startsWith'
+ redacted_condition.expressions[1] = Arel.sql(bind_manager.next_bind_str)
+ else
+ redacted_condition.expressions = redacted_condition.expressions.map { Arel.sql(bind_manager.next_bind_str) }
+ end
+
+ redacted_condition
+ end
end
end
# rubocop:enable CodeReuse/ActiveRecord
diff --git a/lib/gitlab/background_migration/backfill_finish_onboarding_for_group_saml.rb b/lib/gitlab/background_migration/backfill_finish_onboarding_for_group_saml.rb
new file mode 100644
index 00000000000..3840cf239f8
--- /dev/null
+++ b/lib/gitlab/background_migration/backfill_finish_onboarding_for_group_saml.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ class BackfillFinishOnboardingForGroupSaml < BatchedMigrationJob
+ operation_name :backfill_finish_onboarding_for_group_saml # This is used as the key on collecting metrics
+ scope_to ->(relation) { relation.where(provider: 'group_saml') }
+ feature_category :onboarding
+
+ class User < ApplicationRecord
+ self.table_name = :users
+ end
+
+ def perform
+ each_sub_batch do |sub_batch|
+ # First get the user IDs from the identities query
+ user_ids = sub_batch
+ .joins("INNER JOIN users ON users.id = identities.user_id")
+ .where(provider: 'group_saml', users: { onboarding_in_progress: true })
+ .pluck(:user_id)
+
+ # Then update those users
+ User.where(id: user_ids).update_all(onboarding_in_progress: false)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/parsers/sbom/cyclonedx.rb b/lib/gitlab/ci/parsers/sbom/cyclonedx.rb
index 97648dd315d..8b25c7f0b8b 100644
--- a/lib/gitlab/ci/parsers/sbom/cyclonedx.rb
+++ b/lib/gitlab/ci/parsers/sbom/cyclonedx.rb
@@ -51,6 +51,10 @@ module Gitlab
tools = data.dig('metadata', 'tools')
authors = data.dig('metadata', 'authors')
+ component_data = data.dig('metadata', 'component')
+ component = CyclonedxMetadataComponent.parse(component_data)
+ report.set_metadata_component(component) if component
+
report.metadata = ::Gitlab::Ci::Reports::Sbom::Metadata.new.tap do |metadata|
metadata.tools = tools if tools
metadata.authors = authors if authors
diff --git a/lib/gitlab/ci/parsers/sbom/cyclonedx_metadata_component.rb b/lib/gitlab/ci/parsers/sbom/cyclonedx_metadata_component.rb
new file mode 100644
index 00000000000..479ae28ca41
--- /dev/null
+++ b/lib/gitlab/ci/parsers/sbom/cyclonedx_metadata_component.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Parsers
+ module Sbom
+ class CyclonedxMetadataComponent
+ REQUIRED_PROPERTIES = %w[
+ name
+ type
+ bom-ref
+ ].freeze
+
+ def self.parse(...)
+ new(...).parse
+ end
+
+ def initialize(properties)
+ @properties = properties
+ end
+
+ def parse
+ return if missing_properties.present?
+
+ ::Gitlab::Ci::Reports::Sbom::Component.new(
+ ref: properties['bom-ref'],
+ type: properties['type'],
+ name: properties['name'],
+ purl: nil,
+ version: nil
+ )
+ end
+
+ private
+
+ attr_reader :properties
+
+ def missing_properties
+ REQUIRED_PROPERTIES - properties&.keys.to_a
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/reports/sbom/dependency_adjacency_list.rb b/lib/gitlab/ci/reports/sbom/dependency_adjacency_list.rb
index fdec798059a..d33aebbd703 100644
--- a/lib/gitlab/ci/reports/sbom/dependency_adjacency_list.rb
+++ b/lib/gitlab/ci/reports/sbom/dependency_adjacency_list.rb
@@ -14,8 +14,8 @@ module Gitlab
adjacency_list[child] << parent
end
- def add_component_info(ref, name, version)
- component_info[ref] = { name: name, version: version }
+ def add_component_info(ref, name = nil, version = nil)
+ component_info[ref] = { name: name, version: version }.compact
end
def ancestors_for(child)
diff --git a/lib/gitlab/ci/reports/sbom/report.rb b/lib/gitlab/ci/reports/sbom/report.rb
index e9364e551e7..1417907d1fd 100644
--- a/lib/gitlab/ci/reports/sbom/report.rb
+++ b/lib/gitlab/ci/reports/sbom/report.rb
@@ -44,6 +44,10 @@ module Gitlab
dependencies.add_component_info(component.ref, component.name, component.version)
end
+ def set_metadata_component(component)
+ dependencies.add_component_info(component.ref)
+ end
+
def add_dependency(parent, child)
dependencies.add_edge(parent, child)
end
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 0043586fde6..28d30aa5a23 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -21868,6 +21868,9 @@ msgstr ""
msgid "DuoChat|Included references"
msgstr ""
+msgid "DuoChat|New chat conversation."
+msgstr ""
+
msgid "DuoChat|No results found"
msgstr ""
diff --git a/scripts/frontend/quarantined_vue3_specs.txt b/scripts/frontend/quarantined_vue3_specs.txt
index 803723ce663..10ce7b51c65 100644
--- a/scripts/frontend/quarantined_vue3_specs.txt
+++ b/scripts/frontend/quarantined_vue3_specs.txt
@@ -78,7 +78,6 @@ ee/spec/frontend/status_checks/components/modal_create_spec.js
ee/spec/frontend/status_checks/mount_spec.js
ee/spec/frontend/tracing/details/tracing_details_spec.js
ee/spec/frontend/tracing/details/tracing_header_spec.js
-ee/spec/frontend/usage_quotas/code_suggestions/components/add_on_eligible_user_list_spec.js
ee/spec/frontend/usage_quotas/transfer/components/usage_by_month_spec.js
ee/spec/frontend/users/identity_verification/components/international_phone_input_spec.js
ee/spec/frontend/users/identity_verification/components/verify_phone_verification_code_spec.js
diff --git a/spec/frontend/pages/shared/wikis/notes/components/wiki_notes_app_spec.js b/spec/frontend/pages/shared/wikis/notes/components/wiki_notes_app_spec.js
index 31c051fb5bb..4a62941c6b8 100644
--- a/spec/frontend/pages/shared/wikis/notes/components/wiki_notes_app_spec.js
+++ b/spec/frontend/pages/shared/wikis/notes/components/wiki_notes_app_spec.js
@@ -37,6 +37,7 @@ const mockDiscussion = (...children) => {
bodyHtml: c,
createdAt: '2023-05-18T14:24:07.000+00:00',
lastEditedAt: null,
+ lastEditedBy: null,
url: 'https://path/to/2/',
awardEmoji: null,
userPermissions: {
diff --git a/spec/lib/click_house/models/base_model_spec.rb b/spec/lib/click_house/models/base_model_spec.rb
index fcee40d48e3..e6e22522f80 100644
--- a/spec/lib/click_house/models/base_model_spec.rb
+++ b/spec/lib/click_house/models/base_model_spec.rb
@@ -15,16 +15,26 @@ RSpec.describe ClickHouse::Models::BaseModel, feature_category: :database do
end
end
- describe '#to_sql' do
- it 'delegates to the query builder' do
- expect(query_builder).to receive(:to_sql).and_return("SELECT * FROM dummy_table")
+ it { expect(described_class).to be < ClickHouse::Client::QueryLike }
+
+ shared_examples 'method delegated to query builder' do |method_name|
+ it "delegates ##{method_name} to @query_builder" do
+ expect(query_builder).to receive(method_name).and_return("SELECT * FROM dummy_table")
dummy_instance = dummy_class.new(query_builder)
- expect(dummy_instance.to_sql).to eq("SELECT * FROM dummy_table")
+ expect(dummy_instance.public_send(method_name)).to eq("SELECT * FROM dummy_table")
end
end
+ describe '#to_sql' do
+ it_behaves_like 'method delegated to query builder', :to_sql
+ end
+
+ describe '#to_redacted_sql' do
+ it_behaves_like 'method delegated to query builder', :to_redacted_sql
+ end
+
describe '#where' do
it 'returns a new instance with refined query' do
dummy_instance = dummy_class.new(query_builder)
diff --git a/spec/lib/click_house/redactor_spec.rb b/spec/lib/click_house/redactor_spec.rb
index d8354b6cbb9..3b16908f24f 100644
--- a/spec/lib/click_house/redactor_spec.rb
+++ b/spec/lib/click_house/redactor_spec.rb
@@ -107,6 +107,42 @@ RSpec.describe ClickHouse::Redactor, feature_category: :database do
expect(redacted_query).to eq(expected_redacted_sql)
end
+
+ context 'when condition is a named function' do
+ let(:function_name) { 'randomFunction' }
+ let(:expressions) { [Arel.sql("'traversal_path'"), Arel.sql('42')] }
+ let(:function_node) do
+ Arel::Nodes::NamedFunction.new(
+ function_name,
+ expressions
+ )
+ end
+
+ subject(:redacted_query) do
+ new_builder = builder.where(function_node)
+ described_class.redact(new_builder)
+ end
+
+ it 'redacts all condition expressions' do
+ expected_redacted_sql = <<~SQL.lines(chomp: true).join(' ')
+ SELECT * FROM "test_table" WHERE randomFunction($1, $2)
+ SQL
+
+ expect(redacted_query).to eq(expected_redacted_sql)
+ end
+
+ context 'when using startsWith function' do
+ let(:function_name) { 'startsWith' }
+
+ it 'redacts only value argument' do
+ expected_redacted_sql = <<~SQL.lines(chomp: true).join(' ')
+ SELECT * FROM "test_table" WHERE startsWith('traversal_path', $1)
+ SQL
+
+ expect(redacted_query).to eq(expected_redacted_sql)
+ end
+ end
+ end
end
context 'with unsupported arel nodes' do
diff --git a/spec/lib/gitlab/background_migration/backfill_finish_onboarding_for_group_saml_spec.rb b/spec/lib/gitlab/background_migration/backfill_finish_onboarding_for_group_saml_spec.rb
new file mode 100644
index 00000000000..408cb5c6071
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/backfill_finish_onboarding_for_group_saml_spec.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BackfillFinishOnboardingForGroupSaml, feature_category: :onboarding do
+ let(:users) { table(:users) }
+ let(:identities) { table(:identities) }
+
+ let(:first_user_with_saml) do
+ users.create!(email: 'user1@example.com', projects_limit: 0, onboarding_in_progress: true)
+ end
+
+ let!(:first_user_identity) { identities.create!(user_id: first_user_with_saml.id, provider: 'group_saml') }
+
+ let!(:user_with_saml_not_in_onboarding) do
+ record = users.create!(email: 'user2@example.com', projects_limit: 0, onboarding_in_progress: false)
+ identities.create!(user_id: record.id, provider: 'group_saml')
+ record
+ end
+
+ let!(:user_with_identity_not_group_saml) do
+ record = users.create!(email: 'user3@example.com', projects_limit: 0, onboarding_in_progress: true)
+ identities.create!(user_id: record.id, provider: 'foo')
+ record
+ end
+
+ let!(:last_user_no_identity) do
+ users.create!(email: 'user4@example.com', projects_limit: 0, onboarding_in_progress: true)
+ end
+
+ let(:last_user_with_identity) do
+ users.create!(email: 'user5@example.com', projects_limit: 0, onboarding_in_progress: true)
+ end
+
+ let!(:last_user_not_saml_identity) { identities.create!(user_id: last_user_with_identity.id, provider: 'foo') }
+ let!(:last_user_identity) { identities.create!(user_id: last_user_with_identity.id, provider: 'group_saml') }
+
+ subject(:migration) do
+ described_class.new(
+ start_id: first_user_identity.id,
+ end_id: last_user_identity.id,
+ batch_table: :identities,
+ batch_column: :id,
+ sub_batch_size: 100,
+ pause_ms: 0,
+ connection: ApplicationRecord.connection
+ )
+ end
+
+ describe '#perform' do
+ it 'updates the correct data' do
+ migration.perform
+
+ expect(first_user_with_saml.reload.onboarding_in_progress).to be(false)
+ expect(user_with_saml_not_in_onboarding.reload.onboarding_in_progress).to be(false)
+ expect(user_with_identity_not_group_saml.reload.onboarding_in_progress).to be(true)
+ expect(last_user_no_identity.reload.onboarding_in_progress).to be(true)
+ expect(last_user_with_identity.reload.onboarding_in_progress).to be(false)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/parsers/sbom/cyclonedx_metadata_component_spec.rb b/spec/lib/gitlab/ci/parsers/sbom/cyclonedx_metadata_component_spec.rb
new file mode 100644
index 00000000000..007a9595b9f
--- /dev/null
+++ b/spec/lib/gitlab/ci/parsers/sbom/cyclonedx_metadata_component_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Ci::Parsers::Sbom::CyclonedxMetadataComponent, feature_category: :dependency_management do
+ describe "#parse" do
+ let_it_be(:name) { 'Root Application' }
+ let_it_be(:type) { 'application' }
+ let_it_be(:ref) { 'bom-ref' }
+
+ subject(:component) { described_class.new(data).parse }
+
+ %w[name type bom-ref].each do |property|
+ context "without #{property}" do
+ let_it_be(:data) { { 'name' => name, 'type' => type, 'bom-ref' => ref }.delete(property.to_sym) }
+
+ it 'returns nil' do
+ expect(component).to be_nil
+ end
+ end
+ end
+
+ context 'with all required properties' do
+ let_it_be(:data) { { 'name' => name, 'type' => type, 'bom-ref' => ref } }
+
+ it 'returns a sbom component' do
+ expect(component).to be_kind_of(::Gitlab::Ci::Reports::Sbom::Component)
+
+ expect(component.component_type).to eq(type)
+ expect(component.name).to eq(name)
+ expect(component.ref).to eq(ref)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/parsers/sbom/cyclonedx_spec.rb b/spec/lib/gitlab/ci/parsers/sbom/cyclonedx_spec.rb
index 9430320a664..222c50eca30 100644
--- a/spec/lib/gitlab/ci/parsers/sbom/cyclonedx_spec.rb
+++ b/spec/lib/gitlab/ci/parsers/sbom/cyclonedx_spec.rb
@@ -428,4 +428,44 @@ RSpec.describe Gitlab::Ci::Parsers::Sbom::Cyclonedx, feature_category: :dependen
parse!
end
end
+
+ context 'when metadata component is present' do
+ let(:ref) { 'urn:uuid:bbd321e1-f802-4fc1-ab0d-0cc629c3d53a' }
+ let(:type) { 'application' }
+ let(:name) { 'Root Application' }
+
+ let(:component) do
+ {
+ 'type' => type,
+ 'name' => name,
+ 'bom-ref' => ref
+ }
+ end
+
+ let(:report_data) do
+ base_report_data.merge({ 'metadata' => { 'component' => component } })
+ end
+
+ it 'sets report metadata component' do
+ expect(report).to receive(:set_metadata_component)
+ .with(an_object_having_attributes(ref: ref, name: name, type: type))
+
+ parse!
+ end
+
+ context 'with incomplete component' do
+ let(:component) do
+ {
+ 'type' => type,
+ 'name' => name
+ }
+ end
+
+ it 'doesnt set report metadata component' do
+ expect(report).not_to receive(:set_metadata_component)
+
+ parse!
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/ci/reports/sbom/dependency_adjacency_list_spec.rb b/spec/lib/gitlab/ci/reports/sbom/dependency_adjacency_list_spec.rb
index 91277decba3..f633efdaaf0 100644
--- a/spec/lib/gitlab/ci/reports/sbom/dependency_adjacency_list_spec.rb
+++ b/spec/lib/gitlab/ci/reports/sbom/dependency_adjacency_list_spec.rb
@@ -48,6 +48,19 @@ RSpec.describe Gitlab::Ci::Reports::Sbom::DependencyAdjacencyList, feature_categ
expect(dependency_list.ancestors_for(child)).to contain_exactly(component_data, component_data_2)
end
end
+
+ context 'with metadata component' do
+ let(:metadata_component) { 'metadata_ref' }
+
+ before do
+ dependency_list.add_component_info(metadata_component)
+ dependency_list.add_edge(metadata_component, child)
+ end
+
+ it 'returns the ancestor with empty hash' do
+ expect(dependency_list.ancestors_for(child)).to contain_exactly(component_data, {})
+ end
+ end
end
end
end
diff --git a/spec/lib/gitlab/ci/reports/sbom/report_spec.rb b/spec/lib/gitlab/ci/reports/sbom/report_spec.rb
index 7f8c375cb2b..0a9ea0715dd 100644
--- a/spec/lib/gitlab/ci/reports/sbom/report_spec.rb
+++ b/spec/lib/gitlab/ci/reports/sbom/report_spec.rb
@@ -64,4 +64,19 @@ RSpec.describe Gitlab::Ci::Reports::Sbom::Report, feature_category: :dependency_
expect(component_last.ancestors).to match_array([expected_value])
end
end
+
+ describe '#add_metadata_component' do
+ let_it_be(:metadata_component) { create(:ci_reports_sbom_component) }
+ let_it_be(:component) { create(:ci_reports_sbom_component) }
+
+ it 'sets empty hash into ancestors' do
+ report.set_metadata_component(metadata_component)
+ report.add_component(component)
+ report.add_dependency(metadata_component.ref, component.ref)
+
+ report.ensure_ancestors!
+
+ expect(component.ancestors).to match_array([{}])
+ end
+ end
end
diff --git a/spec/migrations/20250305135537_queue_backfill_finish_onboarding_for_group_saml_spec.rb b/spec/migrations/20250305135537_queue_backfill_finish_onboarding_for_group_saml_spec.rb
new file mode 100644
index 00000000000..62c4fb121ea
--- /dev/null
+++ b/spec/migrations/20250305135537_queue_backfill_finish_onboarding_for_group_saml_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe QueueBackfillFinishOnboardingForGroupSaml, migration: :gitlab_main_cell, feature_category: :onboarding do
+ let!(:batched_migration) { described_class::MIGRATION }
+
+ it 'schedules a new batched migration' do
+ reversible_migration do |migration|
+ migration.before -> {
+ expect(batched_migration).not_to have_scheduled_batched_migration
+ }
+
+ attributes = {
+ table_name: :identities,
+ column_name: :id,
+ interval: described_class::DELAY_INTERVAL,
+ batch_size: described_class::BATCH_SIZE,
+ sub_batch_size: described_class::SUB_BATCH_SIZE,
+ max_batch_size: described_class::MAX_BATCH_SIZE
+ }
+
+ migration.after -> {
+ expect(batched_migration).to have_scheduled_batched_migration(attributes)
+ }
+ end
+ end
+end
diff --git a/spec/support/shared_examples/click_house/ci/collect_pipeline_analytics_shared_examples.rb b/spec/support/shared_examples/click_house/ci/collect_pipeline_analytics_shared_examples.rb
index 31c6036768e..580423710d7 100644
--- a/spec/support/shared_examples/click_house/ci/collect_pipeline_analytics_shared_examples.rb
+++ b/spec/support/shared_examples/click_house/ci/collect_pipeline_analytics_shared_examples.rb
@@ -1,6 +1,20 @@
# frozen_string_literal: true
RSpec.shared_examples_for 'a pipeline analytics service' do
+ it 'does not execute raw sql queries' do
+ allow(::ClickHouse::Client).to receive(:select).and_call_original
+
+ expect(::ClickHouse::Client)
+ .not_to receive(:select)
+ .with(instance_of(String), instance_of(Symbol))
+
+ expect(::ClickHouse::Client)
+ .to receive(:select)
+ .with(kind_of(ClickHouse::Client::QueryLike), instance_of(Symbol))
+
+ result
+ end
+
context 'when ClickHouse database is not configured' do
before do
allow(::Gitlab::ClickHouse).to receive(:configured?).and_return(false)