diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-03-03 00:16:54 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-03-03 00:16:54 +0300 |
commit | bd091da6d5cb036cf3c58d4ba5671f931c8381e1 (patch) | |
tree | 285571eaae458aa65fb2dc8de115ef98dc98f39e | |
parent | ad4dfa2eb4a24a56fbdcf838fc28f2a5b2b6a3a0 (diff) |
Add latest changes from gitlab-org/gitlab@master
41 files changed, 321 insertions, 231 deletions
@@ -398,7 +398,7 @@ group :development, :test do end group :development, :test, :danger do - gem 'gitlab-dangerfiles', '~> 2.10.1', require: false + gem 'gitlab-dangerfiles', '~> 2.10.2', require: false end group :development, :test, :coverage do diff --git a/Gemfile.lock b/Gemfile.lock index 8b634fd1624..65ee5af0dba 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -463,7 +463,7 @@ GEM terminal-table (~> 1.5, >= 1.5.1) gitlab-chronic (0.10.5) numerizer (~> 0.2) - gitlab-dangerfiles (2.10.1) + gitlab-dangerfiles (2.10.2) danger (>= 8.3.1) danger-gitlab (>= 8.0.0) gitlab-experiment (0.7.0) @@ -1478,7 +1478,7 @@ DEPENDENCIES gitaly (~> 14.8.0.pre.rc1) github-markup (~> 1.7.0) gitlab-chronic (~> 0.10.5) - gitlab-dangerfiles (~> 2.10.1) + gitlab-dangerfiles (~> 2.10.2) gitlab-experiment (~> 0.7.0) gitlab-fog-azure-rm (~> 1.2.0) gitlab-labkit (~> 0.22.0) diff --git a/app/assets/javascripts/integrations/constants.js b/app/assets/javascripts/integrations/constants.js index 004601bc0a3..7daa6433fb8 100644 --- a/app/assets/javascripts/integrations/constants.js +++ b/app/assets/javascripts/integrations/constants.js @@ -1,6 +1,7 @@ import { s__, __ } from '~/locale'; export const integrationLevels = { + PROJECT: 'project', GROUP: 'group', INSTANCE: 'instance', }; diff --git a/app/assets/javascripts/integrations/edit/components/integration_form.vue b/app/assets/javascripts/integrations/edit/components/integration_form.vue index 007a384f41e..f955cc1b432 100644 --- a/app/assets/javascripts/integrations/edit/components/integration_form.vue +++ b/app/assets/javascripts/integrations/edit/components/integration_form.vue @@ -3,6 +3,7 @@ import { GlButton, GlModalDirective, GlSafeHtmlDirective as SafeHtml, GlForm } f import axios from 'axios'; import * as Sentry from '@sentry/browser'; import { mapState, mapActions, mapGetters } from 'vuex'; + import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import { I18N_FETCH_TEST_SETTINGS_DEFAULT_ERROR_MESSAGE, @@ -41,10 +42,8 @@ export default { SafeHtml, }, mixins: [glFeatureFlagsMixin()], - props: { + inject: { helpHtml: { - type: String, - required: false, default: '', }, }, @@ -81,28 +80,28 @@ export default { disableButtons() { return Boolean(this.isSaving || this.isResetting || this.isTesting); }, - form() { - return this.$refs.integrationForm.$el; - }, }, methods: { ...mapActions(['setOverride', 'requestJiraIssueTypes']), + form() { + return this.$refs.integrationForm.$el; + }, setIsValidated() { this.isValidated = true; }, onSaveClick() { this.isSaving = true; - if (this.integrationActive && !this.form.checkValidity()) { + if (this.integrationActive && !this.form().checkValidity()) { this.isSaving = false; this.setIsValidated(); return; } - this.form.submit(); + this.form().submit(); }, onTestClick() { - if (!this.form.checkValidity()) { + if (!this.form().checkValidity()) { this.setIsValidated(); return; } @@ -147,7 +146,7 @@ export default { this.requestJiraIssueTypes(this.getFormData()); }, getFormData() { - return new FormData(this.form); + return new FormData(this.form()); }, onToggleIntegrationState(integrationActive) { this.integrationActive = integrationActive; diff --git a/app/assets/javascripts/integrations/edit/index.js b/app/assets/javascripts/integrations/edit/index.js index f4202e30a62..216a7412322 100644 --- a/app/assets/javascripts/integrations/edit/index.js +++ b/app/assets/javascripts/integrations/edit/index.js @@ -116,13 +116,13 @@ export default function initIntegrationSettingsForm() { return new Vue({ el: customSettingsEl, + name: 'IntegrationEditRoot', store: createStore(initialState), + provide: { + helpHtml, + }, render(createElement) { - return createElement(IntegrationForm, { - props: { - helpHtml, - }, - }); + return createElement(IntegrationForm); }, }); } diff --git a/app/assets/javascripts/integrations/edit/store/getters.js b/app/assets/javascripts/integrations/edit/store/getters.js index b79132128cc..b0adc444395 100644 --- a/app/assets/javascripts/integrations/edit/store/getters.js +++ b/app/assets/javascripts/integrations/edit/store/getters.js @@ -1,5 +1,10 @@ +import { integrationLevels } from '~/integrations/constants'; + export const isInheriting = (state) => (state.defaultState === null ? false : !state.override); +export const isProjectLevel = (state) => + state.customState.integrationLevel === integrationLevels.PROJECT; + export const propsSource = (state, getters) => getters.isInheriting ? state.defaultState : state.customState; diff --git a/app/assets/javascripts/pages/projects/pages_domains/form.js b/app/assets/javascripts/pages/projects/pages_domains/form.js index 169530685ad..6836d399fa4 100644 --- a/app/assets/javascripts/pages/projects/pages_domains/form.js +++ b/app/assets/javascripts/pages/projects/pages_domains/form.js @@ -1,4 +1,4 @@ -import setupToggleButtons from '~/toggle_buttons'; +import { initToggle } from '~/toggles'; function updateVisibility(selector, isVisible) { Array.from(document.querySelectorAll(selector)).forEach((el) => { @@ -11,12 +11,12 @@ function updateVisibility(selector, isVisible) { } export default () => { - const toggleContainer = document.querySelector('.js-auto-ssl-toggle-container'); + const sslToggle = initToggle(document.querySelector('.js-enable-ssl-gl-toggle')); + const sslToggleInput = document.querySelector('.js-project-feature-toggle-input'); - if (toggleContainer) { - const onToggleButtonClicked = (isAutoSslEnabled) => { + if (sslToggle) { + sslToggle.$on('change', (isAutoSslEnabled) => { updateVisibility('.js-shown-unless-auto-ssl', !isAutoSslEnabled); - updateVisibility('.js-shown-if-auto-ssl', isAutoSslEnabled); Array.from(document.querySelectorAll('.js-enabled-unless-auto-ssl')).forEach((el) => { @@ -26,8 +26,9 @@ export default () => { el.removeAttribute('disabled'); } }); - }; - setupToggleButtons(toggleContainer, onToggleButtonClicked); + sslToggleInput.setAttribute('value', isAutoSslEnabled); + }); } + return sslToggle; }; diff --git a/app/assets/javascripts/pipeline_editor/components/editor/text_editor.vue b/app/assets/javascripts/pipeline_editor/components/editor/text_editor.vue index 5177cea900c..255e3cb31f1 100644 --- a/app/assets/javascripts/pipeline_editor/components/editor/text_editor.vue +++ b/app/assets/javascripts/pipeline_editor/components/editor/text_editor.vue @@ -3,6 +3,7 @@ import { EDITOR_READY_EVENT } from '~/editor/constants'; import { CiSchemaExtension } from '~/editor/extensions/source_editor_ci_schema_ext'; import SourceEditor from '~/vue_shared/components/source_editor.vue'; import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; +import { SOURCE_EDITOR_DEBOUNCE } from '../../constants'; export default { editorOptions: { @@ -10,6 +11,7 @@ export default { // autocomplete for keywords quickSuggestions: true, }, + debounceValue: SOURCE_EDITOR_DEBOUNCE, components: { SourceEditor, }, @@ -34,6 +36,7 @@ export default { <div class="gl-border-solid gl-border-gray-100 gl-border-1 gl-border-t-none!"> <source-editor ref="editor" + :debounce-value="$options.debounceValue" :editor-options="$options.editorOptions" :file-name="ciConfigPath" v-bind="$attrs" diff --git a/app/assets/javascripts/pipeline_editor/constants.js b/app/assets/javascripts/pipeline_editor/constants.js index a65463d02aa..1382b1d50eb 100644 --- a/app/assets/javascripts/pipeline_editor/constants.js +++ b/app/assets/javascripts/pipeline_editor/constants.js @@ -47,6 +47,7 @@ export const DRAWER_EXPANDED_KEY = 'pipeline_editor_drawer_expanded'; export const BRANCH_PAGINATION_LIMIT = 20; export const BRANCH_SEARCH_DEBOUNCE = '500'; +export const SOURCE_EDITOR_DEBOUNCE = 500; export const STARTER_TEMPLATE_NAME = 'Getting-Started'; diff --git a/app/assets/javascripts/toggles/index.js b/app/assets/javascripts/toggles/index.js index 046b9fc7dcd..5848b3a424c 100644 --- a/app/assets/javascripts/toggles/index.js +++ b/app/assets/javascripts/toggles/index.js @@ -8,16 +8,12 @@ export const initToggle = (el) => { return false; } - const { - name, - isChecked, - disabled, - isLoading, - label, - help, - labelPosition, - ...dataset - } = el.dataset; + const { name, id, isChecked, disabled, isLoading, label, help, labelPosition, ...dataset } = + el.dataset || {}; + + const dataAttrs = Object.fromEntries( + Object.entries(dataset).map(([key, value]) => [`data-${kebabCase(key)}`, value]), + ); return new Vue({ el, @@ -50,9 +46,7 @@ export const initToggle = (el) => { labelPosition, }, class: el.className, - attrs: Object.fromEntries( - Object.entries(dataset).map(([key, value]) => [`data-${kebabCase(key)}`, value]), - ), + attrs: { id, ...dataAttrs }, on: { change: (newValue) => { this.value = newValue; diff --git a/app/assets/javascripts/vue_shared/components/source_editor.vue b/app/assets/javascripts/vue_shared/components/source_editor.vue index 011cad4267c..6a0bf07c8b4 100644 --- a/app/assets/javascripts/vue_shared/components/source_editor.vue +++ b/app/assets/javascripts/vue_shared/components/source_editor.vue @@ -46,6 +46,11 @@ export default { required: false, default: () => ({}), }, + debounceValue: { + type: Number, + required: false, + default: CONTENT_UPDATE_DEBOUNCE, + }, }, data() { return { @@ -73,9 +78,7 @@ export default { ...this.editorOptions, }); - this.editor.onDidChangeModelContent( - debounce(this.onFileChange.bind(this), CONTENT_UPDATE_DEBOUNCE), - ); + this.editor.onDidChangeModelContent(debounce(this.onFileChange.bind(this), this.debounceValue)); }, beforeDestroy() { this.editor.dispose(); diff --git a/app/views/projects/pages_domains/_certificate.html.haml b/app/views/projects/pages_domains/_certificate.html.haml index 33db7896065..91683c1b316 100644 --- a/app/views/projects/pages_domains/_certificate.html.haml +++ b/app/views/projects/pages_domains/_certificate.html.haml @@ -14,14 +14,14 @@ - lets_encrypt_link_start = "<a href=\"%{lets_encrypt_link_url}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-nowrap\">".html_safe % { lets_encrypt_link_url: lets_encrypt_link_url } - lets_encrypt_link_end = "</a>".html_safe = _("Automatic certificate management using %{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end}").html_safe % { lets_encrypt_link_start: lets_encrypt_link_start, lets_encrypt_link_end: lets_encrypt_link_end } - %button{ type: "button", id: "pages_domain_auto_ssl_enabled_button", - class: "js-project-feature-toggle project-feature-toggle mt-2 #{"is-checked" if auto_ssl_available_and_enabled}", - "aria-label": _("Automatic certificate management using Let's Encrypt") } + = render "shared/gl_toggle", + id: "pages_domain_auto_ssl_enabled_button", + is_checked: auto_ssl_available_and_enabled, + classes: "js-project-feature-toggle js-enable-ssl-gl-toggle mt-2", + label: _("Automatic certificate management using Let's Encrypt"), + label_position: 'hidden' = f.hidden_field :auto_ssl_enabled?, class: "js-project-feature-toggle-input" - %span.toggle-icon - = sprite_icon("status_success_borderless", size: 18, css_class: "gl-text-blue-500 toggle-status-checked") - = sprite_icon("status_failed_borderless", size: 18, css_class: "gl-text-gray-400 toggle-status-unchecked") - %p.text-secondary.mt-3 + %p.gl-text-secondary.gl-mt-1 - docs_link_url = help_page_path("user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.md") - docs_link_start = "<a href=\"%{docs_link_url}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-nowrap\">".html_safe % { docs_link_url: docs_link_url } - docs_link_end = "</a>".html_safe diff --git a/app/views/shared/_gl_toggle.html.haml b/app/views/shared/_gl_toggle.html.haml index afaa6b6df92..59a3c7ba0b5 100644 --- a/app/views/shared/_gl_toggle.html.haml +++ b/app/views/shared/_gl_toggle.html.haml @@ -3,6 +3,7 @@ - classes = local_assigns.fetch(:classes) - name = local_assigns.fetch(:name, nil) +- id = local_assigns.fetch(:id, nil) - is_checked = local_assigns.fetch(:is_checked, false).to_s - disabled = local_assigns.fetch(:disabled, false).to_s - is_loading = local_assigns.fetch(:is_loading, false).to_s @@ -13,6 +14,7 @@ %span{ class: classes, data: { name: name, + id: id, is_checked: is_checked, disabled: disabled, is_loading: is_loading, diff --git a/danger/product_intelligence/Dangerfile b/danger/product_intelligence/Dangerfile index 77d714a7f60..8f782e3de65 100644 --- a/danger/product_intelligence/Dangerfile +++ b/danger/product_intelligence/Dangerfile @@ -19,4 +19,4 @@ return if product_intelligence_paths_to_review.empty? || product_intelligence.sk warn format(CHANGED_FILES_MESSAGE, changed_files: helper.markdown_list(product_intelligence_paths_to_review)) unless product_intelligence.has_approved_label? -helper.labels_to_add.merge(labels_to_add) unless labels_to_add.empty? +helper.labels_to_add.concat(labels_to_add) unless labels_to_add.empty? diff --git a/danger/specialization_labels/Dangerfile b/danger/specialization_labels/Dangerfile index 7d1c83697fd..b3520e7af7e 100644 --- a/danger/specialization_labels/Dangerfile +++ b/danger/specialization_labels/Dangerfile @@ -26,4 +26,4 @@ labels_to_add = helper.changes_by_category.each_with_object([]) do |(category, _ memo << label end -helper.labels_to_add.merge(labels_to_add) if labels_to_add.any? +helper.labels_to_add.concat(labels_to_add) if labels_to_add.any? diff --git a/data/whats_new/202011230001_13_06.yml b/data/whats_new/202011230001_13_06.yml index 53ee394f156..1e47bcca0ec 100644 --- a/data/whats_new/202011230001_13_06.yml +++ b/data/whats_new/202011230001_13_06.yml @@ -64,7 +64,7 @@ published_at: 2020-11-22 release: 13.6 - title: Milestone Burnup Charts and historically accurate reporting - body: | + body: | A milestone or iteration burndown chart helps track completion progress of total scope, but it doesn't provide insight into how the scope changed during the course of the timebox. Neither has it previously retained historical accuracy regarding how much of the initial committed scope of the milestone or iteration was actually completed. To solve these problems and help teams have better insights into scope creep, milestones and iterations now show a burnup chart that tracks the daily total count and weight of issues added to and completed within a given timebox. diff --git a/data/whats_new/202101140001_13_08.yml b/data/whats_new/202101140001_13_08.yml index 3c1f33f1c9c..3a1c0179d84 100644 --- a/data/whats_new/202101140001_13_08.yml +++ b/data/whats_new/202101140001_13_08.yml @@ -80,4 +80,3 @@ image_url: https://about.gitlab.com/images/home/kubernetes.png published_at: 2021-01-22 release: 13.8 - diff --git a/data/whats_new/202102180001_13_09.yml b/data/whats_new/202102180001_13_09.yml index d948993994e..5f50a05bef2 100644 --- a/data/whats_new/202102180001_13_09.yml +++ b/data/whats_new/202102180001_13_09.yml @@ -120,4 +120,3 @@ image_url: https://about.gitlab.com/images/13_9/deploy_keys.png published_at: 2021-02-22 release: 13.9 - diff --git a/data/whats_new/202103220001_13_10.yml b/data/whats_new/202103220001_13_10.yml index 24928f9609b..a1f456a6c8d 100644 --- a/data/whats_new/202103220001_13_10.yml +++ b/data/whats_new/202103220001_13_10.yml @@ -5,8 +5,8 @@ self-managed: true gitlab-com: true packages: [Free, Premium, Ultimate] - url: https://docs.gitlab.com/runner/install/openshift.html - image_url: https://img.youtube.com/vi/ZNBc_QnDUu4/hqdefault.jpg + url: https://docs.gitlab.com/runner/install/openshift.html + image_url: https://img.youtube.com/vi/ZNBc_QnDUu4/hqdefault.jpg published_at: 2021-03-22 release: 13.10 - title: "View epics on a board (MVC)" @@ -21,7 +21,7 @@ gitlab-com: true packages: [Premium, Ultimate] url: https://docs.gitlab.com/ee/user/group/epics/epic_boards.html - image_url: https://about.gitlab.com/images/13_10/view-epics-on-a-board-mvc-1.png + image_url: https://about.gitlab.com/images/13_10/view-epics-on-a-board-mvc-1.png published_at: 2021-03-22 release: 13.10 - title: "View Jira issue details in GitLab" @@ -35,8 +35,8 @@ self-managed: true gitlab-com: true packages: [Premium, Ultimate] - url: https://docs.gitlab.com/ee/user/project/integrations/jira.html#view-a-jira-issue - image_url: https://about.gitlab.com/images/13_10/jira-detail-view.png + url: https://docs.gitlab.com/ee/user/project/integrations/jira.html#view-a-jira-issue + image_url: https://about.gitlab.com/images/13_10/jira-detail-view.png published_at: 2021-03-22 release: 13.10 - title: "DORA4-based lead time for changes" @@ -46,8 +46,8 @@ self-managed: true gitlab-com: true packages: [Ultimate] - url: https://docs.gitlab.com/ee/api/dora4_project_analytics.html#list-project-merge-request-lead-times - image_url: https://about.gitlab.com/images/13_10/api.png + url: https://docs.gitlab.com/ee/api/dora4_project_analytics.html#list-project-merge-request-lead-times + image_url: https://about.gitlab.com/images/13_10/api.png published_at: 2021-03-22 release: 13.10 - title: "Create a release from an existing tag" @@ -57,8 +57,8 @@ self-managed: true gitlab-com: true packages: [Free, Premium, Ultimate] - url: https://docs.gitlab.com/ee/user/project/releases/#create-a-release - image_url: https://about.gitlab.com/images/13_10/exiting_tags.png + url: https://docs.gitlab.com/ee/user/project/releases/#create-a-release + image_url: https://about.gitlab.com/images/13_10/exiting_tags.png published_at: 2021-03-22 release: 13.10 - title: "Integrate any IT alerting tool with GitLab" @@ -70,8 +70,8 @@ self-managed: true gitlab-com: true packages: [Premium, Ultimate] - url: https://docs.gitlab.com/ee/operations/incident_management/integrations.html#http-endpoints - image_url: https://about.gitlab.com/images/13_10/integrate_alerts.png + url: https://docs.gitlab.com/ee/operations/incident_management/integrations.html#http-endpoints + image_url: https://about.gitlab.com/images/13_10/integrate_alerts.png published_at: 2021-03-22 release: 13.10 - title: "Merge request test summary usability improvements" @@ -85,7 +85,7 @@ self-managed: true gitlab-com: true packages: [Free, Premium, Ultimate] - url: https://docs.gitlab.com/ee/ci/unit_test_reports.html - image_url: https://about.gitlab.com/images/13_10/test_summary_ux_improvements.png + url: https://docs.gitlab.com/ee/ci/unit_test_reports.html + image_url: https://about.gitlab.com/images/13_10/test_summary_ux_improvements.png published_at: 2021-03-22 release: 13.10 diff --git a/data/whats_new/202104220001_13_11.yml b/data/whats_new/202104220001_13_11.yml index 36e1ae3fff0..6453893b6de 100644 --- a/data/whats_new/202104220001_13_11.yml +++ b/data/whats_new/202104220001_13_11.yml @@ -38,7 +38,7 @@ gitlab-com: true packages: [Premium, Ultimate] url: https://docs.gitlab.com/ee/operations/incident_management/oncall_schedules.html - image_url: https://img.youtube.com/vi/QXfCQ24-Ufo/hqdefault.jpg + image_url: https://img.youtube.com/vi/QXfCQ24-Ufo/hqdefault.jpg published_at: 2021-04-22 release: 13.11 - title: Use multiple caches in the same job @@ -49,21 +49,21 @@ gitlab-com: true packages: [Free, Premium, Ultimate] url: https://docs.gitlab.com/ee/ci/yaml/index.html#multiple-caches - image_url: https://about.gitlab.com/images/13_11/cache.png + image_url: https://about.gitlab.com/images/13_11/cache.png published_at: 2021-04-22 release: 13.11 -- title: Group SAML Enforcement for Git activity +- title: Group SAML Enforcement for Git activity body: | GitLab group maintainers can now enhance their group security by enforcing Group SAML for Git activity. Security-minded organizations want all GitLab activity to be protected and governed by their SAML Identity Provider. Currently, SAML SSO enforcement only applies to activity in the GitLab UI. Git CLI operations do not require an active SAML SSO session. When Git Group SAML SSO enforcement is enabled, users must have an active web SAML session to perform Git operations in the CLI. stage: Manage self-managed: false gitlab-com: true - packages: [Premium, Ultimate] + packages: [Premium, Ultimate] url: https://docs.gitlab.com/ee/user/group/saml_sso/#sso-enforcement image_url: https://about.gitlab.com/images/sdlc-icons/manage.svg published_at: 2021-04-22 release: 13.11 -- title: Cherry pick commits from fork to parent +- title: Cherry pick commits from fork to parent body: | With GitLab 13.11, if you are a project member, you can now cherry-pick commits from downstream forks back into your project. We've added a new **Pick into project** section to the cherry-pick dialog, shown when you select **Options > Cherry-pick** on a commit's details page. @@ -73,9 +73,9 @@ stage: Create self-managed: true gitlab-com: true - packages: [Free, Premium, Ultimate] + packages: [Free, Premium, Ultimate] url: https://docs.gitlab.com/ee/user/project/merge_requests/cherry_pick_changes.html#cherry-pick-into-a-project - image_url: https://about.gitlab.com/images/13_11/cherry_pick_commits_from_fork_to_parent.png + image_url: https://about.gitlab.com/images/13_11/cherry_pick_commits_from_fork_to_parent.png published_at: 2021-04-22 release: 13.11 - title: Improvements to Jira Connect application configuration @@ -104,7 +104,7 @@ image_url: https://about.gitlab.com/images/13_11/search-settings.gif published_at: 2021-04-22 release: 13.11 -- title: Deploy GitLab on OpenShift and Kubernetes with the GitLab Operator (beta) +- title: Deploy GitLab on OpenShift and Kubernetes with the GitLab Operator (beta) body: | GitLab is working to offer full support for OpenShift. To accomplish this, we have released the MVP [GitLab Operator](https://gitlab.com/gitlab-org/gl-openshift/gitlab-operator/-/tree/master/doc). The operator aims to manage the full lifecycle of GitLab instances on Kubernetes and OpenShift container platforms. Currently, this is a [beta release](https://gitlab.com/groups/gitlab-org/-/epics/3444) and it is **not recommended for production use**. The next steps will be to make the operator generally available (GA). In the future the operator will become the recommended installation method for Kubernetes and OpenShift, although the GitLab Helm chart will still be supported. We welcome you to try this operator and [provide feedback on our issue tracker](https://gitlab.com/gitlab-org/gl-openshift/gitlab-operator/-/issues/131). stage: Enablement @@ -112,6 +112,6 @@ gitlab-com: true packages: [Free, Premium, Ultimate] url: https://gitlab.com/gitlab-org/gl-openshift/gitlab-operator/-/tree/master/doc - image_url: https://about.gitlab.com/images/13_11/gitlab-operator.png + image_url: https://about.gitlab.com/images/13_11/gitlab-operator.png published_at: 2021-04-22 release: 13.11 diff --git a/data/whats_new/202105220001_13_12.yml b/data/whats_new/202105220001_13_12.yml index 945a9f8327c..bbe614959a0 100644 --- a/data/whats_new/202105220001_13_12.yml +++ b/data/whats_new/202105220001_13_12.yml @@ -1,5 +1,5 @@ - title: On-demand DAST GA launch - body: | + body: | After months of work, we are pleased to announce that our on-demand DAST scanning has reached a General Availability (GA) maturity level. It is ready for usage by anyone who needs to scan an already-deployed application or API outside of a CI/CD pipeline job. With the 13.11 release, we added to on-demand DAST Site profiles the ability to specify authentication information, exclude URLs, add additional request headers, and switch between scanning web applications and APIs. This is in addition to the ability to save scans for quick reusability that was added in 13.9, and the ability to select the branch that a scan is associated with that was added in 13.10. We believe this feature set meets the needs of a majority of GitLab customers. As we continue to add features, such as scan scheduling, we expect on-demand DAST scanning to cover an ever-increasing range of use cases. As always, we would love as much feedback about these features as possible. Please let us know how things are working for you by leaving a comment in [issue 327396](https://gitlab.com/gitlab-org/gitlab/-/issues/327396). @@ -12,7 +12,7 @@ published_at: 2021-05-22 release: 13.12 - title: Filter Project Vulnerability Report by vendor name - body: | + body: | GitLab strives to play well with others and security is no exception. We provide many security scanners as part of our Secure offering. We also encourage 3rd party vendors to [integrate their scanning tools](https://docs.gitlab.com/ee/development/integrations/secure.html) using our open API and data interchange formats. A benefit of using GitLab is managing vulnerabilities from multiple scanners in a unified experience. While you were already able to filter by scanner type (SAST, DAST), it wasn't possible to drill down by the tool provider. You now have even more granularity when managing vulnerabilities with the new ability to filter by scanner and vendor. You can look at all results across a single vendor's scanners or gain confidence in findings from one scan type (e.g. SAST) that are confirmed by both GitLab and the 3rd party tool. The new filtering capability is available now in Project Vulnerability Reports. @@ -25,10 +25,10 @@ published_at: 2021-05-22 release: 13.12 - title: Lock latest pipeline artifact to prevent deletion - body: | - GitLab now automatically locks the latest artifact produced from a successful pipeline on any active branch, merge request, or tag to prevent it from being deleted based on expiration if it is still the most recent artifact. + body: | + GitLab now automatically locks the latest artifact produced from a successful pipeline on any active branch, merge request, or tag to prevent it from being deleted based on expiration if it is still the most recent artifact. - This makes it easier to set a more aggressive expiration policy to clean up older artifacts, helps reduce disk space consumption, and ensures you have always got a copy of the latest artifact from your pipeline. + This makes it easier to set a more aggressive expiration policy to clean up older artifacts, helps reduce disk space consumption, and ensures you have always got a copy of the latest artifact from your pipeline. Pipeline artifacts, such as those used by the [test coverage visualization feature](https://docs.gitlab.com/ee/user/project/merge_requests/test_coverage_visualization.html), are not explicitly managed by the `.gitlab-ci.yml` definitions. stage: verify @@ -40,7 +40,7 @@ published_at: 2021-05-22 release: 13.12 - title: Delete associated package files via API - body: | + body: | You use the GitLab Package Registry to publish, install, and share your dependencies. You may do this using a variety of package manager formats, such as Maven or npm. If you do this as part of your CI workflow, you may publish many packages to your registry. When you publish a dependency, it generates several files including the package archive. Prior to GitLab 13.12, GitLab didn't provide a way to delete the files from a package. You could only delete the package itself. These extra files can clutter the user interface or result in someone installing an incorrect or outdated dependency. @@ -55,7 +55,7 @@ published_at: 2021-05-22 release: 13.12 - title: Configuration tool for Secret Detection - body: | + body: | Following in the footsteps of the [GitLab SAST configuration tool](https://docs.gitlab.com/ee/user/application_security/sast/index.html#configure-sast-in-the-ui) we are adding support for Secret Detection on the Security Configuration page. We believe that [security is a team effort](https://about.gitlab.com/direction/secure/#security-is-a-team-effort) and this configuration experience makes it easier for non-CI experts to get started with [GitLab Secret Detection](https://docs.gitlab.com/ee/user/application_security/secret_detection/). The tool helps a user create a merge request to enable Secret Detection scanning while leveraging best configuration practices like using the GitLab-managed [`SAST.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml). The Configuration tool can create a new `.gitlab-ci.yml` file if one does not exist or update existing simple GitLab CI files, allowing the tool to be used with projects that already have GitLab CI setup. stage: secure self-managed: true @@ -66,8 +66,8 @@ published_at: 2021-05-22 release: 13.12 - title: Code quality violation notices in MR diffs - body: | - During code reviews, you may have wanted to highlight Code Quality violations and how to resolve them. Previously, this involved having a browser window open to see the violations on the Merge Request summary and another window reviewing the changes in the MR or your IDE. You may have found switching between them too difficult and given up. + body: | + During code reviews, you may have wanted to highlight Code Quality violations and how to resolve them. Previously, this involved having a browser window open to see the violations on the Merge Request summary and another window reviewing the changes in the MR or your IDE. You may have found switching between them too difficult and given up. Now, you can see if the file you are reviewing has new code quality violations that are part of the changes right in the Merge Request diff view. This gives you the necessary context to suggest a fix as part of your normal workflow within GitLab without having to keep additional windows open and context switch back and forth between them. stage: verify @@ -79,7 +79,7 @@ published_at: 2021-05-22 release: 13.12 - title: Group-level deployment frequency CI/CD chart - body: | + body: | As part of our efforts to natively support [DORA4 metrics](https://docs.gitlab.com/ee/user/analytics/ci_cd_analytics.html#devops-research-and-assessment-dora-key-metrics) in GitLab, the group-level deployment frequency chart is now available. This chart will show the aggregated deployment frequency metrics for all the projects that are part of the group, and allow you to get a full picture of the deployment frequency across multiple projects and teams, so that you can comprehend their efficiency more accurately. Monitoring deployment frequency helps you understand the efficiency of your deployments over time, find bottlenecks, and focus on improvement areas that span across your projects and teams. stage: Release self-managed: true @@ -90,8 +90,8 @@ published_at: 2021-05-22 release: 13.12 - title: Enforce delayed project removal for all subgroups - body: | - Group owners can now enable and enforce [delayed project removal](https://docs.gitlab.com/ee/user/group/#enable-delayed-project-removal) for all subgroups and projects in their group. Delayed project removal protects your data by placing deleted projects in a read-only state after deletion and can be restored, if required. We plan to expand our settings model and allow more settings to be inherited and enforced in subgroups and projects in future milestones. Our new settings management model gives group owners a way to ensure that their subgroups and projects settings adhere to their organization's security and compliance needs. + body: | + Group owners can now enable and enforce [delayed project removal](https://docs.gitlab.com/ee/user/group/#enable-delayed-project-removal) for all subgroups and projects in their group. Delayed project removal protects your data by placing deleted projects in a read-only state after deletion and can be restored, if required. We plan to expand our settings model and allow more settings to be inherited and enforced in subgroups and projects in future milestones. Our new settings management model gives group owners a way to ensure that their subgroups and projects settings adhere to their organization's security and compliance needs. stage: manage self-managed: true gitlab-com: true @@ -101,10 +101,10 @@ published_at: 2021-05-22 release: 13.12 - title: Mobile application binary scanning support - body: | - Since GitLab 13.6, we've offered [SAST for Android and iOS mobile projects](https://about.gitlab.com/releases/2020/10/22/gitlab-13-5-released/#sast-support-for-ios-and-android-mobile-apps). Initially our Mobile App SAST supported the automatic detection of Xcode projects and Android manifest files. With this release and contribution from community contributor [@proletarius101](https://gitlab.com/proletarius101), GitLab SAST now also supports the automatic detection of .ipa (iOS) and .apk (Android) binary files enabling the security scanning of fully built mobile application artifacts. This offers mobile teams more flexibility with how they build and scan their mobile projects with GitLab SAST for security vulnerabilities. - Please note that mobile application scanning is still an experimental feature and [requires enabling the experimental flag](https://docs.gitlab.com/ee/user/application_security/sast/#experimental-features) in your CI template. We will make the mobile application scanner generally available without this flag [in the near future](https://gitlab.com/groups/gitlab-org/-/epics/5977). - stage: secure + body: | + Since GitLab 13.6, we've offered [SAST for Android and iOS mobile projects](https://about.gitlab.com/releases/2020/10/22/gitlab-13-5-released/#sast-support-for-ios-and-android-mobile-apps). Initially our Mobile App SAST supported the automatic detection of Xcode projects and Android manifest files. With this release and contribution from community contributor [@proletarius101](https://gitlab.com/proletarius101), GitLab SAST now also supports the automatic detection of .ipa (iOS) and .apk (Android) binary files enabling the security scanning of fully built mobile application artifacts. This offers mobile teams more flexibility with how they build and scan their mobile projects with GitLab SAST for security vulnerabilities. + Please note that mobile application scanning is still an experimental feature and [requires enabling the experimental flag](https://docs.gitlab.com/ee/user/application_security/sast/#experimental-features) in your CI template. We will make the mobile application scanner generally available without this flag [in the near future](https://gitlab.com/groups/gitlab-org/-/epics/5977). + stage: secure self-managed: true gitlab-com: true packages: [Free, Premium, Ultimate] @@ -113,9 +113,9 @@ published_at: 2021-05-22 release: 13.12 - title: Instance-level Federated Learning of Cohorts (FLoC) opt-in - body: | + body: | [Federated Learning of Cohorts (FLoC)](https://en.wikipedia.org/wiki/Federated_Learning_of_Cohorts) is a new type of web tracking, intended to replace the use of third-party cookies. It does this by grouping users into cohorts based on their browsing history, for the primary purpose of interest-based advertising. FLoC is being activated in the Chrome browser in some regions. - + With GitLab 13.12, FLoC will not incorporate GitLab browsing activity by default. If an instance administrator would like their users' GitLab instance usage to contribute to FLoC, they can re-enable in instance settings. stage: enablement self-managed: true diff --git a/data/whats_new/202106220001_14_0.yml b/data/whats_new/202106220001_14_0.yml index fb3775239d4..a17261e8586 100644 --- a/data/whats_new/202106220001_14_0.yml +++ b/data/whats_new/202106220001_14_0.yml @@ -149,7 +149,7 @@ - title: Terraform module registry built into GitLab body: | Terraform modules play a central role in building standard infrastructure components throughout an organization. Up to GitLab 13.12, GitLab users had to use either a third-party Terraform module registry, local modules, or Git-based modules. While these options work well, they do not help with the distribution of the modules and they lack proper versioning support, which introduces risks for module users. GitLab 14.0 extends our [Infrastructure-as-Code offerings](https://docs.gitlab.com/ee/user/infrastructure/) with a Terraform module registry. Now, you can use the Terraform module registry built into GitLab to discover Terraform modules with semantic versioning support for upgrades and maintenance. Moreover, you can publish modules easily using GitLab CI/CD. - + While following Terraform's best practices, we recommend developing each Terraform module in a dedicated GitLab project. To simplify the transition to the registry, users can host and publish multiple modules from a single GitLab repository. You can learn more about publishing and consuming a new module [in our documentation](https://docs.gitlab.com/ee/user/packages/terraform_module_registry/index.html). stage: Configure self-managed: true diff --git a/data/whats_new/202107220001_14_1.yml b/data/whats_new/202107220001_14_1.yml index 5ab4651a43c..3c67d74d3db 100644 --- a/data/whats_new/202107220001_14_1.yml +++ b/data/whats_new/202107220001_14_1.yml @@ -27,7 +27,7 @@ With [GitLab Workflow](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow) [v3.26.0](https://gitlab.com/gitlab-org/gitlab-vscode-extension/-/blob/main/CHANGELOG.md#3260-2021-07-13) for VS Code you can now create and apply patches directly in your editor. The new `GitLab: Create snippet patch` command creates a patch with the changes in your editor and uploads that patch as a [GitLab snippet](https://docs.gitlab.com/ee/user/snippets.html). - Anyone can search for patches in the project's snippets and apply them directly in VS Code with the `GitLab: Apply snippet patch` command. The applied changes can then be committed to the MR. + Anyone can search for patches in the project's snippets and apply them directly in VS Code with the `GitLab: Apply snippet patch` command. The applied changes can then be committed to the MR. Sharing and collaborating around patches is a great way to propose more complex suggestions and provide clear improvements. Patches created in VS Code can also be linked to others through snippets and downloaded and applied outside of VS Code for users with different editing tools. stage: Create @@ -38,7 +38,7 @@ image_url: https://img.youtube.com/vi/QQxpLoKJULQ/hqdefault.jpg published_at: 2021-07-22 release: 14.1 -- title: Code coverage merge request approval rule +- title: Code coverage merge request approval rule body: | To keep code test coverage high, you need to ensure that merge requests to your codebase never decrease test coverage. Previously, the only way to enforce this was to [require approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/#required-approvals) from users who would check for test coverage decreases as part of their reviews. @@ -68,7 +68,7 @@ GitLab already supports a variety of other [package manager formats](https://docs.gitlab.com/ee/user/packages/). Why not also support Helm? That's what community member and [MVP from the 14.0 milestone](https://about.gitlab.com/releases/2021/06/22/gitlab-14-0-released/#mvp) [Mathieu Parent](https://gitlab.com/sathieu) asked several months ago before breaking ground on the new GitLab Helm chart registry. The collaboration between the community and GitLab is part of our [dual flywheel strategy](https://about.gitlab.com/company/strategy/#dual-flywheels) and one of the reasons we love working at GitLab. Chapeau Mathieu! - Now you can use your GitLab project to publish and share packaged Helm charts. Simply add your project as a remote, authenticating with a personal access, deploy, or CI/CD job token. Once that's done you can use the Helm client or GitLab CI/CD to manage your Helm charts. You can also download the charts using the [API](https://docs.gitlab.com/ee/api/packages.html#get-a-project-package) or the [user interface](https://docs.gitlab.com/ee/user/packages/package_registry/#download-a-package). + Now you can use your GitLab project to publish and share packaged Helm charts. Simply add your project as a remote, authenticating with a personal access, deploy, or CI/CD job token. Once that's done you can use the Helm client or GitLab CI/CD to manage your Helm charts. You can also download the charts using the [API](https://docs.gitlab.com/ee/api/packages.html#get-a-project-package) or the [user interface](https://docs.gitlab.com/ee/user/packages/package_registry/#download-a-package). stage: Package self-managed: true gitlab-com: true @@ -81,7 +81,7 @@ body: | Being on-call is a stressful, 24/7 job. It's possible to miss a notification despite your best efforts and intentions. Teams that maintain critical systems can't afford to miss alerts for outages or service disruptions. Escalation policies are a safety net for these situations. Escalation policies contain time-boxed steps that automatically page a responder in the next escalation step if the responder in the step before didn't respond. To protect your company from missed critical alerts, create an escalation policy in the GitLab project where you manage on-call schedules. - In GitLab 14.1, users can create, view, or delete escalation policies. + In GitLab 14.1, users can create, view, or delete escalation policies. stage: Monitor self-managed: true gitlab-com: true @@ -128,7 +128,7 @@ release: 14.1 - title: Pronouns viewable in user profile snapshot body: | - You can now see pronouns on the snapshot view of a user profile when you hover over someone's name on an issue or merge request. This helps users better respond to comments using the correct pronouns without needing to navigate to the user's profile. + You can now see pronouns on the snapshot view of a user profile when you hover over someone's name on an issue or merge request. This helps users better respond to comments using the correct pronouns without needing to navigate to the user's profile. stage: Manage self-managed: true gitlab-com: true diff --git a/data/whats_new/2021102000001_14_04.yml b/data/whats_new/2021102000001_14_04.yml index 146544f6f6b..13caddd2bc5 100644 --- a/data/whats_new/2021102000001_14_04.yml +++ b/data/whats_new/2021102000001_14_04.yml @@ -13,7 +13,7 @@ body: | When working in your editor you may need to refer to another project or upstream library for additional information. When you don't have that project already cloned locally, you're forced to either leave your editor and browse the project on GitLab, or locate and then clone the project so you can browse it in your editor. Both of those tasks break your current context, introduce delays, and can take you to a less familiar interface for working with code. - [GitLab Workflow](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow) version `3.33.0` provides an option to open a remote repository. Open the command palette and use the `GitLab: Open Remote Repository` command to find and then open a project. + [GitLab Workflow](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow) version `3.33.0` provides an option to open a remote repository. Open the command palette and use the `GitLab: Open Remote Repository` command to find and then open a project. Opening a remote repository allows you to browse a read-only version of a project in your familiar VS Code environment. You can then quickly find the information you're looking for, compare an implementation, or copy a snippet you need. stage: Create @@ -57,4 +57,3 @@ image_url: https://about.gitlab.com/images/14_4/monitor-integrated-error-tracking.png published_at: 2021-10-22 release: 14.4 - diff --git a/data/whats_new/202112200001_14_06.yml b/data/whats_new/202112200001_14_06.yml index 77491629892..178cc4dc019 100644 --- a/data/whats_new/202112200001_14_06.yml +++ b/data/whats_new/202112200001_14_06.yml @@ -33,9 +33,9 @@ release: 14.6 - title: Toggle wiki editors seamlessly body: | - Editing wiki pages with the new rich Markdown editor makes it easier for everyone to contribute regardless of how well they know Markdown syntax. You may also prefer to write raw Markdown in some situations, but use the WYSIWYG interface for more complex or tedious formatting tasks, like creating tables. + Editing wiki pages with the new rich Markdown editor makes it easier for everyone to contribute regardless of how well they know Markdown syntax. You may also prefer to write raw Markdown in some situations, but use the WYSIWYG interface for more complex or tedious formatting tasks, like creating tables. - Previous versions of GitLab required you to save changes before switching between the rich Markdown editor and the Markdown source, adding more steps and friction to your edits. In GitLab 14.6 you can now seamlessly switch between the two editing experiences without committing your changes, choosing the editor that suits your needs at any given moment. + Previous versions of GitLab required you to save changes before switching between the rich Markdown editor and the Markdown source, adding more steps and friction to your edits. In GitLab 14.6 you can now seamlessly switch between the two editing experiences without committing your changes, choosing the editor that suits your needs at any given moment. stage: Create self-managed: true gitlab-com: true diff --git a/data/whats_new/202201200001_14_07.yml b/data/whats_new/202201200001_14_07.yml index 4f260ee8a8c..d8c76334775 100644 --- a/data/whats_new/202201200001_14_07.yml +++ b/data/whats_new/202201200001_14_07.yml @@ -39,4 +39,3 @@ image_url: https://about.gitlab.com/images/14_7/group_access_token.png published_at: 2022-01-22 release: 14.7 - diff --git a/data/whats_new/202202210001_14_08.yml b/data/whats_new/202202210001_14_08.yml index 116eb889bbe..930535dd4e0 100644 --- a/data/whats_new/202202210001_14_08.yml +++ b/data/whats_new/202202210001_14_08.yml @@ -31,7 +31,7 @@ - Multiple rules can be created and chained together to allow for filtering on different severity thresholds for each scanner type. - A two-step approval process can be enforced for any desired changes to security approval rules. - A single set of security policies can be applied to multiple development projects to allow for ease in maintaining a single, centralized ruleset. - + Security approval policies can be used alongside the existing Vulnerability-Check feature, as the two policies are additive and don't conflict. However, we encourage users to migrate their Vulnerability-Check rules over to security approval policies. Vulnerability-Check rules are now [deprecated](https://docs.gitlab.com/ee/update/deprecations.html#vulnerability-check), and are scheduled for removal in GitLab 15.0. Self managed users will need to enable the `scan_result_policy` feature flag prior to using this feature. To get started, navigate to **Security & Compliance > Policies** and create a new Scan Result type policy. stage: protect self-managed: true @@ -58,7 +58,7 @@ [user impersonation](https://docs.gitlab.com/ee/user/admin_area/#user-impersonation) starting and stopping. This was previously only available on a page unavailable to GitLab SaaS customers. We are excited to bring it to the group page which allows both self-managed and SaaS users to view these events! - + These events are helpful to understand if an administrator impersonated a user in your group and any actions that the administrator took as the impersonated user. You can correlate: @@ -80,7 +80,7 @@ body: | In this release, we have introduced additional progress tracking capabilities to roadmaps. You can now view the percentage of completed epics based on issue count instead of issue weight. This functionality is useful for organizations that are using Kanban or other methodologies that don't require their teams to set a weight on issues. - You can now also customize the level of milestones to include in your roadmap, allowing you to tailor your view to meet the needs of your audience. + You can now also customize the level of milestones to include in your roadmap, allowing you to tailor your view to meet the needs of your audience. stage: plan self-managed: true gitlab-com: true @@ -89,4 +89,3 @@ image_url: 'https://about.gitlab.com/images/14_8/rp_roadmap_settings.png' published_at: 2022-02-22 release: 14.8 -
\ No newline at end of file diff --git a/data/whats_new/templates/YYYYMMDD0001_XX_YY.yml b/data/whats_new/templates/YYYYMMDD0001_XX_YY.yml index f8611da2cff..0e34b37a32b 100644 --- a/data/whats_new/templates/YYYYMMDD0001_XX_YY.yml +++ b/data/whats_new/templates/YYYYMMDD0001_XX_YY.yml @@ -9,8 +9,8 @@ # # Please delete this line and above before submitting your merge request. -- title: # Match the release post entry - body: | # Do not modify this line, instead modify the lines below. +- title: # Match the release post entry + body: | # Do not modify this line, instead modify the lines below. <!-- START OF BODY COMMENT This area supports markdown. @@ -22,11 +22,11 @@ Delete this entire comment and replace it with your markdown content. END OF BODY COMMENT --> - stage: # String value of the stage that the feature was created in. e.g., Growth - self-managed: # Boolean value (true or false) - gitlab-com: # Boolean value (true or false) - packages: # Array of strings. The Array brackets are required here. e.g., [Core, Starter, Premium, Ultimate] - url: # This is the documentation URL, but can be a URL to a video if there is one - image_url: # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg - published_at: # YYYY-MM-DD - release: # XX.Y + stage: # String value of the stage that the feature was created in. e.g., Growth + self-managed: # Boolean value (true or false) + gitlab-com: # Boolean value (true or false) + packages: # Array of strings. The Array brackets are required here. e.g., [Core, Starter, Premium, Ultimate] + url: # This is the documentation URL, but can be a URL to a video if there is one + image_url: # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg + published_at: # YYYY-MM-DD + release: # XX.Y diff --git a/doc/development/dangerbot.md b/doc/development/dangerbot.md index e2ff56351a7..9bf0fbe1d78 100644 --- a/doc/development/dangerbot.md +++ b/doc/development/dangerbot.md @@ -124,8 +124,8 @@ NOTE: This is applicable to all the projects that use the [`gitlab-dangerfiles` gem](https://rubygems.org/gems/gitlab-dangerfiles). Danger is often used to improve MR hygiene by adding labels. Instead of calling the -API directly in your `Dangerfile`, add the labels to `helper.labels_to_add` set (with `helper.labels_to_add << label` -or `helper.labels_to_add.merge(array_of_labels)`. +API directly in your `Dangerfile`, add the labels to `helper.labels_to_add` array (with `helper.labels_to_add << label` +or `helper.labels_to_add.concat(array_of_labels)`. `gitlab-dangerfiles` will then take care of adding the labels to the MR with a single API call after all the rules have had the chance to add to `helper.labels_to_add`. diff --git a/doc/integration/azure.md b/doc/integration/azure.md index 8d69881699b..ee39d2b6e04 100644 --- a/doc/integration/azure.md +++ b/doc/integration/azure.md @@ -4,102 +4,104 @@ group: Integrations info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments --- -# Microsoft Azure OAuth 2.0 OmniAuth Provider **(FREE SELF)** +# Use Microsoft Azure as an authentication provider **(FREE SELF)** + +You can enable the Microsoft Azure OAuth 2.0 OmniAuth provider and sign in to +GitLab with your Microsoft Azure credentials. You can configure the provider that uses +[the earlier Azure Active Directory v1.0 endpoint](https://docs.microsoft.com/en-us/azure/active-directory/azuread-dev/v1-protocols-oauth-code), +or the provider that uses the v2.0 endpoint. NOTE: -Per Microsoft, this provider uses the [older Azure Active Directory v1.0 endpoint](https://docs.microsoft.com/en-us/azure/active-directory/azuread-dev/v1-protocols-oauth-code). -Microsoft documentation suggests that you should use the [OpenID Connect protocol to use the v2 endpoints](../administration/auth/oidc.md#microsoft-azure) for new projects. -To use v2 endpoints via OmniAuth, please follow [Microsoft Azure OAuth 2.0 OmniAuth Provider v2 instructions](#microsoft-azure-oauth-20-omniauth-provider-v2). +For new projects, Microsoft suggests you use the +[OpenID Connect protocol](../administration/auth/oidc.md#microsoft-azure), +which uses the Microsoft identity platform (v2.0) endpoint. + +## Register an Azure application To enable the Microsoft Azure OAuth 2.0 OmniAuth provider, you must register -your application with Azure. Azure generates a client ID and secret key for you -to use. +an Azure application and get a client ID and secret key. -Sign in to the [Azure Portal](https://portal.azure.com), and follow the -instructions in the [Microsoft Quickstart documentation](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app). +1. Sign in to the [Azure portal](https://portal.azure.com). +1. If you have multiple Azure Active Directory tenants, switch to the desired tenant. +1. [Register an application](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app) + and provide the following information: + - The redirect URI, which requires the URL of the Azure OAuth callback of your GitLab + installation. For example, `https://gitlab.mycompany.com/users/auth/azure_oauth2/callback`. + - The application type, which must be set to **Web**. +1. Save the client ID and client secret. The client secret is only + displayed once. -As you go through the Microsoft procedure, keep the following in mind: + If required, you can [create a new application secret](https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal#option-2-create-a-new-application-secret). -- If you have multiple instances of Azure Active Directory, you can switch to the desired tenant. -- You're setting up a Web application. -- The redirect URI requires the URL of the Azure OAuth callback of your GitLab - installation. For example, `https://gitlab.mycompany.com/users/auth/azure_oauth2/callback`. - The type dropdown should be set to **Web**. -- The `client ID` and `client secret` are terms associated with OAuth 2.0. In some Microsoft documentation, - the terms may be listed as `Application ID` and `Application Secret`. -- If you have to generate a new client secret, follow the Microsoft documentation - for [creating a new application secret](https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal#create-a-new-application-secret). -- Save the client ID and client secret for your new app, as the client secret is only - displayed one time. +`client ID` and `client secret` are terms associated with OAuth 2.0. +In some Microsoft documentation, the terms are named `Application ID` and +`Application Secret`. + +## Enable Microsoft OAuth in GitLab 1. On your GitLab server, open the configuration file. - For Omnibus GitLab: + - **For Omnibus installations** - ```shell - sudo editor /etc/gitlab/gitlab.rb - ``` + ```shell + sudo editor /etc/gitlab/gitlab.rb + ``` - For installations from source: + - **For installations from source** - ```shell - cd /home/git/gitlab + ```shell + cd /home/git/gitlab - sudo -u git -H editor config/gitlab.yml - ``` + sudo -u git -H editor config/gitlab.yml + ``` -1. Refer to [Configure initial settings](omniauth.md#configure-initial-settings) - for initial settings. +1. [Configure the initial settings](omniauth.md#configure-initial-settings). -1. Add the provider configuration: +1. Add the provider configuration. Replace `CLIENT ID`, `CLIENT SECRET`, and `TENANT ID` + with the values you got when you registered the Azure application. - For Omnibus GitLab: + - **For Omnibus installations** - ```ruby - gitlab_rails['omniauth_providers'] = [ - { - name: "azure_oauth2", - # label: "Provider name", # optional label for login button, defaults to "Azure AD" - args: { - client_id: "CLIENT ID", - client_secret: "CLIENT SECRET", - tenant_id: "TENANT ID", + ```ruby + gitlab_rails['omniauth_providers'] = [ + { + name: "azure_oauth2", + # label: "Provider name", # optional label for login button, defaults to "Azure AD" + args: { + client_id: "CLIENT ID", + client_secret: "CLIENT SECRET", + tenant_id: "TENANT ID", + } } - } - ] - ``` + ] + ``` - For installations from source: - - ```yaml - - { name: 'azure_oauth2', - # label: 'Provider name', # optional label for login button, defaults to "Azure AD" - args: { client_id: 'CLIENT ID', - client_secret: 'CLIENT SECRET', - tenant_id: 'TENANT ID' } } - ``` + - **For installations from source** - The `base_azure_url` is optional and can be added for different locales; - such as `base_azure_url: "https://login.microsoftonline.de"`. + ```yaml + - { name: 'azure_oauth2', + # label: 'Provider name', # optional label for login button, defaults to "Azure AD" + args: { client_id: 'CLIENT ID', + client_secret: 'CLIENT SECRET', + tenant_id: 'TENANT ID' } } + ``` -1. Replace `CLIENT ID`, `CLIENT SECRET` and `TENANT ID` with the values you got above. + You can optionally add `base_azure_url` for different locales, + for example, `base_azure_url: "https://login.microsoftonline.de"`. 1. Save the configuration file. -1. Reconfigure or restart GitLab, depending on your installation method: +1. [Reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure) + if you installed using Omnibus, or [restart GitLab](../administration/restart_gitlab.md#installations-from-source) + if you installed from source. - - *If you installed from Omnibus GitLab,* - [reconfigure](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure) GitLab. - - *If you installed from source,* - [restart GitLab](../administration/restart_gitlab.md#installations-from-source). +1. Refresh the GitLab sign-in page. A Microsoft icon should display below the + sign-in form. -On the sign-in page, you should now see a Microsoft icon below the regular -sign-in form. Click the icon to begin the authentication process. Microsoft then -asks you to sign in and authorize the GitLab application. If successful, you are -returned to GitLab and signed in. +1. Select the icon. Sign in to Microsoft and authorize the GitLab application. -Read [Enable OmniAuth for an Existing User](omniauth.md#enable-omniauth-for-an-existing-user) -for information on how existing GitLab users can connect to their newly-available Azure AD accounts. +Read [Enable OmniAuth for an existing user](omniauth.md#enable-omniauth-for-an-existing-user) +for information on how existing GitLab users can connect to their new Azure AD accounts. ## Microsoft Azure OAuth 2.0 OmniAuth Provider v2 diff --git a/doc/operations/incident_management/alerts.md b/doc/operations/incident_management/alerts.md index b03955edf87..90b82b824a6 100644 --- a/doc/operations/incident_management/alerts.md +++ b/doc/operations/incident_management/alerts.md @@ -217,13 +217,3 @@ add a to-do item: ![Alert Details Add a to do](img/alert_detail_add_todo_v13_9.png) To view your To-Do List, on the top bar, select **To-Do List** (**{todo-done}**). - -## View the environment that generated the alert - -> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/232492) in GitLab 13.5 behind a feature flag, disabled by default. -> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/232492) in GitLab 13.6. - -WARNING: -This feature might not be available to you. Check the **version history** note above for details. - -The environment information and the link are displayed in the [Alert Details tab](#alert-details-tab). diff --git a/spec/features/projects/pages/user_adds_domain_spec.rb b/spec/features/projects/pages/user_adds_domain_spec.rb index bd4cb1aa39b..71bf1c24655 100644 --- a/spec/features/projects/pages/user_adds_domain_spec.rb +++ b/spec/features/projects/pages/user_adds_domain_spec.rb @@ -95,7 +95,7 @@ RSpec.describe 'User adds pages domain', :js do fill_in 'Domain', with: 'my.test.domain.com' - find('.js-auto-ssl-toggle-container .project-feature-toggle').click + find('.js-auto-ssl-toggle-container .js-project-feature-toggle').click fill_in 'Certificate (PEM)', with: certificate_pem fill_in 'Key (PEM)', with: certificate_key diff --git a/spec/features/projects/pages/user_edits_lets_encrypt_settings_spec.rb b/spec/features/projects/pages/user_edits_lets_encrypt_settings_spec.rb index a3fc5804e13..bdf280f4fe4 100644 --- a/spec/features/projects/pages/user_edits_lets_encrypt_settings_spec.rb +++ b/spec/features/projects/pages/user_edits_lets_encrypt_settings_spec.rb @@ -50,7 +50,7 @@ RSpec.describe "Pages with Let's Encrypt", :https_pages_enabled do expect(page).to have_selector '.card-header', text: 'Certificate' expect(page).to have_text domain.subject - find('.js-auto-ssl-toggle-container .project-feature-toggle').click + find('.js-auto-ssl-toggle-container .js-project-feature-toggle').click expect(find("#pages_domain_auto_ssl_enabled", visible: false).value).to eq 'true' expect(page).not_to have_selector '.card-header', text: 'Certificate' @@ -74,7 +74,7 @@ RSpec.describe "Pages with Let's Encrypt", :https_pages_enabled do expect(page).not_to have_field 'Certificate (PEM)', type: 'textarea' expect(page).not_to have_field 'Key (PEM)', type: 'textarea' - find('.js-auto-ssl-toggle-container .project-feature-toggle').click + find('.js-auto-ssl-toggle-container .js-project-feature-toggle').click expect(find("#pages_domain_auto_ssl_enabled", visible: false).value).to eq 'false' expect(page).to have_field 'Certificate (PEM)', type: 'textarea' diff --git a/spec/frontend/integrations/edit/components/integration_form_spec.js b/spec/frontend/integrations/edit/components/integration_form_spec.js index 7e01b79383a..7be519b6cde 100644 --- a/spec/frontend/integrations/edit/components/integration_form_spec.js +++ b/spec/frontend/integrations/edit/components/integration_form_spec.js @@ -37,7 +37,7 @@ describe('IntegrationForm', () => { const createComponent = ({ customStateProps = {}, initialState = {}, - props = {}, + provide = {}, mountFn = shallowMountExtended, } = {}) => { const store = createStore({ @@ -47,7 +47,7 @@ describe('IntegrationForm', () => { dispatch = jest.spyOn(store, 'dispatch').mockImplementation(); wrapper = mountFn(IntegrationForm, { - propsData: { ...props }, + provide, store, stubs: { OverrideDropdown, @@ -300,7 +300,7 @@ describe('IntegrationForm', () => { }); }); - describe('with `helpHtml` prop', () => { + describe('with `helpHtml` provided', () => { const mockTestId = 'jest-help-html-test'; setHTMLFixture(` @@ -316,7 +316,7 @@ describe('IntegrationForm', () => { const mockHelpHtml = document.querySelector(`[data-testid="${mockTestId}"]`); createComponent({ - props: { + provide: { helpHtml: mockHelpHtml.outerHTML, }, }); diff --git a/spec/frontend/integrations/edit/mock_data.js b/spec/frontend/integrations/edit/mock_data.js index 39e5f8521e8..c8b292dcf6a 100644 --- a/spec/frontend/integrations/edit/mock_data.js +++ b/spec/frontend/integrations/edit/mock_data.js @@ -13,6 +13,7 @@ export const mockIntegrationProps = { fields: [], type: '', inheritFromId: 25, + integrationLevel: 'project', }; export const mockJiraIssueTypes = [ diff --git a/spec/frontend/integrations/edit/store/getters_spec.js b/spec/frontend/integrations/edit/store/getters_spec.js index 3353e0c84cc..4680c4b24cc 100644 --- a/spec/frontend/integrations/edit/store/getters_spec.js +++ b/spec/frontend/integrations/edit/store/getters_spec.js @@ -1,5 +1,12 @@ -import { currentKey, isInheriting, propsSource } from '~/integrations/edit/store/getters'; +import { + currentKey, + isInheriting, + isProjectLevel, + propsSource, +} from '~/integrations/edit/store/getters'; + import createState from '~/integrations/edit/store/state'; +import { integrationLevels } from '~/integrations/constants'; import { mockIntegrationProps } from '../mock_data'; describe('Integration form store getters', () => { @@ -45,6 +52,18 @@ describe('Integration form store getters', () => { }); }); + describe('isProjectLevel', () => { + it.each` + integrationLevel | expected + ${integrationLevels.PROJECT} | ${true} + ${integrationLevels.GROUP} | ${false} + ${integrationLevels.INSTANCE} | ${false} + `('when integrationLevel is `$integrationLevel`', ({ integrationLevel, expected }) => { + state.customState.integrationLevel = integrationLevel; + expect(isProjectLevel(state)).toBe(expected); + }); + }); + describe('propsSource', () => { beforeEach(() => { state.defaultState = defaultState; diff --git a/spec/frontend/issues/show/components/incidents/incident_tabs_spec.js b/spec/frontend/issues/show/components/incidents/incident_tabs_spec.js index 68c204766ca..20c6cda33d4 100644 --- a/spec/frontend/issues/show/components/incidents/incident_tabs_spec.js +++ b/spec/frontend/issues/show/components/incidents/incident_tabs_spec.js @@ -58,7 +58,6 @@ describe('Incident Tabs component', () => { const findTabs = () => wrapper.findAll(GlTab); const findSummaryTab = () => findTabs().at(0); const findMetricsTab = () => wrapper.find('[data-testid="metrics-tab"]'); - const findTimelineTab = () => wrapper.find('[data-testid="timeline-events-tab"]'); const findAlertDetailsTab = () => wrapper.find('[data-testid="alert-details-tab"]'); const findAlertDetailsComponent = () => wrapper.find(AlertDetailsTable); const findDescriptionComponent = () => wrapper.find(DescriptionComponent); @@ -74,29 +73,6 @@ describe('Incident Tabs component', () => { }); }); - describe('incident timeline tab', () => { - beforeEach(() => { - mountComponent(); - }); - - it('renders the timeline tab when feature flag is enabled', () => { - expect(findTimelineTab().exists()).toBe(true); - expect(findTimelineTab().attributes('title')).toBe('Timeline'); - }); - - it('does not render timeline tab when feature flag is disabled', () => { - mountComponent({}, { provide: { glFeatures: { incidentTimelineEventTab: false } } }); - - expect(findTimelineTab().exists()).toBe(false); - }); - - it('does not render timeline tab when not available in license', () => { - mountComponent({}, { provide: { glFeatures: { incidentTimelineEvents: false } } }); - - expect(findTimelineTab().exists()).toBe(false); - }); - }); - describe('with an alert present', () => { beforeEach(() => { mountComponent(); diff --git a/spec/frontend/pages/projects/pages_domains/form_spec.js b/spec/frontend/pages/projects/pages_domains/form_spec.js new file mode 100644 index 00000000000..55336596f30 --- /dev/null +++ b/spec/frontend/pages/projects/pages_domains/form_spec.js @@ -0,0 +1,82 @@ +import initForm from '~/pages/projects/pages_domains/form'; + +const ENABLED_UNLESS_AUTO_SSL_CLASS = 'js-enabled-unless-auto-ssl'; +const SSL_TOGGLE_CLASS = 'js-enable-ssl-gl-toggle'; +const SSL_TOGGLE_INPUT_CLASS = 'js-project-feature-toggle-input'; +const SHOW_IF_AUTO_SSL_CLASS = 'js-shown-if-auto-ssl'; +const SHOW_UNLESS_AUTO_SSL_CLASS = 'js-shown-unless-auto-ssl'; +const D_NONE_CLASS = 'd-none'; + +describe('Page domains form', () => { + let toggle; + + const findEnabledUnless = () => document.querySelector(`.${ENABLED_UNLESS_AUTO_SSL_CLASS}`); + const findSslToggle = () => document.querySelector(`.${SSL_TOGGLE_CLASS} button`); + const findSslToggleInput = () => document.querySelector(`.${SSL_TOGGLE_INPUT_CLASS}`); + const findIfAutoSsl = () => document.querySelector(`.${SHOW_IF_AUTO_SSL_CLASS}`); + const findUnlessAutoSsl = () => document.querySelector(`.${SHOW_UNLESS_AUTO_SSL_CLASS}`); + + const create = () => { + setFixtures(` + <form> + <span + class="${SSL_TOGGLE_CLASS}" + data-label="SSL toggle" + ></span> + <input class="${SSL_TOGGLE_INPUT_CLASS}" type="hidden" /> + <span class="${SHOW_UNLESS_AUTO_SSL_CLASS}"></span> + <span class="${SHOW_IF_AUTO_SSL_CLASS}"></span> + <button class="${ENABLED_UNLESS_AUTO_SSL_CLASS}"></button> + </form> + `); + }; + + it('instantiates the toggle', () => { + create(); + initForm(); + + expect(findSslToggle()).not.toBe(null); + }); + + describe('when auto SSL is enabled', () => { + beforeEach(() => { + create(); + toggle = initForm(); + toggle.$emit('change', true); + }); + + it('sets the correct classes', () => { + expect(Array.from(findIfAutoSsl().classList)).not.toContain(D_NONE_CLASS); + expect(Array.from(findUnlessAutoSsl().classList)).toContain(D_NONE_CLASS); + }); + + it('sets the correct disabled value', () => { + expect(findEnabledUnless().getAttribute('disabled')).toBe('disabled'); + }); + + it('sets the correct value for the input', () => { + expect(findSslToggleInput().getAttribute('value')).toBe('true'); + }); + }); + + describe('when auto SSL is not enabled', () => { + beforeEach(() => { + create(); + toggle = initForm(); + toggle.$emit('change', false); + }); + + it('sets the correct classes', () => { + expect(Array.from(findIfAutoSsl().classList)).toContain(D_NONE_CLASS); + expect(Array.from(findUnlessAutoSsl().classList)).not.toContain(D_NONE_CLASS); + }); + + it('sets the correct disabled value', () => { + expect(findUnlessAutoSsl().getAttribute('disabled')).toBe(null); + }); + + it('sets the correct value for the input', () => { + expect(findSslToggleInput().getAttribute('value')).toBe('false'); + }); + }); +}); diff --git a/spec/frontend/pipeline_editor/components/editor/text_editor_spec.js b/spec/frontend/pipeline_editor/components/editor/text_editor_spec.js index f15d5f334d6..6cdf9a93d55 100644 --- a/spec/frontend/pipeline_editor/components/editor/text_editor_spec.js +++ b/spec/frontend/pipeline_editor/components/editor/text_editor_spec.js @@ -1,6 +1,7 @@ import { shallowMount } from '@vue/test-utils'; import { EDITOR_READY_EVENT } from '~/editor/constants'; +import { SOURCE_EDITOR_DEBOUNCE } from '~/pipeline_editor/constants'; import TextEditor from '~/pipeline_editor/components/editor/text_editor.vue'; import { mockCiConfigPath, @@ -22,7 +23,7 @@ describe('Pipeline Editor | Text editor component', () => { const MockSourceEditor = { template: '<div/>', - props: ['value', 'fileName'], + props: ['value', 'fileName', 'editorOptions', 'debounceValue'], }; const createComponent = (glFeatures = {}, mountFn = shallowMount) => { @@ -90,6 +91,14 @@ describe('Pipeline Editor | Text editor component', () => { expect(findEditor().props('fileName')).toBe(mockCiConfigPath); }); + it('passes down editor configs options', () => { + expect(findEditor().props('editorOptions')).toEqual({ quickSuggestions: true }); + }); + + it('passes down editor debounce value', () => { + expect(findEditor().props('debounceValue')).toBe(SOURCE_EDITOR_DEBOUNCE); + }); + it('bubbles up events', () => { findEditor().vm.$emit(EDITOR_READY_EVENT, editorInstanceDetail); diff --git a/spec/frontend/snippets/components/__snapshots__/snippet_blob_edit_spec.js.snap b/spec/frontend/snippets/components/__snapshots__/snippet_blob_edit_spec.js.snap index e12255fe825..6fc358a6a15 100644 --- a/spec/frontend/snippets/components/__snapshots__/snippet_blob_edit_spec.js.snap +++ b/spec/frontend/snippets/components/__snapshots__/snippet_blob_edit_spec.js.snap @@ -14,6 +14,7 @@ exports[`Snippet Blob Edit component with loaded blob matches snapshot 1`] = ` /> <source-editor-stub + debouncevalue="250" editoroptions="[object Object]" fileglobalid="blob_local_7" filename="foo/bar/test.md" diff --git a/spec/frontend/toggles/index_spec.js b/spec/frontend/toggles/index_spec.js index 575b1b6080c..19c4d6f1f1d 100644 --- a/spec/frontend/toggles/index_spec.js +++ b/spec/frontend/toggles/index_spec.js @@ -99,10 +99,12 @@ describe('toggles/index.js', () => { const name = 'toggle-name'; const help = 'Help text'; const foo = 'bar'; + const id = 'an-id'; beforeEach(() => { initToggleWithOptions({ name, + id, isChecked: true, disabled: true, isLoading: true, @@ -144,6 +146,10 @@ describe('toggles/index.js', () => { it('passes custom dataset to the wrapper', () => { expect(toggleWrapper.dataset.foo).toBe('bar'); }); + + it('passes an id to the wrapper', () => { + expect(toggleWrapper.id).toBe(id); + }); }); }); }); |