diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-05-13 06:06:53 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-05-13 06:06:53 +0300 |
commit | c0b9c14ebd1524a1e2334e656f997ec680a18966 (patch) | |
tree | 4437aea2c4239279131a56adca1679f636683d29 | |
parent | 98638cd5e43611aac2193a5c2f80f72374040430 (diff) |
Add latest changes from gitlab-org/gitlab@master
126 files changed, 1084 insertions, 619 deletions
diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS index f555355bfc9..0d6bf442a92 100644 --- a/.gitlab/CODEOWNERS +++ b/.gitlab/CODEOWNERS @@ -278,7 +278,7 @@ Dangerfile /ee/app/assets/javascripts/vue_shared/components/customizable_dashboard/panels_base.vue /ee/app/assets/javascripts/product_analytics/ -^[Product Intelligence] @gitlab-org/analytics-section/product-intelligence/engineers +^[Analytics Instrumentation] @gitlab-org/analytics-section/product-intelligence/engineers /ee/lib/gitlab/usage_data_counters/ /ee/lib/ee/gitlab/usage_data.rb /lib/gitlab/usage_data.rb @@ -1238,9 +1238,7 @@ lib/gitlab/checks/** # the same section. /**/app/**/ci/ /**/lib/**/ci/ -/**/spec/**/ci/ /**/app/**/merge_trains/ -/**/spec/**/merge_trains/ /app/controllers/admin/jobs_controller.rb /app/controllers/admin/runner_projects_controller.rb /app/controllers/admin/runners_controller.rb @@ -1304,49 +1302,6 @@ lib/gitlab/checks/** /ee/app/workers/clear_shared_runners_minutes_worker.rb /ee/lib/api/merge_trains.rb /ee/lib/ee/api/entities/merge_train.rb -/ee/spec/requests/api/merge_trains_spec.rb -/spec/controllers/admin/jobs_controller_spec.rb -/spec/controllers/admin/runner_projects_controller_spec.rb -/spec/controllers/admin/runners_controller_spec.rb -/spec/controllers/projects/artifacts_controller_spec.rb -/spec/controllers/projects/jobs_controller_spec.rb -/spec/requests/runner_setup_controller_spec.rb -/spec/controllers/projects/pipeline_schedules_controller_spec.rb -/spec/requests/projects/pipelines_controller_spec.rb -/spec/controllers/projects/pipelines_settings_controller_spec.rb -/spec/controllers/projects/runners_controller_spec.rb -/spec/controllers/groups/variables_controller_spec.rb -/spec/models/commit_status_spec.rb -/spec/models/external_pull_request_spec.rb -/spec/models/generic_commit_status_spec.rb -/spec/models/namespace_ci_cd_setting_spec.rb -/spec/models/project_ci_cd_setting_spec.rb -/spec/presenters/commit_status_presenter_spec.rb -/spec/views/projects/jobs/ -/spec/views/projects/pipeline_schedules/ -/spec/views/projects/pipelines/ -/spec/views/projects/settings/ci_cd/ -/spec/workers/build_hooks_worker_spec.rb -/spec/workers/build_queue_worker_spec.rb -/spec/workers/build_success_worker_spec.rb -/spec/workers/ci_platform_metrics_update_cron_worker_spec.rb -/spec/workers/create_pipeline_worker_spec.rb -/spec/workers/expire_build_artifacts_worker_spec.rb -/spec/workers/pipeline_hooks_worker_spec.rb -/spec/workers/pipeline_metrics_worker_spec.rb -/spec/workers/pipeline_notification_worker_spec.rb -/spec/workers/pipeline_process_worker_spec.rb -/spec/workers/pipeline_schedule_worker_spec.rb -/spec/workers/run_pipeline_schedule_worker_spec.rb -/spec/workers/stuck_ci_jobs_worker_spec.rb -/spec/workers/update_external_pull_requests_worker_spec.rb -/ee/spec/finders/merge_trains_finder_spec.rb -/ee/spec/services/auto_merge/add_to_merge_train_when_pipeline_succeeds_service_spec.rb -/ee/spec/services/auto_merge/merge_train_service_spec.rb -/ee/spec/services/system_notes/merge_train_service_spec.rb -/ee/spec/controllers/projects/subscriptions_controller_spec.rb -/ee/spec/helpers/ee/projects/pipeline_helper_spec.rb -/ee/spec/workers/clear_shared_runners_minutes_worker_spec.rb # Overrides for Verify. These files below require approval from teams outside Verify. /**/lib/**/ci/reports/**/ @gitlab-org/maintainers/rails-backend @@ -1359,7 +1314,6 @@ lib/gitlab/checks/** /ee/lib/gitlab/ci/reports/security/ @gitlab-org/govern/threat-insights-backend-team # Verify frontend -/**/spec/frontend/**/ci/ @gitlab-org/ci-cd/verify/frontend /**/javascripts/ci/ @gitlab-org/ci-cd/verify/frontend /**/javascripts/pipelines/ @gitlab-org/ci-cd/verify/frontend /**/javascripts/jobs/ @gitlab-org/ci-cd/verify/frontend @@ -1403,15 +1357,6 @@ lib/gitlab/checks/** /ee/app/services/ci/runners/ @gitlab-org/ci-cd/runner-fleet-team/backend-approvers /ee/app/services/ee/ci/runners/ @gitlab-org/ci-cd/runner-fleet-team/backend-approvers /ee/app/workers/ci/runners/ @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/ee/spec/graphql/ee/mutations/ci/runner/ @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/ee/spec/graphql/resolvers/ci/runner*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/ee/spec/graphql/types/ci/runner*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/ee/spec/models/ee/ci/runner*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/ee/spec/policies/ee/ci/runner*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/ee/spec/requests/api/graphql/ci/runner*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/ee/spec/services/audit_events/*runner*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/ee/spec/services/ci/runners/ @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/ee/spec/workers/ci/runners/ @gitlab-org/ci-cd/runner-fleet-team/backend-approvers /lib/api/ci/helpers/runner.rb @gitlab-org/maintainers/cicd-verify @gitlab-org/ci-cd/runner-fleet-team/backend-approvers /lib/api/ci/runner*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers /lib/api/ci/runner.rb @gitlab-org/maintainers/cicd-verify @gitlab-org/ci-cd/runner-fleet-team/backend-approvers @@ -1420,31 +1365,6 @@ lib/gitlab/checks/** /lib/gitlab/ci/runner*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers /lib/gitlab/seeders/ci/runner/ @gitlab-org/ci-cd/runner-fleet-team/backend-approvers /lib/tasks/gitlab/seed/runner_fleet.rake @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/factories/ci/runner*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/finders/ci/runner*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/graphql/mutations/ci/runner/ @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/graphql/resolvers/ci/*runner*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/graphql/types/ci/runner*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/graphql/types/permission_types/ci/runner*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/lib/gitlab/audit/ci_runner_token_author_spec.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/lib/api/ci/helpers/runner_*_spec.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/lib/api/ci/helpers/runner_spec.rb @gitlab-org/maintainers/cicd-verify @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/lib/gitlab/ci/runner_*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/lib/gitlab/seeders/ci/runner/ @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/models/ci/runner*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/models/concerns/runners*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/models/preloaders/runner*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/requests/api/ci/runner/ @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/requests/api/graphql/ci/runner*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/requests/api/graphql/mutations/ci/runner/ @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/requests/api/graphql/mutations/ci/runners_registration_token/ @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/requests/api/graphql/project/runner*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/services/ci/runners/ @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/support/shared_contexts/graphql/resolvers/runner*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/support/shared_examples/features/runner*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/tasks/gitlab/seed/runner_fleet_*.rb @gitlab-org/ci-cd/runner-fleet-team/backend-approvers -/spec/workers/ci/runners/ @gitlab-org/ci-cd/runner-fleet-team/backend-approvers - # CI/CD templates require approval from specific owners. /lib/gitlab/ci/templates/ @gitlab-org/maintainers/cicd-templates /lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml @DylanGriffith @mayra-cabrera @tkuah diff --git a/.gitlab/ci/test-on-gdk/main.gitlab-ci.yml b/.gitlab/ci/test-on-gdk/main.gitlab-ci.yml index c17618ef724..6073098ef06 100644 --- a/.gitlab/ci/test-on-gdk/main.gitlab-ci.yml +++ b/.gitlab/ci/test-on-gdk/main.gitlab-ci.yml @@ -13,6 +13,7 @@ include: before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - sysctl -n -w fs.inotify.max_user_watches=524288 + - echo "SUITE_RAN=true" > suite_status.env variables: DOCKER_DRIVER: overlay2 DOCKER_HOST: tcp://docker:2375 diff --git a/.gitlab/merge_request_templates/Deprecations.md b/.gitlab/merge_request_templates/Deprecations.md index 841ef70d92a..9e02e047efa 100644 --- a/.gitlab/merge_request_templates/Deprecations.md +++ b/.gitlab/merge_request_templates/Deprecations.md @@ -106,4 +106,4 @@ If you have trouble running the Rake task, check the [troubleshooting steps](htt /label ~"release post" ~"release post item" ~"Technical Writing" ~"release post item::deprecation" /label ~"type::maintenance" -/label ~"maintenance::refactor" +/label ~"maintenance::removal" diff --git a/.gitlab/merge_request_templates/Removals.md b/.gitlab/merge_request_templates/Removals.md index e212893d10d..5b4c8473d1d 100644 --- a/.gitlab/merge_request_templates/Removals.md +++ b/.gitlab/merge_request_templates/Removals.md @@ -1,7 +1,7 @@ <!-- Set the correct label and milestone using autocomplete for guidance. Please @mention only the DRI(s) for each stage or group rather than an entire department. --> /label ~"release post" ~"release post item" ~"Technical Writing" ~devops:: ~group:: ~"release post item::removal" -/label ~"type::maintenance" +/label ~"type::maintenance" ~"maintenance::removal" /milestone % /assign `@EM/PM` (choose the DRI; remove backticks here, and below) diff --git a/.gitlab/secret-detection-ruleset.toml b/.gitlab/secret-detection-ruleset.toml index 5fcde57cad7..4a76fb22d00 100644 --- a/.gitlab/secret-detection-ruleset.toml +++ b/.gitlab/secret-detection-ruleset.toml @@ -4,3 +4,8 @@ [secrets.ruleset.identifier] type = "gitleaks_rule_id" value = "Password in URL" + [[secrets.passthrough]] + type = "file" + # note this must be gitleaks.toml + target = "gitleaks.toml" + value = "config/gitleaks.toml" diff --git a/.gitpod.yml b/.gitpod.yml index fd57b15ce38..684f9a8e5a2 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -51,6 +51,9 @@ tasks: [[ -f /workspace/gitpod_start_time.sh ]] && source /workspace/gitpod_start_time.sh SECONDS=0 cd /workspace/gitlab-development-kit + make gitlab-update + make gitlab-shell-update + make gitlab-workhorse-update # update GDK if [ "$GITLAB_UPDATE_GDK" == true ]; then echo "$(date) – Updating GDK" | tee -a /workspace/startup.log diff --git a/.rubocop_todo/layout/argument_alignment.yml b/.rubocop_todo/layout/argument_alignment.yml index c9911bfe433..359b6838873 100644 --- a/.rubocop_todo/layout/argument_alignment.yml +++ b/.rubocop_todo/layout/argument_alignment.yml @@ -2420,17 +2420,6 @@ Layout/ArgumentAlignment: - 'spec/support/shared_examples/integrations/integration_settings_form.rb' - 'spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb' - 'spec/support/shared_examples/lib/gitlab/database/background_migration_job_shared_examples.rb' - - 'spec/support/shared_examples/lib/gitlab/gitaly_client_shared_examples.rb' - - 'spec/support/shared_examples/lib/gitlab/project_search_results_shared_examples.rb' - - 'spec/support/shared_examples/lib/sentry/client_shared_examples.rb' - - 'spec/support/shared_examples/models/chat_integration_shared_examples.rb' - - 'spec/support/shared_examples/models/clusters/prometheus_client_shared.rb' - - 'spec/support/shared_examples/models/diff_note_after_commit_shared_examples.rb' - - 'spec/support/shared_examples/models/member_shared_examples.rb' - - 'spec/support/shared_examples/observability/csp_shared_examples.rb' - - 'spec/support/shared_examples/projects/container_repository/cleanup_tags_service_shared_examples.rb' - - 'spec/support/shared_examples/quick_actions/issuable/max_issuable_examples.rb' - - 'spec/support/shared_examples/views/pipeline_status_changes_email.rb' - 'spec/tasks/cache/clear/redis_spec.rb' - 'spec/tasks/gitlab/cleanup_rake_spec.rb' - 'spec/tasks/gitlab/db/decomposition/rollback/bump_ci_sequences_rake_spec.rb' diff --git a/.rubocop_todo/layout/empty_line_after_magic_comment.yml b/.rubocop_todo/layout/empty_line_after_magic_comment.yml index dbd7c038482..93302cebaa1 100644 --- a/.rubocop_todo/layout/empty_line_after_magic_comment.yml +++ b/.rubocop_todo/layout/empty_line_after_magic_comment.yml @@ -823,6 +823,6 @@ Layout/EmptyLineAfterMagicComment: - 'spec/workers/partition_creation_worker_spec.rb' - 'spec/workers/projects/delete_branch_worker_spec.rb' - 'spec/workers/web_hook_worker_spec.rb' - - 'tooling/danger/product_intelligence.rb' + - 'tooling/danger/analytics_instrumentation.rb' - 'tooling/danger/suggestor.rb' - 'tooling/docs/deprecation_handling.rb' diff --git a/.rubocop_todo/layout/line_length.yml b/.rubocop_todo/layout/line_length.yml index abca9baa4cd..339edfce783 100644 --- a/.rubocop_todo/layout/line_length.yml +++ b/.rubocop_todo/layout/line_length.yml @@ -5214,7 +5214,7 @@ Layout/LineLength: - 'spec/tasks/migrate/schema_check_rake_spec.rb' - 'spec/tooling/danger/datateam_spec.rb' - 'spec/tooling/danger/feature_flag_spec.rb' - - 'spec/tooling/danger/product_intelligence_spec.rb' + - 'spec/tooling/danger/analytics_instrumentation_spec.rb' - 'spec/tooling/danger/project_helper_spec.rb' - 'spec/tooling/danger/sidekiq_queues_spec.rb' - 'spec/tooling/lib/tooling/kubernetes_client_spec.rb' @@ -5329,7 +5329,7 @@ Layout/LineLength: - 'spec/workers/todos_destroyer/confidential_issue_worker_spec.rb' - 'spec/workers/update_head_pipeline_for_merge_request_worker_spec.rb' - 'spec/workers/users/deactivate_dormant_users_worker_spec.rb' - - 'tooling/danger/product_intelligence.rb' + - 'tooling/danger/analytics_instrumentation.rb' - 'tooling/danger/project_helper.rb' - 'tooling/danger/specs.rb' - 'tooling/graphql/docs/helper.rb' diff --git a/.rubocop_todo/lint/missing_cop_enable_directive.yml b/.rubocop_todo/lint/missing_cop_enable_directive.yml index 5a5d4d752d2..8cfecb87f2b 100644 --- a/.rubocop_todo/lint/missing_cop_enable_directive.yml +++ b/.rubocop_todo/lint/missing_cop_enable_directive.yml @@ -183,4 +183,4 @@ Lint/MissingCopEnableDirective: - 'spec/lib/gitlab/sidekiq_middleware/size_limiter/server_spec.rb' - 'spec/support/capybara.rb' - 'spec/support/google_api/cloud_platform_helpers.rb' - - 'tooling/danger/product_intelligence.rb' + - 'tooling/danger/analytics_instrumentation.rb' diff --git a/.rubocop_todo/lint/redundant_cop_disable_directive.yml b/.rubocop_todo/lint/redundant_cop_disable_directive.yml index 2723a4e6190..6274aecec04 100644 --- a/.rubocop_todo/lint/redundant_cop_disable_directive.yml +++ b/.rubocop_todo/lint/redundant_cop_disable_directive.yml @@ -317,7 +317,7 @@ Lint/RedundantCopDisableDirective: - 'spec/support/shared_examples/models/packages/debian/distribution_key_shared_examples.rb' - 'spec/support/shared_examples/requests/api/rubygems_packages_shared_examples.rb' - 'spec/uploaders/packages/composer/cache_uploader_spec.rb' - - 'tooling/danger/product_intelligence.rb' + - 'tooling/danger/analytics_instrumentation.rb' - 'tooling/danger/stable_branch.rb' - 'tooling/danger/suggestor.rb' - 'tooling/lib/tooling/helm3_client.rb' diff --git a/.rubocop_todo/rspec/missing_feature_category.yml b/.rubocop_todo/rspec/missing_feature_category.yml index 1c887978de8..28c571463ec 100644 --- a/.rubocop_todo/rspec/missing_feature_category.yml +++ b/.rubocop_todo/rspec/missing_feature_category.yml @@ -495,7 +495,6 @@ RSpec/MissingFeatureCategory: - 'ee/spec/helpers/ee/labels_helper_spec.rb' - 'ee/spec/helpers/ee/lock_helper_spec.rb' - 'ee/spec/helpers/ee/namespace_user_cap_reached_alert_helper_spec.rb' - - 'ee/spec/helpers/ee/namespaces_helper_spec.rb' - 'ee/spec/helpers/ee/operations_helper_spec.rb' - 'ee/spec/helpers/ee/personal_access_tokens_helper_spec.rb' - 'ee/spec/helpers/ee/profiles_helper_spec.rb' @@ -2625,7 +2624,6 @@ RSpec/MissingFeatureCategory: - 'spec/helpers/markup_helper_spec.rb' - 'spec/helpers/members_helper_spec.rb' - 'spec/helpers/milestones_helper_spec.rb' - - 'spec/helpers/namespaces_helper_spec.rb' - 'spec/helpers/nav/top_nav_helper_spec.rb' - 'spec/helpers/notifications_helper_spec.rb' - 'spec/helpers/notify_helper_spec.rb' @@ -5714,7 +5712,7 @@ RSpec/MissingFeatureCategory: - 'spec/tooling/danger/customer_success_spec.rb' - 'spec/tooling/danger/datateam_spec.rb' - 'spec/tooling/danger/feature_flag_spec.rb' - - 'spec/tooling/danger/product_intelligence_spec.rb' + - 'spec/tooling/danger/analytics_instrumentation_spec.rb' - 'spec/tooling/danger/project_helper_spec.rb' - 'spec/tooling/danger/sidekiq_queues_spec.rb' - 'spec/tooling/docs/deprecation_handling_spec.rb' diff --git a/.rubocop_todo/style/if_unless_modifier.yml b/.rubocop_todo/style/if_unless_modifier.yml index 7baf5978326..78e27951786 100644 --- a/.rubocop_todo/style/if_unless_modifier.yml +++ b/.rubocop_todo/style/if_unless_modifier.yml @@ -1074,7 +1074,7 @@ Style/IfUnlessModifier: - 'spec/support/webmock.rb' - 'spec/views/profiles/keys/_key.html.haml_spec.rb' - 'spec/workers/analytics/usage_trends/counter_job_worker_spec.rb' - - 'tooling/danger/product_intelligence.rb' + - 'tooling/danger/analytics_instrumentation.rb' - 'tooling/lib/tooling/find_codeowners.rb' - 'tooling/lib/tooling/image.rb' - 'tooling/lib/tooling/test_map_packer.rb' diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION index 0566059822f..7befd5a0d5b 100644 --- a/GITALY_SERVER_VERSION +++ b/GITALY_SERVER_VERSION @@ -1 +1 @@ -2a5e9db06122c8a033bd4989cf99c46604cd2949 +cf82dc98409a959201de728d2024e80418ea4c2a diff --git a/app/assets/javascripts/ci/pipeline_editor/components/editor/ci_editor_header.vue b/app/assets/javascripts/ci/pipeline_editor/components/editor/ci_editor_header.vue index b78224e93b0..66957365261 100644 --- a/app/assets/javascripts/ci/pipeline_editor/components/editor/ci_editor_header.vue +++ b/app/assets/javascripts/ci/pipeline_editor/components/editor/ci_editor_header.vue @@ -10,6 +10,7 @@ export default { browseTemplates: __('Browse templates'), help: __('Help'), jobAssistant: s__('JobAssistant|Job assistant'), + aiAssistant: s__('PipelinesAiAssistant|Ai assistant'), }, TEMPLATE_REPOSITORY_URL, components: { @@ -25,6 +26,10 @@ export default { type: Boolean, required: true, }, + showAiAssistantDrawer: { + type: Boolean, + required: true, + }, }, methods: { toggleDrawer() { @@ -40,6 +45,11 @@ export default { this.showJobAssistantDrawer ? 'close-job-assistant-drawer' : 'open-job-assistant-drawer', ); }, + toggleAiAssistantDrawer() { + this.$emit( + this.showAiAssistantDrawer ? 'close-ai-assistant-drawer' : 'open-ai-assistant-drawer', + ); + }, trackHelpDrawerClick() { const { label, actions } = pipelineEditorTrackingOptions; this.track(actions.openHelpDrawer, { label }); @@ -85,5 +95,15 @@ export default { > {{ $options.i18n.jobAssistant }} </gl-button> + <gl-button + v-if="glFeatures.aiCiConfigGenerator" + icon="bulb" + size="small" + data-testid="ai-assistant-drawer-toggle" + data-qa-selector="ai_assistant_drawer_toggle" + @click="toggleAiAssistantDrawer" + > + {{ $options.i18n.aiAssistant }} + </gl-button> </div> </template> diff --git a/app/assets/javascripts/ci/pipeline_editor/components/pipeline_editor_tabs.vue b/app/assets/javascripts/ci/pipeline_editor/components/pipeline_editor_tabs.vue index e965ac12aa5..403793a255a 100644 --- a/app/assets/javascripts/ci/pipeline_editor/components/pipeline_editor_tabs.vue +++ b/app/assets/javascripts/ci/pipeline_editor/components/pipeline_editor_tabs.vue @@ -99,6 +99,10 @@ export default { type: Boolean, required: true, }, + showAiAssistantDrawer: { + type: Boolean, + required: true, + }, }, apollo: { appStatus: { @@ -194,6 +198,7 @@ export default { <ci-editor-header :show-drawer="showDrawer" :show-job-assistant-drawer="showJobAssistantDrawer" + :show-ai-assistant-drawer="showAiAssistantDrawer" v-on="$listeners" /> <text-editor :commit-sha="commitSha" :value="ciFileContent" v-on="$listeners" /> diff --git a/app/assets/javascripts/ci/pipeline_editor/pipeline_editor_home.vue b/app/assets/javascripts/ci/pipeline_editor/pipeline_editor_home.vue index 1329042ee4c..647e33333ce 100644 --- a/app/assets/javascripts/ci/pipeline_editor/pipeline_editor_home.vue +++ b/app/assets/javascripts/ci/pipeline_editor/pipeline_editor_home.vue @@ -1,6 +1,7 @@ <script> import { GlModal } from '@gitlab/ui'; import { __ } from '~/locale'; +import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import CommitSection from './components/commit/commit_section.vue'; import PipelineEditorDrawer from './components/drawer/pipeline_editor_drawer.vue'; import JobAssistantDrawer from './components/job_assistant_drawer/job_assistant_drawer.vue'; @@ -10,6 +11,9 @@ import PipelineEditorHeader from './components/header/pipeline_editor_header.vue import PipelineEditorTabs from './components/pipeline_editor_tabs.vue'; import { CREATE_TAB, FILE_TREE_DISPLAY_KEY } from './constants'; +const AiAssistantDrawer = () => + import('ee_component/ci/pipeline_editor/components/ai_assistant_drawer.vue'); + export default { commitSectionRef: 'commitSectionRef', modal: { @@ -30,11 +34,13 @@ export default { GlModal, PipelineEditorDrawer, JobAssistantDrawer, + AiAssistantDrawer, PipelineEditorFileNav, PipelineEditorFileTree, PipelineEditorHeader, PipelineEditorTabs, }, + mixins: [glFeatureFlagMixin()], props: { ciConfigData: { type: Object, @@ -66,8 +72,10 @@ export default { shouldLoadNewBranch: false, showDrawer: false, showJobAssistantDrawer: false, + showAiAssistantDrawer: false, drawerIndex: 200, jobAssistantIndex: 200, + aiAssistantIndex: 200, showFileTree: false, showSwitchBranchModal: false, }; @@ -93,6 +101,13 @@ export default { closeJobAssistantDrawer() { this.showJobAssistantDrawer = false; }, + closeAiAssistantDrawer() { + this.showAiAssistantDrawer = false; + }, + openAiAssistantDrawer() { + this.showAiAssistantDrawer = true; + this.aiAssistantIndex = this.drawerIndex + 1; + }, handleConfirmSwitchBranch() { this.showSwitchBranchModal = true; }, @@ -167,11 +182,14 @@ export default { :is-new-ci-config-file="isNewCiConfigFile" :show-drawer="showDrawer" :show-job-assistant-drawer="showJobAssistantDrawer" + :show-ai-assistant-drawer="showAiAssistantDrawer" v-on="$listeners" @open-drawer="openDrawer" @close-drawer="closeDrawer" @open-job-assistant-drawer="openJobAssistantDrawer" @close-job-assistant-drawer="closeJobAssistantDrawer" + @open-ai-assistant-drawer="openAiAssistantDrawer" + @close-ai-assistant-drawer="closeAiAssistantDrawer" @set-current-tab="setCurrentTab" @walkthrough-popover-cta-clicked="setScrollToCommitForm" /> @@ -202,5 +220,11 @@ export default { v-on="$listeners" @close-job-assistant-drawer="closeJobAssistantDrawer" /> + <ai-assistant-drawer + v-if="glFeatures.aiCiConfigGenerator" + :is-visible="showAiAssistantDrawer" + :z-index="aiAssistantIndex" + @close-ai-assistant-drawer="closeAiAssistantDrawer" + /> </div> </template> diff --git a/app/assets/javascripts/ci/runner/components/cells/runner_summary_cell.vue b/app/assets/javascripts/ci/runner/components/cells/runner_summary_cell.vue index 24c1b4f5c3b..f24fb5575ae 100644 --- a/app/assets/javascripts/ci/runner/components/cells/runner_summary_cell.vue +++ b/app/assets/javascripts/ci/runner/components/cells/runner_summary_cell.vue @@ -71,7 +71,7 @@ export default { <template> <div> - <div> + <div class="gl-mb-3"> <slot :runner="runner" name="runner-name"> <runner-name :runner="runner" /> </slot> @@ -84,22 +84,23 @@ export default { <runner-type-badge :type="runner.runnerType" size="sm" class="gl-vertical-align-middle" /> </div> - <div class="gl-ml-auto gl-display-inline-flex gl-max-w-full gl-py-2"> - <div class="gl-flex-shrink-0"> - <runner-upgrade-status-icon :runner="runner" /> - <gl-sprintf v-if="runner.version" :message="$options.i18n.I18N_VERSION_LABEL"> - <template #version>{{ runner.version }}</template> - </gl-sprintf> - </div> - <div class="gl-text-secondary gl-mx-2" aria-hidden="true">·</div> + <div class="gl-mb-3 gl-ml-auto gl-display-inline-flex gl-max-w-full"> + <template v-if="runner.version"> + <div class="gl-flex-shrink-0"> + <runner-upgrade-status-icon :runner="runner" /> + <gl-sprintf :message="$options.i18n.I18N_VERSION_LABEL"> + <template #version>{{ runner.version }}</template> + </gl-sprintf> + </div> + <div class="gl-text-secondary gl-mx-2" aria-hidden="true">·</div> + </template> <tooltip-on-truncate - v-if="runner.description" class="gl-text-truncate gl-display-block" + :class="{ 'gl-text-secondary': !runner.description }" :title="runner.description" > - {{ runner.description }} + {{ runner.description || $options.i18n.I18N_NO_DESCRIPTION }} </tooltip-on-truncate> - <span v-else class="gl-text-secondary">{{ $options.i18n.I18N_NO_DESCRIPTION }}</span> </div> <div> @@ -148,6 +149,6 @@ export default { </runner-summary-field> </div> - <runner-tags class="gl-display-block gl-pt-2" :tag-list="runner.tagList" size="sm" /> + <runner-tags class="gl-display-block" :tag-list="runner.tagList" size="sm" /> </div> </template> diff --git a/app/assets/javascripts/ci/runner/components/cells/runner_summary_field.vue b/app/assets/javascripts/ci/runner/components/cells/runner_summary_field.vue index 20681873436..742259ee491 100644 --- a/app/assets/javascripts/ci/runner/components/cells/runner_summary_field.vue +++ b/app/assets/javascripts/ci/runner/components/cells/runner_summary_field.vue @@ -24,7 +24,7 @@ export default { </script> <template> - <div v-gl-tooltip="tooltip" class="gl-display-inline-block gl-text-secondary gl-my-2 gl-mr-4"> + <div v-gl-tooltip="tooltip" class="gl-display-inline-block gl-text-secondary gl-mb-3 gl-mr-4"> <gl-icon v-if="icon" :name="icon" /> <!-- display tooltip as a label for screen readers --> <span class="gl-sr-only">{{ tooltip }}</span> diff --git a/app/assets/javascripts/commit/pipelines/pipelines_table.vue b/app/assets/javascripts/commit/pipelines/pipelines_table.vue index b0a1c46e619..f2dac15a99e 100644 --- a/app/assets/javascripts/commit/pipelines/pipelines_table.vue +++ b/app/assets/javascripts/commit/pipelines/pipelines_table.vue @@ -234,6 +234,7 @@ export default { <template v-else-if="shouldRenderEmptyState"> <gl-empty-state :svg-path="emptyStateSvgPath" + :svg-height="150" :title="$options.i18n.emptyStateTitle" data-testid="pipeline-empty-state" > diff --git a/app/assets/javascripts/environments/components/empty_state.vue b/app/assets/javascripts/environments/components/empty_state.vue index e40c37b5095..3ac32f0d045 100644 --- a/app/assets/javascripts/environments/components/empty_state.vue +++ b/app/assets/javascripts/environments/components/empty_state.vue @@ -1,12 +1,13 @@ <script> -import { GlEmptyState, GlLink } from '@gitlab/ui'; +import { GlButton, GlEmptyState, GlLink, GlSprintf } from '@gitlab/ui'; import { s__ } from '~/locale'; -import { ENVIRONMENTS_SCOPE } from '../constants'; export default { components: { + GlButton, GlEmptyState, GlLink, + GlSprintf, }, inject: ['newEnvironmentPath'], props: { @@ -14,10 +15,6 @@ export default { type: String, required: true, }, - scope: { - type: String, - required: true, - }, hasTerm: { type: Boolean, required: false, @@ -26,40 +23,40 @@ export default { }, computed: { title() { - return this.hasTerm - ? this.$options.i18n.searchingTitle - : this.$options.i18n.title[this.scope]; + return this.hasTerm ? this.$options.i18n.searchingTitle : this.$options.i18n.title; }, content() { return this.hasTerm ? this.$options.i18n.searchingContent : this.$options.i18n.content; }, - buttonText() { - return this.hasTerm ? this.$options.i18n.newEnvironmentButtonLabel : ''; - }, }, i18n: { - title: { - [ENVIRONMENTS_SCOPE.AVAILABLE]: s__("Environments|You don't have any environments."), - [ENVIRONMENTS_SCOPE.STOPPED]: s__("Environments|You don't have any stopped environments."), - }, - content: s__( - 'Environments|Environments are places where code gets deployed, such as staging or production.', - ), searchingTitle: s__('Environments|No results found'), + title: s__('Environments|Get started with environments'), searchingContent: s__('Environments|Edit your search and try again'), - link: s__('Environments|How do I create an environment?'), - newEnvironmentButtonLabel: s__('Environments|New environment'), + content: s__( + 'Environments|Environments are places where code gets deployed, such as staging or production. You can create an environment in the UI or in your .gitlab-ci.yml file. You can also enable review apps, which assist with providing an environment to showcase product changes. %{linkStart}Learn more%{linkEnd} about environments.', + ), + newEnvironmentButtonLabel: s__('Environments|Create an environment'), + enablingReviewButtonLabel: s__('Environments|Enable review apps'), }, }; </script> <template> - <gl-empty-state :primary-button-text="buttonText" :primary-button-link="newEnvironmentPath"> - <template #title> - <h4>{{ title }}</h4> - </template> + <gl-empty-state class="gl-layout-w-limited" :title="title"> <template #description> - <p>{{ content }}</p> - <gl-link v-if="!hasTerm" :href="helpPath">{{ $options.i18n.link }}</gl-link> + <gl-sprintf :message="content"> + <template #link="{ content: contentToDisplay }"> + <gl-link :href="helpPath">{{ contentToDisplay }}</gl-link> + </template> + </gl-sprintf> + </template> + <template v-if="!hasTerm" #actions> + <gl-button :href="newEnvironmentPath" variant="confirm"> + {{ $options.i18n.newEnvironmentButtonLabel }} + </gl-button> + <gl-button @click="$emit('enable-review')"> + {{ $options.i18n.enablingReviewButtonLabel }} + </gl-button> </template> </gl-empty-state> </template> diff --git a/app/assets/javascripts/environments/components/environments_app.vue b/app/assets/javascripts/environments/components/environments_app.vue index b2a69cdb6c6..a95b5b273f7 100644 --- a/app/assets/javascripts/environments/components/environments_app.vue +++ b/app/assets/javascripts/environments/components/environments_app.vue @@ -76,7 +76,7 @@ export default { inject: ['newEnvironmentPath', 'canCreateEnvironment', 'helpPagePath'], i18n: { newEnvironmentButtonLabel: s__('Environments|New environment'), - reviewAppButtonLabel: s__('Environments|Enable review app'), + reviewAppButtonLabel: s__('Environments|Enable review apps'), cleanUpEnvsButtonLabel: s__('Environments|Clean up environments'), available: __('Available'), stopped: __('Stopped'), @@ -124,12 +124,24 @@ export default { hasEnvironments() { return this.environments.length > 0 || this.folders.length > 0; }, + showEmptyState() { + return !this.$apollo.queries.environmentApp.loading && !this.hasEnvironments; + }, hasSearch() { return Boolean(this.search); }, availableCount() { return this.environmentApp?.availableCount; }, + stoppedCount() { + return this.environmentApp?.stoppedCount; + }, + hasAnyEnvironment() { + return this.availableCount > 0 || this.stoppedCount > 0; + }, + showContent() { + return this.hasAnyEnvironment || this.hasSearch; + }, addEnvironment() { if (!this.canCreateEnvironment) { return null; @@ -170,9 +182,6 @@ export default { }, }; }, - stoppedCount() { - return this.environmentApp?.stoppedCount; - }, totalItems() { return this.pageInfo?.total; }, @@ -253,45 +262,45 @@ export default { <stop-environment-modal :environment="environmentToStop" graphql /> <confirm-rollback-modal :environment="environmentToRollback" graphql /> <canary-update-modal :environment="environmentToChangeCanary" :weight="weight" /> - <gl-tabs - :action-secondary="openReviewAppModal" - :action-primary="openCleanUpEnvsModal" - :action-tertiary="addEnvironment" - sync-active-tab-with-query-params - query-param-name="scope" - @secondary="showReviewAppModal" - @primary="showCleanUpEnvsModal" - > - <gl-tab - :query-param-value="$options.ENVIRONMENTS_SCOPE.AVAILABLE" - @click="setScope($options.ENVIRONMENTS_SCOPE.AVAILABLE)" + <template v-if="showContent"> + <gl-tabs + :action-secondary="openReviewAppModal" + :action-primary="openCleanUpEnvsModal" + :action-tertiary="addEnvironment" + sync-active-tab-with-query-params + query-param-name="scope" + @secondary="showReviewAppModal" + @primary="showCleanUpEnvsModal" > - <template #title> - <span>{{ $options.i18n.available }}</span> - <gl-badge size="sm" class="gl-tab-counter-badge"> - {{ availableCount }} - </gl-badge> - </template> - </gl-tab> - <gl-tab - :query-param-value="$options.ENVIRONMENTS_SCOPE.STOPPED" - @click="setScope($options.ENVIRONMENTS_SCOPE.STOPPED)" - > - <template #title> - <span>{{ $options.i18n.stopped }}</span> - <gl-badge size="sm" class="gl-tab-counter-badge"> - {{ stoppedCount }} - </gl-badge> - </template> - </gl-tab> - </gl-tabs> - <gl-search-box-by-type - class="gl-mb-4" - :value="search" - :placeholder="$options.i18n.searchPlaceholder" - @input="setSearch" - /> - <template v-if="hasEnvironments"> + <gl-tab + :query-param-value="$options.ENVIRONMENTS_SCOPE.AVAILABLE" + @click="setScope($options.ENVIRONMENTS_SCOPE.AVAILABLE)" + > + <template #title> + <span>{{ $options.i18n.available }}</span> + <gl-badge size="sm" class="gl-tab-counter-badge"> + {{ availableCount }} + </gl-badge> + </template> + </gl-tab> + <gl-tab + :query-param-value="$options.ENVIRONMENTS_SCOPE.STOPPED" + @click="setScope($options.ENVIRONMENTS_SCOPE.STOPPED)" + > + <template #title> + <span>{{ $options.i18n.stopped }}</span> + <gl-badge size="sm" class="gl-tab-counter-badge"> + {{ stoppedCount }} + </gl-badge> + </template> + </gl-tab> + </gl-tabs> + <gl-search-box-by-type + class="gl-mb-4" + :value="search" + :placeholder="$options.i18n.searchPlaceholder" + @input="setSearch" + /> <environment-folder v-for="folder in folders" :key="folder.name" @@ -309,10 +318,10 @@ export default { /> </template> <empty-state - v-else-if="!$apollo.queries.environmentApp.loading" + v-if="showEmptyState" :help-path="helpPagePath" - :scope="scope" :has-term="hasSearch" + @enable-review="showReviewAppModal" /> <gl-pagination align="center" diff --git a/app/assets/javascripts/environments/constants.js b/app/assets/javascripts/environments/constants.js index e675a73ba7d..448cee530f6 100644 --- a/app/assets/javascripts/environments/constants.js +++ b/app/assets/javascripts/environments/constants.js @@ -51,7 +51,7 @@ export const ENVIRONMENT_COUNT_BY_SCOPE = { }; export const REVIEW_APP_MODAL_I18N = { - title: s__('ReviewApp|Enable Review App'), + title: s__('Environments|Enable Review Apps'), intro: s__( 'EnableReviewApp|Review apps are dynamic environments that you can use to provide a live preview of changes made in a feature branch.', ), diff --git a/app/assets/javascripts/google_tag_manager/index.js b/app/assets/javascripts/google_tag_manager/index.js index 98c9db1fc9a..0a1a7a74d21 100644 --- a/app/assets/javascripts/google_tag_manager/index.js +++ b/app/assets/javascripts/google_tag_manager/index.js @@ -123,17 +123,6 @@ export const trackSaasTrialSubmit = () => { pushEvent('saasTrialSubmit'); }; -export const trackSaasTrialSkip = () => { - if (!isSupported()) { - return; - } - - const skipLink = document.querySelector('.js-skip-trial'); - skipLink.addEventListener('click', () => { - pushEvent('saasTrialSkip'); - }); -}; - export const trackSaasTrialGroup = () => { if (!isSupported()) { return; diff --git a/app/assets/javascripts/ide/components/pipelines/empty_state.vue b/app/assets/javascripts/ide/components/pipelines/empty_state.vue index 194deb2ece0..25e1698e3f4 100644 --- a/app/assets/javascripts/ide/components/pipelines/empty_state.vue +++ b/app/assets/javascripts/ide/components/pipelines/empty_state.vue @@ -28,6 +28,7 @@ export default { <gl-empty-state :title="$options.i18n.title" :svg-path="pipelinesEmptyStateSvgPath" + :svg-height="150" :description="$options.i18n.description" :primary-button-text="$options.i18n.primaryButtonText" :primary-button-link="ciHelpPagePath" diff --git a/app/assets/javascripts/lib/utils/url_utility.js b/app/assets/javascripts/lib/utils/url_utility.js index f33484f4192..7bf34dbaa2e 100644 --- a/app/assets/javascripts/lib/utils/url_utility.js +++ b/app/assets/javascripts/lib/utils/url_utility.js @@ -5,8 +5,11 @@ const PATH_SEPARATOR_LEADING_REGEX = new RegExp(`^${PATH_SEPARATOR}+`); const PATH_SEPARATOR_ENDING_REGEX = new RegExp(`${PATH_SEPARATOR}+$`); const SHA_REGEX = /[\da-f]{40}/gi; +// GitLab default domain (override in jh) +export const DOMAIN = 'gitlab.com'; + // About GitLab default host (overwrite in jh) -export const PROMO_HOST = 'about.gitlab.com'; +export const PROMO_HOST = `about.${DOMAIN}`; // about.gitlab.com // About Gitlab default url (overwrite in jh) export const PROMO_URL = `https://${PROMO_HOST}`; diff --git a/app/assets/javascripts/notes/components/discussion_notes_replies_wrapper.vue b/app/assets/javascripts/notes/components/discussion_notes_replies_wrapper.vue index a0d2b47c89c..1dd07fe90d2 100644 --- a/app/assets/javascripts/notes/components/discussion_notes_replies_wrapper.vue +++ b/app/assets/javascripts/notes/components/discussion_notes_replies_wrapper.vue @@ -21,7 +21,7 @@ export default { 'li', { class: - 'discussion-collapsible gl-border-solid gl-border-gray-100 gl-border-1 gl-rounded-base clearfix gl-pt-5', + 'discussion-collapsible gl-border-solid gl-border-gray-100 gl-border-1 gl-rounded-base clearfix', }, [h('ul', { class: 'notes' }, children)], ); diff --git a/app/assets/javascripts/super_sidebar/components/help_center.vue b/app/assets/javascripts/super_sidebar/components/help_center.vue index caefeaa5eb4..1fffbb05d03 100644 --- a/app/assets/javascripts/super_sidebar/components/help_center.vue +++ b/app/assets/javascripts/super_sidebar/components/help_center.vue @@ -8,7 +8,7 @@ import { } from '@gitlab/ui'; import GitlabVersionCheckBadge from '~/gitlab_version_check/components/gitlab_version_check_badge.vue'; import { helpPagePath } from '~/helpers/help_page_helper'; -import { PROMO_URL } from 'jh_else_ce/lib/utils/url_utility'; +import { DOMAIN, PROMO_URL } from 'jh_else_ce/lib/utils/url_utility'; import { __, s__ } from '~/locale'; import { STORAGE_KEY } from '~/whats_new/utils/notification'; import Tracking from '~/tracking'; @@ -93,7 +93,7 @@ export default { }, { text: this.$options.i18n.docs, - href: 'https://docs.gitlab.com', + href: `https://docs.${DOMAIN}`, extraAttrs: { ...this.trackingAttrs('gitlab_documentation'), }, @@ -107,7 +107,7 @@ export default { }, { text: this.$options.i18n.forum, - href: 'https://forum.gitlab.com/', + href: `https://forum.${DOMAIN}/`, extraAttrs: { ...this.trackingAttrs('community_forum'), }, @@ -121,7 +121,7 @@ export default { }, { text: this.$options.i18n.feedback, - href: 'https://about.gitlab.com/submit-feedback', + href: `${PROMO_URL}/submit-feedback`, extraAttrs: { ...this.trackingAttrs('submit_feedback'), }, diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/nothing_to_merge.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/nothing_to_merge.vue index e6a0b5fd8be..30cd9fa752f 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/states/nothing_to_merge.vue +++ b/app/assets/javascripts/vue_merge_request_widget/components/states/nothing_to_merge.vue @@ -1,6 +1,6 @@ <script> import { GlButton, GlSprintf, GlLink } from '@gitlab/ui'; -import EMPTY_STATE_SVG_URL from '@gitlab/svgs/dist/illustrations/merge_requests.svg?url'; +import EMPTY_STATE_SVG_URL from '@gitlab/svgs/dist/illustrations/empty-state/empty-merge-requests-md.svg?url'; import api from '~/api'; import { helpPagePath } from '~/helpers/help_page_helper'; @@ -31,14 +31,14 @@ export default { <div class="mr-widget-body mr-widget-empty-state"> <div class="row"> <div - class="col-md-5 order-md-last col-12 text-center d-flex justify-content-center align-items-center svg-content svg-250 pb-0" + class="col-md-3 col-12 text-center d-flex justify-content-center align-items-center svg-content svg-150 pb-0 pt-0" > <img :alt="s__('mrWidgetNothingToMerge|This merge request contains no changes.')" :src="$options.EMPTY_STATE_SVG_URL" /> </div> - <div class="text col-md-7 order-md-first col-12"> + <div class="text col-md-9 col-12"> <p class="highlight"> {{ s__('mrWidgetNothingToMerge|This merge request contains no changes.') }} </p> diff --git a/app/controllers/jira_connect/branches_controller.rb b/app/controllers/jira_connect/branches_controller.rb index 12ea6560e3a..4c1b0d2b208 100644 --- a/app/controllers/jira_connect/branches_controller.rb +++ b/app/controllers/jira_connect/branches_controller.rb @@ -23,7 +23,8 @@ class JiraConnect::BranchesController < ApplicationController def new_branch_data { initial_branch_name: initial_branch_name, - success_state_svg_path: ActionController::Base.helpers.image_path('illustrations/merge_requests.svg') + success_state_svg_path: + ActionController::Base.helpers.image_path('illustrations/empty-state/empty-merge-requests-md.svg') } end end diff --git a/app/controllers/projects/ci/pipeline_editor_controller.rb b/app/controllers/projects/ci/pipeline_editor_controller.rb index 45584f3048a..d874c60daec 100644 --- a/app/controllers/projects/ci/pipeline_editor_controller.rb +++ b/app/controllers/projects/ci/pipeline_editor_controller.rb @@ -4,6 +4,7 @@ class Projects::Ci::PipelineEditorController < Projects::ApplicationController before_action :check_can_collaborate! before_action do push_frontend_feature_flag(:ci_job_assistant_drawer, @project) + push_frontend_feature_flag(:ai_ci_config_generator, @project) end feature_category :pipeline_composition diff --git a/app/controllers/projects/google_cloud/configuration_controller.rb b/app/controllers/projects/google_cloud/configuration_controller.rb index e109ab95d39..d35b2d54c53 100644 --- a/app/controllers/projects/google_cloud/configuration_controller.rb +++ b/app/controllers/projects/google_cloud/configuration_controller.rb @@ -10,7 +10,8 @@ module Projects databasesUrl: project_google_cloud_databases_path(project), serviceAccounts: ::GoogleCloud::ServiceAccountsService.new(project).find_for_project, createServiceAccountUrl: project_google_cloud_service_accounts_path(project), - emptyIllustrationUrl: ActionController::Base.helpers.image_path('illustrations/pipelines_empty.svg'), + emptyIllustrationUrl: + ActionController::Base.helpers.image_path('illustrations/empty-state/empty-pipeline-md.svg'), configureGcpRegionsUrl: project_google_cloud_gcp_regions_path(project), gcpRegions: gcp_regions, revokeOauthUrl: revoke_oauth_url diff --git a/app/controllers/projects/google_cloud/databases_controller.rb b/app/controllers/projects/google_cloud/databases_controller.rb index 9c20f10809c..ea79efd9f4f 100644 --- a/app/controllers/projects/google_cloud/databases_controller.rb +++ b/app/controllers/projects/google_cloud/databases_controller.rb @@ -15,7 +15,8 @@ module Projects cloudsqlMysqlUrl: new_project_google_cloud_database_path(project, :mysql), cloudsqlSqlserverUrl: new_project_google_cloud_database_path(project, :sqlserver), cloudsqlInstances: ::GoogleCloud::GetCloudsqlInstancesService.new(project).execute, - emptyIllustrationUrl: ActionController::Base.helpers.image_path('illustrations/pipelines_empty.svg') + emptyIllustrationUrl: + ActionController::Base.helpers.image_path('illustrations/empty-state/empty-pipeline-md.svg') } @js_data = Gitlab::Json.dump(js_data) diff --git a/app/helpers/ci/pipelines_helper.rb b/app/helpers/ci/pipelines_helper.rb index 90c89f04dc7..6b15f0c9e20 100644 --- a/app/helpers/ci/pipelines_helper.rb +++ b/app/helpers/ci/pipelines_helper.rb @@ -91,7 +91,7 @@ module Ci artifacts_endpoint: downloadable_artifacts_project_pipeline_path(project, artifacts_endpoint_placeholder, format: :json), artifacts_endpoint_placeholder: artifacts_endpoint_placeholder, pipeline_schedule_url: pipeline_schedules_path(project), - empty_state_svg_path: image_path('illustrations/pipelines_empty.svg'), + empty_state_svg_path: image_path('illustrations/empty-state/empty-pipeline-md.svg'), error_state_svg_path: image_path('illustrations/pipelines_failed.svg'), no_pipelines_svg_path: image_path('illustrations/pipelines_pending.svg'), can_create_pipeline: can?(current_user, :create_pipeline, project).to_s, diff --git a/app/helpers/clusters_helper.rb b/app/helpers/clusters_helper.rb index b2ae1386727..b1d61474700 100644 --- a/app/helpers/clusters_helper.rb +++ b/app/helpers/clusters_helper.rb @@ -64,7 +64,11 @@ module ClustersHelper when 'apps' render 'applications' when 'integrations' - render 'integrations' + if Feature.enabled?(:remove_monitor_metrics) + render('details', expanded: expanded) + else + render 'integrations' + end when 'settings' render 'advanced_settings_container' else diff --git a/app/helpers/ide_helper.rb b/app/helpers/ide_helper.rb index 0112dc6a35e..448909543c4 100644 --- a/app/helpers/ide_helper.rb +++ b/app/helpers/ide_helper.rb @@ -43,7 +43,7 @@ module IdeHelper 'empty-state-svg-path' => image_path('illustrations/multi_file_editor_empty.svg'), 'no-changes-state-svg-path' => image_path('illustrations/multi-editor_no_changes_empty.svg'), 'committed-state-svg-path' => image_path('illustrations/multi-editor_all_changes_committed_empty.svg'), - 'pipelines-empty-state-svg-path': image_path('illustrations/pipelines_empty.svg'), + 'pipelines-empty-state-svg-path': image_path('illustrations/empty-state/empty-pipeline-md.svg'), 'switch-editor-svg-path': image_path('illustrations/rocket-launch-md.svg'), 'promotion-svg-path': image_path('illustrations/web-ide_promotion.svg'), 'ci-help-page-path' => help_page_path('ci/quick_start/index'), diff --git a/app/models/abuse_report.rb b/app/models/abuse_report.rb index d35778046da..55b1aff51da 100644 --- a/app/models/abuse_report.rb +++ b/app/models/abuse_report.rb @@ -208,3 +208,5 @@ class AbuseReport < ApplicationRecord ) end end + +AbuseReport.prepend_mod diff --git a/app/models/ci/trigger.rb b/app/models/ci/trigger.rb index 0cfe2d50283..58da1b4bd7e 100644 --- a/app/models/ci/trigger.rb +++ b/app/models/ci/trigger.rb @@ -8,7 +8,7 @@ module Ci TRIGGER_TOKEN_PREFIX = 'glptt-' - ignore_column :ref, remove_with: '15.4', remove_after: '2022-08-22' + ignore_column :ref, remove_with: '16.1', remove_after: '2023-05-22' self.limit_name = 'pipeline_triggers' self.limit_scope = :project diff --git a/app/models/user_custom_attribute.rb b/app/models/user_custom_attribute.rb index 91aa6cfa9dc..9a186cb9038 100644 --- a/app/models/user_custom_attribute.rb +++ b/app/models/user_custom_attribute.rb @@ -14,6 +14,7 @@ class UserCustomAttribute < ApplicationRecord BLOCKED_BY = 'blocked_by' UNBLOCKED_BY = 'unblocked_by' ARKOSE_RISK_BAND = 'arkose_risk_band' + AUTO_BANNED_BY_ABUSE_REPORT_ID = 'auto_banned_by_abuse_report_id' class << self def upsert_custom_attributes(custom_attributes) diff --git a/app/policies/base_policy.rb b/app/policies/base_policy.rb index 7c745c5731f..d6aaa3e983d 100644 --- a/app/policies/base_policy.rb +++ b/app/policies/base_policy.rb @@ -35,6 +35,10 @@ class BasePolicy < DeclarativePolicy::Base with_options scope: :user, score: 0 condition(:security_bot) { @user&.security_bot? } + desc "User is security policy bot" + with_options scope: :user, score: 0 + condition(:security_policy_bot) { @user&.security_policy_bot? } + desc "User is automation bot" with_options scope: :user, score: 0 condition(:automation_bot) { @user&.automation_bot? } diff --git a/app/policies/concerns/policy_actor.rb b/app/policies/concerns/policy_actor.rb index 8fa09683b06..e000f1514e5 100644 --- a/app/policies/concerns/policy_actor.rb +++ b/app/policies/concerns/policy_actor.rb @@ -53,6 +53,10 @@ module PolicyActor false end + def security_policy_bot? + false + end + def automation_bot? false end diff --git a/app/policies/global_policy.rb b/app/policies/global_policy.rb index 3e5a1a356ad..b96ad9a73c8 100644 --- a/app/policies/global_policy.rb +++ b/app/policies/global_policy.rb @@ -62,10 +62,14 @@ class GlobalPolicy < BasePolicy rule { ~can?(:access_api) }.prevent :execute_graphql_mutation - rule { blocked | (internal & ~migration_bot & ~security_bot) }.policy do + rule { blocked | (internal & ~migration_bot & ~security_bot & ~security_policy_bot) }.policy do prevent :access_git end + rule { security_policy_bot }.policy do + enable :access_git + end + rule { project_bot | service_account }.policy do prevent :log_in prevent :receive_notifications diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb index c963b364e4a..47d8d0eef3e 100644 --- a/app/policies/project_policy.rb +++ b/app/policies/project_policy.rb @@ -38,6 +38,9 @@ class ProjectPolicy < BasePolicy desc "User is a project bot" condition(:project_bot) { user.project_bot? && team_member? } + desc "User is a security policy bot on the project" + condition(:security_policy_bot) { user&.security_policy_bot? && team_member? } + desc "Project is public" condition(:public_project, scope: :subject, score: 0) { project.public? } diff --git a/app/views/clusters/clusters/show.html.haml b/app/views/clusters/clusters/show.html.haml index bfeb0d3d7f0..19ca9407513 100644 --- a/app/views/clusters/clusters/show.html.haml +++ b/app/views/clusters/clusters/show.html.haml @@ -33,7 +33,7 @@ = render 'clusters/clusters/details_tab' = render_if_exists 'clusters/clusters/environments_tab' = render 'clusters/clusters/health_tab' if !Feature.enabled?(:remove_monitor_metrics) - = render 'clusters/clusters/integrations_tab' + = render 'clusters/clusters/integrations_tab' if !Feature.enabled?(:remove_monitor_metrics) = render 'clusters/clusters/advanced_settings_tab' .tab-content.py-3 diff --git a/app/views/explore/projects/page_out_of_bounds.html.haml b/app/views/explore/projects/page_out_of_bounds.html.haml index 1b65cdb0c56..dc92787a41f 100644 --- a/app/views/explore/projects/page_out_of_bounds.html.haml +++ b/app/views/explore/projects/page_out_of_bounds.html.haml @@ -3,7 +3,7 @@ .nothing-here-block .svg-content - = image_tag 'illustrations/profile-page/personal-project.svg', size: '75' + = image_tag 'illustrations/empty-state/empty-projects-md.svg', size: '75' .text-content %h5= _("Maximum page reached") %p= _("Sorry, you have exceeded the maximum browsable page number. Please use the API to explore further.") diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index 8d7a7dd6b1b..e42f524467d 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -7,7 +7,7 @@ - if show_invite_banner?(@group) = content_for :group_invite_members_banner do .container-fluid.container-limited{ class: "gl-pb-2! gl-pt-6! #{@content_class}" } - .js-group-invite-members-banner{ data: { svg_path: image_path('illustrations/merge_requests.svg'), + .js-group-invite-members-banner{ data: { svg_path: image_path('illustrations/empty-state/empty-merge-requests-md.svg'), track_label: 'invite_members_banner', invite_members_path: group_group_members_path(@group), callouts_path: group_callouts_path, diff --git a/app/views/projects/commit/_pipelines_list.haml b/app/views/projects/commit/_pipelines_list.haml index dd7b5eae80e..f7ae462e8f9 100644 --- a/app/views/projects/commit/_pipelines_list.haml +++ b/app/views/projects/commit/_pipelines_list.haml @@ -4,7 +4,7 @@ #commit-pipeline-table-view{ data: { disable_initialization: disable_initialization, endpoint: endpoint, full_path: @project.full_path, - "empty-state-svg-path" => image_path('illustrations/pipelines_empty.svg'), + "empty-state-svg-path" => image_path('illustrations/empty-state/empty-pipeline-md.svg'), "error-state-svg-path" => image_path('illustrations/pipelines_failed.svg'), "project-id": @project.id, "artifacts-endpoint" => downloadable_artifacts_project_pipeline_path(@project, artifacts_endpoint_placeholder, format: :json), diff --git a/app/views/projects/environments/new.html.haml b/app/views/projects/environments/new.html.haml index de7f976717b..11c36b5ea6d 100644 --- a/app/views/projects/environments/new.html.haml +++ b/app/views/projects/environments/new.html.haml @@ -1,5 +1,6 @@ -- breadcrumb_title _("Environments") -- page_title _("New Environment") +- add_to_breadcrumbs s_("Environments|Environments"), project_environments_path(@project) +- breadcrumb_title s_("Environments|New") +- page_title s_("Environments|New Environment") - add_page_specific_style 'page_bundles/environments' #js-new-environment{ data: { project_environments_path: project_environments_path(@project) } } diff --git a/app/views/projects/find_file/show.html.haml b/app/views/projects/find_file/show.html.haml index 1d4e907dd61..afb49c48146 100644 --- a/app/views/projects/find_file/show.html.haml +++ b/app/views/projects/find_file/show.html.haml @@ -17,8 +17,8 @@ %table.table.files-slider{ class: "table_#{@hex_path} tree-table" } %tbody .col-12.empty-state.hidden - .svg-250.svg-content - = image_tag('illustrations/profile-page/personal-projects.svg', alt: 'No files svg', lazy: true) + .svg-150.svg-content + = image_tag('illustrations/empty-state/empty-search-md.svg', alt: 'No files svg', lazy: true) .text-center %h4 = _('There are no matching files') diff --git a/app/views/projects/merge_requests/_widget.html.haml b/app/views/projects/merge_requests/_widget.html.haml index e097d25802e..576fed58609 100644 --- a/app/views/projects/merge_requests/_widget.html.haml +++ b/app/views/projects/merge_requests/_widget.html.haml @@ -16,7 +16,7 @@ window.gl.mrWidgetData.license_compliance_docs_path = '#{help_page_path('user/compliance/license_compliance/index.md')}'; window.gl.mrWidgetData.eligible_approvers_docs_path = '#{help_page_path('user/project/merge_requests/approvals/rules.md', anchor: 'eligible-approvers')}'; window.gl.mrWidgetData.approvals_help_path = '#{help_page_path("user/project/merge_requests/approvals/index.md")}'; - window.gl.mrWidgetData.pipelines_empty_svg_path = '#{image_path('illustrations/pipelines_empty.svg')}'; + window.gl.mrWidgetData.pipelines_empty_svg_path = '#{image_path('illustrations/empty-state/empty-pipeline-md.svg')}'; window.gl.mrWidgetData.codequality_help_path = '#{help_page_path("user/project/merge_requests/code_quality", anchor: "code-quality-reports")}'; window.gl.mrWidgetData.false_positive_doc_url = '#{help_page_path('user/application_security/vulnerabilities/index')}'; window.gl.mrWidgetData.can_view_false_positive = '#{@merge_request.project.licensed_feature_available?(:sast_fp_reduction).to_s}'; diff --git a/app/views/projects/pipelines/new.html.haml b/app/views/projects/pipelines/new.html.haml index 63b44de0d74..210f9c35c79 100644 --- a/app/views/projects/pipelines/new.html.haml +++ b/app/views/projects/pipelines/new.html.haml @@ -1,4 +1,5 @@ -- breadcrumb_title _('Pipelines') +- breadcrumb_title s_('Pipeline|Run pipeline') +- add_to_breadcrumbs s_('Pipeline|Pipelines'), project_pipelines_path(@project) - page_title s_('Pipeline|Run pipeline') %h1.page-title.gl-font-size-h-display diff --git a/app/views/projects/releases/new.html.haml b/app/views/projects/releases/new.html.haml index 87197f2662d..908cbd00f47 100644 --- a/app/views/projects/releases/new.html.haml +++ b/app/views/projects/releases/new.html.haml @@ -1,4 +1,5 @@ -- page_title s_('Releases|New Release') +- add_to_breadcrumbs s_("Releases|Releases"), project_releases_path(@project) +- page_title s_('Releases|New') - add_page_specific_style 'page_bundles/releases' #js-new-release-page{ data: data_for_new_release_page } diff --git a/app/views/projects/tags/new.html.haml b/app/views/projects/tags/new.html.haml index 2f8291d255f..bd37a6258a2 100644 --- a/app/views/projects/tags/new.html.haml +++ b/app/views/projects/tags/new.html.haml @@ -1,4 +1,5 @@ -- page_title s_('TagsPage|New Tag') +- add_to_breadcrumbs s_('TagsPage|Tags'), project_tags_path(@project) +- page_title s_('TagsPage|New') - default_ref = params[:ref] || @project.default_branch - if @error diff --git a/app/views/shared/empty_states/_merge_requests.html.haml b/app/views/shared/empty_states/_merge_requests.html.haml index 8e4051fa335..94589996c3a 100644 --- a/app/views/shared/empty_states/_merge_requests.html.haml +++ b/app/views/shared/empty_states/_merge_requests.html.haml @@ -7,8 +7,8 @@ .row.empty-state.merge-requests .col-12 - .svg-content - = image_tag 'illustrations/merge_requests.svg', { auto_dark: true } + .svg-content.svg-150 + = image_tag 'illustrations/empty-state/empty-merge-requests-md.svg', { auto_dark: true } .col-12 .text-content - if has_filter_bar_param? diff --git a/app/views/shared/groups/_list.html.haml b/app/views/shared/groups/_list.html.haml index c5b39c7db08..550f079bf3b 100644 --- a/app/views/shared/groups/_list.html.haml +++ b/app/views/shared/groups/_list.html.haml @@ -1,4 +1,4 @@ -- illustration_path = 'illustrations/profile-page/groups.svg' +- illustration_path = 'illustrations/empty-state/empty-groups-md.svg' - current_user_empty_message_header = s_('UserProfile|You can create a group for several dependent projects.') - current_user_empty_message_description = s_('UserProfile|Groups are the best way to manage projects and members.') - primary_button_label = _('New group') diff --git a/app/views/shared/users/index.html.haml b/app/views/shared/users/index.html.haml index c6a61e1c4df..ef5552943df 100644 --- a/app/views/shared/users/index.html.haml +++ b/app/views/shared/users/index.html.haml @@ -1,7 +1,7 @@ -- followers_illustration_path = 'illustrations/empty-state/empty-projects-starred-md.svg' +- followers_illustration_path = 'illustrations/empty-state/empty-friends-md.svg' - followers_visitor_empty_message = s_('UserProfile|This user doesn\'t have any followers.') - followers_current_user_empty_message_header = s_('UserProfile|You do not have any followers.') -- following_illustration_path = 'illustrations/empty-state/empty-projects-starred-md.svg' +- following_illustration_path = 'illustrations/empty-state/empty-friends-md.svg' - following_visitor_empty_message = s_('UserProfile|This user isn\'t following other users.') - following_current_user_empty_message_header = s_('UserProfile|You are not following other users.') diff --git a/config/gitleaks.toml b/config/gitleaks.toml new file mode 100644 index 00000000000..be02a43aa9c --- /dev/null +++ b/config/gitleaks.toml @@ -0,0 +1,21 @@ +title = "extension of default gitleaks config" + +[extend] +# Extends default packaged path +path = "/gitleaks.toml" + +[allowlist] + description = "global allow list" + regexTarget = "match" + regexes = [ + # spotted in doc/user/application_security/secret_detection/index.md and some frontend specs + "glpat-1234567890abcdefghij", + # spec/frontend/lib/utils/secret_detection_spec.js + "glpat-cgyKc1k_AsnEpmP-5fRL", + # spec/frontend/lib/utils/secret_detection_spec.js + "GlPat-abcdefghijklmnopqrstuvwxyz", + # doc/development/sec/token_revocation_api.md + "glpat--8GMtG8Mf4EnMJzmAWDU", + # doc/development/sec/token_revocation_api.md + "glpat--tG84EGK33nMLLDE70zU", + ] diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml index 0d138c58ff2..e3b8c5cbffc 100644 --- a/config/sidekiq_queues.yml +++ b/config/sidekiq_queues.yml @@ -23,6 +23,8 @@ # chance = (queue weight / total weight of all queues) * 100 --- :queues: +- - abuse_new_abuse_report + - 1 - - adjourned_project_deletion - 1 - - admin_emails diff --git a/danger/analytics_instrumentation/Dangerfile b/danger/analytics_instrumentation/Dangerfile new file mode 100644 index 00000000000..bbb984939dc --- /dev/null +++ b/danger/analytics_instrumentation/Dangerfile @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +return if stable_branch.valid_stable_branch? + +analytics_instrumentation.check! + +analytics_instrumentation.check_affected_scopes! + +analytics_instrumentation.check_usage_data_insertions! diff --git a/danger/plugins/analytics_instrumentation.rb b/danger/plugins/analytics_instrumentation.rb new file mode 100644 index 00000000000..2343a56f09d --- /dev/null +++ b/danger/plugins/analytics_instrumentation.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +require_relative '../../tooling/danger/analytics_instrumentation' + +module Danger + class AnalyticsInstrumentation < ::Danger::Plugin + # Put the helper code somewhere it can be tested + include Tooling::Danger::AnalyticsInstrumentation + end +end diff --git a/danger/plugins/product_intelligence.rb b/danger/plugins/product_intelligence.rb deleted file mode 100644 index 91551a8312f..00000000000 --- a/danger/plugins/product_intelligence.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -require_relative '../../tooling/danger/product_intelligence' - -module Danger - class ProductIntelligence < ::Danger::Plugin - # Put the helper code somewhere it can be tested - include Tooling::Danger::ProductIntelligence - end -end diff --git a/danger/product_intelligence/Dangerfile b/danger/product_intelligence/Dangerfile deleted file mode 100644 index b20c56a7b7c..00000000000 --- a/danger/product_intelligence/Dangerfile +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -return if stable_branch.valid_stable_branch? - -product_intelligence.check! - -product_intelligence.check_affected_scopes! - -product_intelligence.check_usage_data_insertions! diff --git a/danger/roulette/Dangerfile b/danger/roulette/Dangerfile index 17005d853bb..5b865498651 100644 --- a/danger/roulette/Dangerfile +++ b/danger/roulette/Dangerfile @@ -55,7 +55,7 @@ end OPTIONAL_REVIEW_TEMPLATE = '%{role} review is optional for %{category}' NOT_AVAILABLE_TEMPLATES = { default: 'No %{role} available', - product_intelligence: group_not_available_template('#g_product_intelligence', '@gitlab-org/analytics-section/product-intelligence/engineers'), + product_intelligence: group_not_available_template('#g_analyze_analytics_instrumentation', '@gitlab-org/analytics-section/product-intelligence/engineers'), import_integrate_be: group_not_available_template('#g_manage_import_and_integrate', '@gitlab-org/manage/import-and-integrate'), import_integrate_fe: group_not_available_template('#g_manage_import_and_integrate', '@gitlab-org/manage/import-and-integrate') }.freeze @@ -98,14 +98,14 @@ categories << :database if helper.mr_labels.include?('database') # Ensure to spin for UX reviewer when ~UX is applied (e.g. to review changes to the UI) except when it's from wider community contribution where we want to assign from the corresponding group categories << :ux if helper.mr_labels.include?('UX') && !helper.mr_labels.include?('Community contribution') # rubocop:disable Rails/NegateInclude -# Ensure to spin for Product Intelligence reviewer when ~"product intelligence::review pending" is applied -categories << :product_intelligence if helper.mr_labels.include?("product intelligence::review pending") +# Ensure to spin for Analytics Instrumentation reviewer when ~"analytics instrumentation::review pending" is applied +categories << :analytics_instrumentation if helper.mr_labels.include?("analytics instrumentation::review pending") -# Skip Product intelligence reviews for growth experiment MRs -categories.delete(:product_intelligence) if helper.mr_labels.include?("growth experiment") +# Skip Analytics Instrumentation reviews for growth experiment MRs +categories.delete(:analytics_instrumentation) if helper.mr_labels.include?("growth experiment") # Skip specialty reviews for stable branch MRs since they have already been merged to the default branch -categories.subtract([:database, :ux, :product_intelligence]) if stable_branch.valid_stable_branch? +categories.subtract([:database, :ux, :analytics_instrumentation]) if stable_branch.valid_stable_branch? if changes.any? random_roulette_spins = roulette.spin(nil, categories, timezone_experiment: false) diff --git a/data/removals/16_0/16-0-cs-docker-variables.yml b/data/removals/16_0/16-0-cs-docker-variables.yml new file mode 100644 index 00000000000..05102270a22 --- /dev/null +++ b/data/removals/16_0/16-0-cs-docker-variables.yml @@ -0,0 +1,31 @@ +# +# REQUIRED FIELDS +# +- title: "Container Scanning variables that reference Docker removed" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters." + announcement_milestone: "15.4" # (required) The milestone when this feature was deprecated. + removal_milestone: "16.0" # (required) The milestone when this feature is being removed. + breaking_change: true # (required) Change to false if this is not a breaking change. + reporter: gonzoyumo # (required) GitLab username of the person reporting the removal + stage: secure # (required) String value of the stage that the feature was created in. e.g., Growth + issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/371840 # (required) Link to the deprecation issue in GitLab + body: | # (required) Do not modify this line, instead modify the lines below. + All Container Scanning variables with a name prefixed by `DOCKER_` have been removed. This includes: + + - `DOCKER_IMAGE` + - `DOCKER_PASSWORD` + - `DOCKER_USER` + - `DOCKERFILE_PATH` + + Instead, use the [new variable names](https://docs.gitlab.com/ee/user/application_security/container_scanning/#available-cicd-variables): + + - `CS_IMAGE` + - `CS_REGISTRY_PASSWORD` + - `CS_REGISTRY_USER` + - `CS_DOCKERFILE_PATH` +# +# OPTIONAL FIELDS +# + tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate] + documentation_url: # (optional) This is a link to the current documentation page + image_url: # (optional) This is a link to a thumbnail image depicting the feature + video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg diff --git a/data/removals/16_0/16-0-dependency-scanning-java-versions.yml b/data/removals/16_0/16-0-dependency-scanning-java-versions.yml new file mode 100644 index 00000000000..dbbb4efb212 --- /dev/null +++ b/data/removals/16_0/16-0-dependency-scanning-java-versions.yml @@ -0,0 +1,19 @@ +# +# REQUIRED FIELDS +# +- title: "Dependency Scanning ends support for Java 13, 14, 15, and 16" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters." + announcement_milestone: "15.8" # (required) The milestone when this feature was deprecated. + removal_milestone: "16.0" # (required) The milestone when this feature is being removed. + breaking_change: true # (required) Change to false if this is not a breaking change. + reporter: gonzoyumo # (required) GitLab username of the person reporting the removal + stage: secure # (required) String value of the stage that the feature was created in. e.g., Growth + issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/387560 # (required) Link to the deprecation issue in GitLab + body: | # (required) Do not modify this line, instead modify the lines below. + Dependency Scanning no longer supports projects that use Java versions 13, 14, 15, and 16. +# +# OPTIONAL FIELDS +# + tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate] + documentation_url: # (optional) This is a link to the current documentation page + image_url: # (optional) This is a link to a thumbnail image depicting the feature + video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg diff --git a/data/removals/16_0/16-0-licenses-check.yml b/data/removals/16_0/16-0-licenses-check.yml new file mode 100644 index 00000000000..88ebbeb710a --- /dev/null +++ b/data/removals/16_0/16-0-licenses-check.yml @@ -0,0 +1,10 @@ +- title: "License-Check and the Policies tab on the License Compliance page" + announcement_milestone: "15.9" + removal_milestone: "16.0" + breaking_change: true + reporter: sam.white + stage: govern + issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/390417 + tiers: [Ultimate] + body: | + The License Check Policies feature has been removed. Additionally, the Policies tab on the License Compliance page and all APIs related to the License Check feature have been removed. To enforce approvals based on detected licenses, use the [License Approval policy](https://docs.gitlab.com/ee/user/compliance/license_approval_policies.html) feature instead. diff --git a/data/removals/16_0/16-0-managed-licenses-api.yml b/data/removals/16_0/16-0-managed-licenses-api.yml new file mode 100644 index 00000000000..6e5b8626eb9 --- /dev/null +++ b/data/removals/16_0/16-0-managed-licenses-api.yml @@ -0,0 +1,14 @@ +- title: "Managed Licenses API" + announcement_milestone: "15.9" + removal_milestone: "16.0" + breaking_change: true + reporter: sam.white + stage: govern + tiers: [Ultimate] + issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/390417 + body: | + The [Managed Licenses API](https://archives.docs.gitlab.com/15.8/ee/api/managed_licenses.html) has been removed. To enforce approvals in merge requests when non-compliant licenses are detected, use the [License Approval policy](https://docs.gitlab.com/ee/user/compliance/license_approval_policies.html) feature instead. + + Our [GraphQL APIs](https://docs.gitlab.com/ee/api/graphql/reference/) can be used to create a Security Policy Project, [update the policy.yml](https://docs.gitlab.com/ee/api/graphql/reference/#mutationscanexecutionpolicycommit) in the Security Policy Project, and enforce those policies. + + To query a list of dependencies and components, use our [Dependencies REST API](https://docs.gitlab.com/ee/api/dependencies.html) or [export from the Dependency List](https://docs.gitlab.com/ee/user/application_security/dependency_list/). diff --git a/data/removals/16_0/16-0-starboard-directive.yml b/data/removals/16_0/16-0-starboard-directive.yml new file mode 100644 index 00000000000..af968e3af76 --- /dev/null +++ b/data/removals/16_0/16-0-starboard-directive.yml @@ -0,0 +1,19 @@ +# +# REQUIRED FIELDS +# +- title: "Starboard directive in the config for the GitLab agent for Kubernetes removed" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters." + announcement_milestone: "15.4" # (required) The milestone when this feature was deprecated. + removal_milestone: "16.0" # (required) The milestone when this feature is being removed. + breaking_change: true # (required) Change to false if this is not a breaking change. + reporter: gonzoyumo # (required) GitLab username of the person reporting the removal + stage: secure # (required) String value of the stage that the feature was created in. e.g., Growth + issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/368828 # (required) Link to the deprecation issue in GitLab + body: | # (required) Do not modify this line, instead modify the lines below. + The GitLab operational container scanning feature no longer requires you to install Starboard. The `starboard:` directive in configuration files for the GitLab agent for Kubernetes has been removed. Use the `container_scanning:` directive instead. +# +# OPTIONAL FIELDS +# + tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate] + documentation_url: # (optional) This is a link to the current documentation page + image_url: # (optional) This is a link to a thumbnail image depicting the feature + video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg diff --git a/db/post_migrate/20230510130050_remove_ci_triggers_ref_column.rb b/db/post_migrate/20230510130050_remove_ci_triggers_ref_column.rb new file mode 100644 index 00000000000..fa4fab5b8df --- /dev/null +++ b/db/post_migrate/20230510130050_remove_ci_triggers_ref_column.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class RemoveCiTriggersRefColumn < Gitlab::Database::Migration[2.1] + enable_lock_retries! + + def up + remove_column :ci_triggers, :ref + end + + def down + # rubocop:disable Migration/SchemaAdditionMethodsNoPost + add_column :ci_triggers, :ref, :string, if_not_exists: true + # rubocop:enable Migration/SchemaAdditionMethodsNoPost + end +end diff --git a/db/schema_migrations/20230510130050 b/db/schema_migrations/20230510130050 new file mode 100644 index 00000000000..3f5f91eb7be --- /dev/null +++ b/db/schema_migrations/20230510130050 @@ -0,0 +1 @@ +0b487a9ef3407ae8e3f9e2a9b0e7ac2a125048b4ea91ec1bd2ef46ce0508620b
\ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index 5280c06145f..69428063ae6 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -14111,7 +14111,6 @@ CREATE TABLE ci_triggers ( project_id integer, owner_id integer NOT NULL, description character varying, - ref character varying, encrypted_token bytea, encrypted_token_iv bytea ); diff --git a/doc/administration/instance_limits.md b/doc/administration/instance_limits.md index 2b8ded29fc9..03c7c51251b 100644 --- a/doc/administration/instance_limits.md +++ b/doc/administration/instance_limits.md @@ -795,7 +795,7 @@ You can change these limits in the [GitLab Rails console](operations/rails_conso The `max_yaml_size_bytes` value is not directly tied to the size of the YAML file, but rather the memory allocated for the relevant objects. -- To update the maximum YAML depth, update `max_yaml_depth` with the new value in megabytes: +- To update the maximum YAML depth, update `max_yaml_depth` with the new value in number of lines: ```ruby ApplicationSetting.update(max_yaml_depth: 125) diff --git a/doc/api/environments.md b/doc/api/environments.md index 745abdd7ab3..3cbb6076300 100644 --- a/doc/api/environments.md +++ b/doc/api/environments.md @@ -281,6 +281,8 @@ Example response: ## Update an existing environment +> Parameter `name` [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/338897) in GitLab 16.0. + Updates an existing environment's name and/or `external_url`. It returns `200` if the environment was successfully updated. In case of an error, a status code `400` is returned. @@ -293,7 +295,6 @@ PUT /projects/:id/environments/:environments_id |------------------|----------------|----------|---------------------------------------------------------------------------------------------------------------------| | `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). | | `environment_id` | integer | yes | The ID of the environment. | -| `name` | string | no | [Deprecated and will be removed in GitLab 16.0](https://gitlab.com/gitlab-org/gitlab/-/issues/338897). | | `external_url` | string | no | The new `external_url`. | | `tier` | string | no | The tier of the new environment. Allowed values are `production`, `staging`, `testing`, `development`, and `other`. | diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index bca97d3d596..50d48a7242f 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -15071,6 +15071,7 @@ four standard [pagination arguments](#connection-pagination-arguments): | Name | Type | Description | | ---- | ---- | ----------- | +| <a id="groupclusteragentshasremotedevelopmentagentconfig"></a>`hasRemoteDevelopmentAgentConfig` | [`Boolean`](#boolean) | Returns only cluster agents which have an associated remote development agent config. | | <a id="groupclusteragentshasvulnerabilities"></a>`hasVulnerabilities` | [`Boolean`](#boolean) | Returns only cluster agents which have vulnerabilities. | ##### `Group.codeCoverageActivities` @@ -16124,6 +16125,7 @@ four standard [pagination arguments](#connection-pagination-arguments): | Name | Type | Description | | ---- | ---- | ----------- | +| <a id="instancesecuritydashboardclusteragentshasremotedevelopmentagentconfig"></a>`hasRemoteDevelopmentAgentConfig` | [`Boolean`](#boolean) | Returns only cluster agents which have an associated remote development agent config. | | <a id="instancesecuritydashboardclusteragentshasvulnerabilities"></a>`hasVulnerabilities` | [`Boolean`](#boolean) | Returns only cluster agents which have vulnerabilities. | ##### `InstanceSecurityDashboard.projects` @@ -18991,6 +18993,7 @@ Represents a product analytics dashboard visualization. | <a id="projectfullpath"></a>`fullPath` | [`ID!`](#id) | Full path of the project. | | <a id="projectgrafanaintegration"></a>`grafanaIntegration` | [`GrafanaIntegration`](#grafanaintegration) | Grafana integration details for the project. | | <a id="projectgroup"></a>`group` | [`Group`](#group) | Group of the project. | +| <a id="projecthasjiravulnerabilityissuecreationenabled"></a>`hasJiraVulnerabilityIssueCreationEnabled` | [`Boolean!`](#boolean) | Indicates whether Jira issue creation from vulnerabilities is enabled. | | <a id="projecthttpurltorepo"></a>`httpUrlToRepo` | [`String`](#string) | URL to connect to the project via HTTPS. | | <a id="projectid"></a>`id` | [`ID!`](#id) | ID of the project. | | <a id="projectimportstatus"></a>`importStatus` | [`String`](#string) | Status of import background job of the project. | @@ -19249,6 +19252,7 @@ Returns [`ClusterAgent`](#clusteragent). | Name | Type | Description | | ---- | ---- | ----------- | +| <a id="projectclusteragenthasremotedevelopmentagentconfig"></a>`hasRemoteDevelopmentAgentConfig` | [`Boolean`](#boolean) | Returns only cluster agents which have an associated remote development agent config. | | <a id="projectclusteragenthasvulnerabilities"></a>`hasVulnerabilities` | [`Boolean`](#boolean) | Returns only cluster agents which have vulnerabilities. | | <a id="projectclusteragentname"></a>`name` | [`String!`](#string) | Name of the cluster agent. | @@ -19266,6 +19270,7 @@ four standard [pagination arguments](#connection-pagination-arguments): | Name | Type | Description | | ---- | ---- | ----------- | +| <a id="projectclusteragentshasremotedevelopmentagentconfig"></a>`hasRemoteDevelopmentAgentConfig` | [`Boolean`](#boolean) | Returns only cluster agents which have an associated remote development agent config. | | <a id="projectclusteragentshasvulnerabilities"></a>`hasVulnerabilities` | [`Boolean`](#boolean) | Returns only cluster agents which have vulnerabilities. | ##### `Project.containerRepositories` diff --git a/doc/architecture/blueprints/gitlab_ml_experiments/index.md b/doc/architecture/blueprints/gitlab_ml_experiments/index.md index f912a7092de..90adfc41257 100644 --- a/doc/architecture/blueprints/gitlab_ml_experiments/index.md +++ b/doc/architecture/blueprints/gitlab_ml_experiments/index.md @@ -7,8 +7,6 @@ coach: "@grzesiek" # GitLab Service-Integration: AI and Beyond -[[_TOC_]] - This document is an abbreviated proposal for Service-Integration to allow teams within GitLab to rapidly build new application features that leverage AI, ML, and data technologies. ## Executive Summary diff --git a/doc/ci/environments/index.md b/doc/ci/environments/index.md index e48c8dffb90..f4d155369e9 100644 --- a/doc/ci/environments/index.md +++ b/doc/ci/environments/index.md @@ -161,9 +161,10 @@ deploy_review_app: ### Rename an environment > - Renaming an environment by using the UI was [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68550) in GitLab 14.3. -> - Renaming an environment by using the API was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/338897) in GitLab 15.9 and is planned for removal in GitLab 16.0. +> - Renaming an environment by using the API was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/338897) in GitLab 15.9. +> - Renaming an environment with the API [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/338897) in GitLab 16.0. -You cannot rename an environment by using the UI, and the API method was deprecated in GitLab 15.9 and to be removed in GitLab 16.0. +You cannot rename an environment. To achieve the same result as renaming an environment: diff --git a/doc/ci/review_apps/index.md b/doc/ci/review_apps/index.md index 1b423f1df70..004bd9dfc5f 100644 --- a/doc/ci/review_apps/index.md +++ b/doc/ci/review_apps/index.md @@ -58,16 +58,16 @@ The process of configuring review apps is as follows: 1. [Install](https://docs.gitlab.com/runner/install/) and [configure](https://docs.gitlab.com/runner/commands/) a runner to do deployment. 1. Set up a job in `.gitlab-ci.yml` that uses the [predefined CI/CD variable](../variables/index.md) `${CI_COMMIT_REF_SLUG}` to create dynamic environments and restrict it to run only on branches. - Alternatively, you can get a YAML template for this job by [enabling review apps](#enable-review-app-button) for your project. + Alternatively, you can get a YAML template for this job by [enabling review apps](#enable-review-apps-button) for your project. 1. Optionally, set a job that [manually stops](../environments/index.md#stopping-an-environment) the review apps. -### Enable review app button +### Enable review apps button > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/118844) in GitLab 12.8. When configuring review apps for a project, you add a new job to the `.gitlab-ci.yml` file, as mentioned above. To facilitate this, and if you are using Kubernetes, you can select -**Enable review app** and GitLab prompts you with a template code block that +**Enable review apps** and GitLab prompts you with a template code block that you can copy and paste into `.gitlab-ci.yml` as a starting point. Prerequisite: @@ -78,7 +78,7 @@ To use the review apps template: 1. On the top bar, select **Main menu > Projects** and find the project you want to create a review app job for. 1. On the left sidebar, select **Deployments > Environments**. -1. Select **Enable review app**. +1. Select **Enable review apps**. 1. Copy the provided code snippet and paste it into your `.gitlab-ci.yml` file: diff --git a/doc/development/ai_features.md b/doc/development/ai_features.md index e5632351d21..11442755df3 100644 --- a/doc/development/ai_features.md +++ b/doc/development/ai_features.md @@ -66,6 +66,27 @@ All AI features are experimental. 1. Enable the specific feature flag for the feature you want to test 1. Set either the required access token `OpenAi` or `Vertex`. Ask in [`#ai_enablement_team`](https://gitlab.slack.com/archives/C051K31F30R) to receive an access token. +### Set up the embedding database + +For features that use the embedding database, additional setup is needed. + +1. Enable [pgvector](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/howto/pgvector.md#enable-pgvector-in-the-gdk) in GDK +1. Enable the embedding database in GDK + + ```shell + gdk config set gitlab.rails.databases.embedding.enabled true + ``` + +1. Run `gdk reconfigure` +1. Run database migrations to create the embedding database + +### Setup for GitLab chat + +To populate the embedding database for GitLab chat: + +1. Open a rails console +1. Run [this script](https://gitlab.com/gitlab-com/gl-infra/production/-/issues/10588#note_1373586079) to populate the embedding database + ### Internal-Only GCP account access In order to obtain a GCP service key for local development, please follow the steps below: @@ -204,7 +225,7 @@ If the circuit is open, subsequent requests fail fast without executing the code ### Configuration -The circuit breaker is configured with two constants which control the number of errors and requests at which the circuit will open: +The circuit breaker is configured with two constants which control the number of errors and requests at which the circuit will open: - `ERROR_THRESHOLD` - `VOLUME_THRESHOLD` diff --git a/doc/development/code_review.md b/doc/development/code_review.md index 5588afe0713..341fac1a1b9 100644 --- a/doc/development/code_review.md +++ b/doc/development/code_review.md @@ -166,7 +166,7 @@ with [domain expertise](#domain-experts). | End-to-end **and** non-end-to-end changes (*4*) | [Software Engineer in Test](https://about.gitlab.com/handbook/engineering/quality/#individual-contributors). | | Only End-to-end changes (*4*) **or** if the MR author is a [Software Engineer in Test](https://about.gitlab.com/handbook/engineering/quality/#individual-contributors) | [Quality maintainer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_maintainers_qa). | | A new or updated [application limit](https://about.gitlab.com/handbook/product/product-processes/#introducing-application-limits) | [Product manager](https://about.gitlab.com/company/team/). | -| Product Intelligence (telemetry or analytics) changes | [Product Intelligence engineer](https://gitlab.com/gitlab-org/analytics-section/product-intelligence/engineers). | +| Analytics Instrumentation (telemetry or analytics) changes | [Analytics Instrumentation engineer](https://gitlab.com/gitlab-org/analytics-section/product-intelligence/engineers). | | An addition of, or changes to a [Feature spec](testing_guide/testing_levels.md#frontend-feature-tests) | [Quality maintainer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_maintainers_qa) or [Quality reviewer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_reviewers_qa). | | A new service to GitLab (Puma, Sidekiq, Gitaly are examples) | [Product manager](https://about.gitlab.com/company/team/). See the [process for adding a service component to GitLab](adding_service_component.md) for details. | | Changes related to authentication or authorization | [Manage:Authentication and Authorization team member](https://about.gitlab.com/company/team/). Check the [code review section on the group page](https://about.gitlab.com/handbook/engineering/development/dev/manage/authentication-and-authorization/#additional-considerations) for more details. Patterns for files known to require review from the team are listed in the in the `Authentication and Authorization` section of the [`CODEOWNERS`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/CODEOWNERS) file, and the team will be listed in the approvers section of all merge requests that modify these files. | diff --git a/doc/development/database_review.md b/doc/development/database_review.md index feac0b3098d..0e34e550098 100644 --- a/doc/development/database_review.md +++ b/doc/development/database_review.md @@ -173,7 +173,7 @@ Include in the MR description: ##### Query Plans - The query plan for each raw SQL query included in the merge request along with the link to the query plan following each raw SQL snippet. -- Provide a link to the plan from [postgres.ai](database/database_lab.md), provided by the chatbot. +- Provide a link to the plan generated using the `explain` command in the [postgres.ai](database/database_lab.md) chatbot. - If it's not possible to get an accurate picture in Database Lab, you may need to seed a development environment, and instead provide links from [explain.depesz.com](https://explain.depesz.com) or [explain.dalibo.com](https://explain.dalibo.com). Be sure to paste both the plan and the query used in the form. diff --git a/doc/development/service_ping/implement.md b/doc/development/service_ping/implement.md index 54352a43010..73b74feb239 100644 --- a/doc/development/service_ping/implement.md +++ b/doc/development/service_ping/implement.md @@ -690,8 +690,8 @@ Create a merge request for the new Service Ping metric, and do the following: - Add the `feature` label to the merge request. A metric is a user-facing change and is part of expanding the Service Ping feature. - Add a changelog entry that complies with the [changelog entries guide](../changelog.md). -- Ask for a Product Intelligence review. - On GitLab.com, we have DangerBot set up to monitor Product Intelligence related files and recommend a [Product Intelligence review](review_guidelines.md). +- Ask for an Analytics Instrumentation review. + On GitLab.com, we have DangerBot set up to monitor Analytics Instrumentation related files and recommend a [Analytics Instrumentation review](review_guidelines.md). ## Verify your metric diff --git a/doc/development/service_ping/review_guidelines.md b/doc/development/service_ping/review_guidelines.md index f260d9700a3..8128f1e371b 100644 --- a/doc/development/service_ping/review_guidelines.md +++ b/doc/development/service_ping/review_guidelines.md @@ -7,7 +7,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w # Service Ping review guidelines This page includes introductory material for a -[Product Intelligence](https://about.gitlab.com/handbook/engineering/development/analytics/product-intelligence/) +[Analytics Instrumentation](https://about.gitlab.com/handbook/engineering/development/analytics/analytics-instrumentation/) review, and is specific to Service Ping related reviews. For broader advice and general best practices for code reviews, refer to our [code review guide](../code_review.md). @@ -18,7 +18,7 @@ general best practices for code reviews, refer to our [code review guide](../cod ## Review process -We recommend a Product Intelligence review when a merge request (MR) touches +We recommend a Analytics Instrumentation review when a merge request (MR) touches any of the following Service Ping files: - `usage_data*` files. @@ -26,29 +26,29 @@ any of the following Service Ping files: - [`config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/metrics). - [`ee/config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/ee/config/metrics). - [`schema.json`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/schema.json). -- Product Intelligence tooling. For example, +- Analytics Instrumentation tooling. For example, [`Gitlab::UsageMetricDefinitionGenerator`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/generators/gitlab/usage_metric_definition_generator.rb) ### Roles and process #### The merge request **author** should -- Decide whether a Product Intelligence review is needed. You can skip the Product Intelligence -review and remove the labels if the changes are not related to the Product Intelligence domain and +- Decide whether a Analytics Instrumentation review is needed. You can skip the Analytics Instrumentation +review and remove the labels if the changes are not related to the Analytics Instrumentation domain and are regular backend changes. -- If a Product Intelligence review is needed, add the labels - `~product intelligence` and `~product intelligence::review pending`. -- For merge requests authored by Product Intelligence team members: - - Assign both the `~backend` and `~product intelligence` reviews to another Product Intelligence team member. - - Assign the maintainer review to someone outside of the Product Intelligence group. +- If a Analytics Instrumentation review is needed, add the labels + `~analytics instrumentation` and `~analytics instrumentation::review pending`. +- For merge requests authored by Analytics Instrumentation team members: + - Assign both the `~backend` and `~analytics instrumentation` reviews to another Analytics Instrumentation team member. + - Assign the maintainer review to someone outside of the Analytics Instrumentation group. - Assign an - [engineer](https://gitlab.com/groups/gitlab-org/analytics-section/product-intelligence/engineers/-/group_members?with_inherited_permissions=exclude) from the Product Intelligence team for a review. + [engineer](https://gitlab.com/groups/gitlab-org/analytics-section/product-intelligence/engineers/-/group_members?with_inherited_permissions=exclude) from the Analytics Instrumentation team for a review. - Set the correct attributes in the metric's YAML definition: - `product_section`, `product_stage`, `product_group` - Provide a clear description of the metric. - Add a changelog [according to guidelines](../changelog.md). -#### The Product Intelligence **reviewer** should +#### The Analytics Instrumentation **reviewer** should - Perform a first-pass review on the merge request and suggest improvements to the author. - Check the [metrics location](metrics_dictionary.md#metric-key_path) in @@ -70,13 +70,13 @@ are regular backend changes. - If a metric was changed or removed: Make sure the MR author notified the Customer Success Ops team (`@csops-team`), Analytics Engineers (`@gitlab-data/analytics-engineers`), and Product Analysts (`@gitlab-data/product-analysts`) by `@` mentioning those groups in a comment on the issue for the MR and all of these groups have acknowledged the removal. - Metrics instrumentations - Recommend using metrics instrumentation for new metrics, [if possible](metrics_instrumentation.md#support-for-instrumentation-classes). -- Approve the MR, and relabel the MR with `~"product intelligence::approved"`. +- Approve the MR, and relabel the MR with `~"analytics instrumentation::approved"`. ## Review workload distribution -[Danger bot](../dangerbot.md) adds the list of changed Product Intelligence files +[Danger bot](../dangerbot.md) adds the list of changed Analytics Instrumentation files and pings the [`@gitlab-org/analytics-section/product-intelligence/engineers`](https://gitlab.com/groups/gitlab-org/analytics-section/product-intelligence/engineers/-/group_members?with_inherited_permissions=exclude) group for merge requests that are not drafts. -Any of the Product Intelligence engineers can be assigned for the Product Intelligence review. +Any of the Analytics Instrumentation engineers can be assigned for the Analytics Instrumentation review. diff --git a/doc/development/snowplow/review_guidelines.md b/doc/development/snowplow/review_guidelines.md index 5a4310c1cde..d5432cc9075 100644 --- a/doc/development/snowplow/review_guidelines.md +++ b/doc/development/snowplow/review_guidelines.md @@ -6,8 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w # Snowplow review guidelines -This page includes introductory material for a -[Product Intelligence](https://about.gitlab.com/handbook/engineering/development/analytics/product-intelligence/) +This page includes introductory material for an +[Analytics Instrumentation](https://about.gitlab.com/handbook/engineering/development/analytics/analytics-instrumentation/) review, and is specific to Snowplow related reviews. For broader advice and general best practices for code reviews, refer to our [code review guide](../code_review.md). @@ -18,7 +18,7 @@ general best practices for code reviews, refer to our [code review guide](../cod ## Review process -We recommend a Product Intelligence review when a merge request (MR) involves changes in +We recommend an Analytics Instrumentation review when a merge request (MR) involves changes in events or touches Snowplow related files. ### Roles and process @@ -33,7 +33,7 @@ events or touches Snowplow related files. to reset with `GET http://localhost:9090/micro/reset` first). - Add or update the event definition file according to the [Event Dictionary Guide](event_dictionary_guide.md). -#### The Product Intelligence **reviewer** should +#### The Analytics Instrumentation **reviewer** should - Check that the [event schema](index.md#event-schema) is correct. - Check the [usage recommendations](implementation.md#usage-recommendations). diff --git a/doc/update/removals.md b/doc/update/removals.md index 444c2015700..475e4cc9ca2 100644 --- a/doc/update/removals.md +++ b/doc/update/removals.md @@ -122,6 +122,34 @@ Review the details carefully before upgrading. The Container Registry [pull-through cache](https://docs.docker.com/registry/recipes/mirror/) was deprecated in GitLab 15.8 and removed in GitLab 16.0. This feature is part of the upstream [Docker Distribution project](https://github.com/distribution/distribution) but we are removing that code in favor of the GitLab Dependency Proxy. Use the GitLab Dependency Proxy to proxy and cache container images from Docker Hub. +### Container Scanning variables that reference Docker removed + +WARNING: +This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). +Review the details carefully before upgrading. + +All Container Scanning variables with a name prefixed by `DOCKER_` have been removed. This includes: + +- `DOCKER_IMAGE` +- `DOCKER_PASSWORD` +- `DOCKER_USER` +- `DOCKERFILE_PATH` + +Instead, use the [new variable names](https://docs.gitlab.com/ee/user/application_security/container_scanning/#available-cicd-variables): + +- `CS_IMAGE` +- `CS_REGISTRY_PASSWORD` +- `CS_REGISTRY_USER` +- `CS_DOCKERFILE_PATH` + +### Dependency Scanning ends support for Java 13, 14, 15, and 16 + +WARNING: +This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). +Review the details carefully before upgrading. + +Dependency Scanning no longer supports projects that use Java versions 13, 14, 15, and 16. + ### Developer role providing the ability to import projects to a group WARNING: @@ -189,6 +217,14 @@ In GitLab 16.0 and later, the GraphQL query for runners will no longer return th - `PAUSED` has been replaced with the field, `paused: true`. - `ACTIVE` has been replaced with the field, `paused: false`. +### License-Check and the Policies tab on the License Compliance page + +WARNING: +This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). +Review the details carefully before upgrading. + +The License Check Policies feature has been removed. Additionally, the Policies tab on the License Compliance page and all APIs related to the License Check feature have been removed. To enforce approvals based on detected licenses, use the [License Approval policy](https://docs.gitlab.com/ee/user/compliance/license_approval_policies.html) feature instead. + ### Limit CI_JOB_TOKEN scope is disabled WARNING: @@ -205,6 +241,18 @@ In 17.0, we plan to remove the **Limit** setting completely, and set the **Allow To prepare for this change, users on GitLab.com or self-managed GitLab 15.9 or later can enable the **Allow access** setting now and add the other projects. It will not be possible to disable the setting in 17.0 or later. +### Managed Licenses API + +WARNING: +This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). +Review the details carefully before upgrading. + +The [Managed Licenses API](https://archives.docs.gitlab.com/15.8/ee/api/managed_licenses.html) has been removed. To enforce approvals in merge requests when non-compliant licenses are detected, use the [License Approval policy](https://docs.gitlab.com/ee/user/compliance/license_approval_policies.html) feature instead. + +Our [GraphQL APIs](https://docs.gitlab.com/ee/api/graphql/reference/) can be used to create a Security Policy Project, [update the policy.yml](https://docs.gitlab.com/ee/api/graphql/reference/#mutationscanexecutionpolicycommit) in the Security Policy Project, and enforce those policies. + +To query a list of dependencies and components, use our [Dependencies REST API](https://docs.gitlab.com/ee/api/dependencies.html) or [export from the Dependency List](https://docs.gitlab.com/ee/user/application_security/dependency_list/). + ### Maximum number of active pipelines per project limit (`ci_active_pipelines`) The [**Maximum number of active pipelines per project** limit](https://docs.gitlab.com/ee/user/admin_area/settings/continuous_integration.html#set-cicd-limits) has been removed. Instead, use the other recommended rate limits that offer similar protection: @@ -385,6 +433,14 @@ Review the details carefully before upgrading. Version 14.x.x [security report schemas](https://gitlab.com/gitlab-org/security-products/security-report-schemas) have been removed. Security reports that use schema version 14.x.x will cause an error in the pipeline's **Security** tab. For more information, refer to [security report validation](https://docs.gitlab.com/ee/user/application_security/#security-report-validation). +### Starboard directive in the config for the GitLab agent for Kubernetes removed + +WARNING: +This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). +Review the details carefully before upgrading. + +The GitLab operational container scanning feature no longer requires you to install Starboard. The `starboard:` directive in configuration files for the GitLab agent for Kubernetes has been removed. Use the `container_scanning:` directive instead. + ### Stop publishing GitLab Runner images based on Windows Server 2004 and 20H2 As of GitLab 16.0, GitLab Runner images based on Windows Server 2004 and 20H2 will not be provided as these operating systems are end-of-life. diff --git a/doc/user/admin_area/settings/usage_statistics.md b/doc/user/admin_area/settings/usage_statistics.md index 64bec01b765..ba226e0f05b 100644 --- a/doc/user/admin_area/settings/usage_statistics.md +++ b/doc/user/admin_area/settings/usage_statistics.md @@ -52,9 +52,11 @@ tier. Users can continue to access the features in a paid tier without sharing u ### Features available in 16.0 and later +- [View description change history](../../../user/discussions/index.md#view-description-change-history). - [Maintenance mode](../../../administration/maintenance_mode/index.md). - [Configurable issue boards](../../project/issue_board.md#configurable-issue-boards). - [Coverage-guided fuzz testing](../../application_security/coverage_fuzzing/index.md). +- [Password complexity requirements](../../../user/admin_area/settings/sign_up_restrictions.md#password-complexity-requirements). NOTE: Registration is not yet required for participation, but may be added in a future milestone. diff --git a/doc/user/admin_area/settings/visibility_and_access_controls.md b/doc/user/admin_area/settings/visibility_and_access_controls.md index ccc80c1fd2c..edcf1a80aca 100644 --- a/doc/user/admin_area/settings/visibility_and_access_controls.md +++ b/doc/user/admin_area/settings/visibility_and_access_controls.md @@ -191,8 +191,8 @@ For more details on project visibility, see ## Configure allowed import sources -Before projects can be imported from other systems, the [import source](../../gitlab_com/index.md#default-import-sources) -for that system must be enabled. +Before you can import projects from other systems, you must enable the +[import source](../../gitlab_com/index.md#default-import-sources) for that system. 1. Sign in to GitLab as a user with Administrator access level. 1. On the top bar, select **Main menu > Admin**. diff --git a/doc/user/application_security/policies/index.md b/doc/user/application_security/policies/index.md index 723b55a884d..0d821f8e47c 100644 --- a/doc/user/application_security/policies/index.md +++ b/doc/user/application_security/policies/index.md @@ -148,7 +148,7 @@ The workaround is to amend your group or instance push rules to allow branches f - Scan result policies created at the group or sub-group level can take some time to apply to all the merge requests in the group. - Scheduled scan execution policies run with a minimum 15 minute cadence. Learn more [about the schedule rule type](../policies/scan-execution-policies.md#schedule-rule-type). - When scheduling pipelines, keep in mind that CRON scheduling is based on UTC on GitLab SaaS and is based on your server time for self managed instances. When testing new policies, it may appear pipelines are not running properly when in fact they are scheduled in your server's timezone. -- When enforcing scan execution policies, the target project's pipeline is triggered by the user who last updated the security policy project's `policy.yml` file. The user must have permission to trigger the pipeline in the project for the policy to be enforced, and the pipeline to run. Work to address this is being tracked in [issue 394958]. +- When enforcing scan execution policies, the target project's pipeline is triggered by the user who last updated the security policy project's `policy.yml` file. The user must have permission to trigger the pipeline in the project for the policy to be enforced, and the pipeline to run. Work to address this is being tracked in [issue 394958](https://gitlab.com/gitlab-org/gitlab/-/issues/394958). - You should not link a security policy project to a development project and to the group or sub-group the development project belongs to at the same time. Linking this way will result in approval rules from the Scan Result Policy not being applied to merge requests in the development project. If you are still experiencing issues, you can [view recent reported bugs](https://gitlab.com/gitlab-org/gitlab/-/issues/?sort=popularity&state=opened&label_name%5B%5D=group%3A%3Asecurity%20policies&label_name%5B%5D=type%3A%3Abug&first_page_size=20) and raise new unreported issues. diff --git a/doc/user/gitlab_com/index.md b/doc/user/gitlab_com/index.md index de778d91478..fae45e4b2d3 100644 --- a/doc/user/gitlab_com/index.md +++ b/doc/user/gitlab_com/index.md @@ -212,7 +212,7 @@ this limit. Repository limits apply to both public and private projects. > Disabling all importers by default for new GitLab self-managed installations [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/118970) in GitLab 16.0. -The import sources that are available default depend on which GitLab you use: +The import sources that are available by default depend on which GitLab you use: - GitLab.com: all available import sources are enabled by default. - GitLab self-managed: no import sources are enabled by default and must be diff --git a/doc/user/group/manage.md b/doc/user/group/manage.md index 5b88315f497..7c2c2eaa211 100644 --- a/doc/user/group/manage.md +++ b/doc/user/group/manage.md @@ -679,13 +679,20 @@ To view the merge request approval settings for a group: Support for group-level settings for merge request approval rules is tracked in this [epic](https://gitlab.com/groups/gitlab-org/-/epics/4367). -## Group Code Suggestions **(PREMIUM SAAS)** +## Group Code Suggestions **(FREE SAAS)** > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/405126) in GitLab 15.11. > - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/408158) from GitLab Ultimate to GitLab Premium in 16.0. +> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/410801) from GitLab Premium to GitLab Free in 16.0. WARNING: -This feature is in [Beta](../../policy/alpha-beta-support.md#beta). Code Suggestions use generative AI to suggest code while you're developing. Due to high demand, this feature will have unscheduled downtime and code suggestions in VS Code may be delayed. Code Suggestions may produce [low-quality or incomplete suggestions](../project/repository/code_suggestions.md#model-accuracy-and-quality). Beta users should read about the [known limitations](../project/repository/code_suggestions.md#known-limitations). We look forward to hearing your feedback. +This feature is in [Beta](../../policy/alpha-beta-support.md#beta). +Code Suggestions use generative AI to suggest code while you're developing. +Due to high demand, this feature will have unscheduled downtime and code suggestions in VS Code may be delayed. +Code Suggestions may produce +[low-quality or incomplete suggestions](../project/repository/code_suggestions.md#model-accuracy-and-quality). +Beta users should read about the [known limitations](../project/repository/code_suggestions.md#known-limitations). +We look forward to hearing your feedback. This setting enables users in the group to access [Code Suggestions](../project/repository/code_suggestions.md). This setting [cascades to all projects](../project/merge_requests/approvals/settings.md#settings-cascading) diff --git a/doc/user/project/repository/code_suggestions.md b/doc/user/project/repository/code_suggestions.md index c64bcdb073c..5de55db5ad4 100644 --- a/doc/user/project/repository/code_suggestions.md +++ b/doc/user/project/repository/code_suggestions.md @@ -5,14 +5,19 @@ info: To determine the technical writer assigned to the Stage/Group associated w type: index, reference --- -# Code Suggestions (Beta) **(PREMIUM SAAS)** +# Code Suggestions (Beta) **(FREE SAAS)** > - [Introduced](https://about.gitlab.com/releases/2023/02/22/gitlab-15-9-released/#code-suggestions-available-in-closed-beta) in GitLab 15.9 as [Beta](/ee/policy/alpha-beta-support.md#beta) for early access Ultimate customers. -> - [Enabled] as opt-in with GitLab 15.11 as [Beta](/ee/policy/alpha-beta-support.md#beta). +> - [Enabled](https://gitlab.com/gitlab-org/gitlab/-/issues/408104) as opt-in with GitLab 15.11 as [Beta](/ee/policy/alpha-beta-support.md#beta). > - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/408158) from GitLab Ultimate to GitLab Premium in 16.0. +> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/410801) from GitLab Premium to GitLab Free in 16.0. WARNING: -This feature is in [Beta](/ee/policy/alpha-beta-support.md#beta). Code Suggestions use generative AI to suggest code while you're developing. Due to high demand, this feature will have unscheduled downtime and code suggestions in VS Code may be delayed. Code Suggestions may produce [low-quality or incomplete suggestions](#model-accuracy-and-quality). Beta users should read about the [known limitations](#known-limitations). We look forward to hearing your feedback. +This feature is in [Beta](/ee/policy/alpha-beta-support.md#beta). +Code Suggestions use generative AI to suggest code while you're developing. +Due to high demand, this feature will have unscheduled downtime and code suggestions in VS Code may be delayed. +Code Suggestions may produce [low-quality or incomplete suggestions](#model-accuracy-and-quality). +Beta users should read about the [known limitations](#known-limitations). We look forward to hearing your feedback. Use Code Suggestions to write code more efficiently by viewing code suggestions as you type. Depending on the cursor position, the extension either: @@ -80,19 +85,31 @@ Start typing and receive suggestions for your GitLab projects. Code Suggestions is a generative artificial intelligence (AI) model hosted on GitLab.com. -Your personal access token enables a secure API connection to GitLab.com. This API connection securely transmits a context window from VS Code to the Code Suggestions ML model for inference, and the generated suggestion is transmitted back to VS Code. +Your personal access token enables a secure API connection to GitLab.com. +This API connection securely transmits a context window from VS Code to the Code Suggestions ML model for inference, +and the generated suggestion is transmitted back to VS Code. ### Data privacy -Code Suggestions operate completely in the GitLab.com infrastructure, providing the same level of [security](https://about.gitlab.com/security/) as any other feature of GitLab.com, and processing any personal data in accordance with our [Privacy Statement](https://about.gitlab.com/privacy/). +Code Suggestions operate completely in the GitLab.com infrastructure, providing the same level of +[security](https://about.gitlab.com/security/) as any other feature of GitLab.com, and processing any personal +data in accordance with our [Privacy Statement](https://about.gitlab.com/privacy/). -No new additional data is collected to enable this feature. The content of your GitLab hosted source code is not used as training data. Source code inference against the Code Suggestions model is not used to re-train the model. Your data also never leaves GitLab.com. All training and inference is done in GitLab.com infrastructure. +No new additional data is collected to enable this feature. The content of your GitLab hosted source code is +not used as training data. Source code inference against the Code Suggestions model is not used to re-train the model. +Your data also never leaves GitLab.com. All training and inference is done in GitLab.com infrastructure. [Read more about the security of GitLab.com](https://about.gitlab.com/security/faq/). ### Training data -Code Suggestions uses open source pre-trained base models from the [CodeGen family](https://openreview.net/forum?id=iaYcJKpY2B_) including CodeGen-MULTI and CodeGen-NL. We then re-train and fine-tune these base models with a customized open source dataset to enable multi-language support and additional use cases. This customized dataset contains non-preprocessed open source code in 13 programming languages from [The Pile](https://pile.eleuther.ai/) and the [Google BigQuery source code dataset](https://cloud.google.com/blog/topics/public-datasets/github-on-bigquery-analyze-all-the-open-source-code). We then process this raw dataset against heuristics that aim to increase the quality of the dataset. +Code Suggestions uses open source pre-trained base models from the +[CodeGen family](https://openreview.net/forum?id=iaYcJKpY2B_) including CodeGen-MULTI and CodeGen-NL. +We then re-train and fine-tune these base models with a customized open source dataset to enable multi-language +support and additional use cases. This customized dataset contains non-preprocessed open source code in 13 +programming languages from [The Pile](https://pile.eleuther.ai/) and the +[Google BigQuery source code dataset](https://cloud.google.com/blog/topics/public-datasets/github-on-bigquery-analyze-all-the-open-source-code). +We then process this raw dataset against heuristics that aim to increase the quality of the dataset. The Code Suggestions model is not trained on GitLab customer data. @@ -100,31 +117,54 @@ The Code Suggestions model is not trained on GitLab customer data. Code Suggestions are off by default and require a group owner to enable the feature with a group-level setting. -After the group-level setting is enabled, developers using Visual Studio Code with the [GitLab Workflow extension](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow) can connect to GitLab.com by using a GitLab [personal access token](../../profile/personal_access_tokens.md#create-a-personal-access-token) with the `read_api` and `read_user` scopes. +After the group-level setting is enabled, developers using Visual Studio Code with the +[GitLab Workflow extension](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow) can connect +to GitLab.com by using a GitLab +[personal access token](../../profile/personal_access_tokens.md#create-a-personal-access-token) with the `read_api` +and `read_user` scopes. ## Progressive enhancement -This feature is designed as a progressive enhancement to the existing VS Code GitLab Workflow plugin. Code Suggestions offer a completion if the machine learning engine can generate a recommendation. In the event of a connection issue or model inference failure, the feature gracefully degrades. Code Suggestions do not prevent you from writing code in VS Code. +This feature is designed as a progressive enhancement to the existing VS Code GitLab Workflow plugin. +Code Suggestions offer a completion if the machine learning engine can generate a recommendation. +In the event of a connection issue or model inference failure, the feature gracefully degrades. +Code Suggestions do not prevent you from writing code in VS Code. ### Internet connectivity -Code Suggestions only work when you have internet connectivity and can access GitLab.com. Code Suggestions are not available for self-managed customers, nor customers operating within an air-gapped environment. +Code Suggestions only work when you have internet connectivity and can access GitLab.com. +Code Suggestions are not available for self-managed customers, nor customers operating within an offline environment. ### Stability and performance -This feature is currently in [Beta](/ee/policy/alpha-beta-support.md#beta). While the Code Suggestions inference API operates completely within the GitLab.com enterprise infrastructure, we expect a high demand for this Beta feature, which may cause degraded performance or unexpected downtime of the feature. We have built this feature to gracefully degrade and have controls in place to allow us to mitigate abuse or misuse. GitLab may disable this feature for any or all customers at any time at our discretion. +This feature is currently in [Beta](/ee/policy/alpha-beta-support.md#beta). +While the Code Suggestions inference API operates completely within the GitLab.com enterprise infrastructure, +we expect a high demand for this Beta feature, which may cause degraded performance or unexpected downtime +of the feature. We have built this feature to gracefully degrade and have controls in place to allow us to +mitigate abuse or misuse. GitLab may disable this feature for any or all customers at any time at our discretion. ### Model accuracy and quality -While in Beta, Code Suggestions can generate low-quality, incomplete, and possibly insecure code. We strongly encourage all beta users to leverage GitLab native [Code Quality Scanning](../../../ci/testing/code_quality.md) and [Security Scanning](../../application_security/index.md) capabilities. +While in Beta, Code Suggestions can generate low-quality, incomplete, and possibly insecure code. +We strongly encourage all beta users to leverage GitLab native +[Code Quality Scanning](../../../ci/testing/code_quality.md) and +[Security Scanning](../../application_security/index.md) capabilities. -GitLab uses a customized open source dataset to fine-tune the model to support multiple languages. Based on the languages you code in, GitLab routes the request to a targeted inference and prompt engine to get relevant suggestions. +GitLab uses a customized open source dataset to fine-tune the model to support multiple languages. +Based on the languages you code in, GitLab routes the request to a targeted inference and prompt engine +to get relevant suggestions. -GitLab is actively refining these models to improve the quality of recommendations, add support for more languages, and add protections to limit personal data, insecure code, and other unwanted behavior that the model may have learned from training data. +GitLab is actively refining these models to: + +- Improve the quality of recommendations. +- Add support for more languages. +- Add protections to limit personal data, insecure code, and other unwanted behavior + that the model may have learned from training data. ## Known limitations -While in Beta, we are working on improving the accuracy of overall generated content. However, Code Suggestions may generate suggestions that are: +While in Beta, we are working on improving the accuracy of overall generated content. +However, Code Suggestions may generate suggestions that are: - Low-quality - Incomplete diff --git a/lib/gitlab/ci/status/build/erased.rb b/lib/gitlab/ci/status/build/erased.rb index d74cfc1ee77..c3430b8cc1c 100644 --- a/lib/gitlab/ci/status/build/erased.rb +++ b/lib/gitlab/ci/status/build/erased.rb @@ -7,8 +7,8 @@ module Gitlab class Erased < Status::Extended def illustration { - image: 'illustrations/erased-log_empty.svg', - size: 'svg-430', + image: 'illustrations/empty-state/empty-projects-deleted-md.svg', + size: 'svg-150', title: _('Job has been erased') } end diff --git a/lib/gitlab/registration_features/password_complexity.rb b/lib/gitlab/registration_features/password_complexity.rb new file mode 100644 index 00000000000..6d165a7a665 --- /dev/null +++ b/lib/gitlab/registration_features/password_complexity.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +module Gitlab + module RegistrationFeatures + class PasswordComplexity + def self.feature_available? + ::License.feature_available?(:password_complexity) || + ::GitlabSubscriptions::Features.usage_ping_feature?(:password_complexity) + end + end + end +end diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 9f097e63b8b..9df05bf3889 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -1904,6 +1904,9 @@ msgstr "" msgid "AI|Responses generated by AI" msgstr "" +msgid "AI|Send chat message." +msgstr "" + msgid "AI|Something went wrong. Please try again later" msgstr "" @@ -16911,6 +16914,9 @@ msgstr "" msgid "Environments|Commit" msgstr "" +msgid "Environments|Create an environment" +msgstr "" + msgid "Environments|Delete" msgstr "" @@ -16935,7 +16941,10 @@ msgstr "" msgid "Environments|Edit your search and try again" msgstr "" -msgid "Environments|Enable review app" +msgid "Environments|Enable Review Apps" +msgstr "" + +msgid "Environments|Enable review apps" msgstr "" msgid "Environments|Environment" @@ -16944,10 +16953,10 @@ msgstr "" msgid "Environments|Environments" msgstr "" -msgid "Environments|Environments are places where code gets deployed, such as staging or production." +msgid "Environments|Environments are places where code gets deployed, such as staging or production. You can create an environment in the UI or in your .gitlab-ci.yml file. You can also enable review apps, which assist with providing an environment to showcase product changes. %{linkStart}Learn more%{linkEnd} about environments." msgstr "" -msgid "Environments|How do I create an environment?" +msgid "Environments|Get started with environments" msgstr "" msgid "Environments|Job" @@ -16959,6 +16968,12 @@ msgstr "" msgid "Environments|Learn more about stopping environments" msgstr "" +msgid "Environments|New" +msgstr "" + +msgid "Environments|New Environment" +msgstr "" + msgid "Environments|New environment" msgstr "" @@ -17037,12 +17052,6 @@ msgstr "" msgid "Environments|Updated" msgstr "" -msgid "Environments|You don't have any environments." -msgstr "" - -msgid "Environments|You don't have any stopped environments." -msgstr "" - msgid "Environments|by %{avatar}" msgstr "" @@ -19430,9 +19439,6 @@ msgstr "" msgid "Geo|Filter by status" msgstr "" -msgid "Geo|Full details" -msgstr "" - msgid "Geo|Geo Settings" msgstr "" @@ -29478,9 +29484,6 @@ msgstr "" msgid "New Deploy Key" msgstr "" -msgid "New Environment" -msgstr "" - msgid "New Epic" msgstr "" @@ -32908,6 +32911,12 @@ msgstr "" msgid "Pipelines settings for '%{project_name}' were successfully updated." msgstr "" +msgid "PipelinesAiAssistant|Ai assistant" +msgstr "" + +msgid "PipelinesAiAssistant|Chat with AI assistant" +msgstr "" + msgid "Pipelines|\"Hello world\" with GitLab CI" msgstr "" @@ -37254,7 +37263,10 @@ msgstr "" msgid "Releases are based on Git tags. We recommend tags that use semantic versioning, for example %{codeStart}1.0.0%{codeEnd}, %{codeStart}2.1.0-pre%{codeEnd}." msgstr "" -msgid "Releases|New Release" +msgid "Releases|New" +msgstr "" + +msgid "Releases|Releases" msgstr "" msgid "Releases|Tag message" @@ -38403,9 +38415,6 @@ msgstr "" msgid "Review time is the amount of time since the first comment in a merge request." msgstr "" -msgid "ReviewApp|Enable Review App" -msgstr "" - msgid "Reviewer" msgid_plural "%d Reviewers" msgstr[0] "" @@ -44201,6 +44210,9 @@ msgstr "" msgid "TagsPage|Filter by tag name" msgstr "" +msgid "TagsPage|New" +msgstr "" + msgid "TagsPage|New Tag" msgstr "" diff --git a/spec/controllers/admin/clusters_controller_spec.rb b/spec/controllers/admin/clusters_controller_spec.rb index a47bac4d2ef..d04cd20f4e6 100644 --- a/spec/controllers/admin/clusters_controller_spec.rb +++ b/spec/controllers/admin/clusters_controller_spec.rb @@ -284,20 +284,37 @@ RSpec.describe Admin::ClustersController, feature_category: :deployment_manageme end describe 'functionality' do - render_views + context 'when remove_monitor_metrics FF is disabled' do + before do + stub_feature_flags(remove_monitor_metrics: false) + end - it 'responds successfully' do - get_show + render_views - expect(response).to have_gitlab_http_status(:ok) - expect(assigns(:cluster)).to eq(cluster) + it 'responds successfully' do + get_show + + expect(response).to have_gitlab_http_status(:ok) + expect(assigns(:cluster)).to eq(cluster) + end + + it 'renders integration tab view' do + get_show(tab: 'integrations') + + expect(response).to render_template('clusters/clusters/_integrations') + expect(response).to have_gitlab_http_status(:ok) + end end - it 'renders integration tab view' do - get_show(tab: 'integrations') + context 'when remove_monitor_metrics FF is enabled' do + render_views - expect(response).to render_template('clusters/clusters/_integrations') - expect(response).to have_gitlab_http_status(:ok) + it 'renders details tab view' do + get_show(tab: 'integrations') + + expect(response).to render_template('clusters/clusters/_details') + expect(response).to have_gitlab_http_status(:ok) + end end end diff --git a/spec/controllers/groups/clusters_controller_spec.rb b/spec/controllers/groups/clusters_controller_spec.rb index 410579c0bed..f36494c3d78 100644 --- a/spec/controllers/groups/clusters_controller_spec.rb +++ b/spec/controllers/groups/clusters_controller_spec.rb @@ -354,20 +354,37 @@ RSpec.describe Groups::ClustersController, feature_category: :deployment_managem end describe 'functionality' do - render_views + context 'when remove_monitor_metrics FF is disabled' do + before do + stub_feature_flags(remove_monitor_metrics: false) + end - it 'renders view' do - go + render_views - expect(response).to have_gitlab_http_status(:ok) - expect(assigns(:cluster)).to eq(cluster) + it 'renders view' do + go + + expect(response).to have_gitlab_http_status(:ok) + expect(assigns(:cluster)).to eq(cluster) + end + + it 'renders integration tab view', :aggregate_failures do + go(tab: 'integrations') + + expect(response).to render_template('clusters/clusters/_integrations') + expect(response).to have_gitlab_http_status(:ok) + end end - it 'renders integration tab view', :aggregate_failures do - go(tab: 'integrations') + context 'when remove_monitor_metrics FF is enabled' do + render_views - expect(response).to render_template('clusters/clusters/_integrations') - expect(response).to have_gitlab_http_status(:ok) + it 'renders details tab view', :aggregate_failures do + go(tab: 'integrations') + + expect(response).to render_template('clusters/clusters/_details') + expect(response).to have_gitlab_http_status(:ok) + end end end diff --git a/spec/controllers/jira_connect/branches_controller_spec.rb b/spec/controllers/jira_connect/branches_controller_spec.rb index 45daf3b5309..cf4dfaface6 100644 --- a/spec/controllers/jira_connect/branches_controller_spec.rb +++ b/spec/controllers/jira_connect/branches_controller_spec.rb @@ -17,7 +17,7 @@ RSpec.describe JiraConnect::BranchesController do expect(response).to be_successful expect(assigns(:new_branch_data)).to include( initial_branch_name: 'ACME-123-my-issue', - success_state_svg_path: start_with('/assets/illustrations/merge_requests-') + success_state_svg_path: start_with('/assets/illustrations/empty-state/empty-merge-requests-md-') ) end diff --git a/spec/controllers/projects/clusters_controller_spec.rb b/spec/controllers/projects/clusters_controller_spec.rb index 8bddf51a434..f976b5bfe67 100644 --- a/spec/controllers/projects/clusters_controller_spec.rb +++ b/spec/controllers/projects/clusters_controller_spec.rb @@ -397,20 +397,37 @@ RSpec.describe Projects::ClustersController, feature_category: :deployment_manag end describe 'functionality' do - render_views + context 'when remove_monitor_metrics FF is disabled' do + before do + stub_feature_flags(remove_monitor_metrics: false) + end - it "renders view" do - go + render_views - expect(response).to have_gitlab_http_status(:ok) - expect(assigns(:cluster)).to eq(cluster) + it "renders view" do + go + + expect(response).to have_gitlab_http_status(:ok) + expect(assigns(:cluster)).to eq(cluster) + end + + it 'renders integration tab view' do + go(tab: 'integrations') + + expect(response).to render_template('clusters/clusters/_integrations') + expect(response).to have_gitlab_http_status(:ok) + end end - it 'renders integration tab view' do - go(tab: 'integrations') + context 'when remove_monitor_metrics FF is enabled' do + render_views - expect(response).to render_template('clusters/clusters/_integrations') - expect(response).to have_gitlab_http_status(:ok) + it 'renders details tab view', :aggregate_failures do + go(tab: 'integrations') + + expect(response).to render_template('clusters/clusters/_details') + expect(response).to have_gitlab_http_status(:ok) + end end end diff --git a/spec/features/projects/environments/environments_spec.rb b/spec/features/projects/environments/environments_spec.rb index 91651617966..b50fc59ac32 100644 --- a/spec/features/projects/environments/environments_spec.rb +++ b/spec/features/projects/environments/environments_spec.rb @@ -31,16 +31,16 @@ RSpec.describe 'Environments page', :js, feature_category: :projects do end describe 'page tabs' do - it 'shows "Available" and "Stopped" tab with links' do - visit_environments(project) - - expect(page).to have_link(_('Available')) - expect(page).to have_link(_('Stopped')) - end - describe 'with one available environment' do let!(:environment) { create(:environment, project: project, state: :available) } + it 'shows "Available" and "Stopped" tab with links' do + visit_environments(project) + + expect(page).to have_link(_('Available')) + expect(page).to have_link(_('Stopped')) + end + describe 'in available tab page' do it 'shows one environment' do visit_environments(project, scope: 'available') @@ -70,7 +70,7 @@ RSpec.describe 'Environments page', :js, feature_category: :projects do it 'shows no environments' do visit_environments(project, scope: 'stopped') - expect(page).to have_content(s_('Environments|You don\'t have any stopped environments.')) + expect(page).to have_content(s_('Environments|Get started with environments')) end end @@ -99,7 +99,7 @@ RSpec.describe 'Environments page', :js, feature_category: :projects do it 'shows no environments' do visit_environments(project, scope: 'available') - expect(page).to have_content(s_('Environments|You don\'t have any environments.')) + expect(page).to have_content(s_('Environments|Get started with environments')) end end @@ -119,11 +119,11 @@ RSpec.describe 'Environments page', :js, feature_category: :projects do visit_environments(project) end - it 'does not show environments and counters are set to zero' do - expect(page).to have_content(s_('Environments|You don\'t have any environments.')) + it 'does not show environments and tabs' do + expect(page).to have_content(s_('Environments|Get started with environments')) - expect(page).to have_link("#{_('Available')} 0") - expect(page).to have_link("#{_('Stopped')} 0") + expect(page).not_to have_link(_('Available')) + expect(page).not_to have_link(_('Stopped')) end end @@ -403,7 +403,7 @@ RSpec.describe 'Environments page', :js, feature_category: :projects do it 'does have a new environment button' do visit_environments(project) - expect(page).to have_link('New environment') + expect(page).to have_link('Create an environment') end describe 'creating a new environment' do @@ -415,7 +415,7 @@ RSpec.describe 'Environments page', :js, feature_category: :projects do let(:role) { :developer } it 'developer creates a new environment with a valid name' do - click_link 'New environment' + click_link 'Create an environment' fill_in('Name', with: 'production') click_on 'Save' @@ -423,7 +423,7 @@ RSpec.describe 'Environments page', :js, feature_category: :projects do end it 'developer creates a new environment with invalid name' do - click_link 'New environment' + click_link 'Create an environment' fill_in('Name', with: 'name,with,commas') click_on 'Save' diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb index 06d894fd5f1..d3ccde3d2e1 100644 --- a/spec/features/projects/pipelines/pipelines_spec.rb +++ b/spec/features/projects/pipelines/pipelines_spec.rb @@ -697,7 +697,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do it 'creates a new pipeline' do expect do - click_on 'Run pipeline' + find('[data-testid="run_pipeline_button"]', text: 'Run pipeline').click wait_for_requests end .to change { Ci::Pipeline.count }.by(1) @@ -713,7 +713,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do end expect do - click_on 'Run pipeline' + find('[data-testid="run_pipeline_button"]', text: 'Run pipeline').click wait_for_requests end .to change { Ci::Pipeline.count }.by(1) @@ -726,7 +726,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do context 'without gitlab-ci.yml' do before do - click_on 'Run pipeline' + find('[data-testid="run_pipeline_button"]', text: 'Run pipeline').click wait_for_requests end @@ -736,7 +736,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do stub_ci_pipeline_to_return_yaml_file expect do - click_on 'Run pipeline' + find('[data-testid="run_pipeline_button"]', text: 'Run pipeline').click wait_for_requests end .to change { Ci::Pipeline.count }.by(1) diff --git a/spec/features/projects/releases/user_creates_release_spec.rb b/spec/features/projects/releases/user_creates_release_spec.rb index ffc319c8453..678c8df666f 100644 --- a/spec/features/projects/releases/user_creates_release_spec.rb +++ b/spec/features/projects/releases/user_creates_release_spec.rb @@ -25,11 +25,12 @@ RSpec.describe 'User creates release', :js, feature_category: :continuous_delive it 'renders the breadcrumbs', :aggregate_failures do within('.breadcrumbs') do - expect(page).to have_content("#{project.creator.name} #{project.name} New Release") + expect(page).to have_content("#{project.creator.name} #{project.name} Releases New") expect(page).to have_link(project.creator.name, href: user_path(project.creator)) expect(page).to have_link(project.name, href: project_path(project)) - expect(page).to have_link('New Release', href: new_project_release_path(project)) + expect(page).to have_link('Releases', href: project_releases_path(project)) + expect(page).to have_link('New', href: new_project_release_path(project)) end end diff --git a/spec/frontend/ci/runner/components/cells/runner_summary_cell_spec.js b/spec/frontend/ci/runner/components/cells/runner_summary_cell_spec.js index 23ec170961a..64e9c11a584 100644 --- a/spec/frontend/ci/runner/components/cells/runner_summary_cell_spec.js +++ b/spec/frontend/ci/runner/components/cells/runner_summary_cell_spec.js @@ -82,14 +82,15 @@ describe('RunnerTypeCell', () => { it('Displays the runner description', () => { expect(wrapper.text()).toContain(mockRunner.description); + expect(wrapper.findByText(I18N_NO_DESCRIPTION).exists()).toBe(false); }); - it('Displays the no runner description', () => { + it('Displays "No description" for missing runner description', () => { createComponent({ description: null, }); - expect(wrapper.text()).toContain(I18N_NO_DESCRIPTION); + expect(wrapper.findByText(I18N_NO_DESCRIPTION).classes()).toContain('gl-text-secondary'); }); it('Displays last contact', () => { diff --git a/spec/frontend/environments/empty_state_spec.js b/spec/frontend/environments/empty_state_spec.js index d067c4c80e0..593200859e4 100644 --- a/spec/frontend/environments/empty_state_spec.js +++ b/spec/frontend/environments/empty_state_spec.js @@ -11,12 +11,17 @@ describe('~/environments/components/empty_state.vue', () => { const findNewEnvironmentLink = () => wrapper.findByRole('link', { - name: s__('Environments|New environment'), + name: s__('Environments|Create an environment'), }); const findDocsLink = () => wrapper.findByRole('link', { - name: s__('Environments|How do I create an environment?'), + name: 'Learn more', + }); + + const finfEnablingReviewButton = () => + wrapper.findByRole('button', { + name: s__('Environments|Enable review apps'), }); const createWrapper = ({ propsData = {} } = {}) => @@ -29,38 +34,44 @@ describe('~/environments/components/empty_state.vue', () => { provide: { newEnvironmentPath: NEW_PATH }, }); - it('shows an empty state for available environments', () => { - wrapper = createWrapper(); - - const title = wrapper.findByRole('heading', { - name: s__("Environments|You don't have any environments."), + describe('without search term', () => { + beforeEach(() => { + wrapper = createWrapper(); }); - expect(title.exists()).toBe(true); - }); + it('shows an empty state environments', () => { + const title = wrapper.findByRole('heading', { + name: s__('Environments|Get started with environments'), + }); - it('shows an empty state for stopped environments', () => { - wrapper = createWrapper({ propsData: { scope: ENVIRONMENTS_SCOPE.STOPPED } }); + expect(title.exists()).toBe(true); + }); + + it('shows a link to the the help path', () => { + const link = findDocsLink(); - const title = wrapper.findByRole('heading', { - name: s__("Environments|You don't have any stopped environments."), + expect(link.attributes('href')).toBe(HELP_PATH); }); - expect(title.exists()).toBe(true); - }); + it('shows a link to creating a new environment', () => { + const link = findNewEnvironmentLink(); - it('shows a link to the the help path', () => { - wrapper = createWrapper(); + expect(link.attributes('href')).toBe(NEW_PATH); + }); - const link = findDocsLink(); + it('shows a button to enable review apps', () => { + const button = finfEnablingReviewButton(); - expect(link.attributes('href')).toBe(HELP_PATH); - }); + expect(button.exists()).toBe(true); + }); + + it('should emit enable review', () => { + const button = finfEnablingReviewButton(); - it('hides a link to creating a new environment', () => { - const link = findNewEnvironmentLink(); + button.vm.$emit('click'); - expect(link.exists()).toBe(false); + expect(wrapper.emitted('enable-review')).toBeDefined(); + }); }); describe('with search term', () => { @@ -86,10 +97,16 @@ describe('~/environments/components/empty_state.vue', () => { expect(link.exists()).toBe(false); }); - it('shows a link to create a new environment', () => { + it('hide a link to create a new environment', () => { const link = findNewEnvironmentLink(); - expect(link.attributes('href')).toBe(NEW_PATH); + expect(link.exists()).toBe(false); + }); + + it('hide a button to enable review apps', () => { + const button = finfEnablingReviewButton(); + + expect(button.exists()).toBe(false); }); }); }); diff --git a/spec/frontend/environments/enable_review_app_modal_spec.js b/spec/frontend/environments/enable_review_app_modal_spec.js index ee728775980..f5571609931 100644 --- a/spec/frontend/environments/enable_review_app_modal_spec.js +++ b/spec/frontend/environments/enable_review_app_modal_spec.js @@ -10,7 +10,7 @@ jest.mock('lodash/uniqueId', () => (x) => `${x}77`); const EXPECTED_COPY_PRE_ID = 'enable-review-app-copy-string-77'; -describe('Enable Review App Modal', () => { +describe('Enable Review Apps Modal', () => { let wrapper; let modal; diff --git a/spec/frontend/environments/environments_app_spec.js b/spec/frontend/environments/environments_app_spec.js index 6f2ee6f06cd..dc450eb2aa7 100644 --- a/spec/frontend/environments/environments_app_spec.js +++ b/spec/frontend/environments/environments_app_spec.js @@ -170,12 +170,8 @@ describe('~/environments/components/environments_app.vue', () => { folder: resolvedFolder, }); - const button = wrapper.findByRole('button', { name: s__('Environments|Enable review app') }); - button.trigger('click'); - - await nextTick(); - - expect(wrapper.findByText(s__('ReviewApp|Enable Review App')).exists()).toBe(true); + const button = wrapper.findByRole('button', { name: s__('Environments|Enable review apps') }); + expect(button.exists()).toBe(true); }); it('should not show a button to open the review app modal if review apps are configured', async () => { @@ -187,7 +183,7 @@ describe('~/environments/components/environments_app.vue', () => { folder: resolvedFolder, }); - const button = wrapper.findByRole('button', { name: s__('Environments|Enable review app') }); + const button = wrapper.findByRole('button', { name: s__('Environments|Enable review apps') }); expect(button.exists()).toBe(false); }); diff --git a/spec/frontend/google_tag_manager/index_spec.js b/spec/frontend/google_tag_manager/index_spec.js index ec9e1ef8e5f..dd8e886e6bc 100644 --- a/spec/frontend/google_tag_manager/index_spec.js +++ b/spec/frontend/google_tag_manager/index_spec.js @@ -6,7 +6,6 @@ import { trackProjectImport, trackNewRegistrations, trackSaasTrialSubmit, - trackSaasTrialSkip, trackSaasTrialGroup, trackSaasTrialGetStarted, trackTrialAcceptTerms, @@ -143,9 +142,6 @@ describe('~/google_tag_manager/index', () => { describe.each([ createOmniAuthTestCase(trackFreeTrialAccountSubmissions, 'freeThirtyDayTrial'), createOmniAuthTestCase(trackNewRegistrations, 'standardSignUp'), - createTestCase(trackSaasTrialSkip, { - links: [{ cls: 'js-skip-trial', expectation: { event: 'saasTrialSkip' } }], - }), createTestCase(trackSaasTrialGroup, { forms: [{ cls: 'js-saas-trial-group', expectation: { event: 'saasTrialGroup' } }], }), diff --git a/spec/frontend/pipelines/pipelines_spec.js b/spec/frontend/pipelines/pipelines_spec.js index 68a430b0403..f0772bce167 100644 --- a/spec/frontend/pipelines/pipelines_spec.js +++ b/spec/frontend/pipelines/pipelines_spec.js @@ -42,7 +42,7 @@ describe('Pipelines', () => { let trackingSpy; const paths = { - emptyStateSvgPath: '/assets/illustrations/pipelines_empty.svg', + emptyStateSvgPath: '/assets/illustrations/empty-state/empty-pipeline-md.svg', errorStateSvgPath: '/assets/illustrations/pipelines_failed.svg', noPipelinesSvgPath: '/assets/illustrations/pipelines_pending.svg', ciLintPath: '/ci/lint', @@ -53,7 +53,7 @@ describe('Pipelines', () => { }; const noPermissions = { - emptyStateSvgPath: '/assets/illustrations/pipelines_empty.svg', + emptyStateSvgPath: '/assets/illustrations/empty-state/empty-pipeline-md.svg', errorStateSvgPath: '/assets/illustrations/pipelines_failed.svg', noPipelinesSvgPath: '/assets/illustrations/pipelines_pending.svg', }; diff --git a/spec/frontend/super_sidebar/components/help_center_spec.js b/spec/frontend/super_sidebar/components/help_center_spec.js index b48d4469362..808c30436a3 100644 --- a/spec/frontend/super_sidebar/components/help_center_spec.js +++ b/spec/frontend/super_sidebar/components/help_center_spec.js @@ -4,7 +4,7 @@ import toggleWhatsNewDrawer from '~/whats_new'; import { mountExtended } from 'helpers/vue_test_utils_helper'; import HelpCenter from '~/super_sidebar/components/help_center.vue'; import { helpPagePath } from '~/helpers/help_page_helper'; -import { PROMO_URL } from 'jh_else_ce/lib/utils/url_utility'; +import { DOMAIN, PROMO_URL } from 'jh_else_ce/lib/utils/url_utility'; import { useLocalStorageSpy } from 'helpers/local_storage_helper'; import { STORAGE_KEY } from '~/whats_new/utils/notification'; import { helpCenterState } from '~/super_sidebar/constants'; @@ -52,7 +52,7 @@ describe('HelpCenter component', () => { }, { text: HelpCenter.i18n.docs, - href: 'https://docs.gitlab.com', + href: `https://docs.${DOMAIN}`, extraAttrs: trackingAttrs('gitlab_documentation'), }, { @@ -62,7 +62,7 @@ describe('HelpCenter component', () => { }, { text: HelpCenter.i18n.forum, - href: 'https://forum.gitlab.com/', + href: `https://forum.${DOMAIN}/`, extraAttrs: trackingAttrs('community_forum'), }, { @@ -72,7 +72,7 @@ describe('HelpCenter component', () => { }, { text: HelpCenter.i18n.feedback, - href: 'https://about.gitlab.com/submit-feedback', + href: `${PROMO_URL}/submit-feedback`, extraAttrs: trackingAttrs('submit_feedback'), }, ]; diff --git a/spec/helpers/clusters_helper_spec.rb b/spec/helpers/clusters_helper_spec.rb index 9a3cd5fd18d..41a8dea7f5a 100644 --- a/spec/helpers/clusters_helper_spec.rb +++ b/spec/helpers/clusters_helper_spec.rb @@ -166,6 +166,90 @@ RSpec.describe ClustersHelper do end end + describe '#render_cluster_info_tab_content' do + subject { helper.render_cluster_info_tab_content(tab, expanded) } + + let(:expanded) { true } + + context 'environments' do + let(:tab) { 'environments' } + + it 'renders environemtns tab' do + expect(helper).to receive(:render_if_exists).with('clusters/clusters/environments') + subject + end + end + + context 'health' do + let(:tab) { 'health' } + + it 'renders details tab' do + expect(helper).to receive(:render).with('details', { expanded: expanded }) + subject + end + end + + context 'apps' do + let(:tab) { 'apps' } + + it 'renders apps tab' do + expect(helper).to receive(:render).with('applications') + subject + end + end + + context 'integrations ' do + let(:tab) { 'integrations' } + + it 'renders details tab' do + expect(helper).to receive(:render).with('details', { expanded: expanded }) + subject + end + end + + context 'settings' do + let(:tab) { 'settings' } + + it 'renders settings tab' do + expect(helper).to receive(:render).with('advanced_settings_container') + subject + end + end + + context 'details ' do + let(:tab) { 'details' } + + it 'renders details tab' do + expect(helper).to receive(:render).with('details', { expanded: expanded }) + subject + end + end + + context 'when remove_monitor_metrics FF is disabled' do + before do + stub_feature_flags(remove_monitor_metrics: false) + end + + context 'health' do + let(:tab) { 'health' } + + it 'renders health tab' do + expect(helper).to receive(:render_if_exists).with('clusters/clusters/health') + subject + end + end + + context 'integrations ' do + let(:tab) { 'integrations' } + + it 'renders integrations tab' do + expect(helper).to receive(:render).with('integrations') + subject + end + end + end + end + describe '#cluster_type_label' do subject { helper.cluster_type_label(cluster_type) } diff --git a/spec/helpers/namespaces_helper_spec.rb b/spec/helpers/namespaces_helper_spec.rb index e288a604be6..e7c8e40da7f 100644 --- a/spec/helpers/namespaces_helper_spec.rb +++ b/spec/helpers/namespaces_helper_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe NamespacesHelper do +RSpec.describe NamespacesHelper, feature_category: :subgroups do let!(:admin) { create(:admin) } let!(:admin_project_creation_level) { nil } let!(:admin_group) do @@ -121,7 +121,7 @@ RSpec.describe NamespacesHelper do end end - describe '#pipeline_usage_app_data' do + describe '#pipeline_usage_app_data', unless: Gitlab.ee?, feature_category: :consumables_cost_management do it 'returns a hash with necessary data for the frontend' do expect(helper.pipeline_usage_app_data(user_group)).to eql({ namespace_actual_plan_name: user_group.actual_plan_name, diff --git a/spec/policies/concerns/policy_actor_spec.rb b/spec/policies/concerns/policy_actor_spec.rb index 7271cbb4a9d..7fd9db67032 100644 --- a/spec/policies/concerns/policy_actor_spec.rb +++ b/spec/policies/concerns/policy_actor_spec.rb @@ -2,7 +2,17 @@ require 'spec_helper' -RSpec.describe PolicyActor do +RSpec.describe PolicyActor, feature_category: :shared do + let(:policy_actor_test_class) do + Class.new do + include PolicyActor + end + end + + before do + stub_const('PolicyActorTestClass', policy_actor_test_class) + end + it 'implements all the methods from user' do methods = subject.instance_methods @@ -10,4 +20,10 @@ RSpec.describe PolicyActor do # initialized. So here we just use an instance expect(build(:user).methods).to include(*methods) end + + describe '#security_policy_bot?' do + subject { PolicyActorTestClass.new.security_policy_bot? } + + it { is_expected.to eq(false) } + end end diff --git a/spec/policies/global_policy_spec.rb b/spec/policies/global_policy_spec.rb index 0d91c288bbc..dce97fab252 100644 --- a/spec/policies/global_policy_spec.rb +++ b/spec/policies/global_policy_spec.rb @@ -10,6 +10,7 @@ RSpec.describe GlobalPolicy, feature_category: :shared do let_it_be(:service_account) { create(:user, :service_account) } let_it_be(:migration_bot) { create(:user, :migration_bot) } let_it_be(:security_bot) { create(:user, :security_bot) } + let_it_be(:security_policy_bot) { create(:user, :security_policy_bot) } let_it_be(:llm_bot) { create(:user, :llm_bot) } let_it_be_with_reload(:current_user) { create(:user) } let_it_be(:user) { create(:user) } @@ -410,6 +411,12 @@ RSpec.describe GlobalPolicy, feature_category: :shared do it { is_expected.to be_allowed(:access_git) } end + context 'security policy bot' do + let(:current_user) { security_policy_bot } + + it { is_expected.to be_allowed(:access_git) } + end + describe 'deactivated user' do before do current_user.deactivate diff --git a/spec/support/rspec_order_todo.yml b/spec/support/rspec_order_todo.yml index 36118361546..82dc6659dbf 100644 --- a/spec/support/rspec_order_todo.yml +++ b/spec/support/rspec_order_todo.yml @@ -9763,7 +9763,7 @@ - './spec/tooling/danger/customer_success_spec.rb' - './spec/tooling/danger/datateam_spec.rb' - './spec/tooling/danger/feature_flag_spec.rb' -- './spec/tooling/danger/product_intelligence_spec.rb' +- './spec/tooling/danger/analytics_instrumentation_spec.rb' - './spec/tooling/danger/project_helper_spec.rb' - './spec/tooling/danger/sidekiq_queues_spec.rb' - './spec/tooling/danger/specs_spec.rb' diff --git a/spec/support/shared_examples/lib/gitlab/gitaly_client_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/gitaly_client_shared_examples.rb index f26b9a4a7bd..d388abb16c6 100644 --- a/spec/support/shared_examples/lib/gitlab/gitaly_client_shared_examples.rb +++ b/spec/support/shared_examples/lib/gitlab/gitaly_client_shared_examples.rb @@ -1,10 +1,12 @@ # frozen_string_literal: true def raw_repo_without_container(repository) - Gitlab::Git::Repository.new(repository.shard, - "#{repository.disk_path}.git", - repository.repo_type.identifier_for_container(repository.container), - repository.container.full_path) + Gitlab::Git::Repository.new( + repository.shard, + "#{repository.disk_path}.git", + repository.repo_type.identifier_for_container(repository.container), + repository.container.full_path + ) end RSpec.shared_examples 'Gitaly feature flag actors are inferred from repository' do diff --git a/spec/support/shared_examples/lib/gitlab/project_search_results_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/project_search_results_shared_examples.rb index f83fecee4ea..0016f1e670d 100644 --- a/spec/support/shared_examples/lib/gitlab/project_search_results_shared_examples.rb +++ b/spec/support/shared_examples/lib/gitlab/project_search_results_shared_examples.rb @@ -38,8 +38,7 @@ RSpec.shared_examples 'access restricted confidential issues' do let(:user) { author } it 'lists project confidential issues' do - expect(objects).to contain_exactly(issue, - security_issue_1) + expect(objects).to contain_exactly(issue, security_issue_1) expect(results.limited_issues_count).to eq 2 end end @@ -48,8 +47,7 @@ RSpec.shared_examples 'access restricted confidential issues' do let(:user) { assignee } it 'lists project confidential issues for assignee' do - expect(objects).to contain_exactly(issue, - security_issue_2) + expect(objects).to contain_exactly(issue, security_issue_2) expect(results.limited_issues_count).to eq 2 end end @@ -60,9 +58,7 @@ RSpec.shared_examples 'access restricted confidential issues' do end it 'lists project confidential issues' do - expect(objects).to contain_exactly(issue, - security_issue_1, - security_issue_2) + expect(objects).to contain_exactly(issue, security_issue_1, security_issue_2) expect(results.limited_issues_count).to eq 3 end end @@ -72,9 +68,7 @@ RSpec.shared_examples 'access restricted confidential issues' do context 'when admin mode is enabled', :enable_admin_mode do it 'lists all project issues' do - expect(objects).to contain_exactly(issue, - security_issue_1, - security_issue_2) + expect(objects).to contain_exactly(issue, security_issue_1, security_issue_2) end end diff --git a/spec/support/shared_examples/lib/sentry/client_shared_examples.rb b/spec/support/shared_examples/lib/sentry/client_shared_examples.rb index e0b411e1e2a..fa3e9bf5340 100644 --- a/spec/support/shared_examples/lib/sentry/client_shared_examples.rb +++ b/spec/support/shared_examples/lib/sentry/client_shared_examples.rb @@ -90,7 +90,9 @@ RSpec.shared_examples 'Sentry API response size limit' do end it 'raises an exception when response is too large' do - expect { subject }.to raise_error(ErrorTracking::SentryClient::ResponseInvalidSizeError, - 'Sentry API response is too big. Limit is 1 MB.') + expect { subject }.to raise_error( + ErrorTracking::SentryClient::ResponseInvalidSizeError, + 'Sentry API response is too big. Limit is 1 MB.' + ) end end diff --git a/spec/support/shared_examples/models/chat_integration_shared_examples.rb b/spec/support/shared_examples/models/chat_integration_shared_examples.rb index 085fec6ff1e..addd37cde32 100644 --- a/spec/support/shared_examples/models/chat_integration_shared_examples.rb +++ b/spec/support/shared_examples/models/chat_integration_shared_examples.rb @@ -221,11 +221,13 @@ RSpec.shared_examples "chat integration" do |integration_name| context "with commit comment" do let_it_be(:note) do - create(:note_on_commit, - author: user, - project: project, - commit_id: project.repository.commit.id, - note: "a comment on a commit") + create( + :note_on_commit, + author: user, + project: project, + commit_id: project.repository.commit.id, + note: "a comment on a commit" + ) end it_behaves_like "triggered #{integration_name} integration" @@ -261,9 +263,11 @@ RSpec.shared_examples "chat integration" do |integration_name| context "with failed pipeline" do let_it_be(:pipeline) do - create(:ci_pipeline, - project: project, status: "failed", - sha: project.commit.sha, ref: project.default_branch) + create( + :ci_pipeline, + project: project, status: "failed", + sha: project.commit.sha, ref: project.default_branch + ) end it_behaves_like "triggered #{integration_name} integration" @@ -271,9 +275,11 @@ RSpec.shared_examples "chat integration" do |integration_name| context "with succeeded pipeline" do let_it_be(:pipeline) do - create(:ci_pipeline, - project: project, status: "success", - sha: project.commit.sha, ref: project.default_branch) + create( + :ci_pipeline, + project: project, status: "success", + sha: project.commit.sha, ref: project.default_branch + ) end context "with default notify_only_broken_pipelines" do diff --git a/spec/support/shared_examples/models/clusters/prometheus_client_shared.rb b/spec/support/shared_examples/models/clusters/prometheus_client_shared.rb index 8d6dcfef925..140968da272 100644 --- a/spec/support/shared_examples/models/clusters/prometheus_client_shared.rb +++ b/spec/support/shared_examples/models/clusters/prometheus_client_shared.rb @@ -41,10 +41,12 @@ RSpec.shared_examples '#prometheus_client shared' do subject.cluster.platform_kubernetes.namespace = 'a-namespace' stub_kubeclient_discover(cluster.platform_kubernetes.api_url) - create(:cluster_kubernetes_namespace, - cluster: cluster, - cluster_project: cluster.cluster_project, - project: cluster.cluster_project.project) + create( + :cluster_kubernetes_namespace, + cluster: cluster, + cluster_project: cluster.cluster_project, + project: cluster.cluster_project.project + ) end it 'creates proxy prometheus_client' do diff --git a/spec/support/shared_examples/models/diff_note_after_commit_shared_examples.rb b/spec/support/shared_examples/models/diff_note_after_commit_shared_examples.rb index 64390ccdc25..f1f6d799cf3 100644 --- a/spec/support/shared_examples/models/diff_note_after_commit_shared_examples.rb +++ b/spec/support/shared_examples/models/diff_note_after_commit_shared_examples.rb @@ -10,10 +10,12 @@ RSpec.shared_examples 'a valid diff note with after commit callback' do it 'raises an error' do allow(diff_file_from_repository).to receive(:line_for_position).with(position).and_return(nil) - expect { subject.save! }.to raise_error(::DiffNote::NoteDiffFileCreationError, - "Failed to find diff line for: #{diff_file_from_repository.file_path}, "\ - "old_line: #{position.old_line}"\ - ", new_line: #{position.new_line}") + expect { subject.save! }.to raise_error( + ::DiffNote::NoteDiffFileCreationError, + "Failed to find diff line for: #{diff_file_from_repository.file_path}, "\ + "old_line: #{position.old_line}"\ + ", new_line: #{position.new_line}" + ) end end diff --git a/spec/support/shared_examples/models/member_shared_examples.rb b/spec/support/shared_examples/models/member_shared_examples.rb index 32b1cf24c0f..e9e25dee746 100644 --- a/spec/support/shared_examples/models/member_shared_examples.rb +++ b/spec/support/shared_examples/models/member_shared_examples.rb @@ -508,11 +508,13 @@ RSpec.shared_examples_for "bulk member creation" do create(:member_task, member: member, project: task_project, tasks_to_be_done: %w(code ci)) expect do - described_class.add_members(source, - [user1.id], - :developer, - tasks_to_be_done: %w(issues), - tasks_project_id: task_project.id) + described_class.add_members( + source, + [user1.id], + :developer, + tasks_to_be_done: %w(issues), + tasks_project_id: task_project.id + ) end.not_to change { MemberTask.count } member.reset @@ -522,11 +524,13 @@ RSpec.shared_examples_for "bulk member creation" do it 'adds tasks to be done if they do not exist', :aggregate_failures do expect do - described_class.add_members(source, - [user1.id], - :developer, - tasks_to_be_done: %w(issues), - tasks_project_id: task_project.id) + described_class.add_members( + source, + [user1.id], + :developer, + tasks_to_be_done: %w(issues), + tasks_project_id: task_project.id + ) end.to change { MemberTask.count }.by(1) member = source.members.find_by(user_id: user1.id) diff --git a/spec/support/shared_examples/projects/container_repository/cleanup_tags_service_shared_examples.rb b/spec/support/shared_examples/projects/container_repository/cleanup_tags_service_shared_examples.rb index f70621673d5..f9f8435c211 100644 --- a/spec/support/shared_examples/projects/container_repository/cleanup_tags_service_shared_examples.rb +++ b/spec/support/shared_examples/projects/container_repository/cleanup_tags_service_shared_examples.rb @@ -7,9 +7,9 @@ RSpec.shared_examples 'when regex matching everything is specified' do end it_behaves_like 'removing the expected tags', - service_response_extra: service_response_extra, - supports_caching: supports_caching, - delete_expectations: delete_expectations + service_response_extra: service_response_extra, + supports_caching: supports_caching, + delete_expectations: delete_expectations context 'with deprecated name_regex param' do let(:params) do @@ -17,9 +17,9 @@ RSpec.shared_examples 'when regex matching everything is specified' do end it_behaves_like 'removing the expected tags', - service_response_extra: service_response_extra, - supports_caching: supports_caching, - delete_expectations: delete_expectations + service_response_extra: service_response_extra, + supports_caching: supports_caching, + delete_expectations: delete_expectations end end @@ -31,9 +31,9 @@ RSpec.shared_examples 'when regex matching everything is specified and latest is end it_behaves_like 'removing the expected tags', - service_response_extra: service_response_extra, - supports_caching: supports_caching, - delete_expectations: delete_expectations + service_response_extra: service_response_extra, + supports_caching: supports_caching, + delete_expectations: delete_expectations end RSpec.shared_examples 'when delete regex matching specific tags is used' do @@ -43,9 +43,9 @@ RSpec.shared_examples 'when delete regex matching specific tags is used' do end it_behaves_like 'removing the expected tags', - service_response_extra: service_response_extra, - supports_caching: supports_caching, - delete_expectations: [%w[C D]] + service_response_extra: service_response_extra, + supports_caching: supports_caching, + delete_expectations: [%w[C D]] end RSpec.shared_examples 'when delete regex matching specific tags is used with overriding allow regex' do @@ -58,9 +58,9 @@ RSpec.shared_examples 'when delete regex matching specific tags is used with ove end it_behaves_like 'removing the expected tags', - service_response_extra: service_response_extra, - supports_caching: supports_caching, - delete_expectations: [%w[D]] + service_response_extra: service_response_extra, + supports_caching: supports_caching, + delete_expectations: [%w[D]] context 'with name_regex_delete overriding deprecated name_regex' do let(:params) do @@ -71,9 +71,9 @@ RSpec.shared_examples 'when delete regex matching specific tags is used with ove end it_behaves_like 'removing the expected tags', - service_response_extra: service_response_extra, - supports_caching: supports_caching, - delete_expectations: [%w[D]] + service_response_extra: service_response_extra, + supports_caching: supports_caching, + delete_expectations: [%w[D]] end end @@ -87,9 +87,9 @@ RSpec.shared_examples 'with allow regex value' do end it_behaves_like 'removing the expected tags', - service_response_extra: service_response_extra, - supports_caching: supports_caching, - delete_expectations: delete_expectations + service_response_extra: service_response_extra, + supports_caching: supports_caching, + delete_expectations: delete_expectations end RSpec.shared_examples 'when keeping only N tags' do @@ -135,9 +135,9 @@ RSpec.shared_examples 'when removing keeping only 3' do end it_behaves_like 'removing the expected tags', - service_response_extra: service_response_extra, - supports_caching: supports_caching, - delete_expectations: delete_expectations + service_response_extra: service_response_extra, + supports_caching: supports_caching, + delete_expectations: delete_expectations end RSpec.shared_examples 'when removing older than 1 day' do @@ -150,9 +150,9 @@ RSpec.shared_examples 'when removing older than 1 day' do end it_behaves_like 'removing the expected tags', - service_response_extra: service_response_extra, - supports_caching: supports_caching, - delete_expectations: delete_expectations + service_response_extra: service_response_extra, + supports_caching: supports_caching, + delete_expectations: delete_expectations end RSpec.shared_examples 'when combining all parameters' do @@ -166,9 +166,9 @@ RSpec.shared_examples 'when combining all parameters' do end it_behaves_like 'removing the expected tags', - service_response_extra: service_response_extra, - supports_caching: supports_caching, - delete_expectations: delete_expectations + service_response_extra: service_response_extra, + supports_caching: supports_caching, + delete_expectations: delete_expectations end RSpec.shared_examples 'when running a container_expiration_policy' do diff --git a/spec/support/shared_examples/quick_actions/issuable/max_issuable_examples.rb b/spec/support/shared_examples/quick_actions/issuable/max_issuable_examples.rb index b5704ad8f17..9b03cdbb3bf 100644 --- a/spec/support/shared_examples/quick_actions/issuable/max_issuable_examples.rb +++ b/spec/support/shared_examples/quick_actions/issuable/max_issuable_examples.rb @@ -23,11 +23,11 @@ RSpec.shared_examples 'does not exceed the issuable size limit' do end note = described_class.new(project, user, opts.merge( - note: note_text, - noteable_type: noteable_type, - noteable_id: issuable.id, - confidential: false - )).execute + note: note_text, + noteable_type: noteable_type, + noteable_id: issuable.id, + confidential: false + )).execute expect(note.errors[:validation]).to match_array([validation_message]) end @@ -44,11 +44,11 @@ RSpec.shared_examples 'does not exceed the issuable size limit' do end note = described_class.new(project, user, opts.merge( - note: note_text, - noteable_type: noteable_type, - noteable_id: issuable.id, - confidential: false - )).execute + note: note_text, + noteable_type: noteable_type, + noteable_id: issuable.id, + confidential: false + )).execute expect(note.errors[:validation]).to be_empty end diff --git a/spec/support/shared_examples/views/pipeline_status_changes_email.rb b/spec/support/shared_examples/views/pipeline_status_changes_email.rb index 698f11c2216..fe6cc5e03d2 100644 --- a/spec/support/shared_examples/views/pipeline_status_changes_email.rb +++ b/spec/support/shared_examples/views/pipeline_status_changes_email.rb @@ -8,12 +8,14 @@ RSpec.shared_examples 'pipeline status changes email' do let(:merge_request) { create(:merge_request, :simple, source_project: project) } let(:pipeline) do - create(:ci_pipeline, - project: project, - user: user, - ref: project.default_branch, - sha: project.commit.sha, - status: status) + create( + :ci_pipeline, + project: project, + user: user, + ref: project.default_branch, + sha: project.commit.sha, + status: status + ) end before do diff --git a/spec/tooling/danger/product_intelligence_spec.rb b/spec/tooling/danger/analytics_instrumentation_spec.rb index bc6b9debfe0..5d12647e02f 100644 --- a/spec/tooling/danger/product_intelligence_spec.rb +++ b/spec/tooling/danger/analytics_instrumentation_spec.rb @@ -3,39 +3,39 @@ require 'gitlab-dangerfiles' require 'gitlab/dangerfiles/spec_helper' -require_relative '../../../tooling/danger/product_intelligence' +require_relative '../../../tooling/danger/analytics_instrumentation' require_relative '../../../tooling/danger/project_helper' -RSpec.describe Tooling::Danger::ProductIntelligence do +RSpec.describe Tooling::Danger::AnalyticsInstrumentation, feature_category: :service_ping do include_context "with dangerfile" - subject(:product_intelligence) { fake_danger.new(helper: fake_helper) } + subject(:analytics_instrumentation) { fake_danger.new(helper: fake_helper) } let(:fake_danger) { DangerSpecHelper.fake_danger.include(described_class) } let(:previous_label_to_add) { 'label_to_add' } let(:labels_to_add) { [previous_label_to_add] } let(:ci_env) { true } - let(:has_product_intelligence_label) { true } + let(:has_analytics_instrumentation_label) { true } before do allow(fake_helper).to receive(:changed_lines).and_return(changed_lines) if defined?(changed_lines) allow(fake_helper).to receive(:labels_to_add).and_return(labels_to_add) allow(fake_helper).to receive(:ci?).and_return(ci_env) - allow(fake_helper).to receive(:mr_has_labels?).with('product intelligence').and_return(has_product_intelligence_label) + allow(fake_helper).to receive(:mr_has_labels?).with('analytics instrumentation').and_return(has_analytics_instrumentation_label) end describe '#check!' do - subject { product_intelligence.check! } + subject { analytics_instrumentation.check! } let(:markdown_formatted_list) { 'markdown formatted list' } - let(:review_pending_label) { 'product intelligence::review pending' } - let(:approved_label) { 'product intelligence::approved' } + let(:review_pending_label) { 'analytics instrumentation::review pending' } + let(:approved_label) { 'analytics instrumentation::approved' } let(:changed_files) { ['metrics/counts_7d/test_metric.yml'] } let(:changed_lines) { ['+tier: ee'] } let(:fake_changes) { instance_double(Gitlab::Dangerfiles::Changes, files: changed_files) } before do - allow(fake_changes).to receive(:by_category).with(:product_intelligence).and_return(fake_changes) + allow(fake_changes).to receive(:by_category).with(:analytics_instrumentation).and_return(fake_changes) allow(fake_helper).to receive(:changes).and_return(fake_changes) allow(fake_helper).to receive(:all_changed_files).and_return(changed_files) allow(fake_helper).to receive(:markdown_list).with(changed_files).and_return(markdown_formatted_list) @@ -51,7 +51,7 @@ RSpec.describe Tooling::Danger::ProductIntelligence do shared_examples "doesn't add new warnings" do it "doesn't add new warnings" do - expect(product_intelligence).not_to receive(:warn) + expect(analytics_instrumentation).not_to receive(:warn) subject end @@ -67,7 +67,7 @@ RSpec.describe Tooling::Danger::ProductIntelligence do it 'receives all the changed files by calling the correct helper method', :aggregate_failures do expect(fake_helper).not_to receive(:changes_by_category) expect(fake_helper).to receive(:changes) - expect(fake_changes).to receive(:by_category).with(:product_intelligence) + expect(fake_changes).to receive(:by_category).with(:analytics_instrumentation) expect(fake_changes).to receive(:files) subject @@ -99,26 +99,26 @@ RSpec.describe Tooling::Danger::ProductIntelligence do include_examples 'adds new labels' it 'warns with proper message' do - expect(product_intelligence).to receive(:warn).with(%r{#{markdown_formatted_list}}) + expect(analytics_instrumentation).to receive(:warn).with(%r{#{markdown_formatted_list}}) subject end end - context 'with product intelligence::review pending label' do - let(:mr_labels) { ['product intelligence::review pending'] } + context 'with analytics instrumentation::review pending label' do + let(:mr_labels) { ['analytics instrumentation::review pending'] } include_examples "doesn't add new labels" end - context 'with product intelligence::approved label' do - let(:mr_labels) { ['product intelligence::approved'] } + context 'with analytics instrumentation::approved label' do + let(:mr_labels) { ['analytics instrumentation::approved'] } include_examples "doesn't add new labels" end - context 'with the product intelligence label' do - let(:has_product_intelligence_label) { true } + context 'with the analytics instrumentation label' do + let(:has_analytics_instrumentation_label) { true } context 'with ci? false' do let(:ci_env) { false } @@ -148,9 +148,9 @@ RSpec.describe Tooling::Danger::ProductIntelligence do context 'when a scope is changed' do context 'and a metrics uses the affected scope' do it 'producing warning' do - expect(product_intelligence).to receive(:warn).with(%r{#{modified_files}}) + expect(analytics_instrumentation).to receive(:warn).with(%r{#{modified_files}}) - product_intelligence.check_affected_scopes! + analytics_instrumentation.check_affected_scopes! end end @@ -158,9 +158,9 @@ RSpec.describe Tooling::Danger::ProductIntelligence do let(:changed_lines) { ['+scope :foo, -> { iwhere(email: Array(emails)) }'] } it 'doesnt do anything' do - expect(product_intelligence).not_to receive(:warn) + expect(analytics_instrumentation).not_to receive(:warn) - product_intelligence.check_affected_scopes! + analytics_instrumentation.check_affected_scopes! end end end @@ -170,9 +170,9 @@ RSpec.describe Tooling::Danger::ProductIntelligence do let(:modified_files) { ['app/models/post_box.rb'] } it 'doesnt do anything' do - expect(product_intelligence).not_to receive(:warn) + expect(analytics_instrumentation).not_to receive(:warn) - product_intelligence.check_affected_scopes! + analytics_instrumentation.check_affected_scopes! end end @@ -180,9 +180,9 @@ RSpec.describe Tooling::Danger::ProductIntelligence do let(:modified_files) { ['spec/app/models/user_spec.rb'] } it 'doesnt do anything' do - expect(product_intelligence).not_to receive(:warn) + expect(analytics_instrumentation).not_to receive(:warn) - product_intelligence.check_affected_scopes! + analytics_instrumentation.check_affected_scopes! end end end @@ -199,9 +199,9 @@ RSpec.describe Tooling::Danger::ProductIntelligence do let(:changed_lines) { ['+ ci_runners: count(::Ci::CiRunner),'] } it 'produces warning' do - expect(product_intelligence).to receive(:warn).with(/usage_data\.rb has been deprecated/) + expect(analytics_instrumentation).to receive(:warn).with(/usage_data\.rb has been deprecated/) - product_intelligence.check_usage_data_insertions! + analytics_instrumentation.check_usage_data_insertions! end end @@ -209,24 +209,24 @@ RSpec.describe Tooling::Danger::ProductIntelligence do let(:changed_lines) { ['- ci_runners: count(::Ci::CiRunner),'] } it 'doesnt do anything' do - expect(product_intelligence).not_to receive(:warn) + expect(analytics_instrumentation).not_to receive(:warn) - product_intelligence.check_usage_data_insertions! + analytics_instrumentation.check_usage_data_insertions! end end end context 'when usage_data.rb is not modified' do context 'and another file has insertions' do - let(:modified_files) { ['tooling/danger/product_intelligence.rb'] } + let(:modified_files) { ['tooling/danger/analytics_instrumentation.rb'] } it 'doesnt do anything' do expect(fake_helper).to receive(:changed_lines).with("lib/gitlab/usage_data.rb").and_return([]) - allow(fake_helper).to receive(:changed_lines).with("tooling/danger/product_intelligence.rb").and_return(["+ Inserting"]) + allow(fake_helper).to receive(:changed_lines).with("tooling/danger/analytics_instrumentation.rb").and_return(["+ Inserting"]) - expect(product_intelligence).not_to receive(:warn) + expect(analytics_instrumentation).not_to receive(:warn) - product_intelligence.check_usage_data_insertions! + analytics_instrumentation.check_usage_data_insertions! end end end diff --git a/spec/tooling/danger/project_helper_spec.rb b/spec/tooling/danger/project_helper_spec.rb index e21d3c426b6..898c0ffa10c 100644 --- a/spec/tooling/danger/project_helper_spec.rb +++ b/spec/tooling/danger/project_helper_spec.rb @@ -39,7 +39,7 @@ RSpec.describe Tooling::Danger::ProjectHelper do 'doc/api/openapi/openapi.yaml' | [:docs, :backend] 'doc/api/openapi/any_other_file.yaml' | [:docs, :backend] - 'usage_data.rb' | [:database, :backend, :product_intelligence] + 'usage_data.rb' | [:database, :backend, :analytics_instrumentation] 'doc/foo.md' | [:docs] 'CONTRIBUTING.md' | [:docs] 'LICENSE' | [:docs] @@ -178,29 +178,29 @@ RSpec.describe Tooling::Danger::ProjectHelper do 'foo/bar.txt' | [:none] 'foo/bar.md' | [:none] - 'ee/config/metrics/counts_7d/20210216174919_g_analytics_issues_weekly.yml' | [:product_intelligence] - 'lib/gitlab/usage_data_counters/aggregated_metrics/common.yml' | [:product_intelligence] - 'lib/gitlab/usage_data_counters/hll_redis_counter.rb' | [:backend, :product_intelligence] - 'lib/gitlab/tracking.rb' | [:backend, :product_intelligence] - 'lib/gitlab/usage/service_ping_report.rb' | [:backend, :product_intelligence] - 'lib/gitlab/usage/metrics/key_path_processor.rb' | [:backend, :product_intelligence] - 'spec/lib/gitlab/tracking_spec.rb' | [:backend, :product_intelligence] - 'app/helpers/tracking_helper.rb' | [:backend, :product_intelligence] - 'spec/helpers/tracking_helper_spec.rb' | [:backend, :product_intelligence] - 'lib/generators/rails/usage_metric_definition_generator.rb' | [:backend, :product_intelligence] - 'spec/lib/generators/usage_metric_definition_generator_spec.rb' | [:backend, :product_intelligence] - 'config/metrics/schema.json' | [:product_intelligence] - 'app/assets/javascripts/tracking/foo.js' | [:frontend, :product_intelligence] - 'spec/frontend/tracking/foo.js' | [:frontend, :product_intelligence] - 'spec/frontend/tracking_spec.js' | [:frontend, :product_intelligence] + 'ee/config/metrics/counts_7d/20210216174919_g_analytics_issues_weekly.yml' | [:analytics_instrumentation] + 'lib/gitlab/usage_data_counters/aggregated_metrics/common.yml' | [:analytics_instrumentation] + 'lib/gitlab/usage_data_counters/hll_redis_counter.rb' | [:backend, :analytics_instrumentation] + 'lib/gitlab/tracking.rb' | [:backend, :analytics_instrumentation] + 'lib/gitlab/usage/service_ping_report.rb' | [:backend, :analytics_instrumentation] + 'lib/gitlab/usage/metrics/key_path_processor.rb' | [:backend, :analytics_instrumentation] + 'spec/lib/gitlab/tracking_spec.rb' | [:backend, :analytics_instrumentation] + 'app/helpers/tracking_helper.rb' | [:backend, :analytics_instrumentation] + 'spec/helpers/tracking_helper_spec.rb' | [:backend, :analytics_instrumentation] + 'lib/generators/rails/usage_metric_definition_generator.rb' | [:backend, :analytics_instrumentation] + 'spec/lib/generators/usage_metric_definition_generator_spec.rb' | [:backend, :analytics_instrumentation] + 'config/metrics/schema.json' | [:analytics_instrumentation] + 'app/assets/javascripts/tracking/foo.js' | [:frontend, :analytics_instrumentation] + 'spec/frontend/tracking/foo.js' | [:frontend, :analytics_instrumentation] + 'spec/frontend/tracking_spec.js' | [:frontend, :analytics_instrumentation] 'lib/gitlab/usage_database/foo.rb' | [:backend] - 'config/metrics/counts_7d/test_metric.yml' | [:product_intelligence] - 'config/events/snowplow_event.yml' | [:product_intelligence] - 'config/metrics/schema.json' | [:product_intelligence] - 'doc/api/usage_data.md' | [:product_intelligence] - 'spec/lib/gitlab/usage_data_spec.rb' | [:product_intelligence] - 'spec/lib/gitlab/usage/service_ping_report.rb' | [:backend, :product_intelligence] - 'spec/lib/gitlab/usage/metrics/key_path_processor.rb' | [:backend, :product_intelligence] + 'config/metrics/counts_7d/test_metric.yml' | [:analytics_instrumentation] + 'config/events/snowplow_event.yml' | [:analytics_instrumentation] + 'config/metrics/schema.json' | [:analytics_instrumentation] + 'doc/api/usage_data.md' | [:analytics_instrumentation] + 'spec/lib/gitlab/usage_data_spec.rb' | [:analytics_instrumentation] + 'spec/lib/gitlab/usage/service_ping_report.rb' | [:backend, :analytics_instrumentation] + 'spec/lib/gitlab/usage/metrics/key_path_processor.rb' | [:backend, :analytics_instrumentation] 'app/models/integration.rb' | [:import_integrate_be, :backend] 'ee/app/models/integrations/github.rb' | [:import_integrate_be, :backend] @@ -263,22 +263,22 @@ RSpec.describe Tooling::Danger::ProjectHelper do context 'having specific changes' do where(:expected_categories, :patch, :changed_files) do - [:product_intelligence] | '+data-track-action' | ['components/welcome.vue'] - [:product_intelligence] | '+ data: { track_label:' | ['admin/groups/_form.html.haml'] - [:product_intelligence] | '+ Gitlab::Tracking.event' | ['dashboard/todos_controller.rb', 'admin/groups/_form.html.haml'] - [:database, :backend, :product_intelligence] | '+ count(User.active)' | ['usage_data.rb', 'lib/gitlab/usage_data.rb', 'ee/lib/ee/gitlab/usage_data.rb'] - [:database, :backend, :product_intelligence] | '+ estimate_batch_distinct_count(User.active)' | ['usage_data.rb'] - [:backend, :product_intelligence] | '+ alt_usage_data(User.active)' | ['lib/gitlab/usage_data.rb'] - [:backend, :product_intelligence] | '+ count(User.active)' | ['lib/gitlab/usage_data/topology.rb'] - [:backend, :product_intelligence] | '+ foo_count(User.active)' | ['lib/gitlab/usage_data.rb'] - [:backend] | '+ count(User.active)' | ['user.rb'] + [:analytics_instrumentation] | '+data-track-action' | ['components/welcome.vue'] + [:analytics_instrumentation] | '+ data: { track_label:' | ['admin/groups/_form.html.haml'] + [:analytics_instrumentation] | '+ Gitlab::Tracking.event' | ['dashboard/todos_controller.rb', 'admin/groups/_form.html.haml'] + [:database, :backend, :analytics_instrumentation] | '+ count(User.active)' | ['usage_data.rb', 'lib/gitlab/usage_data.rb', 'ee/lib/ee/gitlab/usage_data.rb'] + [:database, :backend, :analytics_instrumentation] | '+ estimate_batch_distinct_count(User.active)' | ['usage_data.rb'] + [:backend, :analytics_instrumentation] | '+ alt_usage_data(User.active)' | ['lib/gitlab/usage_data.rb'] + [:backend, :analytics_instrumentation] | '+ count(User.active)' | ['lib/gitlab/usage_data/topology.rb'] + [:backend, :analytics_instrumentation] | '+ foo_count(User.active)' | ['lib/gitlab/usage_data.rb'] + [:backend] | '+ count(User.active)' | ['user.rb'] [:import_integrate_be, :database, :migration] | '+ add_column :integrations, :foo, :text' | ['db/migrate/foo.rb'] [:import_integrate_be, :database, :migration] | '+ create_table :zentao_tracker_data do |t|' | ['ee/db/post_migrate/foo.rb'] [:import_integrate_be, :backend] | '+ Integrations::Foo' | ['app/foo/bar.rb'] [:import_integrate_be, :backend] | '+ project.execute_hooks(foo, :bar)' | ['ee/lib/ee/foo.rb'] [:import_integrate_be, :backend] | '+ project.execute_integrations(foo, :bar)' | ['app/foo.rb'] - [:frontend, :product_intelligence] | '+ api.trackRedisCounterEvent("foo")' | ['app/assets/javascripts/telemetry.js', 'ee/app/assets/javascripts/mr_widget.vue'] - [:frontend, :product_intelligence] | '+ api.trackRedisHllUserEvent("bar")' | ['app/assets/javascripts/telemetry.js', 'ee/app/assets/javascripts/mr_widget.vue'] + [:frontend, :analytics_instrumentation] | '+ api.trackRedisCounterEvent("foo")' | ['app/assets/javascripts/telemetry.js', 'ee/app/assets/javascripts/mr_widget.vue'] + [:frontend, :analytics_instrumentation] | '+ api.trackRedisHllUserEvent("bar")' | ['app/assets/javascripts/telemetry.js', 'ee/app/assets/javascripts/mr_widget.vue'] end with_them do diff --git a/tooling/danger/product_intelligence.rb b/tooling/danger/analytics_instrumentation.rb index 00dc31b9bb9..ce5ee55e3ee 100644 --- a/tooling/danger/product_intelligence.rb +++ b/tooling/danger/analytics_instrumentation.rb @@ -3,13 +3,13 @@ module Tooling module Danger - module ProductIntelligence + module AnalyticsInstrumentation METRIC_DIRS = %w[lib/gitlab/usage/metrics/instrumentations ee/lib/gitlab/usage/metrics/instrumentations].freeze - APPROVED_LABEL = 'product intelligence::approved' - REVIEW_LABEL = 'product intelligence::review pending' + APPROVED_LABEL = 'analytics instrumentation::approved' + REVIEW_LABEL = 'analytics instrumentation::review pending' CHANGED_FILES_MESSAGE = <<~MSG - For the following files, a review from the [Data team and Product Intelligence team](https://gitlab.com/groups/gitlab-org/analytics-section/product-intelligence/engineers/-/group_members?with_inherited_permissions=exclude) is recommended - Please check the ~"product intelligence" [Service Ping guide](https://docs.gitlab.com/ee/development/service_ping/) or the [Snowplow guide](https://docs.gitlab.com/ee/development/snowplow/). + For the following files, a review from the [Data team and Analytics Instrumentation team](https://gitlab.com/groups/gitlab-org/analytics-section/product-intelligence/engineers/-/group_members?with_inherited_permissions=exclude) is recommended + Please check the ~"analytics instrumentation" [Service Ping guide](https://docs.gitlab.com/ee/development/service_ping/) or the [Snowplow guide](https://docs.gitlab.com/ee/development/snowplow/). For MR review guidelines, see the [Service Ping review guidelines](https://docs.gitlab.com/ee/development/service_ping/review_guidelines.html) or the [Snowplow review guidelines](https://docs.gitlab.com/ee/development/snowplow/review_guidelines.html). @@ -18,7 +18,7 @@ module Tooling MSG CHANGED_SCOPE_MESSAGE = <<~MSG - The following metrics could be affected by the modified scopes and require ~"product intelligence" review: + The following metrics could be affected by the modified scopes and require ~"analytics instrumentation" review: MSG @@ -33,13 +33,13 @@ module Tooling ].freeze def check! - product_intelligence_paths_to_review = helper.changes.by_category(:product_intelligence).files + analytics_instrumentation_paths_to_review = helper.changes.by_category(:analytics_instrumentation).files labels_to_add = missing_labels - return if product_intelligence_paths_to_review.empty? || skip_review? + return if analytics_instrumentation_paths_to_review.empty? || skip_review? - warn format(CHANGED_FILES_MESSAGE, changed_files: helper.markdown_list(product_intelligence_paths_to_review)) unless has_approved_label? + warn format(CHANGED_FILES_MESSAGE, changed_files: helper.markdown_list(analytics_instrumentation_paths_to_review)) unless has_approved_label? helper.labels_to_add.concat(labels_to_add) unless labels_to_add.empty? end @@ -110,7 +110,7 @@ module Tooling return [] unless helper.ci? labels = [] - labels << 'product intelligence' unless helper.mr_has_labels?('product intelligence') + labels << 'analytics instrumentation' unless helper.mr_has_labels?('analytics instrumentation') labels << REVIEW_LABEL unless has_workflow_labels? labels diff --git a/tooling/danger/project_helper.rb b/tooling/danger/project_helper.rb index d9581929896..5b5b998e3ea 100644 --- a/tooling/danger/project_helper.rb +++ b/tooling/danger/project_helper.rb @@ -26,11 +26,11 @@ module Tooling %r{\Adoc/api/graphql/reference/} => [:docs, :backend], %r{\Adoc/api/openapi/.*\.yaml\z} => [:docs, :backend], - [%r{usage_data\.rb}, %r{^(\+|-).*\s+(count|distinct_count|estimate_batch_distinct_count)\(.*\)(.*)$}] => [:database, :backend, :product_intelligence], + [%r{usage_data\.rb}, %r{^(\+|-).*\s+(count|distinct_count|estimate_batch_distinct_count)\(.*\)(.*)$}] => [:database, :backend, :analytics_instrumentation], %r{\A((ee|jh)/)?config/feature_flags/} => :feature_flag, - %r{doc/api/usage_data.md} => [:product_intelligence], + %r{doc/api/usage_data.md} => [:analytics_instrumentation], %r{\Adoc/.*(\.(md|png|gif|jpg|yml))\z} => :docs, %r{\A(CONTRIBUTING|LICENSE|MAINTENANCE|PHILOSOPHY|PROCESS|README)(\.md)?\z} => :docs, @@ -65,8 +65,8 @@ module Tooling app/assets/javascripts/tracking/.*\.js | spec/frontend/tracking/.*\.js | spec/frontend/tracking_spec\.js - )\z}x => [:frontend, :product_intelligence], - [%r{\.(vue|js)\z}, %r{trackRedis}] => [:frontend, :product_intelligence], + )\z}x => [:frontend, :analytics_instrumentation], + [%r{\.(vue|js)\z}, %r{trackRedis}] => [:frontend, :analytics_instrumentation], %r{\A((ee|jh)/)?app/assets/} => :frontend, %r{\A((ee|jh)/)?app/views/.*\.svg} => :frontend, %r{\A((ee|jh)/)?app/views/} => [:frontend, :backend], @@ -132,11 +132,11 @@ module Tooling %r{\A((ee|jh)/)?spec/support/shared_contexts/features/} => :test, %r{\A((ee|jh)/)?spec/support/helpers/features/} => :test, - %r{\A((spec/)?lib/generators/gitlab/usage_metric_)} => [:product_intelligence], - %r{\A((ee|jh)/)?lib/gitlab/usage_data_counters/.*\.yml\z} => [:product_intelligence], - %r{\A((ee|jh)/)?config/(events|metrics)/((.*\.yml)|(schema\.json))\z} => [:product_intelligence], - %r{\A((ee|jh)/)?lib/gitlab/usage_data(_counters)?(/|\.rb)} => [:backend, :product_intelligence], - %r{\A((ee|jh)/)?(spec/)?lib/gitlab/usage(/|\.rb)} => [:backend, :product_intelligence], + %r{\A((spec/)?lib/generators/gitlab/usage_metric_)} => [:analytics_instrumentation], + %r{\A((ee|jh)/)?lib/gitlab/usage_data_counters/.*\.yml\z} => [:analytics_instrumentation], + %r{\A((ee|jh)/)?config/(events|metrics)/((.*\.yml)|(schema\.json))\z} => [:analytics_instrumentation], + %r{\A((ee|jh)/)?lib/gitlab/usage_data(_counters)?(/|\.rb)} => [:backend, :analytics_instrumentation], + %r{\A((ee|jh)/)?(spec/)?lib/gitlab/usage(/|\.rb)} => [:backend, :analytics_instrumentation], %r{\A( lib/gitlab/tracking\.rb | spec/lib/gitlab/tracking_spec\.rb | @@ -146,11 +146,11 @@ module Tooling (spec/)?lib/generators/gitlab/usage_metric_definition/redis_hll_generator(_spec)?\.rb | lib/generators/rails/usage_metric_definition_generator\.rb | spec/lib/generators/usage_metric_definition_generator_spec\.rb | - generator_templates/usage_metric_definition/metric_definition\.yml)\z}x => [:backend, :product_intelligence], - %r{gitlab/usage_data(_spec)?\.rb} => [:product_intelligence], - [%r{\.haml\z}, %r{data: \{ track}] => [:product_intelligence], - [%r{\.(rb|haml)\z}, %r{Gitlab::Tracking\.(event|enabled\?|options)$}] => [:product_intelligence], - [%r{\.(vue|js)\z}, %r{(Tracking.event|/\btrack\(/|data-track-action)}] => [:product_intelligence], + generator_templates/usage_metric_definition/metric_definition\.yml)\z}x => [:backend, :analytics_instrumentation], + %r{gitlab/usage_data(_spec)?\.rb} => [:analytics_instrumentation], + [%r{\.haml\z}, %r{data: \{ track}] => [:analytics_instrumentation], + [%r{\.(rb|haml)\z}, %r{Gitlab::Tracking\.(event|enabled\?|options)$}] => [:analytics_instrumentation], + [%r{\.(vue|js)\z}, %r{(Tracking.event|/\btrack\(/|data-track-action)}] => [:analytics_instrumentation], %r{\A((ee|jh)/)?app/(?!assets|views)[^/]+} => :backend, %r{\A((ee|jh)/)?(bin|config|generator_templates|lib|rubocop)/} => :backend, |