Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitlab-ci.yml3
-rw-r--r--.gitlab/ci/reports.gitlab-ci.yml9
-rw-r--r--.gitlab/ci/rules.gitlab-ci.yml7
-rw-r--r--.rubocop_todo/rspec/missing_feature_category.yml1
-rw-r--r--Gemfile8
-rw-r--r--Gemfile.checksum2
-rw-r--r--Gemfile.lock4
-rw-r--r--app/assets/javascripts/analytics/cycle_analytics/components/base.vue4
-rw-r--r--app/assets/javascripts/analytics/cycle_analytics/utils.js3
-rw-r--r--app/controllers/projects/cycle_analytics_controller.rb1
-rw-r--r--app/models/concerns/token_authenticatable_strategies/encryption_helper.rb2
-rw-r--r--app/serializers/pipeline_details_entity.rb6
-rw-r--r--config/feature_flags/development/lazy_load_manual_actions.yml8
-rw-r--r--config/feature_flags/ops/dynamic_nonce.yml8
-rw-r--r--doc/architecture/blueprints/runner_tokens/index.md1
-rw-r--r--doc/ci/runners/saas/linux_saas_runner.md6
-rw-r--r--doc/user/group/compliance_frameworks.md6
-rw-r--r--doc/user/group/import/index.md45
-rw-r--r--doc/user/markdown.md36
-rw-r--r--locale/gitlab.pot9
-rw-r--r--spec/features/projects/pipelines/pipelines_spec.rb1
-rw-r--r--spec/frontend/analytics/cycle_analytics/base_spec.js4
-rw-r--r--spec/models/concerns/token_authenticatable_strategies/encryption_helper_spec.rb92
-rw-r--r--spec/serializers/pipeline_details_entity_spec.rb29
24 files changed, 138 insertions, 157 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ff8994a9797..4925f9ec268 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -63,16 +63,19 @@ workflow:
variables:
<<: *ruby2-variables
PIPELINE_NAME: 'Ruby 2 $CI_MERGE_REQUEST_EVENT_TYPE MR pipeline'
+ NO_SOURCEMAPS: 'true'
- if: '$CI_MERGE_REQUEST_LABELS =~ /Community contribution/'
variables:
<<: *ruby3-variables
GITLAB_DEPENDENCY_PROXY_ADDRESS: ""
PIPELINE_NAME: 'Ruby 3 $CI_MERGE_REQUEST_EVENT_TYPE MR pipeline (community contribution)'
+ NO_SOURCEMAPS: 'true'
# For (detached) merge request pipelines.
- if: '$CI_MERGE_REQUEST_IID'
variables:
<<: *ruby3-variables
PIPELINE_NAME: 'Ruby 3 $CI_MERGE_REQUEST_EVENT_TYPE MR pipeline'
+ NO_SOURCEMAPS: 'true'
# For the scheduled pipelines, we set specific variables.
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE == "schedule"'
variables:
diff --git a/.gitlab/ci/reports.gitlab-ci.yml b/.gitlab/ci/reports.gitlab-ci.yml
index 3242ca29d75..c77ee0276c6 100644
--- a/.gitlab/ci/reports.gitlab-ci.yml
+++ b/.gitlab/ci/reports.gitlab-ci.yml
@@ -3,7 +3,6 @@ include:
- template: Jobs/SAST.gitlab-ci.yml
- template: Jobs/Secret-Detection.gitlab-ci.yml
- template: Jobs/Dependency-Scanning.gitlab-ci.yml
- - template: Jobs/License-Scanning.gitlab-ci.yml
code_quality:
extends:
@@ -126,11 +125,3 @@ package_hunter-bundler:
- .reports:rules:package_hunter-bundler
variables:
PACKAGE_MANAGER: bundler
-
-license_scanning:
- extends: .default-retry
- stage: lint
- needs: []
- artifacts:
- expire_in: 1 week # GitLab-specific
- rules: !reference [".reports:rules:license_scanning", rules]
diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml
index afab4c7ab75..3d85325382d 100644
--- a/.gitlab/ci/rules.gitlab-ci.yml
+++ b/.gitlab/ci/rules.gitlab-ci.yml
@@ -2057,13 +2057,6 @@
- <<: *if-merge-request
changes: ["Gemfile.lock"]
-.reports:rules:license_scanning:
- rules:
- - if: '$LICENSE_MANAGEMENT_DISABLED || $GITLAB_FEATURES !~ /\blicense_scanning\b/'
- when: never
- - <<: *if-default-refs
- changes: *dependency-patterns
-
################
# Review rules #
################
diff --git a/.rubocop_todo/rspec/missing_feature_category.yml b/.rubocop_todo/rspec/missing_feature_category.yml
index 3bfafa32fe7..d9e110a879a 100644
--- a/.rubocop_todo/rspec/missing_feature_category.yml
+++ b/.rubocop_todo/rspec/missing_feature_category.yml
@@ -6344,7 +6344,6 @@ RSpec/MissingFeatureCategory:
- 'spec/serializers/paginated_diff_entity_spec.rb'
- 'spec/serializers/personal_access_token_entity_spec.rb'
- 'spec/serializers/personal_access_token_serializer_spec.rb'
- - 'spec/serializers/pipeline_details_entity_spec.rb'
- 'spec/serializers/pipeline_serializer_spec.rb'
- 'spec/serializers/project_access_token_entity_spec.rb'
- 'spec/serializers/project_access_token_serializer_spec.rb'
diff --git a/Gemfile b/Gemfile
index 88c6e2d0988..37f938ea5e9 100644
--- a/Gemfile
+++ b/Gemfile
@@ -592,3 +592,11 @@ gem 'app_store_connect'
# For phone verification
gem 'telesignenterprise', '~> 2.2'
+
+# Ruby 3 extracts net-protocol into a separate gem, while Ruby 2 has it built-in
+# This condition installs the gem only for Ruby 3 to avoid warnings on Ruby 2
+# Can be removed when support for Ruby 2 is dropped
+install_if -> { Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("3.0.0") } do
+ # BufferedIO patch
+ gem 'net-protocol', '~> 0.1.3'
+end
diff --git a/Gemfile.checksum b/Gemfile.checksum
index 0fbd8f394d1..cd822ba89c4 100644
--- a/Gemfile.checksum
+++ b/Gemfile.checksum
@@ -371,6 +371,7 @@
{"name":"net-http-persistent","version":"4.0.1","platform":"ruby","checksum":"2752f4cce05fd1c45e0537c6f3a98fa5a4899efd5f88e63c104ed5f05cbddef9"},
{"name":"net-ldap","version":"0.17.1","platform":"ruby","checksum":"52571b55f9157120833ac1667f2969ce0139251811d0a9b64657c1c135069cf9"},
{"name":"net-ntp","version":"2.1.3","platform":"ruby","checksum":"5bc73f4102bde0d1872bd3b293608ae99d9f5007d744f21919c6a565eda9267d"},
+{"name":"net-protocol","version":"0.1.3","platform":"ruby","checksum":"ad43e2be965ede676683c047b2c3d76762aa49a764779d98312a10da04622c14"},
{"name":"net-scp","version":"3.0.0","platform":"ruby","checksum":"8fc6c80365b95230c6bfc529dbea3893d2d81724855bfb01cbf385866e1c902c"},
{"name":"net-ssh","version":"6.0.0","platform":"ruby","checksum":"6290ddcb232380cae79b772af924e12f57fe1dcd0f71254411dd21c04f7b13d0"},
{"name":"netrc","version":"0.11.0","platform":"ruby","checksum":"de1ce33da8c99ab1d97871726cba75151113f117146becbe45aa85cb3dabee3f"},
@@ -614,6 +615,7 @@
{"name":"thrift","version":"0.16.0","platform":"ruby","checksum":"d023286ea89e30444c9f1c28dd76107f87d8aaf85fe1742da1d8cd3b5417dcce"},
{"name":"tilt","version":"2.0.11","platform":"ruby","checksum":"7b180fc472cbdeb186c85d31c0f2d1e61a2c0d77e1d9fd0ca28482a9d972d6a0"},
{"name":"timeliness","version":"0.3.10","platform":"ruby","checksum":"c357233ce19dc53148e8b29dfddde134689f18f52b32928e9dfe12ebcf4a773f"},
+{"name":"timeout","version":"0.3.2","platform":"ruby","checksum":"269b765ea2fb052fc2bfb8d3be2c90d60fe1161f92bf971c91d6151b8a6bcddd"},
{"name":"timfel-krb5-auth","version":"0.8.3","platform":"ruby","checksum":"ab388c9d747fa3cd95baf2cc1c03253e372d8c680adcc543670f4f099854bb80"},
{"name":"tins","version":"1.31.1","platform":"ruby","checksum":"51c4a347c25c630d310cbc2c040ffb84e266c8227f2ade881f1130ee4f9fbecf"},
{"name":"toml-rb","version":"2.2.0","platform":"ruby","checksum":"a1e2c54ac3cc9d49861004f75f0648b3622ac03a76abe105358c31553227d9a6"},
diff --git a/Gemfile.lock b/Gemfile.lock
index 7eab75fb4a0..0a95518e60b 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -971,6 +971,8 @@ GEM
connection_pool (~> 2.2)
net-ldap (0.17.1)
net-ntp (2.1.3)
+ net-protocol (0.1.3)
+ timeout
net-scp (3.0.0)
net-ssh (>= 2.6.5, < 7.0.0)
net-ssh (6.0.0)
@@ -1493,6 +1495,7 @@ GEM
thrift (0.16.0)
tilt (2.0.11)
timeliness (0.3.10)
+ timeout (0.3.2)
timfel-krb5-auth (0.8.3)
tins (1.31.1)
sync
@@ -1788,6 +1791,7 @@ DEPENDENCIES
multi_json (~> 1.14.1)
net-ldap (~> 0.17.1)
net-ntp
+ net-protocol (~> 0.1.3)
nokogiri (~> 1.14.2)
oauth2 (~> 2.0)
octokit (~> 4.15)
diff --git a/app/assets/javascripts/analytics/cycle_analytics/components/base.vue b/app/assets/javascripts/analytics/cycle_analytics/components/base.vue
index 97af597e2f6..24d8370afdd 100644
--- a/app/assets/javascripts/analytics/cycle_analytics/components/base.vue
+++ b/app/assets/javascripts/analytics/cycle_analytics/components/base.vue
@@ -105,7 +105,9 @@ export default {
return this.hasCycleAnalyticsForGroups ? METRICS_REQUESTS : SUMMARY_METRICS_REQUEST;
},
showLinkToDashboard() {
- return this.hasCycleAnalyticsForGroups && this.features?.groupAnalyticsDashboardsPage;
+ return Boolean(
+ this.features?.groupLevelAnalyticsDashboard && this.features?.groupAnalyticsDashboardsPage,
+ );
},
dashboardsPath() {
const {
diff --git a/app/assets/javascripts/analytics/cycle_analytics/utils.js b/app/assets/javascripts/analytics/cycle_analytics/utils.js
index ab8251d4ba3..e5a2055c43a 100644
--- a/app/assets/javascripts/analytics/cycle_analytics/utils.js
+++ b/app/assets/javascripts/analytics/cycle_analytics/utils.js
@@ -77,7 +77,10 @@ export const filterStagesByHiddenStatus = (stages = [], isHidden = true) =>
*/
const extractFeatures = (gon) => ({
+ // licensed feature toggles
cycleAnalyticsForGroups: Boolean(gon?.licensed_features?.cycleAnalyticsForGroups),
+ groupLevelAnalyticsDashboard: Boolean(gon?.licensed_features?.groupLevelAnalyticsDashboard),
+ // feature flags
groupAnalyticsDashboardsPage: Boolean(gon?.features?.groupAnalyticsDashboardsPage),
});
diff --git a/app/controllers/projects/cycle_analytics_controller.rb b/app/controllers/projects/cycle_analytics_controller.rb
index e6f15eb05a5..38c309836f1 100644
--- a/app/controllers/projects/cycle_analytics_controller.rb
+++ b/app/controllers/projects/cycle_analytics_controller.rb
@@ -22,6 +22,7 @@ class Projects::CycleAnalyticsController < Projects::ApplicationController
before_action do
push_licensed_feature(:cycle_analytics_for_groups) if project.licensed_feature_available?(:cycle_analytics_for_groups)
+ push_licensed_feature(:group_level_analytics_dashboard) if project.licensed_feature_available?(:group_level_analytics_dashboard)
push_frontend_feature_flag(:group_analytics_dashboards_page)
end
diff --git a/app/models/concerns/token_authenticatable_strategies/encryption_helper.rb b/app/models/concerns/token_authenticatable_strategies/encryption_helper.rb
index 447521ad8c1..5e77dfde397 100644
--- a/app/models/concerns/token_authenticatable_strategies/encryption_helper.rb
+++ b/app/models/concerns/token_authenticatable_strategies/encryption_helper.rb
@@ -20,8 +20,6 @@ module TokenAuthenticatableStrategies
end
def self.encrypt_token(plaintext_token)
- return Gitlab::CryptoHelper.aes256_gcm_encrypt(plaintext_token) unless Feature.enabled?(:dynamic_nonce, type: :ops)
-
iv = ::Digest::SHA256.hexdigest(plaintext_token).bytes.take(NONCE_SIZE).pack('c*')
token = Gitlab::CryptoHelper.aes256_gcm_encrypt(plaintext_token, nonce: iv)
"#{DYNAMIC_NONCE_IDENTIFIER}#{token}#{iv}"
diff --git a/app/serializers/pipeline_details_entity.rb b/app/serializers/pipeline_details_entity.rb
index 76797a773b5..438b0dcadd7 100644
--- a/app/serializers/pipeline_details_entity.rb
+++ b/app/serializers/pipeline_details_entity.rb
@@ -8,8 +8,12 @@ class PipelineDetailsEntity < Ci::PipelineEntity
end
expose :details do
- expose :manual_actions, using: BuildActionEntity
+ expose :manual_actions, if: ->(pipeline, _) { Feature.disabled?(:lazy_load_manual_actions, pipeline.project) },
+ using: BuildActionEntity
expose :scheduled_actions, using: BuildActionEntity
+ expose :has_manual_actions do |pipeline|
+ pipeline.manual_actions.any?
+ end
end
expose :triggered_by_pipeline, as: :triggered_by, with: TriggeredPipelineEntity
diff --git a/config/feature_flags/development/lazy_load_manual_actions.yml b/config/feature_flags/development/lazy_load_manual_actions.yml
new file mode 100644
index 00000000000..f28382bfd12
--- /dev/null
+++ b/config/feature_flags/development/lazy_load_manual_actions.yml
@@ -0,0 +1,8 @@
+---
+name: lazy_load_manual_actions
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/113456
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/393846
+milestone: '15.10'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/ops/dynamic_nonce.yml b/config/feature_flags/ops/dynamic_nonce.yml
deleted file mode 100644
index ad8c63f9fa3..00000000000
--- a/config/feature_flags/ops/dynamic_nonce.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: dynamic_nonce
-introduced_by_url:
-rollout_issue_url:
-milestone: '14.0'
-type: ops
-group: group::authentication and authorization
-default_enabled: false
diff --git a/doc/architecture/blueprints/runner_tokens/index.md b/doc/architecture/blueprints/runner_tokens/index.md
index 4aa0e1213de..359eadb18c5 100644
--- a/doc/architecture/blueprints/runner_tokens/index.md
+++ b/doc/architecture/blueprints/runner_tokens/index.md
@@ -420,7 +420,6 @@ scope.
| Component | Milestone | Changes |
|------------------|----------:|---------|
-| GitLab Runner | `%16.0` | Do not allow runner to start if `.runner_system_id` file cannot be written. |
| GitLab Rails app | `%16.6` | Enable `:enforce_create_runner_workflow` feature flag by default. |
| GitLab Rails app | `%16.6` | Start reject job requests that don't include `system_id` value. |
diff --git a/doc/ci/runners/saas/linux_saas_runner.md b/doc/ci/runners/saas/linux_saas_runner.md
index da78f7f911c..8d5f976fa0e 100644
--- a/doc/ci/runners/saas/linux_saas_runner.md
+++ b/doc/ci/runners/saas/linux_saas_runner.md
@@ -88,9 +88,9 @@ Below are the settings for SaaS runners on Linux.
and [#4070](https://gitlab.com/gitlab-com/gl-infra/reliability/-/issues/4070).
NOTE:
-The final disk space your jobs can use is less than 25 GB. Some disk space
-allocated to the instance is occupied by the operating system, the Docker image,
-and a copy of your cloned repository.
+SaaS runner instances are provisioned with a 25 GB storage volume. The underlying disk space of the storage volume
+is shared by the operating system, the Docker image, and a copy of your cloned repository.
+This means that the available free disk space that your jobs can use is **less than 25 GB**.
## Pre-clone script (deprecated)
diff --git a/doc/user/group/compliance_frameworks.md b/doc/user/group/compliance_frameworks.md
index f5c0597adf5..9bde41171f9 100644
--- a/doc/user/group/compliance_frameworks.md
+++ b/doc/user/group/compliance_frameworks.md
@@ -223,6 +223,12 @@ include: # Execute individual project's configuration (if project contains .git
The `rules` configuration in the `include` definition avoids circular inclusion in case the compliance pipeline must be able to run in the host project itself.
You can leave it out if your compliance pipeline only ever runs in labeled projects.
+#### Compliance pipelines and custom pipeline configurations
+
+Compliance pipelines don't run when an included project pipeline uses an external
+[custom CI/CD configuration file](../../ci/pipelines/settings.md#specify-a-custom-cicd-configuration-file). For more information, see
+[issue 393960](https://gitlab.com/gitlab-org/gitlab/-/issues/393960).
+
#### Compliance pipelines in merge requests originating in project forks
When a merge request originates in a fork, the branch to be merged usually only exists in the fork.
diff --git a/doc/user/group/import/index.md b/doc/user/group/import/index.md
index 5f4251bbd01..c01e671b142 100644
--- a/doc/user/group/import/index.md
+++ b/doc/user/group/import/index.md
@@ -193,28 +193,29 @@ Any other group items are **not** migrated.
Group items that are migrated to the destination GitLab instance include:
-- Badges ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292431) in 13.11)
-- Boards ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18938) in GitLab 13.7)
-- Board Lists ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/24863) in GitLab 13.7)
-- Epics ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/250281) in 13.7)
- - Epic resource state events ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/291983) in GitLab 15.4)
- - Label associations ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62074) in GitLab 13.12)
- - State and State ID ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28203) in GitLab 13.7)
- - System Note Metadata ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63551) in GitLab 14.0)
-- Group Labels ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292429) in 13.9)
-- Iterations ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292428) in 13.10)
-- Iterations cadences ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/96570) in 15.4)
-- Members ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/299415) in 13.9)
- Group members are associated with the imported group if:
- - The user already exists in the destination GitLab instance and
- - The user has a public email in the source GitLab instance that matches a
- confirmed email in the destination GitLab instance
-- Milestones ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292427) in 13.10)
-- Namespace Settings ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85128) in GitLab 14.10)
-- Releases
- - Milestones ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/339422) in GitLab 15.0).
-- Subgroups ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18938) in GitLab 13.7)
-- Uploads ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18938) in GitLab 13.7)
+| Group item | Introduced in |
+|:----------------------|:----------------------------------------------------------------------------|
+| Badges | [GitLab 13.11](https://gitlab.com/gitlab-org/gitlab/-/issues/292431) |
+| Boards | [GitLab 13.7](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18938) |
+| Board lists | [GitLab 13.7](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/24863) |
+| Epics <sup>1</sup> | [GitLab 13.7](https://gitlab.com/gitlab-org/gitlab/-/issues/250281) |
+| Group labels | [GitLab 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/292429) |
+| Iterations | [GitLab 13.10](https://gitlab.com/gitlab-org/gitlab/-/issues/292428) |
+| Iteration cadences | [GitLab 15.4](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/96570) |
+| Members <sup>2</sup> | [GitLab 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/299415) |
+| Group milestones | [GitLab 13.10](https://gitlab.com/gitlab-org/gitlab/-/issues/292427) |
+| Namespace settings | [GitLab 14.10](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85128) |
+| Release milestones | [GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/339422) |
+| Subgroups | [GitLab 13.7](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18938) |
+| Uploads | [GitLab 13.7](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18938) |
+
+1. Epic resource state events [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/291983) in GitLab 15.4, label
+ associations [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62074) in GitLab 13.12, state and
+ state ID [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28203) in GitLab 13.7, and system note
+ metadata [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63551) in GitLab 14.0.
+1. Group members are associated with the imported group if the user:
+ - Already exists in the destination GitLab instance.
+ - Has a public email in the source GitLab instance that matches a confirmed email in the destination GitLab instance.
### Migrated project items (beta)
diff --git a/doc/user/markdown.md b/doc/user/markdown.md
index 00eec78e896..3f134f33abc 100644
--- a/doc/user/markdown.md
+++ b/doc/user/markdown.md
@@ -130,7 +130,7 @@ You can generate diagrams from text by using:
- [PlantUML](https://plantuml.com)
- [Kroki](https://kroki.io) to create a wide variety of diagrams.
-In wikis you can also add diagrams created by using the [diagrams.net online editor](#create-or-edit-diagrams-by-using-diagramsnet-editor).
+In wikis, you can also add and edit diagrams created with the [diagrams.net editor](#diagramsnet-editor).
#### Mermaid
@@ -548,51 +548,53 @@ This example links to `<wiki_root>/miscellaneous.md`:
[Link to Related Page](/miscellaneous.md)
```
-#### Create or edit diagrams by using diagrams.net editor
+#### diagrams.net editor
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322174) in GitLab 15.10.
NOTE:
Use of the diagrams.net editor is not available on offline environments.
-On wikis, you can use the [diagrams.net](https://www.diagrams.net/) editor
-to create diagrams. You can also edit diagrams previously created with the
-editor.
+In wikis, you can use the [diagrams.net](https://www.diagrams.net/) editor to create diagrams. You
+can also edit diagrams created with the diagrams.net editor. The diagram editor is available in both
+the Markdown editor and the content editor.
+
+##### Markdown editor
To create a diagram in the Markdown editor:
-1. Select **Insert or edit diagram** (**{diagram}**) in the editor's toolbar.
-1. Use the diagrams.net editor to build the diagram.
+1. In the editor's toolbar, select **Insert or edit diagram** (**{diagram}**).
+1. Use the diagrams.net editor to create the diagram.
1. Select **Save & exit**.
-A Markdown image declaration pointing to the diagram is inserted in the wiki content.
+A Markdown image reference to the diagram is inserted in the wiki content.
To edit a diagram in the Markdown editor:
-1. Place the Markdown editor’s text field cursor in a Markdown image declaration
+1. Place the Markdown editor's text field cursor in a Markdown image reference
that contains the diagram.
1. Select **Insert or edit diagram** (**{diagram}**) in the Markdown editor.
1. Use the diagrams.net editor to edit the diagram.
1. Select **Save & exit**.
-A Markdown image declaration pointing to the diagram is inserted in the wiki content,
+A Markdown image reference to the diagram is inserted in the wiki content,
replacing the previous diagram.
-You can also create and edit diagrams when editing Markdown in the Content Editor.
+##### Content editor
-To create a diagram in the Content Editor:
+To create a diagram in the content editor:
-1. Select **More options** (**{plus}**) in the editor’s toolbar.
-1. Select **Create or edit diagram** in the dropdown menu.
-1. Use the diagrams.net editor to build the diagram.
+1. In the editor's toolbar, select **More options** (**{plus}**).
+1. In the dropdown list, select **Create or edit diagram**.
+1. Use the diagrams.net editor to create the diagram.
1. Select **Save & exit**.
The diagram as visualized in the diagrams.net editor is inserted in the wiki content.
-To edit a diagram in the Content Editor:
+To edit a diagram in the content editor:
1. Select the diagram that you want to edit.
-1. Select **Edit diagram** (**{diagram}**) in the floating toolbar.
+1. In the floating toolbar, select **Edit diagram** (**{diagram}**).
1. Use the diagrams.net editor to edit the diagram.
1. Select **Save & exit**.
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 757c8102e31..d4e40fc7d38 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -33607,6 +33607,9 @@ msgstr ""
msgid "Project visibility level will be changed to match namespace rules when transferring to a group."
msgstr ""
+msgid "Project was created and assigned as security policy project, but failed adding users to the project."
+msgstr ""
+
msgid "Project was not found or you do not have permission to add this project to Security Dashboards."
msgstr ""
@@ -38546,6 +38549,9 @@ msgstr ""
msgid "Security Finding not found"
msgstr ""
+msgid "Security Policy project already exists."
+msgstr ""
+
msgid "Security and Compliance"
msgstr ""
@@ -46924,6 +46930,9 @@ msgstr ""
msgid "User does not have a pending request"
msgstr ""
+msgid "User does not have permission to create a Security Policy project."
+msgstr ""
+
msgid "User identity was successfully created."
msgstr ""
diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb
index e3c2402b2c9..26dc17070a5 100644
--- a/spec/features/projects/pipelines/pipelines_spec.rb
+++ b/spec/features/projects/pipelines/pipelines_spec.rb
@@ -278,6 +278,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do
end
before do
+ stub_feature_flags(lazy_load_manual_actions: false)
visit_project_pipelines
end
diff --git a/spec/frontend/analytics/cycle_analytics/base_spec.js b/spec/frontend/analytics/cycle_analytics/base_spec.js
index 685135947ec..03f52747dd5 100644
--- a/spec/frontend/analytics/cycle_analytics/base_spec.js
+++ b/spec/frontend/analytics/cycle_analytics/base_spec.js
@@ -166,11 +166,11 @@ describe('Value stream analytics component', () => {
});
});
- describe('with `groupAnalyticsDashboardsPage=true` and `cycleAnalyticsForGroups=true` license', () => {
+ describe('with `groupAnalyticsDashboardsPage=true` and `groupLevelAnalyticsDashboard=true` license', () => {
beforeEach(() => {
wrapper = createComponent({
initialState: {
- features: { groupAnalyticsDashboardsPage: true, cycleAnalyticsForGroups: true },
+ features: { groupAnalyticsDashboardsPage: true, groupLevelAnalyticsDashboard: true },
},
});
});
diff --git a/spec/models/concerns/token_authenticatable_strategies/encryption_helper_spec.rb b/spec/models/concerns/token_authenticatable_strategies/encryption_helper_spec.rb
index 671e51e3913..004298bbdd9 100644
--- a/spec/models/concerns/token_authenticatable_strategies/encryption_helper_spec.rb
+++ b/spec/models/concerns/token_authenticatable_strategies/encryption_helper_spec.rb
@@ -6,96 +6,26 @@ RSpec.describe TokenAuthenticatableStrategies::EncryptionHelper do
let(:encrypted_token) { described_class.encrypt_token('my-value-my-value-my-value') }
describe '.encrypt_token' do
- context 'when dynamic_nonce feature flag is switched on' do
- it 'adds nonce identifier on the beginning' do
- expect(encrypted_token.first).to eq(described_class::DYNAMIC_NONCE_IDENTIFIER)
- end
-
- it 'adds nonce at the end' do
- nonce = encrypted_token.last(described_class::NONCE_SIZE)
-
- expect(nonce).to eq(::Digest::SHA256.hexdigest('my-value-my-value-my-value').bytes.take(described_class::NONCE_SIZE).pack('c*'))
- end
-
- it 'encrypts token' do
- expect(encrypted_token[1...-described_class::NONCE_SIZE]).not_to eq('my-value-my-value-my-value')
- end
+ it 'adds nonce identifier on the beginning' do
+ expect(encrypted_token.first).to eq(described_class::DYNAMIC_NONCE_IDENTIFIER)
end
- context 'when dynamic_nonce feature flag is switched off' do
- before do
- stub_feature_flags(dynamic_nonce: false)
- end
-
- it 'does not add nonce identifier on the beginning' do
- expect(encrypted_token.first).not_to eq(described_class::DYNAMIC_NONCE_IDENTIFIER)
- end
-
- it 'does not add nonce in the end' do
- nonce = encrypted_token.last(described_class::NONCE_SIZE)
-
- expect(nonce).not_to eq(::Digest::SHA256.hexdigest('my-value-my-value-my-value').bytes.take(described_class::NONCE_SIZE).pack('c*'))
- end
+ it 'adds nonce at the end' do
+ nonce = encrypted_token.last(described_class::NONCE_SIZE)
- it 'encrypts token with static iv' do
- token = Gitlab::CryptoHelper.aes256_gcm_encrypt('my-value-my-value-my-value')
+ expect(nonce).to eq(::Digest::SHA256.hexdigest('my-value-my-value-my-value').bytes.take(described_class::NONCE_SIZE).pack('c*'))
+ end
- expect(encrypted_token).to eq(token)
- end
+ it 'encrypts token' do
+ expect(encrypted_token[1...-described_class::NONCE_SIZE]).not_to eq('my-value-my-value-my-value')
end
end
describe '.decrypt_token' do
- context 'with feature flag switched off' do
- before do
- stub_feature_flags(dynamic_nonce: false)
- end
-
- it 'decrypts token with static iv' do
- encrypted_token = described_class.encrypt_token('my-value')
-
- expect(described_class.decrypt_token(encrypted_token)).to eq('my-value')
- end
-
- it 'decrypts token if feature flag changed after encryption' do
- encrypted_token = described_class.encrypt_token('my-value')
-
- expect(encrypted_token).not_to eq('my-value')
-
- stub_feature_flags(dynamic_nonce: true)
-
- expect(described_class.decrypt_token(encrypted_token)).to eq('my-value')
- end
-
- it 'decrypts token with dynamic iv' do
- iv = ::Digest::SHA256.hexdigest('my-value').bytes.take(described_class::NONCE_SIZE).pack('c*')
- token = Gitlab::CryptoHelper.aes256_gcm_encrypt('my-value', nonce: iv)
- encrypted_token = "#{described_class::DYNAMIC_NONCE_IDENTIFIER}#{token}#{iv}"
-
- expect(described_class.decrypt_token(encrypted_token)).to eq('my-value')
- end
- end
-
- context 'with feature flag switched on' do
- before do
- stub_feature_flags(dynamic_nonce: true)
- end
-
- it 'decrypts token with dynamic iv' do
- encrypted_token = described_class.encrypt_token('my-value')
-
- expect(described_class.decrypt_token(encrypted_token)).to eq('my-value')
- end
-
- it 'decrypts token if feature flag changed after encryption' do
- encrypted_token = described_class.encrypt_token('my-value')
-
- expect(encrypted_token).not_to eq('my-value')
-
- stub_feature_flags(dynamic_nonce: false)
+ it 'decrypts token with dynamic iv' do
+ encrypted_token = described_class.encrypt_token('my-value')
- expect(described_class.decrypt_token(encrypted_token)).to eq('my-value')
- end
+ expect(described_class.decrypt_token(encrypted_token)).to eq('my-value')
end
end
end
diff --git a/spec/serializers/pipeline_details_entity_spec.rb b/spec/serializers/pipeline_details_entity_spec.rb
index de05d2afd2b..e841cf8de39 100644
--- a/spec/serializers/pipeline_details_entity_spec.rb
+++ b/spec/serializers/pipeline_details_entity_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe PipelineDetailsEntity do
+RSpec.describe PipelineDetailsEntity, feature_category: :continuous_integration do
let_it_be(:user) { create(:user) }
let(:request) { double('request') }
@@ -32,7 +32,7 @@ RSpec.describe PipelineDetailsEntity do
expect(subject[:details])
.to include :duration, :finished_at
expect(subject[:details])
- .to include :stages, :manual_actions, :scheduled_actions
+ .to include :stages, :has_manual_actions, :scheduled_actions
expect(subject[:details][:status]).to include :icon, :favicon, :text, :label
end
@@ -44,6 +44,31 @@ RSpec.describe PipelineDetailsEntity do
end
end
+ context 'when lazy_load_manual_actions feature flag is disabled' do
+ let(:pipeline) { create(:ci_pipeline, status: :success) }
+
+ before do
+ stub_feature_flags(lazy_load_manual_actions: false)
+ end
+
+ it 'contains manual_actions' do
+ expect(subject[:details]).to include :manual_actions
+ expect(subject[:details]).to include :has_manual_actions
+ end
+ end
+
+ context 'when pipeline has manual builds' do
+ let(:pipeline) { create(:ci_pipeline, status: :success) }
+
+ before do
+ create(:ci_build, :manual, pipeline: pipeline)
+ end
+
+ it 'sets :has_manual_actions to true' do
+ expect(subject[:details][:has_manual_actions]).to eq true
+ end
+ end
+
context 'when pipeline is retryable' do
let(:project) { create(:project) }