diff --git a/.gitlab/ci/test-on-cng/main.gitlab-ci.yml b/.gitlab/ci/test-on-cng/main.gitlab-ci.yml
index 0859cd5051a..c3fed7916ac 100644
--- a/.gitlab/ci/test-on-cng/main.gitlab-ci.yml
+++ b/.gitlab/ci/test-on-cng/main.gitlab-ci.yml
@@ -78,7 +78,7 @@ workflow:
QA_ALLOW_LOCAL_REQUESTS: "true"
QA_SUITE_STATUS_ENV_FILE: $CI_PROJECT_DIR/suite_status.env
QA_RUN_IN_PARALLEL: "true"
- QA_PARALLEL_PROCESSES: 4
+ QA_PARALLEL_PROCESSES: 5
GITLAB_QA_ADMIN_ACCESS_TOKEN: $QA_ADMIN_ACCESS_TOKEN
before_script:
- echo "SUITE_RAN=true" > "$QA_SUITE_STATUS_ENV_FILE"
diff --git a/.gitlab/issue_templates/Security developer workflow.md b/.gitlab/issue_templates/Security developer workflow.md
index e497bbbb241..b60a7852e98 100644
--- a/.gitlab/issue_templates/Security developer workflow.md
+++ b/.gitlab/issue_templates/Security developer workflow.md
@@ -34,7 +34,8 @@ After your merge request has been approved according to our [approval guidelines
- You can use the script `bin/secpick` instead of the following steps, to help you cherry-picking. See the [secpick documentation]
- [ ] Create each MR targeting the stable branch `X-Y-stable`, using the [Security merge request template].
- Every merge request will have its own set of to-dos, so make sure to complete those.
-- [ ] On the "Related merge requests" section, ensure that `4` merge requests are associated: The one targeting `master` and the `3` backports.
+- [ ] On the `Related merge requests` section, ensure that **ONLY** `4` merge requests are associated: **ONLY** one targeting `master` and the `3` backports.
+ - [ ] If there are more associated MRs, re-create another security issue and ensure there are only 4 merge requests associated with that one.
- [ ] If this issue requires less than `4` merge requests, add the ~"reduced backports" label.
## Assigning to a release
diff --git a/.rubocop_todo/gitlab/bounded_contexts.yml b/.rubocop_todo/gitlab/bounded_contexts.yml
index 0741962bf45..47544ee5ef0 100644
--- a/.rubocop_todo/gitlab/bounded_contexts.yml
+++ b/.rubocop_todo/gitlab/bounded_contexts.yml
@@ -3603,6 +3603,7 @@ Gitlab/BoundedContexts:
- 'ee/lib/ee/event_filter.rb'
- 'ee/lib/ee/feature.rb'
- 'ee/lib/ee/feature/definition.rb'
+ - 'ee/lib/ee/sidebars/admin/menus/admin_overview_menu.rb'
- 'ee/lib/ee/sidebars/admin/menus/admin_settings_menu.rb'
- 'ee/lib/ee/sidebars/admin/menus/monitoring_menu.rb'
- 'ee/lib/ee/sidebars/admin/panel.rb'
diff --git a/.rubocop_todo/layout/line_length.yml b/.rubocop_todo/layout/line_length.yml
index 7088afe74b1..005f70f2d1a 100644
--- a/.rubocop_todo/layout/line_length.yml
+++ b/.rubocop_todo/layout/line_length.yml
@@ -1959,7 +1959,6 @@ Layout/LineLength:
- 'lib/api/commit_statuses.rb'
- 'lib/api/commits.rb'
- 'lib/api/composer_packages.rb'
- - 'lib/api/concerns/packages/conan_endpoints.rb'
- 'lib/api/concerns/packages/debian_distribution_endpoints.rb'
- 'lib/api/concerns/packages/debian_package_endpoints.rb'
- 'lib/api/debian_group_packages.rb'
diff --git a/GITLAB_KAS_VERSION b/GITLAB_KAS_VERSION
index 3237e12671d..bc471ddb436 100644
--- a/GITLAB_KAS_VERSION
+++ b/GITLAB_KAS_VERSION
@@ -1 +1 @@
-6250b300df6b3559e377ac6d218bba674ee045bf
+ed8e69891a82913e19430e094c192833ea5cb066
diff --git a/app/assets/javascripts/ci/catalog/components/details/ci_resource_components.vue b/app/assets/javascripts/ci/catalog/components/details/ci_resource_components.vue
index e73aef521d2..90d5aa1c29e 100644
--- a/app/assets/javascripts/ci/catalog/components/details/ci_resource_components.vue
+++ b/app/assets/javascripts/ci/catalog/components/details/ci_resource_components.vue
@@ -1,18 +1,19 @@
@@ -69,12 +87,18 @@ export default {
+ >
+
+
+ {{ $options.i18n.CREATE_USING_MLFLOW_LABEL }}
+
+
+
+
+
diff --git a/app/assets/javascripts/ml/experiment_tracking/routes/experiments/index/components/mlflow_usage_modal.vue b/app/assets/javascripts/ml/experiment_tracking/routes/experiments/index/components/mlflow_usage_modal.vue
new file mode 100644
index 00000000000..512d7f38b15
--- /dev/null
+++ b/app/assets/javascripts/ml/experiment_tracking/routes/experiments/index/components/mlflow_usage_modal.vue
@@ -0,0 +1,73 @@
+
+
+
+
+
{{ s__('MlExperimentTracking|Creating experiments using the MLflow client:') }}
+
+
+
+
+
+ {{ instruction.cmd }}
+
+
+
+
+
+
+ {{
+ content
+ }}
+
+
+
+
+
diff --git a/app/assets/javascripts/ml/experiment_tracking/routes/experiments/index/constants.js b/app/assets/javascripts/ml/experiment_tracking/routes/experiments/index/constants.js
index c94e7648d1d..2a8c39ebdf3 100644
--- a/app/assets/javascripts/ml/experiment_tracking/routes/experiments/index/constants.js
+++ b/app/assets/javascripts/ml/experiment_tracking/routes/experiments/index/constants.js
@@ -2,9 +2,9 @@ import { s__ } from '~/locale';
import { helpPagePath } from '~/helpers/help_page_helper';
export const CREATE_EXPERIMENT_HELP_PATH = helpPagePath(
- 'user/project/ml/experiment_tracking/index',
+ 'user/project/ml/experiment_tracking/mlflow_client',
{
- anchor: 'track-new-experiments-and-candidates',
+ anchor: 'model-experiments',
},
);
@@ -15,3 +15,5 @@ export const EXPERIMENTS_TABLE_FIELDS = Object.freeze([
label: s__('MlExperimentTracking|Logged candidates for experiment'),
},
]);
+
+export const MLFLOW_USAGE_MODAL_ID = 'experiment-tracking-mlflow-experiment-usage-model';
diff --git a/app/assets/javascripts/ml/experiment_tracking/routes/experiments/index/translations.js b/app/assets/javascripts/ml/experiment_tracking/routes/experiments/index/translations.js
index f556197633b..78800c53ca5 100644
--- a/app/assets/javascripts/ml/experiment_tracking/routes/experiments/index/translations.js
+++ b/app/assets/javascripts/ml/experiment_tracking/routes/experiments/index/translations.js
@@ -4,10 +4,14 @@ export const TITLE_LABEL = s__('MlExperimentTracking|Model experiments');
export const CREATE_NEW_LABEL = s__('MlExperimentTracking|Create a new experiment');
+export const CREATE_USING_MLFLOW_LABEL = s__(
+ 'MlExperimentTracking|Create an experiment using MLflow',
+);
+
export const EMPTY_STATE_TITLE_LABEL = s__(
'MlExperimentTracking|Get started with model experiments!',
);
export const EMPTY_STATE_DESCRIPTION_LABEL = s__(
- 'MlExperimentTracking|Experiments keep track of comparable model candidates, and determine which parameters provides the best performance. Create experiments using the MLflow client',
+ 'MlExperimentTracking|Experiments keep track of comparable model candidates, and determine which parameters provides the best performance.',
);
diff --git a/app/assets/javascripts/pages/projects/merge_requests/index/index.js b/app/assets/javascripts/pages/projects/merge_requests/index/index.js
index a367c0b5498..3eb9958b7d3 100644
--- a/app/assets/javascripts/pages/projects/merge_requests/index/index.js
+++ b/app/assets/javascripts/pages/projects/merge_requests/index/index.js
@@ -1,4 +1,7 @@
import addExtraTokensForMergeRequests from 'ee_else_ce/filtered_search/add_extra_tokens_for_merge_requests';
+import getMergeRequestsQuery from 'ee_else_ce/merge_requests/list/queries/project/get_merge_requests.query.graphql';
+import getMergeRequestsCountsQuery from 'ee_else_ce/merge_requests/list/queries/project/get_merge_requests_counts.query.graphql';
+
import { addShortcutsExtension } from '~/behaviors/shortcuts';
import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
import IssuableFilteredSearchTokenKeys from '~/filtered_search/issuable_filtered_search_token_keys';
@@ -23,4 +26,4 @@ addShortcutsExtension(ShortcutsNavigation);
initIssuableByEmail();
initCsvImportExportButtons();
mountMoreActionsDropdown();
-mountMergeRequestListsApp();
+mountMergeRequestListsApp({ getMergeRequestsQuery, getMergeRequestsCountsQuery });
diff --git a/app/assets/javascripts/pages/projects/ml/experiments/index/index.js b/app/assets/javascripts/pages/projects/ml/experiments/index/index.js
index b054022b6d6..f38cf12b3ea 100644
--- a/app/assets/javascripts/pages/projects/ml/experiments/index/index.js
+++ b/app/assets/javascripts/pages/projects/ml/experiments/index/index.js
@@ -8,11 +8,12 @@ const initIndexMlExperiments = () => {
return undefined;
}
- const { experiments, pageInfo, emptyStateSvgPath } = element.dataset;
+ const { experiments, pageInfo, emptyStateSvgPath, mlflowTrackingUrl } = element.dataset;
const props = {
experiments: JSON.parse(experiments),
pageInfo: convertObjectPropsToCamelCase(JSON.parse(pageInfo)),
emptyStateSvgPath,
+ mlflowTrackingUrl,
};
return new Vue({
diff --git a/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/interval_pattern_input.vue b/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/interval_pattern_input.vue
index 1e8fb7d81e7..41ca1745ddb 100644
--- a/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/interval_pattern_input.vue
+++ b/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/interval_pattern_input.vue
@@ -1,8 +1,9 @@