Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
4d8bd36aa2
commit
cceb99c072
|
@ -119,16 +119,12 @@ class List {
|
||||||
}
|
}
|
||||||
|
|
||||||
moveMultipleIssues({ issues, oldIndicies, newIndex, moveBeforeId, moveAfterId }) {
|
moveMultipleIssues({ issues, oldIndicies, newIndex, moveBeforeId, moveAfterId }) {
|
||||||
oldIndicies.reverse().forEach(index => {
|
|
||||||
this.issues.splice(index, 1);
|
|
||||||
});
|
|
||||||
this.issues.splice(newIndex, 0, ...issues);
|
|
||||||
|
|
||||||
boardsStore
|
boardsStore
|
||||||
.moveMultipleIssues({
|
.moveListMultipleIssues({
|
||||||
ids: issues.map(issue => issue.id),
|
list: this,
|
||||||
fromListId: null,
|
issues,
|
||||||
toListId: null,
|
oldIndicies,
|
||||||
|
newIndex,
|
||||||
moveBeforeId,
|
moveBeforeId,
|
||||||
moveAfterId,
|
moveAfterId,
|
||||||
})
|
})
|
||||||
|
@ -170,12 +166,7 @@ class List {
|
||||||
}
|
}
|
||||||
|
|
||||||
onNewIssueResponse(issue, data) {
|
onNewIssueResponse(issue, data) {
|
||||||
issue.refreshData(data);
|
boardsStore.onNewListIssueResponse(this, issue, data);
|
||||||
|
|
||||||
if (this.issuesSize > 1) {
|
|
||||||
const moveBeforeId = this.issues[1].id;
|
|
||||||
boardsStore.moveIssue(issue.id, null, null, null, moveBeforeId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -296,6 +296,15 @@ const boardsStore = {
|
||||||
Object.assign(this.moving, { list, issue });
|
Object.assign(this.moving, { list, issue });
|
||||||
},
|
},
|
||||||
|
|
||||||
|
onNewListIssueResponse(list, issue, data) {
|
||||||
|
issue.refreshData(data);
|
||||||
|
|
||||||
|
if (list.issuesSize > 1) {
|
||||||
|
const moveBeforeId = list.issues[1].id;
|
||||||
|
this.moveIssue(issue.id, null, null, null, moveBeforeId);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
moveMultipleIssuesToList({ listFrom, listTo, issues, newIndex }) {
|
moveMultipleIssuesToList({ listFrom, listTo, issues, newIndex }) {
|
||||||
const issueTo = issues.map(issue => listTo.findIssue(issue.id));
|
const issueTo = issues.map(issue => listTo.findIssue(issue.id));
|
||||||
const issueLists = issues.map(issue => issue.getLists()).flat();
|
const issueLists = issues.map(issue => issue.getLists()).flat();
|
||||||
|
@ -675,6 +684,21 @@ const boardsStore = {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
moveListMultipleIssues({ list, issues, oldIndicies, newIndex, moveBeforeId, moveAfterId }) {
|
||||||
|
oldIndicies.reverse().forEach(index => {
|
||||||
|
list.issues.splice(index, 1);
|
||||||
|
});
|
||||||
|
list.issues.splice(newIndex, 0, ...issues);
|
||||||
|
|
||||||
|
return this.moveMultipleIssues({
|
||||||
|
ids: issues.map(issue => issue.id),
|
||||||
|
fromListId: null,
|
||||||
|
toListId: null,
|
||||||
|
moveBeforeId,
|
||||||
|
moveAfterId,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
newIssue(id, issue) {
|
newIssue(id, issue) {
|
||||||
return axios.post(this.generateIssuesPath(id), {
|
return axios.post(this.generateIssuesPath(id), {
|
||||||
issue,
|
issue,
|
||||||
|
|
|
@ -64,7 +64,12 @@ export default {
|
||||||
<template>
|
<template>
|
||||||
<list-item v-bind="$attrs" :selected="selected">
|
<list-item v-bind="$attrs" :selected="selected">
|
||||||
<template #left-action>
|
<template #left-action>
|
||||||
<gl-form-checkbox class="gl-m-0" :checked="selected" @change="$emit('select')" />
|
<gl-form-checkbox
|
||||||
|
v-if="Boolean(tag.destroy_path)"
|
||||||
|
class="gl-m-0"
|
||||||
|
:checked="selected"
|
||||||
|
@change="$emit('select')"
|
||||||
|
/>
|
||||||
</template>
|
</template>
|
||||||
<template #left-primary>
|
<template #left-primary>
|
||||||
<div class="gl-display-flex gl-align-items-center">
|
<div class="gl-display-flex gl-align-items-center">
|
||||||
|
|
|
@ -12,6 +12,7 @@ import {
|
||||||
} from './constants';
|
} from './constants';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
registerHTMLToMarkdownRenderer,
|
||||||
addCustomEventListener,
|
addCustomEventListener,
|
||||||
removeCustomEventListener,
|
removeCustomEventListener,
|
||||||
addImage,
|
addImage,
|
||||||
|
@ -87,6 +88,7 @@ export default {
|
||||||
onLoad(editorApi) {
|
onLoad(editorApi) {
|
||||||
this.editorApi = editorApi;
|
this.editorApi = editorApi;
|
||||||
|
|
||||||
|
registerHTMLToMarkdownRenderer(editorApi);
|
||||||
addCustomEventListener(
|
addCustomEventListener(
|
||||||
this.editorApi,
|
this.editorApi,
|
||||||
CUSTOM_EVENTS.openAddImageModal,
|
CUSTOM_EVENTS.openAddImageModal,
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
const buildHTMLToMarkdownRender = baseRenderer => {
|
||||||
|
return {
|
||||||
|
TEXT_NODE(node) {
|
||||||
|
return baseRenderer.getSpaceControlled(
|
||||||
|
baseRenderer.trim(baseRenderer.getSpaceCollapsedText(node.nodeValue)),
|
||||||
|
node,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export default buildHTMLToMarkdownRender;
|
|
@ -1,5 +1,6 @@
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import ToolbarItem from '../toolbar_item.vue';
|
import ToolbarItem from '../toolbar_item.vue';
|
||||||
|
import buildHtmlToMarkdownRenderer from './build_html_to_markdown_renderer';
|
||||||
|
|
||||||
const buildWrapper = propsData => {
|
const buildWrapper = propsData => {
|
||||||
const instance = new Vue({
|
const instance = new Vue({
|
||||||
|
@ -40,3 +41,16 @@ export const removeCustomEventListener = (editorApi, event, handler) =>
|
||||||
export const addImage = ({ editor }, image) => editor.exec('AddImage', image);
|
export const addImage = ({ editor }, image) => editor.exec('AddImage', image);
|
||||||
|
|
||||||
export const getMarkdown = editorInstance => editorInstance.invoke('getMarkdown');
|
export const getMarkdown = editorInstance => editorInstance.invoke('getMarkdown');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function allow us to extend Toast UI HTML to Markdown renderer. It is
|
||||||
|
* a temporary measure because Toast UI does not provide an API
|
||||||
|
* to achieve this goal.
|
||||||
|
*/
|
||||||
|
export const registerHTMLToMarkdownRenderer = editorApi => {
|
||||||
|
const { renderer } = editorApi.toMarkOptions;
|
||||||
|
|
||||||
|
Object.assign(editorApi.toMarkOptions, {
|
||||||
|
renderer: renderer.constructor.factory(renderer, buildHtmlToMarkdownRenderer(renderer)),
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
class Clusters::ClustersController < Clusters::BaseController
|
class Clusters::ClustersController < Clusters::BaseController
|
||||||
include RoutableActions
|
include RoutableActions
|
||||||
|
include Metrics::Dashboard::PrometheusApiProxy
|
||||||
|
|
||||||
before_action :cluster, only: [:cluster_status, :show, :update, :destroy, :clear_cache]
|
before_action :cluster, only: [:cluster_status, :show, :update, :destroy, :clear_cache]
|
||||||
before_action :generate_gcp_authorize_url, only: [:new]
|
before_action :generate_gcp_authorize_url, only: [:new]
|
||||||
|
@ -290,6 +291,29 @@ class Clusters::ClustersController < Clusters::BaseController
|
||||||
@gcp_cluster = cluster.present(current_user: current_user)
|
@gcp_cluster = cluster.present(current_user: current_user)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def proxyable
|
||||||
|
cluster.cluster
|
||||||
|
end
|
||||||
|
|
||||||
|
# During first iteration of dashboard variables implementation
|
||||||
|
# cluster health case was omitted. Existing service for now is tied to
|
||||||
|
# environment, which is not always present for cluster health dashboard.
|
||||||
|
# It is planned to break coupling to environment https://gitlab.com/gitlab-org/gitlab/-/issues/213833.
|
||||||
|
# It is also planned to move cluster health to metrics dashboard section https://gitlab.com/gitlab-org/gitlab/-/issues/220214
|
||||||
|
# but for now I've used dummy class to stub variable substitution service, as there are no variables
|
||||||
|
# in cluster health dashboard
|
||||||
|
def proxy_variable_substitution_service
|
||||||
|
@empty_service ||= Class.new(BaseService) do
|
||||||
|
def initialize(proxyable, params)
|
||||||
|
@proxyable, @params = proxyable, params
|
||||||
|
end
|
||||||
|
|
||||||
|
def execute
|
||||||
|
success(params: @params)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def user_cluster
|
def user_cluster
|
||||||
cluster = Clusters::BuildService.new(clusterable.subject).execute
|
cluster = Clusters::BuildService.new(clusterable.subject).execute
|
||||||
cluster.build_platform_kubernetes
|
cluster.build_platform_kubernetes
|
||||||
|
|
|
@ -103,6 +103,7 @@ class GroupPolicy < BasePolicy
|
||||||
enable :admin_list
|
enable :admin_list
|
||||||
enable :admin_issue
|
enable :admin_issue
|
||||||
enable :read_metrics_dashboard_annotation
|
enable :read_metrics_dashboard_annotation
|
||||||
|
enable :read_prometheus
|
||||||
end
|
end
|
||||||
|
|
||||||
rule { maintainer }.policy do
|
rule { maintainer }.policy do
|
||||||
|
|
|
@ -26,7 +26,7 @@ module Projects
|
||||||
message: 'Project housekeeping failed',
|
message: 'Project housekeeping failed',
|
||||||
project_full_path: @project.full_path,
|
project_full_path: @project.full_path,
|
||||||
project_id: @project.id,
|
project_id: @project.id,
|
||||||
error: e.message
|
'error.message' => e.message
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Remove moveMultipleIssues logic from issue model
|
||||||
|
merge_request: 32243
|
||||||
|
author: nuwe1
|
||||||
|
type: other
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Remove onNewIssueResponse logic from list model
|
||||||
|
merge_request: 32245
|
||||||
|
author: nuwe1
|
||||||
|
type: other
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Update cluster-applications to 0.23.0
|
||||||
|
merge_request: 35691
|
||||||
|
author:
|
||||||
|
type: added
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Fix incorrect text escaping in the Static Site Editor
|
||||||
|
merge_request: 35671
|
||||||
|
author:
|
||||||
|
type: fixed
|
|
@ -0,0 +1,4 @@
|
||||||
|
title: Conditionally render Docker row checkbox
|
||||||
|
merge_request: 36000
|
||||||
|
author: gfyoung
|
||||||
|
type: fixed
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Use error.message instead of error in importer.log
|
||||||
|
merge_request: 36104
|
||||||
|
author:
|
||||||
|
type: fixed
|
|
@ -190,7 +190,6 @@ Rails.application.routes.draw do
|
||||||
Gitlab.ee do
|
Gitlab.ee do
|
||||||
get :metrics, format: :json
|
get :metrics, format: :json
|
||||||
get :metrics_dashboard
|
get :metrics_dashboard
|
||||||
get :'/prometheus/api/v1/*proxy_path', to: 'clusters#prometheus_proxy', as: :prometheus_api
|
|
||||||
get :environments, format: :json
|
get :environments, format: :json
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -200,6 +199,7 @@ Rails.application.routes.draw do
|
||||||
delete '/:application', to: 'clusters/applications#destroy', as: :uninstall_applications
|
delete '/:application', to: 'clusters/applications#destroy', as: :uninstall_applications
|
||||||
end
|
end
|
||||||
|
|
||||||
|
get :'/prometheus/api/v1/*proxy_path', to: 'clusters#prometheus_proxy', as: :prometheus_api
|
||||||
get :cluster_status, format: :json
|
get :cluster_status, format: :json
|
||||||
delete :clear_cache
|
delete :clear_cache
|
||||||
end
|
end
|
||||||
|
|
|
@ -46,7 +46,9 @@ exceptions:
|
||||||
- NFS
|
- NFS
|
||||||
- NGINX
|
- NGINX
|
||||||
- NOTE
|
- NOTE
|
||||||
|
- NPM
|
||||||
- ONLY
|
- ONLY
|
||||||
|
- PDF
|
||||||
- PGP
|
- PGP
|
||||||
- PHP
|
- PHP
|
||||||
- POST
|
- POST
|
||||||
|
@ -63,6 +65,7 @@ exceptions:
|
||||||
- SSH
|
- SSH
|
||||||
- SSL
|
- SSL
|
||||||
- SSO
|
- SSO
|
||||||
|
- SVN
|
||||||
- TCP
|
- TCP
|
||||||
- TIP
|
- TIP
|
||||||
- TLS
|
- TLS
|
||||||
|
|
|
@ -225,6 +225,7 @@ LDAP
|
||||||
ldapsearch
|
ldapsearch
|
||||||
Leiningen
|
Leiningen
|
||||||
Libravatar
|
Libravatar
|
||||||
|
liveness
|
||||||
Lograge
|
Lograge
|
||||||
Logstash
|
Logstash
|
||||||
lookahead
|
lookahead
|
||||||
|
|
|
@ -11,7 +11,7 @@ description: 'Learn how to use and administer GitLab, the most scalable Git-base
|
||||||
|
|
||||||
# GitLab Docs
|
# GitLab Docs
|
||||||
|
|
||||||
Welcome to [GitLab](https://about.gitlab.com/) Documentation.
|
Welcome to [GitLab](https://about.gitlab.com/) documentation.
|
||||||
|
|
||||||
Here you can access the complete documentation for GitLab, the single application for the
|
Here you can access the complete documentation for GitLab, the single application for the
|
||||||
[entire DevOps lifecycle](#the-entire-devops-lifecycle).
|
[entire DevOps lifecycle](#the-entire-devops-lifecycle).
|
||||||
|
@ -20,30 +20,32 @@ Here you can access the complete documentation for GitLab, the single applicatio
|
||||||
|
|
||||||
No matter how you use GitLab, we have documentation for you.
|
No matter how you use GitLab, we have documentation for you.
|
||||||
|
|
||||||
| Essential Documentation | Essential Documentation |
|
| Essential documentation | Essential documentation |
|
||||||
|:-------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------|
|
|:-------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------|
|
||||||
| [**User Documentation**](user/index.md)<br/>Discover features and concepts for GitLab users. | [**Administrator documentation**](administration/index.md)<br/>Everything GitLab self-managed administrators need to know. |
|
| [**User Documentation**](user/index.md)<br/>Discover features and concepts for GitLab users. | [**Administrator documentation**](administration/index.md)<br/>Everything GitLab self-managed administrators need to know. |
|
||||||
| [**Contributing to GitLab**](#contributing-to-gitlab)<br/>At GitLab, everyone can contribute! | [**New to Git and GitLab?**](#new-to-git-and-gitlab)<br/>We have the resources to get you started. |
|
| [**Contributing to GitLab**](#contributing-to-gitlab)<br/>At GitLab, everyone can contribute! | [**New to Git and GitLab?**](#new-to-git-and-gitlab)<br/>We have the resources to get you started. |
|
||||||
| [**Building an integration with GitLab?**](#building-an-integration-with-gitlab)<br/>Consult our automation and integration documentation. | [**Coming to GitLab from another platform?**](#coming-to-gitlab-from-another-platform)<br/>Consult our handy guides. |
|
| [**Build an integration with GitLab?**](#build-an-integration-with-gitlab)<br/>Consult our automation and integration documentation. | [**Coming to GitLab from another platform?**](#coming-to-gitlab-from-another-platform)<br/>Consult our handy guides. |
|
||||||
| [**Install GitLab**](https://about.gitlab.com/install/)<br/>Installation options for different platforms. | [**Customers**](subscriptions/index.md)<br/>Information for new and existing customers. |
|
| [**Install GitLab**](https://about.gitlab.com/install/)<br/>Installation options for different platforms. | [**Customers**](subscriptions/index.md)<br/>Information for new and existing customers. |
|
||||||
| [**Update GitLab**](update/README.md)<br/>Update your GitLab self-managed instance to the latest version. | [**Reference Architectures**](administration/reference_architectures/index.md)<br/>GitLab's reference architectures |
|
| [**Update GitLab**](update/README.md)<br/>Update your GitLab self-managed instance to the latest version. | [**Reference Architectures**](administration/reference_architectures/index.md)<br/>GitLab's reference architectures |
|
||||||
| [**GitLab Releases**](https://about.gitlab.com/releases/)<br/>What's new in GitLab. | |
|
| [**GitLab Releases**](https://about.gitlab.com/releases/)<br/>What's new in GitLab. | |
|
||||||
|
|
||||||
## Popular Documentation
|
## Popular topics
|
||||||
|
|
||||||
Have a look at some of our most popular documentation resources:
|
Have a look at some of our most popular topics:
|
||||||
|
|
||||||
| Popular Topic | Description |
|
| Popular topic | Description |
|
||||||
|:----------------------------------------------------------------|:-----------------------------------------------------------------|
|
|:-----------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------|
|
||||||
| [Configuring `.gitlab-ci.yml`](ci/yaml/README.md) | Complete syntax documentation for configuring your CI pipelines. |
|
| [Two-factor authentication](user/profile/account/two_factor_authentication.md) | Improve the security of your GitLab account. |
|
||||||
| [GitLab CI/CD examples](ci/examples/README.md) | Get up to speed quickly with common CI/CD scenarios. |
|
| [GitLab groups](user/group/index.md) | Manage projects together. |
|
||||||
| [GitLab Container Registry](user/packages/container_registry/index.md) | Host Docker images within GitLab. |
|
| [GitLab CI/CD pipeline configuration reference](ci/yaml/README.md) | Available configuration options for `.gitlab-ci.yml` files. |
|
||||||
| [GitLab Pages](user/project/pages/index.md) | Host static websites for your projects with GitLab. |
|
| [Activate GitLab EE with a license](user/admin_area/license.md) **(STARTER ONLY)** | Activate GitLab Enterprise Edition functionality with a license. |
|
||||||
| [GitLab.com settings](user/gitlab_com/index.md) | Settings for GitLab.com. |
|
| [Back up and restore GitLab](raketasks/backup_restore.md) **(CORE ONLY)** | Rake tasks for backing up and restoring GitLab self-managed instances. |
|
||||||
| [Kubernetes integration](user/project/clusters/index.md) | Use GitLab with Kubernetes. |
|
| [GitLab release and maintenance policy](policy/maintenance.md) | Policies for version naming and cadence, and also upgrade recommendations. |
|
||||||
| [SSH authentication](ssh/README.md) | Secure your network communications. |
|
| [Elasticsearch integration](integration/elasticsearch.md) **(STARTER ONLY)** | Integrate Elasticsearch with GitLab to enable advanced searching. |
|
||||||
| [Using Docker images](ci/docker/using_docker_images.md) | Build and test your applications with Docker. |
|
| [Omnibus GitLab database settings](https://docs.gitlab.com/omnibus/settings/database.html) **(CORE ONLY)** | Database settings for Omnibus GitLab self-managed instances. |
|
||||||
| [GraphQL](api/graphql/index.md) | Explore GitLab's GraphQL API. |
|
| [Omnibus GitLab NGINX settings](https://docs.gitlab.com/omnibus/settings/nginx.html) **(CORE ONLY)** | NGINX settings for Omnibus GitLab self-managed instances. |
|
||||||
|
| [Omnibus GitLab SSL configuration](https://docs.gitlab.com/omnibus/settings/ssl.html) **(CORE ONLY)** | SSL settings for Omnibus GitLab self-managed instances. |
|
||||||
|
| [GitLab.com settings](user/gitlab_com/index.md) | Settings used for GitLab.com. |
|
||||||
|
|
||||||
## The entire DevOps Lifecycle
|
## The entire DevOps Lifecycle
|
||||||
|
|
||||||
|
@ -62,7 +64,7 @@ than ever.
|
||||||
|
|
||||||
The following sections provide links to documentation for each DevOps stage:
|
The following sections provide links to documentation for each DevOps stage:
|
||||||
|
|
||||||
| DevOps Stage | Documentation for |
|
| DevOps stage | Documentation for |
|
||||||
|:------------------------|:------------------------------------------------------------|
|
|:------------------------|:------------------------------------------------------------|
|
||||||
| [Manage](#manage) | Statistics and analytics features. |
|
| [Manage](#manage) | Statistics and analytics features. |
|
||||||
| [Plan](#plan) | Project planning and management features. |
|
| [Plan](#plan) | Project planning and management features. |
|
||||||
|
@ -86,7 +88,7 @@ GitLab provides statistics and insight into ways you can maximize the value of G
|
||||||
|
|
||||||
The following documentation relates to the DevOps **Manage** stage:
|
The following documentation relates to the DevOps **Manage** stage:
|
||||||
|
|
||||||
| Manage Topics | Description |
|
| Manage topics | Description |
|
||||||
|:--------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|:--------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| [Authentication and<br/>Authorization](administration/auth/README.md) **(CORE ONLY)** | Supported authentication and authorization providers. |
|
| [Authentication and<br/>Authorization](administration/auth/README.md) **(CORE ONLY)** | Supported authentication and authorization providers. |
|
||||||
| [GitLab Value Stream Analytics](user/project/cycle_analytics.md) | Measure the time it takes to go from an [idea to production](https://about.gitlab.com/blog/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/#from-idea-to-production-with-gitlab) for each project you have. |
|
| [GitLab Value Stream Analytics](user/project/cycle_analytics.md) | Measure the time it takes to go from an [idea to production](https://about.gitlab.com/blog/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/#from-idea-to-production-with-gitlab) for each project you have. |
|
||||||
|
@ -107,7 +109,7 @@ management tools.
|
||||||
|
|
||||||
The following documentation relates to the DevOps **Plan** stage:
|
The following documentation relates to the DevOps **Plan** stage:
|
||||||
|
|
||||||
| Plan Topics | Description |
|
| Plan topics | Description |
|
||||||
|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------|
|
|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| [Burndown Charts](user/project/milestones/burndown_charts.md) **(STARTER)** | Watch your project's progress throughout a specific milestone. |
|
| [Burndown Charts](user/project/milestones/burndown_charts.md) **(STARTER)** | Watch your project's progress throughout a specific milestone. |
|
||||||
| [Discussions](user/discussions/index.md) | Threads, comments, and resolvable threads in issues, commits, and merge requests. |
|
| [Discussions](user/discussions/index.md) | Threads, comments, and resolvable threads in issues, commits, and merge requests. |
|
||||||
|
@ -144,7 +146,7 @@ The following documentation relates to the DevOps **Create** stage:
|
||||||
|
|
||||||
#### Projects and Groups
|
#### Projects and Groups
|
||||||
|
|
||||||
| Create Topics - Projects and Groups | Description |
|
| Create topics - Projects and Groups | Description |
|
||||||
|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------|
|
|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------|
|
||||||
| [Advanced global search](user/search/advanced_global_search.md) **(STARTER)** | Leverage Elasticsearch for faster, more advanced code search across your entire GitLab instance. |
|
| [Advanced global search](user/search/advanced_global_search.md) **(STARTER)** | Leverage Elasticsearch for faster, more advanced code search across your entire GitLab instance. |
|
||||||
| [Advanced syntax search](user/search/advanced_search_syntax.md) **(STARTER)** | Use advanced queries for more targeted search results. |
|
| [Advanced syntax search](user/search/advanced_search_syntax.md) **(STARTER)** | Use advanced queries for more targeted search results. |
|
||||||
|
@ -169,7 +171,7 @@ The following documentation relates to the DevOps **Create** stage:
|
||||||
|
|
||||||
#### Repositories
|
#### Repositories
|
||||||
|
|
||||||
| Create Topics - Repositories | Description |
|
| Create topics - Repositories | Description |
|
||||||
|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------|
|
|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------|
|
||||||
| [Branches](user/project/repository/branches/index.md) and the [default branch](user/project/repository/branches/index.md#default-branch) | How to use branches in GitLab. |
|
| [Branches](user/project/repository/branches/index.md) and the [default branch](user/project/repository/branches/index.md#default-branch) | How to use branches in GitLab. |
|
||||||
| [Commits](user/project/repository/index.md#commits) and [signing commits](user/project/repository/gpg_signed_commits/index.md) | Work with commits, and use GPG to sign your commits. |
|
| [Commits](user/project/repository/index.md#commits) and [signing commits](user/project/repository/gpg_signed_commits/index.md) | Work with commits, and use GPG to sign your commits. |
|
||||||
|
@ -192,7 +194,7 @@ The following documentation relates to the DevOps **Create** stage:
|
||||||
|
|
||||||
#### Merge Requests
|
#### Merge Requests
|
||||||
|
|
||||||
| Create Topics - Merge Requests | Description |
|
| Create topics - Merge Requests | Description |
|
||||||
|:--------------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------|
|
|:--------------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| [Checking out merge requests locally](user/project/merge_requests/reviewing_and_managing_merge_requests.md#checkout-merge-requests-locally) | Tips for working with merge requests locally. |
|
| [Checking out merge requests locally](user/project/merge_requests/reviewing_and_managing_merge_requests.md#checkout-merge-requests-locally) | Tips for working with merge requests locally. |
|
||||||
| [Cherry-picking](user/project/merge_requests/cherry_pick_changes.md) | Use GitLab for cherry-picking changes. |
|
| [Cherry-picking](user/project/merge_requests/cherry_pick_changes.md) | Use GitLab for cherry-picking changes. |
|
||||||
|
@ -208,7 +210,7 @@ The following documentation relates to the DevOps **Create** stage:
|
||||||
|
|
||||||
#### Integration and Automation
|
#### Integration and Automation
|
||||||
|
|
||||||
| Create Topics - Integration and Automation | Description |
|
| Create topics - Integration and Automation | Description |
|
||||||
|:------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------|
|
|:------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------|
|
||||||
| [GitLab API](api/README.md) | Integrate GitLab via a simple and powerful API. |
|
| [GitLab API](api/README.md) | Integrate GitLab via a simple and powerful API. |
|
||||||
| [GitLab Integration](integration/README.md) | Integrate with multiple third-party services with GitLab to allow external issue trackers and external authentication. |
|
| [GitLab Integration](integration/README.md) | Integrate with multiple third-party services with GitLab to allow external issue trackers and external authentication. |
|
||||||
|
@ -235,7 +237,7 @@ scales to run your tests faster.
|
||||||
|
|
||||||
The following documentation relates to the DevOps **Verify** stage:
|
The following documentation relates to the DevOps **Verify** stage:
|
||||||
|
|
||||||
| Verify Topics | Description |
|
| Verify topics | Description |
|
||||||
|:----------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------|
|
|:----------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------|
|
||||||
| [Code Quality reports](user/project/merge_requests/code_quality.md) **(STARTER)** | Analyze source code quality. |
|
| [Code Quality reports](user/project/merge_requests/code_quality.md) **(STARTER)** | Analyze source code quality. |
|
||||||
| [GitLab CI/CD](ci/README.md) | Explore the features and capabilities of Continuous Integration with GitLab. |
|
| [GitLab CI/CD](ci/README.md) | Explore the features and capabilities of Continuous Integration with GitLab. |
|
||||||
|
@ -258,7 +260,7 @@ packages, which can be easily consumed as a dependency in downstream projects.
|
||||||
|
|
||||||
The following documentation relates to the DevOps **Package** stage:
|
The following documentation relates to the DevOps **Package** stage:
|
||||||
|
|
||||||
| Package Topics | Description |
|
| Package topics | Description |
|
||||||
|:----------------------------------------------------------------|:-------------------------------------------------------|
|
|:----------------------------------------------------------------|:-------------------------------------------------------|
|
||||||
| [Container Registry](user/packages/container_registry/index.md) | The GitLab Container Registry enables every project in GitLab to have its own space to store [Docker](https://www.docker.com/) images. |
|
| [Container Registry](user/packages/container_registry/index.md) | The GitLab Container Registry enables every project in GitLab to have its own space to store [Docker](https://www.docker.com/) images. |
|
||||||
| [Dependency Proxy](user/packages/dependency_proxy/index.md) **(PREMIUM)** | The GitLab Dependency Proxy sets up a local proxy for frequently used upstream images/packages. |
|
| [Dependency Proxy](user/packages/dependency_proxy/index.md) **(PREMIUM)** | The GitLab Dependency Proxy sets up a local proxy for frequently used upstream images/packages. |
|
||||||
|
@ -280,7 +282,7 @@ confidently and securely with GitLab’s built-in Continuous Delivery and Deploy
|
||||||
|
|
||||||
The following documentation relates to the DevOps **Release** stage:
|
The following documentation relates to the DevOps **Release** stage:
|
||||||
|
|
||||||
| Release Topics | Description |
|
| Release topics | Description |
|
||||||
|:------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------|
|
|:------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| [Auto Deploy](topics/autodevops/stages.md#auto-deploy) | Configure GitLab for the deployment of your application. |
|
| [Auto Deploy](topics/autodevops/stages.md#auto-deploy) | Configure GitLab for the deployment of your application. |
|
||||||
| [Canary Deployments](user/project/canary_deployments.md) **(PREMIUM)** | Employ a popular CI strategy where a small portion of the fleet is updated to the new version first. |
|
| [Canary Deployments](user/project/canary_deployments.md) **(PREMIUM)** | Employ a popular CI strategy where a small portion of the fleet is updated to the new version first. |
|
||||||
|
@ -306,7 +308,7 @@ configuration. Then customize everything from buildpacks to CI/CD.
|
||||||
|
|
||||||
The following documentation relates to the DevOps **Configure** stage:
|
The following documentation relates to the DevOps **Configure** stage:
|
||||||
|
|
||||||
| Configure Topics | Description |
|
| Configure topics | Description |
|
||||||
|:-----------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------|
|
|:-----------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------|
|
||||||
| [Auto DevOps](topics/autodevops/index.md) | Automatically employ a complete DevOps lifecycle. |
|
| [Auto DevOps](topics/autodevops/index.md) | Automatically employ a complete DevOps lifecycle. |
|
||||||
| [Create Kubernetes clusters](user/project/clusters/add_remove_clusters.md#create-new-cluster) | Use Kubernetes and GitLab. |
|
| [Create Kubernetes clusters](user/project/clusters/add_remove_clusters.md#create-new-cluster) | Use Kubernetes and GitLab. |
|
||||||
|
@ -335,7 +337,7 @@ instant how code changes impact your production environment.
|
||||||
|
|
||||||
The following documentation relates to the DevOps **Monitor** stage:
|
The following documentation relates to the DevOps **Monitor** stage:
|
||||||
|
|
||||||
| Monitor Topics | Description |
|
| Monitor topics | Description |
|
||||||
|:------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------|
|
|:------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| [GitLab Performance Monitoring](administration/monitoring/performance/index.md) **(CORE ONLY)** | Use Prometheus and Grafana to monitor the performance of your GitLab instance. |
|
| [GitLab Performance Monitoring](administration/monitoring/performance/index.md) **(CORE ONLY)** | Use Prometheus and Grafana to monitor the performance of your GitLab instance. |
|
||||||
| [GitLab Prometheus](administration/monitoring/prometheus/index.md) **(CORE ONLY)** | Configure the bundled Prometheus to collect various metrics from your GitLab instance. |
|
| [GitLab Prometheus](administration/monitoring/prometheus/index.md) **(CORE ONLY)** | Configure the bundled Prometheus to collect various metrics from your GitLab instance. |
|
||||||
|
@ -360,7 +362,7 @@ high-level view on projects and groups, and start remediation processes when nee
|
||||||
|
|
||||||
The following documentation relates to the DevOps **Secure** stage:
|
The following documentation relates to the DevOps **Secure** stage:
|
||||||
|
|
||||||
| Secure Topics | Description |
|
| Secure topics | Description |
|
||||||
|:------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------|
|
|:------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------|
|
||||||
| [Compliance Dashboard](user/compliance/compliance_dashboard/index.md) **(ULTIMATE)** | View the most recent Merge Request activity in a group. |
|
| [Compliance Dashboard](user/compliance/compliance_dashboard/index.md) **(ULTIMATE)** | View the most recent Merge Request activity in a group. |
|
||||||
| [Container Scanning](user/application_security/container_scanning/index.md) **(ULTIMATE)** | Use Clair to scan Docker images for known vulnerabilities. |
|
| [Container Scanning](user/application_security/container_scanning/index.md) **(ULTIMATE)** | Use Clair to scan Docker images for known vulnerabilities. |
|
||||||
|
@ -442,7 +444,7 @@ If you are coming to GitLab from another platform, you'll find the following inf
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
## Building an integration with GitLab
|
## Build an integration with GitLab
|
||||||
|
|
||||||
There are many ways to integrate with GitLab, including:
|
There are many ways to integrate with GitLab, including:
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
|
||||||
type: reference
|
type: reference
|
||||||
---
|
---
|
||||||
|
|
||||||
# GitLab CI/CD Pipeline Configuration Reference
|
# GitLab CI/CD pipeline configuration reference
|
||||||
|
|
||||||
GitLab CI/CD [pipelines](../pipelines/index.md) are configured using a YAML file called `.gitlab-ci.yml` within each project.
|
GitLab CI/CD [pipelines](../pipelines/index.md) are configured using a YAML file called `.gitlab-ci.yml` within each project.
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
type: concepts
|
type: concepts
|
||||||
---
|
---
|
||||||
|
|
||||||
# GitLab Release and Maintenance Policy
|
# GitLab release and maintenance policy
|
||||||
|
|
||||||
GitLab has strict policies governing version naming, as well as release pace for major, minor,
|
GitLab has strict policies governing version naming, as well as release pace for major, minor,
|
||||||
patch, and security releases. New releases are usually announced on the [GitLab blog](https://about.gitlab.com/releases/categories/releases/).
|
patch, and security releases. New releases are usually announced on the [GitLab blog](https://about.gitlab.com/releases/categories/releases/).
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Backing up and restoring GitLab **(CORE ONLY)**
|
# Back up and restore GitLab **(CORE ONLY)**
|
||||||
|
|
||||||
GitLab provides Rake tasks for backing up and restoring GitLab instances.
|
GitLab provides Rake tasks for backing up and restoring GitLab instances.
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
|
||||||
type: howto
|
type: howto
|
||||||
---
|
---
|
||||||
|
|
||||||
# Activate all GitLab Enterprise Edition functionality with a license **(STARTER ONLY)**
|
# Activate GitLab EE with a license **(STARTER ONLY)**
|
||||||
|
|
||||||
To activate all GitLab Enterprise Edition (EE) functionality, you need to upload
|
To activate all GitLab Enterprise Edition (EE) functionality, you need to upload
|
||||||
a license. Once you've received your license from GitLab Inc., you can upload it
|
a license. Once you've received your license from GitLab Inc., you can upload it
|
||||||
|
|
|
@ -58,12 +58,15 @@ prerequisites:
|
||||||
|
|
||||||
If you're using custom Helm values for Cilium, you must enable Hubble
|
If you're using custom Helm values for Cilium, you must enable Hubble
|
||||||
with flow metrics for each namespace by adding the following lines to
|
with flow metrics for each namespace by adding the following lines to
|
||||||
your [Hubble values](../../clusters/applications.md#install-cilium-using-gitlab-cicd):
|
your [Cilium values](../../clusters/applications.md#install-cilium-using-gitlab-cicd):
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
metrics:
|
global:
|
||||||
enabled:
|
hubble:
|
||||||
- 'flow:sourceContext=namespace;destinationContext=namespace'
|
enabled: true
|
||||||
|
metrics:
|
||||||
|
enabled:
|
||||||
|
- 'flow:sourceContext=namespace;destinationContext=namespace'
|
||||||
```
|
```
|
||||||
|
|
||||||
The **Container Network Policy** section displays the following information
|
The **Container Network Policy** section displays the following information
|
||||||
|
|
|
@ -988,23 +988,21 @@ Major upgrades might require additional setup steps, please consult
|
||||||
the official [upgrade guide](https://docs.cilium.io/en/stable/install/upgrade/) for more
|
the official [upgrade guide](https://docs.cilium.io/en/stable/install/upgrade/) for more
|
||||||
information.
|
information.
|
||||||
|
|
||||||
By default, Cilium will drop all disallowed packets upon policy
|
By default, Cilium drops all disallowed packets upon policy
|
||||||
deployment. The audit mode is scheduled for release in
|
deployment. In
|
||||||
[Cilium 1.8](https://github.com/cilium/cilium/pull/9970). In the audit
|
[auditmode](https://docs.cilium.io/en/v1.8/gettingstarted/policy-creation/?highlight=policy-audit#enable-policy-audit-mode),
|
||||||
mode, disallowed packets will not be dropped, and audit
|
however, Cilium doesn't drop disallowed packets. You can use
|
||||||
notifications will be generated instead. GitLab provides alternative Docker
|
`policy-verdict` log to observe policy-related decisions. You can
|
||||||
images for Cilium with the audit patch included. You can switch to the
|
enable audit mode by adding the following to
|
||||||
custom build and enable the audit mode by adding the following to
|
|
||||||
`.gitlab/managed-apps/cilium/values.yaml`:
|
`.gitlab/managed-apps/cilium/values.yaml`:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
global:
|
config:
|
||||||
registry: registry.gitlab.com/gitlab-org/defend/cilium
|
|
||||||
policyAuditMode: true
|
policyAuditMode: true
|
||||||
|
|
||||||
agent:
|
agent:
|
||||||
monitor:
|
monitor:
|
||||||
eventTypes: ["drop", "audit"]
|
eventTypes: ["drop", "policy-verdict"]
|
||||||
```
|
```
|
||||||
|
|
||||||
The Cilium monitor log for traffic is logged out by the
|
The Cilium monitor log for traffic is logged out by the
|
||||||
|
@ -1026,22 +1024,24 @@ The [Hubble](https://github.com/cilium/hubble) monitoring daemon is
|
||||||
enabled by default and it's set to collect per namespace flow
|
enabled by default and it's set to collect per namespace flow
|
||||||
metrics. This metrics are accessible on the [Threat Monitoring](../application_security/threat_monitoring/index.md)
|
metrics. This metrics are accessible on the [Threat Monitoring](../application_security/threat_monitoring/index.md)
|
||||||
dashboard. You can disable Hubble by adding the following to
|
dashboard. You can disable Hubble by adding the following to
|
||||||
`.gitlab/managed-apps/config.yaml`:
|
`.gitlab/managed-apps/cilium/values.yaml`:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
cilium:
|
global:
|
||||||
installed: true
|
|
||||||
hubble:
|
hubble:
|
||||||
installed: false
|
enabled: false
|
||||||
```
|
```
|
||||||
|
|
||||||
You can also adjust Helm values for Hubble via
|
You can also adjust Helm values for Hubble via
|
||||||
`.gitlab/managed-apps/cilium/hubble-values.yaml`:
|
`.gitlab/managed-apps/cilium/values.yaml`:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
metrics:
|
global:
|
||||||
enabled:
|
hubble:
|
||||||
- 'flow:sourceContext=namespace;destinationContext=namespace'
|
enabled: true
|
||||||
|
metrics:
|
||||||
|
enabled:
|
||||||
|
- 'flow:sourceContext=namespace;destinationContext=namespace'
|
||||||
```
|
```
|
||||||
|
|
||||||
NOTE: **Note:**
|
NOTE: **Note:**
|
||||||
|
|
|
@ -5,9 +5,9 @@ group: Access
|
||||||
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/#designated-technical-writers
|
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/#designated-technical-writers
|
||||||
---
|
---
|
||||||
|
|
||||||
# Two-Factor Authentication
|
# Two-factor authentication
|
||||||
|
|
||||||
Two-factor Authentication (2FA) provides an additional level of security to your
|
Two-factor authentication (2FA) provides an additional level of security to your
|
||||||
GitLab account. Once enabled, in addition to supplying your username and
|
GitLab account. Once enabled, in addition to supplying your username and
|
||||||
password to login, you'll be prompted for a code generated by your one time password
|
password to login, you'll be prompted for a code generated by your one time password
|
||||||
authenticator. For example, a password manager on one of your devices.
|
authenticator. For example, a password manager on one of your devices.
|
||||||
|
@ -62,7 +62,7 @@ To enable 2FA:
|
||||||
1. Click **Submit**.
|
1. Click **Submit**.
|
||||||
|
|
||||||
If the pin you entered was correct, you'll see a message indicating that
|
If the pin you entered was correct, you'll see a message indicating that
|
||||||
Two-Factor Authentication has been enabled, and you'll be presented with a list
|
two-factor authentication has been enabled, and you'll be presented with a list
|
||||||
of [recovery codes](#recovery-codes). Make sure you download them and keep them
|
of [recovery codes](#recovery-codes). Make sure you download them and keep them
|
||||||
in a safe place.
|
in a safe place.
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
apply:
|
apply:
|
||||||
stage: deploy
|
stage: deploy
|
||||||
image: "registry.gitlab.com/gitlab-org/cluster-integration/cluster-applications:v0.20.0"
|
image: "registry.gitlab.com/gitlab-org/cluster-integration/cluster-applications:v0.23.0"
|
||||||
environment:
|
environment:
|
||||||
name: production
|
name: production
|
||||||
variables:
|
variables:
|
||||||
|
|
|
@ -25172,6 +25172,18 @@ msgstr ""
|
||||||
msgid "User was successfully updated."
|
msgid "User was successfully updated."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "UserLists|Define a set of users to be used within feature flag strategies"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "UserLists|There are no users"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "UserLists|User ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "UserLists|User IDs"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "UserList|Delete %{name}?"
|
msgid "UserList|Delete %{name}?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
require 'airborne'
|
require 'airborne'
|
||||||
|
|
||||||
module QA
|
module QA
|
||||||
context 'Manage with IP rate limits', :requires_admin do
|
RSpec.describe 'Manage with IP rate limits', :requires_admin do
|
||||||
describe 'Users API' do
|
describe 'Users API' do
|
||||||
let(:api_client) { Runtime::API::Client.new(:gitlab, ip_limits: true) }
|
let(:api_client) { Runtime::API::Client.new(:gitlab, ip_limits: true) }
|
||||||
let(:request) { Runtime::API::Request.new(api_client, '/users') }
|
let(:request) { Runtime::API::Request.new(api_client, '/users') }
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
require 'airborne'
|
require 'airborne'
|
||||||
|
|
||||||
module QA
|
module QA
|
||||||
context 'Manage' do
|
RSpec.describe 'Manage' do
|
||||||
describe 'Users API' do
|
describe 'Users API' do
|
||||||
before(:context) do
|
before(:context) do
|
||||||
@api_client = Runtime::API::Client.new(:gitlab)
|
@api_client = Runtime::API::Client.new(:gitlab)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module QA
|
module QA
|
||||||
context 'Configure', :orchestrated, :mattermost do
|
RSpec.describe 'Configure', :orchestrated, :mattermost do
|
||||||
describe 'Mattermost support' do
|
describe 'Mattermost support' do
|
||||||
it 'user creates a group with a mattermost team' do
|
it 'user creates a group with a mattermost team' do
|
||||||
Flow::Login.sign_in
|
Flow::Login.sign_in
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module QA
|
module QA
|
||||||
context 'Manage' do
|
RSpec.describe 'Manage' do
|
||||||
describe 'Project transfer between groups' do
|
describe 'Project transfer between groups' do
|
||||||
it 'user transfers a project between groups' do
|
it 'user transfers a project between groups' do
|
||||||
Flow::Login.sign_in
|
Flow::Login.sign_in
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module QA
|
module QA
|
||||||
context 'Manage', :smoke do
|
RSpec.describe 'Manage', :smoke do
|
||||||
describe 'basic user login' do
|
describe 'basic user login' do
|
||||||
it 'user logs in using basic credentials and logs out' do
|
it 'user logs in using basic credentials and logs out' do
|
||||||
Flow::Login.sign_in
|
Flow::Login.sign_in
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module QA
|
module QA
|
||||||
context 'Manage', :orchestrated, :ldap_no_tls, :ldap_tls do
|
RSpec.describe 'Manage', :orchestrated, :ldap_no_tls, :ldap_tls do
|
||||||
describe 'LDAP login' do
|
describe 'LDAP login' do
|
||||||
it 'user logs into GitLab using LDAP credentials' do
|
it 'user logs into GitLab using LDAP credentials' do
|
||||||
Flow::Login.sign_in
|
Flow::Login.sign_in
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module QA
|
module QA
|
||||||
context 'Manage', :orchestrated, :mattermost do
|
RSpec.describe 'Manage', :orchestrated, :mattermost do
|
||||||
describe 'Mattermost login' do
|
describe 'Mattermost login' do
|
||||||
it 'user logs into Mattermost using GitLab OAuth' do
|
it 'user logs into Mattermost using GitLab OAuth' do
|
||||||
Flow::Login.sign_in
|
Flow::Login.sign_in
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module QA
|
module QA
|
||||||
context 'Manage', :orchestrated, :instance_saml do
|
RSpec.describe 'Manage', :orchestrated, :instance_saml do
|
||||||
describe 'Instance wide SAML SSO' do
|
describe 'Instance wide SAML SSO' do
|
||||||
it 'User logs in to gitlab with SAML SSO' do
|
it 'User logs in to gitlab with SAML SSO' do
|
||||||
Runtime::Browser.visit(:gitlab, Page::Main::Login)
|
Runtime::Browser.visit(:gitlab, Page::Main::Login)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module QA
|
module QA
|
||||||
shared_examples 'registration and login' do
|
RSpec.shared_examples 'registration and login' do
|
||||||
it 'user registers and logs in' do
|
it 'user registers and logs in' do
|
||||||
Runtime::Browser.visit(:gitlab, Page::Main::Login)
|
Runtime::Browser.visit(:gitlab, Page::Main::Login)
|
||||||
|
|
||||||
|
@ -13,13 +13,13 @@ module QA
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'Manage', :skip_signup_disabled do
|
RSpec.describe 'Manage', :skip_signup_disabled do
|
||||||
describe 'standard' do
|
describe 'standard' do
|
||||||
it_behaves_like 'registration and login'
|
it_behaves_like 'registration and login'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'Manage', :orchestrated, :ldap_no_tls, :skip_signup_disabled do
|
RSpec.describe 'Manage', :orchestrated, :ldap_no_tls, :skip_signup_disabled do
|
||||||
describe 'while LDAP is enabled' do
|
describe 'while LDAP is enabled' do
|
||||||
it_behaves_like 'registration and login'
|
it_behaves_like 'registration and login'
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module QA
|
module QA
|
||||||
context 'Manage' do
|
RSpec.describe 'Manage' do
|
||||||
describe 'Add project member' do
|
describe 'Add project member' do
|
||||||
it 'user adds project member' do
|
it 'user adds project member' do
|
||||||
Flow::Login.sign_in
|
Flow::Login.sign_in
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module QA
|
module QA
|
||||||
context 'Manage', :smoke do
|
RSpec.describe 'Manage', :smoke do
|
||||||
describe 'Project creation' do
|
describe 'Project creation' do
|
||||||
it 'user creates a new project' do
|
it 'user creates a new project' do
|
||||||
Flow::Login.sign_in
|
Flow::Login.sign_in
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
require 'nokogiri'
|
require 'nokogiri'
|
||||||
|
|
||||||
module QA
|
module QA
|
||||||
context 'Manage', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/212145', type: :stale } do
|
RSpec.describe 'Manage', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/212145', type: :stale } do
|
||||||
describe 'Check for broken images', :requires_admin do
|
describe 'Check for broken images', :requires_admin do
|
||||||
before(:context) do
|
before(:context) do
|
||||||
admin = QA::Resource::User.new.tap do |user|
|
admin = QA::Resource::User.new.tap do |user|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module QA
|
module QA
|
||||||
context 'Manage', :github, quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/issues/26952', type: :bug } do
|
RSpec.describe 'Manage', :github, quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/issues/26952', type: :bug } do
|
||||||
describe 'Project import from GitHub' do
|
describe 'Project import from GitHub' do
|
||||||
let(:imported_project) do
|
let(:imported_project) do
|
||||||
Resource::ProjectImportedFromGithub.fabricate! do |project|
|
Resource::ProjectImportedFromGithub.fabricate! do |project|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module QA
|
module QA
|
||||||
context 'Manage' do
|
RSpec.describe 'Manage' do
|
||||||
describe 'Repository tags' do
|
describe 'Repository tags' do
|
||||||
let(:project) do
|
let(:project) do
|
||||||
Resource::Project.fabricate_via_api! do |project|
|
Resource::Project.fabricate_via_api! do |project|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module QA
|
module QA
|
||||||
context 'Manage' do
|
RSpec.describe 'Manage' do
|
||||||
describe 'Project activity' do
|
describe 'Project activity' do
|
||||||
it 'user creates an event in the activity page upon Git push' do
|
it 'user creates an event in the activity page upon Git push' do
|
||||||
Flow::Login.sign_in
|
Flow::Login.sign_in
|
||||||
|
|
|
@ -171,6 +171,29 @@ RSpec.describe Admin::ClustersController do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'GET #prometheus_proxy' do
|
||||||
|
let(:user) { admin }
|
||||||
|
let(:proxyable) do
|
||||||
|
create(:cluster, :instance, :provided_by_gcp)
|
||||||
|
end
|
||||||
|
|
||||||
|
it_behaves_like 'metrics dashboard prometheus api proxy' do
|
||||||
|
context 'with anonymous user' do
|
||||||
|
let(:prometheus_body) { nil }
|
||||||
|
|
||||||
|
before do
|
||||||
|
sign_out(admin)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns 404' do
|
||||||
|
get :prometheus_proxy, params: prometheus_proxy_params
|
||||||
|
|
||||||
|
expect(response).to have_gitlab_http_status(:not_found)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe 'POST #create_gcp' do
|
describe 'POST #create_gcp' do
|
||||||
let(:legacy_abac_param) { 'true' }
|
let(:legacy_abac_param) { 'true' }
|
||||||
let(:params) do
|
let(:params) do
|
||||||
|
|
|
@ -192,6 +192,35 @@ RSpec.describe Groups::ClustersController do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'GET #prometheus_proxy' do
|
||||||
|
let(:proxyable) do
|
||||||
|
create(:cluster, :provided_by_gcp, cluster_type: :group_type, groups: [group])
|
||||||
|
end
|
||||||
|
|
||||||
|
it_behaves_like 'metrics dashboard prometheus api proxy' do
|
||||||
|
let(:proxyable_params) do
|
||||||
|
{
|
||||||
|
id: proxyable.id.to_s,
|
||||||
|
group_id: group.name
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with anonymous user' do
|
||||||
|
let(:prometheus_body) { nil }
|
||||||
|
|
||||||
|
before do
|
||||||
|
sign_out(user)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns 404' do
|
||||||
|
get :prometheus_proxy, params: prometheus_proxy_params
|
||||||
|
|
||||||
|
expect(response).to have_gitlab_http_status(:not_found)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe 'POST create for new cluster' do
|
describe 'POST create for new cluster' do
|
||||||
let(:legacy_abac_param) { 'true' }
|
let(:legacy_abac_param) { 'true' }
|
||||||
let(:params) do
|
let(:params) do
|
||||||
|
|
|
@ -200,6 +200,36 @@ RSpec.describe Projects::ClustersController do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'GET #prometheus_proxy' do
|
||||||
|
let(:proxyable) do
|
||||||
|
create(:cluster, :provided_by_gcp, projects: [project])
|
||||||
|
end
|
||||||
|
|
||||||
|
it_behaves_like 'metrics dashboard prometheus api proxy' do
|
||||||
|
let(:proxyable_params) do
|
||||||
|
{
|
||||||
|
id: proxyable.id.to_s,
|
||||||
|
namespace_id: project.namespace.full_path,
|
||||||
|
project_id: project.name
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with anonymous user' do
|
||||||
|
let(:prometheus_body) { nil }
|
||||||
|
|
||||||
|
before do
|
||||||
|
sign_out(user)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'redirects to signin page' do
|
||||||
|
get :prometheus_proxy, params: prometheus_proxy_params
|
||||||
|
|
||||||
|
expect(response).to redirect_to(new_user_session_path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe 'POST create for new cluster' do
|
describe 'POST create for new cluster' do
|
||||||
let(:legacy_abac_param) { 'true' }
|
let(:legacy_abac_param) { 'true' }
|
||||||
let(:params) do
|
let(:params) do
|
||||||
|
|
|
@ -54,6 +54,14 @@ describe('tags list row', () => {
|
||||||
expect(findCheckbox().exists()).toBe(true);
|
expect(findCheckbox().exists()).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("does not exist when the row can't be deleted", () => {
|
||||||
|
const customTag = { ...tag, destroy_path: '' };
|
||||||
|
|
||||||
|
mountComponent({ ...defaultProps, tag: customTag });
|
||||||
|
|
||||||
|
expect(findCheckbox().exists()).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
it('is wired to the selected prop', () => {
|
it('is wired to the selected prop', () => {
|
||||||
mountComponent({ ...defaultProps, selected: true });
|
mountComponent({ ...defaultProps, selected: true });
|
||||||
|
|
||||||
|
|
|
@ -2,18 +2,35 @@ import {
|
||||||
generateToolbarItem,
|
generateToolbarItem,
|
||||||
addCustomEventListener,
|
addCustomEventListener,
|
||||||
removeCustomEventListener,
|
removeCustomEventListener,
|
||||||
|
registerHTMLToMarkdownRenderer,
|
||||||
addImage,
|
addImage,
|
||||||
getMarkdown,
|
getMarkdown,
|
||||||
} from '~/vue_shared/components/rich_content_editor/services/editor_service';
|
} from '~/vue_shared/components/rich_content_editor/services/editor_service';
|
||||||
|
import buildHTMLToMarkdownRenderer from '~/vue_shared/components/rich_content_editor/services/build_html_to_markdown_renderer';
|
||||||
|
|
||||||
|
jest.mock('~/vue_shared/components/rich_content_editor/services/build_html_to_markdown_renderer');
|
||||||
|
|
||||||
describe('Editor Service', () => {
|
describe('Editor Service', () => {
|
||||||
const mockInstance = {
|
let mockInstance;
|
||||||
eventManager: { addEventType: jest.fn(), removeEventHandler: jest.fn(), listen: jest.fn() },
|
let event;
|
||||||
editor: { exec: jest.fn() },
|
let handler;
|
||||||
invoke: jest.fn(),
|
|
||||||
};
|
beforeEach(() => {
|
||||||
const event = 'someCustomEvent';
|
mockInstance = {
|
||||||
const handler = jest.fn();
|
eventManager: { addEventType: jest.fn(), removeEventHandler: jest.fn(), listen: jest.fn() },
|
||||||
|
editor: { exec: jest.fn() },
|
||||||
|
invoke: jest.fn(),
|
||||||
|
toMarkOptions: {
|
||||||
|
renderer: {
|
||||||
|
constructor: {
|
||||||
|
factory: jest.fn(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
event = 'someCustomEvent';
|
||||||
|
handler = jest.fn();
|
||||||
|
});
|
||||||
|
|
||||||
describe('generateToolbarItem', () => {
|
describe('generateToolbarItem', () => {
|
||||||
const config = {
|
const config = {
|
||||||
|
@ -74,4 +91,33 @@ describe('Editor Service', () => {
|
||||||
expect(mockInstance.invoke).toHaveBeenCalledWith('getMarkdown');
|
expect(mockInstance.invoke).toHaveBeenCalledWith('getMarkdown');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('registerHTMLToMarkdownRenderer', () => {
|
||||||
|
let baseRenderer;
|
||||||
|
const htmlToMarkdownRenderer = {};
|
||||||
|
const extendedRenderer = {};
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
baseRenderer = mockInstance.toMarkOptions.renderer;
|
||||||
|
buildHTMLToMarkdownRenderer.mockReturnValueOnce(htmlToMarkdownRenderer);
|
||||||
|
baseRenderer.constructor.factory.mockReturnValueOnce(extendedRenderer);
|
||||||
|
|
||||||
|
registerHTMLToMarkdownRenderer(mockInstance);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('builds a new instance of the HTML to Markdown renderer', () => {
|
||||||
|
expect(buildHTMLToMarkdownRenderer).toHaveBeenCalledWith(baseRenderer);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('extends base renderer with the HTML to Markdown renderer', () => {
|
||||||
|
expect(baseRenderer.constructor.factory).toHaveBeenCalledWith(
|
||||||
|
baseRenderer,
|
||||||
|
htmlToMarkdownRenderer,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('replaces the default renderer with extended renderer', () => {
|
||||||
|
expect(mockInstance.toMarkOptions.renderer).toBe(extendedRenderer);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -13,6 +13,7 @@ import {
|
||||||
addCustomEventListener,
|
addCustomEventListener,
|
||||||
removeCustomEventListener,
|
removeCustomEventListener,
|
||||||
addImage,
|
addImage,
|
||||||
|
registerHTMLToMarkdownRenderer,
|
||||||
} from '~/vue_shared/components/rich_content_editor/services/editor_service';
|
} from '~/vue_shared/components/rich_content_editor/services/editor_service';
|
||||||
|
|
||||||
jest.mock('~/vue_shared/components/rich_content_editor/services/editor_service', () => ({
|
jest.mock('~/vue_shared/components/rich_content_editor/services/editor_service', () => ({
|
||||||
|
@ -20,6 +21,7 @@ jest.mock('~/vue_shared/components/rich_content_editor/services/editor_service',
|
||||||
addCustomEventListener: jest.fn(),
|
addCustomEventListener: jest.fn(),
|
||||||
removeCustomEventListener: jest.fn(),
|
removeCustomEventListener: jest.fn(),
|
||||||
addImage: jest.fn(),
|
addImage: jest.fn(),
|
||||||
|
registerHTMLToMarkdownRenderer: jest.fn(),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
describe('Rich Content Editor', () => {
|
describe('Rich Content Editor', () => {
|
||||||
|
@ -86,16 +88,24 @@ describe('Rich Content Editor', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('when editor is loaded', () => {
|
describe('when editor is loaded', () => {
|
||||||
it('adds the CUSTOM_EVENTS.openAddImageModal custom event listener', () => {
|
let mockEditorApi;
|
||||||
const mockEditorApi = { eventManager: { addEventType: jest.fn(), listen: jest.fn() } };
|
|
||||||
findEditor().vm.$emit('load', mockEditorApi);
|
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
mockEditorApi = { eventManager: { addEventType: jest.fn(), listen: jest.fn() } };
|
||||||
|
findEditor().vm.$emit('load', mockEditorApi);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('adds the CUSTOM_EVENTS.openAddImageModal custom event listener', () => {
|
||||||
expect(addCustomEventListener).toHaveBeenCalledWith(
|
expect(addCustomEventListener).toHaveBeenCalledWith(
|
||||||
mockEditorApi,
|
mockEditorApi,
|
||||||
CUSTOM_EVENTS.openAddImageModal,
|
CUSTOM_EVENTS.openAddImageModal,
|
||||||
wrapper.vm.onOpenAddImageModal,
|
wrapper.vm.onOpenAddImageModal,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('registers HTML to markdown renderer', () => {
|
||||||
|
expect(registerHTMLToMarkdownRenderer).toHaveBeenCalledWith(mockEditorApi);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('when editor is destroyed', () => {
|
describe('when editor is destroyed', () => {
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
import buildHTMLToMarkdownRenderer from '~/vue_shared/components/rich_content_editor/services/build_html_to_markdown_renderer';
|
||||||
|
|
||||||
|
describe('HTMLToMarkdownRenderer', () => {
|
||||||
|
let baseRenderer;
|
||||||
|
let htmlToMarkdownRenderer;
|
||||||
|
const NODE = { nodeValue: 'mock_node' };
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
baseRenderer = {
|
||||||
|
trim: jest.fn(input => `trimmed ${input}`),
|
||||||
|
getSpaceCollapsedText: jest.fn(input => `space collapsed ${input}`),
|
||||||
|
getSpaceControlled: jest.fn(input => `space controlled ${input}`),
|
||||||
|
};
|
||||||
|
htmlToMarkdownRenderer = buildHTMLToMarkdownRenderer(baseRenderer);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('TEXT_NODE visitor', () => {
|
||||||
|
it('composes getSpaceControlled, getSpaceCollapsedText, and trim services', () => {
|
||||||
|
expect(htmlToMarkdownRenderer.TEXT_NODE(NODE)).toBe(
|
||||||
|
`space controlled trimmed space collapsed ${NODE.nodeValue}`,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -72,6 +72,26 @@ RSpec.describe Projects::AfterImportService do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when housekeeping service lease is taken' do
|
||||||
|
let(:exception) { Projects::HousekeepingService::LeaseTaken.new }
|
||||||
|
|
||||||
|
it 'logs the error message' do
|
||||||
|
allow_next_instance_of(Projects::HousekeepingService) do |instance|
|
||||||
|
expect(instance).to receive(:execute).and_raise(exception)
|
||||||
|
end
|
||||||
|
|
||||||
|
expect(Gitlab::Import::Logger).to receive(:info).with(
|
||||||
|
{
|
||||||
|
message: 'Project housekeeping failed',
|
||||||
|
project_full_path: project.full_path,
|
||||||
|
project_id: project.id,
|
||||||
|
'error.message' => exception.to_s
|
||||||
|
}).and_call_original
|
||||||
|
|
||||||
|
subject.execute
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'when after import action throw retriable exception one time' do
|
context 'when after import action throw retriable exception one time' do
|
||||||
let(:exception) { GRPC::DeadlineExceeded.new }
|
let(:exception) { GRPC::DeadlineExceeded.new }
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ RSpec.shared_context 'GroupPolicy context' do
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
let(:read_group_permissions) { %i[read_label read_list read_milestone read_board] }
|
let(:read_group_permissions) { %i[read_label read_list read_milestone read_board] }
|
||||||
let(:reporter_permissions) { %i[admin_label read_container_image read_metrics_dashboard_annotation] }
|
let(:reporter_permissions) { %i[admin_label read_container_image read_metrics_dashboard_annotation read_prometheus] }
|
||||||
let(:developer_permissions) { %i[admin_milestone create_metrics_dashboard_annotation delete_metrics_dashboard_annotation update_metrics_dashboard_annotation] }
|
let(:developer_permissions) { %i[admin_milestone create_metrics_dashboard_annotation delete_metrics_dashboard_annotation update_metrics_dashboard_annotation] }
|
||||||
let(:maintainer_permissions) do
|
let(:maintainer_permissions) do
|
||||||
%i[
|
%i[
|
||||||
|
|
Loading…
Reference in New Issue