Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
c7b780b56d
commit
2f147005c5
34 changed files with 634 additions and 635 deletions
|
@ -666,12 +666,6 @@ Style/RedundantFreeze:
|
|||
Style/RedundantInterpolation:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 33
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: AllowMultipleReturnValues.
|
||||
Style/RedundantReturn:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 801
|
||||
# Cop supports --auto-correct.
|
||||
Style/RedundantSelf:
|
||||
|
|
|
@ -306,7 +306,7 @@ class ApplicationController < ActionController::Base
|
|||
return if session[:impersonator_id] || !current_user&.allow_password_authentication?
|
||||
|
||||
if current_user&.password_expired?
|
||||
return redirect_to new_profile_password_path
|
||||
redirect_to new_profile_password_path
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -364,7 +364,7 @@ class ApplicationController < ActionController::Base
|
|||
|
||||
def require_email
|
||||
if current_user && current_user.temp_oauth_email? && session[:impersonator_id].nil?
|
||||
return redirect_to profile_path, notice: _('Please complete your profile with email address')
|
||||
redirect_to profile_path, notice: _('Please complete your profile with email address')
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -45,7 +45,6 @@ class ChaosController < ActionController::Base
|
|||
unless Devise.secure_compare(chaos_secret_configured, chaos_secret_request)
|
||||
render plain: "To experience chaos, please set a valid `X-Chaos-Secret` header or `token` param",
|
||||
status: :unauthorized
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -197,13 +197,13 @@ module IssuableActions
|
|||
|
||||
def authorize_destroy_issuable!
|
||||
unless can?(current_user, :"destroy_#{issuable.to_ability_name}", issuable)
|
||||
return access_denied!
|
||||
access_denied!
|
||||
end
|
||||
end
|
||||
|
||||
def authorize_admin_issuable!
|
||||
unless can?(current_user, :"admin_#{resource_name}", parent)
|
||||
return access_denied!
|
||||
access_denied!
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -30,25 +30,25 @@ class Groups::ApplicationController < ApplicationController
|
|||
|
||||
def authorize_admin_group!
|
||||
unless can?(current_user, :admin_group, group)
|
||||
return render_404
|
||||
render_404
|
||||
end
|
||||
end
|
||||
|
||||
def authorize_create_deploy_token!
|
||||
unless can?(current_user, :create_deploy_token, group)
|
||||
return render_404
|
||||
render_404
|
||||
end
|
||||
end
|
||||
|
||||
def authorize_destroy_deploy_token!
|
||||
unless can?(current_user, :destroy_deploy_token, group)
|
||||
return render_404
|
||||
render_404
|
||||
end
|
||||
end
|
||||
|
||||
def authorize_admin_group_member!
|
||||
unless can?(current_user, :admin_group_member, group)
|
||||
return render_403
|
||||
render_403
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -200,7 +200,7 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
|
|||
def fail_login(user)
|
||||
error_message = user.errors.full_messages.to_sentence
|
||||
|
||||
return redirect_to omniauth_error_path(oauth['provider'], error: error_message)
|
||||
redirect_to omniauth_error_path(oauth['provider'], error: error_message)
|
||||
end
|
||||
|
||||
def fail_auth0_login
|
||||
|
|
|
@ -42,7 +42,7 @@ class Projects::ApplicationController < ApplicationController
|
|||
|
||||
def authorize_action!(action)
|
||||
unless can?(current_user, action, project)
|
||||
return access_denied!
|
||||
access_denied!
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -129,7 +129,7 @@ class Projects::BlobController < Projects::ApplicationController
|
|||
end
|
||||
end
|
||||
|
||||
return redirect_to_tree_root_for_missing_path(@project, @ref, @path)
|
||||
redirect_to_tree_root_for_missing_path(@project, @ref, @path)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ class Projects::ReleasesController < Projects::ApplicationController
|
|||
|
||||
def new
|
||||
unless Feature.enabled?(:new_release_page, project)
|
||||
return redirect_to(new_project_tag_path(@project))
|
||||
redirect_to(new_project_tag_path(@project))
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -20,9 +20,9 @@ class Projects::TreeController < Projects::ApplicationController
|
|||
|
||||
if tree.entries.empty?
|
||||
if @repository.blob_at(@commit.id, @path)
|
||||
return redirect_to project_blob_path(@project, File.join(@ref, @path))
|
||||
redirect_to project_blob_path(@project, File.join(@ref, @path))
|
||||
elsif @path.present?
|
||||
return redirect_to_tree_root_for_missing_path(@project, @ref, @path)
|
||||
redirect_to_tree_root_for_missing_path(@project, @ref, @path)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -37,7 +37,7 @@ module Resolvers
|
|||
def jira_projects(name:)
|
||||
args = { query: name }.compact
|
||||
|
||||
return Jira::Requests::Projects::ListService.new(project.jira_service, args).execute
|
||||
Jira::Requests::Projects::ListService.new(project.jira_service, args).execute
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -17,21 +17,21 @@ class AccessTokenValidationService
|
|||
|
||||
def validate(scopes: [])
|
||||
if token.expired?
|
||||
return EXPIRED
|
||||
EXPIRED
|
||||
|
||||
elsif token.revoked?
|
||||
return REVOKED
|
||||
REVOKED
|
||||
|
||||
elsif !self.include_any_scope?(scopes)
|
||||
return INSUFFICIENT_SCOPE
|
||||
INSUFFICIENT_SCOPE
|
||||
|
||||
elsif token.respond_to?(:impersonation) &&
|
||||
token.impersonation &&
|
||||
!Gitlab.config.gitlab.impersonation_enabled
|
||||
return IMPERSONATION_DISABLED
|
||||
IMPERSONATION_DISABLED
|
||||
|
||||
else
|
||||
return VALID
|
||||
VALID
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ module Spam
|
|||
rescue *Gitlab::HTTP::HTTP_ERRORS => e
|
||||
# @TODO: log error via try_post https://gitlab.com/gitlab-org/gitlab/-/issues/219223
|
||||
Gitlab::ErrorTracking.log_exception(e)
|
||||
return
|
||||
nil
|
||||
rescue
|
||||
# @TODO log
|
||||
ALLOW
|
||||
|
|
|
@ -17,7 +17,6 @@ class DeleteMergedBranchesWorker # rubocop:disable Scalability/IdempotentWorker
|
|||
begin
|
||||
::Branches::DeleteMergedService.new(project, user).execute
|
||||
rescue Gitlab::Access::AccessDeniedError
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
128
doc/operations/metrics/dashboards/templating_variables.md
Normal file
128
doc/operations/metrics/dashboards/templating_variables.md
Normal file
|
@ -0,0 +1,128 @@
|
|||
---
|
||||
stage: Monitor
|
||||
group: APM
|
||||
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
|
||||
---
|
||||
|
||||
# Templating variables for metrics dashboards
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214539) in GitLab 13.0.
|
||||
|
||||
Templating variables can be used to make your metrics dashboard more versatile.
|
||||
|
||||
`templating` is a top-level key in the
|
||||
[dashboard YAML](yaml.md#dashboard-top-level-properties).
|
||||
Define your variables in the `variables` key, under `templating`. The value of
|
||||
the `variables` key should be a hash, and each key under `variables`
|
||||
defines a templating variable on the dashboard, and may contain alphanumeric and underscore characters.
|
||||
|
||||
A variable can be used in a Prometheus query in the same dashboard using the syntax
|
||||
described [in Using Variables](variables.md).
|
||||
|
||||
## `text` variable type
|
||||
|
||||
CAUTION: **Warning:**
|
||||
This variable type is an _alpha_ feature, and is subject to change at any time
|
||||
without prior notice!
|
||||
|
||||
For each `text` variable defined in the dashboard YAML, there will be a free text
|
||||
box on the dashboard UI, allowing you to enter a value for each variable.
|
||||
|
||||
The `text` variable type supports a simple and a full syntax.
|
||||
|
||||
### Simple syntax
|
||||
|
||||
This example creates a variable called `variable1`, with a default value
|
||||
of `default value`:
|
||||
|
||||
```yaml
|
||||
templating:
|
||||
variables:
|
||||
variable1: 'default value' # `text` type variable with `default value` as its default.
|
||||
```
|
||||
|
||||
### Full syntax
|
||||
|
||||
This example creates a variable called `variable1`, with a default value of `default`.
|
||||
The label for the text box on the UI will be the value of the `label` key:
|
||||
|
||||
```yaml
|
||||
templating:
|
||||
variables:
|
||||
variable1: # The variable name that can be used in queries.
|
||||
label: 'Variable 1' # (Optional) label that will appear in the UI for this text box.
|
||||
type: text
|
||||
options:
|
||||
default_value: 'default' # (Optional) default value.
|
||||
```
|
||||
|
||||
## `custom` variable type
|
||||
|
||||
CAUTION: **Warning:**
|
||||
This variable type is an _alpha_ feature, and is subject to change at any time
|
||||
without prior notice!
|
||||
|
||||
Each `custom` variable defined in the dashboard YAML creates a dropdown
|
||||
selector on the dashboard UI, allowing you to select a value for each variable.
|
||||
|
||||
The `custom` variable type supports a simple and a full syntax.
|
||||
|
||||
### Simple syntax
|
||||
|
||||
This example creates a variable called `variable1`, with a default value of `value1`.
|
||||
The dashboard UI will display a dropdown with `value1`, `value2` and `value3`
|
||||
as the choices.
|
||||
|
||||
```yaml
|
||||
templating:
|
||||
variables:
|
||||
variable1: ['value1', 'value2', 'value3']
|
||||
```
|
||||
|
||||
### Full syntax
|
||||
|
||||
This example creates a variable called `variable1`, with a default value of `value_option_2`.
|
||||
The label for the text box on the UI will be the value of the `label` key.
|
||||
The dashboard UI will display a dropdown with `Option 1` and `Option 2`
|
||||
as the choices.
|
||||
|
||||
If you select `Option 1` from the dropdown, the variable will be replaced with `value option 1`.
|
||||
Similarly, if you select `Option 2`, the variable will be replaced with `value_option_2`:
|
||||
|
||||
```yaml
|
||||
templating:
|
||||
variables:
|
||||
variable1: # The variable name that can be used in queries.
|
||||
label: 'Variable 1' # (Optional) label that will appear in the UI for this dropdown.
|
||||
type: custom
|
||||
options:
|
||||
values:
|
||||
- value: 'value option 1' # The value that will replace the variable in queries.
|
||||
text: 'Option 1' # (Optional) Text that will appear in the UI dropdown.
|
||||
- value: 'value_option_2'
|
||||
text: 'Option 2'
|
||||
default: true # (Optional) This option should be the default value of this variable.
|
||||
```
|
||||
|
||||
## `metric_label_values` variable type
|
||||
|
||||
CAUTION: **Warning:**
|
||||
This variable type is an _alpha_ feature, and is subject to change at any time
|
||||
without prior notice!
|
||||
|
||||
### Full syntax
|
||||
|
||||
This example creates a variable called `variable2`. The values of the dropdown will
|
||||
be all the different values of the `backend` label in the Prometheus series described by
|
||||
`up{env="production"}`.
|
||||
|
||||
```yaml
|
||||
templating:
|
||||
variables:
|
||||
variable2: # The variable name that can be interpolated in queries.
|
||||
label: 'Variable 2' # (Optional) label that will appear in the UI for this dropdown.
|
||||
type: metric_label_values
|
||||
options:
|
||||
series_selector: 'up{env="production"}'
|
||||
label: 'backend'
|
||||
```
|
59
doc/operations/metrics/dashboards/variables.md
Normal file
59
doc/operations/metrics/dashboards/variables.md
Normal file
|
@ -0,0 +1,59 @@
|
|||
---
|
||||
stage: Monitor
|
||||
group: APM
|
||||
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
|
||||
---
|
||||
|
||||
# Using Variables
|
||||
|
||||
## Query Variables
|
||||
|
||||
Variables can be specified using double curly braces, such as `"{{ci_environment_slug}}"` ([added](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20793) in GitLab 12.7).
|
||||
|
||||
Support for the `"%{ci_environment_slug}"` format was
|
||||
[removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/31581) in GitLab 13.0.
|
||||
Queries that continue to use the old format will show no data.
|
||||
|
||||
## Predefined variables
|
||||
|
||||
GitLab supports a limited set of [CI variables](../../../ci/variables/README.md) in the Prometheus query. This is particularly useful for identifying a specific environment, for example with `ci_environment_slug`. The supported variables are:
|
||||
|
||||
- `ci_environment_slug`
|
||||
- `kube_namespace`
|
||||
- `ci_project_name`
|
||||
- `ci_project_namespace`
|
||||
- `ci_project_path`
|
||||
- `ci_environment_name`
|
||||
- `__range`
|
||||
|
||||
NOTE: **Note:**
|
||||
Variables for Prometheus queries must be lowercase.
|
||||
|
||||
### __range
|
||||
|
||||
The `__range` variable is useful in Prometheus
|
||||
[range vector selectors](https://prometheus.io/docs/prometheus/latest/querying/basics/#range-vector-selectors).
|
||||
Its value is the total number of seconds in the dashboard's time range.
|
||||
For example, if the dashboard time range is set to 8 hours, the value of
|
||||
`__range` is `28800s`.
|
||||
|
||||
## User-defined variables
|
||||
|
||||
[Variables can be defined](../../../operations/metrics/dashboards/yaml.md#templating-templating-properties) in a custom dashboard YAML file.
|
||||
|
||||
## Query Variables from URL
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214500) in GitLab 13.0.
|
||||
|
||||
GitLab supports setting custom variables through URL parameters. Surround the variable
|
||||
name with double curly braces (`{{example}}`) to interpolate the variable in a query:
|
||||
|
||||
```plaintext
|
||||
avg(sum(container_memory_usage_bytes{container_name!="{{pod}}"}) by (job)) without (job) /1024/1024/1024'
|
||||
```
|
||||
|
||||
The URL for this query would be:
|
||||
|
||||
```plaintext
|
||||
http://gitlab.com/<user>/<project>/-/environments/<environment_id>/metrics?dashboard=.gitlab%2Fdashboards%2Fcustom.yml&pod=POD
|
||||
```
|
|
@ -29,7 +29,7 @@ The following tables outline the details of expected properties.
|
|||
| -------- | ---- | -------- | ----------- |
|
||||
| `variables` | hash | yes | Variables can be defined here. |
|
||||
|
||||
Read the documentation on [templating](../../../user/project/integrations/prometheus.md#templating-variables-for-metrics-dashboards).
|
||||
Read the documentation on [templating](templating_variables.md).
|
||||
|
||||
## **Links (`links`) properties**
|
||||
|
||||
|
|
|
@ -58,13 +58,13 @@ Maintainer role and above can modify these.
|
|||
|
||||
This feature comes with two feature flags which are disabled by default.
|
||||
|
||||
- The configuration in Admin area is controlled via `admin_merge_request_approval_settings`
|
||||
- The application of these rules is controlled via `project_merge_request_approval_settings`
|
||||
- The configuration in Admin area is controlled via `admin_compliance_merge_request_approval_settings`.
|
||||
- The application of these rules is controlled via `project_compliance_merge_request_approval_settings`.
|
||||
|
||||
These feature flags can be managed by feature flag [API endpoint](../../api/features.md#set-or-create-a-feature) or
|
||||
by [GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md) with the following commands:
|
||||
|
||||
```ruby
|
||||
Feature.enable(:admin_merge_request_approval_settings)
|
||||
Feature.enable(:project_merge_request_approval_settings)
|
||||
Feature.enable(:admin_compliance_merge_request_approval_settings)
|
||||
Feature.enable(:project_compliance_merge_request_approval_settings)
|
||||
```
|
||||
|
|
|
@ -153,11 +153,6 @@ Amazon Elastic Kubernetes Service (EKS) at the project, group, or instance level
|
|||
|
||||
If you have an existing Kubernetes cluster, you can add it to a project, group, or instance.
|
||||
|
||||
For more information, see information for adding an:
|
||||
|
||||
- [Existing Kubernetes cluster](#existing-kubernetes-cluster), including GKE clusters.
|
||||
- [Existing EKS cluster](add_eks_clusters.md#existing-eks-cluster).
|
||||
|
||||
NOTE: **Note:**
|
||||
Kubernetes integration is not supported for arm64 clusters. See the issue
|
||||
[Helm Tiller fails to install on arm64 cluster](https://gitlab.com/gitlab-org/gitlab/-/issues/29838) for details.
|
||||
|
|
|
@ -168,60 +168,6 @@ A few fields are required:
|
|||
|
||||
Multiple metrics can be displayed on the same chart if the fields **Name**, **Type**, and **Y-axis label** match between metrics. For example, a metric with **Name** `Requests Rate`, **Type** `Business`, and **Y-axis label** `rec / sec` would display on the same chart as a second metric with the same values. A **Legend label** is suggested if this feature is used.
|
||||
|
||||
#### Query Variables
|
||||
|
||||
##### Predefined variables
|
||||
|
||||
GitLab supports a limited set of [CI variables](../../../ci/variables/README.md) in the Prometheus query. This is particularly useful for identifying a specific environment, for example with `ci_environment_slug`. The supported variables are:
|
||||
|
||||
- `ci_environment_slug`
|
||||
- `kube_namespace`
|
||||
- `ci_project_name`
|
||||
- `ci_project_namespace`
|
||||
- `ci_project_path`
|
||||
- `ci_environment_name`
|
||||
- `__range`
|
||||
|
||||
NOTE: **Note:**
|
||||
Variables for Prometheus queries must be lowercase.
|
||||
|
||||
###### __range
|
||||
|
||||
The `__range` variable is useful in Prometheus
|
||||
[range vector selectors](https://prometheus.io/docs/prometheus/latest/querying/basics/#range-vector-selectors).
|
||||
Its value is the total number of seconds in the dashboard's time range.
|
||||
For example, if the dashboard time range is set to 8 hours, the value of
|
||||
`__range` is `28800s`.
|
||||
|
||||
##### User-defined variables
|
||||
|
||||
[Variables can be defined](../../../operations/metrics/dashboards/yaml.md#templating-templating-properties) in a custom dashboard YAML file.
|
||||
|
||||
##### Using variables
|
||||
|
||||
Variables can be specified using double curly braces, such as `"{{ci_environment_slug}}"` ([added](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20793) in GitLab 12.7).
|
||||
|
||||
Support for the `"%{ci_environment_slug}"` format was
|
||||
[removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/31581) in GitLab 13.0.
|
||||
Queries that continue to use the old format will show no data.
|
||||
|
||||
#### Query Variables from URL
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214500) in GitLab 13.0.
|
||||
|
||||
GitLab supports setting custom variables through URL parameters. Surround the variable
|
||||
name with double curly braces (`{{example}}`) to interpolate the variable in a query:
|
||||
|
||||
```plaintext
|
||||
avg(sum(container_memory_usage_bytes{container_name!="{{pod}}"}) by (job)) without (job) /1024/1024/1024'
|
||||
```
|
||||
|
||||
The URL for this query would be:
|
||||
|
||||
```plaintext
|
||||
http://gitlab.com/<user>/<project>/-/environments/<environment_id>/metrics?dashboard=.gitlab%2Fdashboards%2Fcustom.yml&pod=POD
|
||||
```
|
||||
|
||||
#### Editing additional metrics from the dashboard
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/208976) in GitLab 12.9.
|
||||
|
@ -353,131 +299,6 @@ When **Metrics Dashboard YAML definition is invalid** at least one of the follow
|
|||
|
||||
Metrics Dashboard YAML definition validation information is also available as a [GraphQL API field](../../../api/graphql/reference/index.md#metricsdashboard)
|
||||
|
||||
### Templating variables for metrics dashboards
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214539) in GitLab 13.0.
|
||||
|
||||
Templating variables can be used to make your metrics dashboard more versatile.
|
||||
|
||||
#### Templating variable types
|
||||
|
||||
`templating` is a top-level key in the
|
||||
[dashboard YAML](../../../operations/metrics/dashboards/yaml.md#dashboard-top-level-properties).
|
||||
Define your variables in the `variables` key, under `templating`. The value of
|
||||
the `variables` key should be a hash, and each key under `variables`
|
||||
defines a templating variable on the dashboard, and may contain alphanumeric and underscore characters.
|
||||
|
||||
A variable can be used in a Prometheus query in the same dashboard using the syntax
|
||||
described [here](#using-variables).
|
||||
|
||||
##### `text` variable type
|
||||
|
||||
CAUTION: **Warning:**
|
||||
This variable type is an _alpha_ feature, and is subject to change at any time
|
||||
without prior notice!
|
||||
|
||||
For each `text` variable defined in the dashboard YAML, there will be a free text
|
||||
box on the dashboard UI, allowing you to enter a value for each variable.
|
||||
|
||||
The `text` variable type supports a simple and a full syntax.
|
||||
|
||||
###### Simple syntax
|
||||
|
||||
This example creates a variable called `variable1`, with a default value
|
||||
of `default value`:
|
||||
|
||||
```yaml
|
||||
templating:
|
||||
variables:
|
||||
variable1: 'default value' # `text` type variable with `default value` as its default.
|
||||
```
|
||||
|
||||
###### Full syntax
|
||||
|
||||
This example creates a variable called `variable1`, with a default value of `default`.
|
||||
The label for the text box on the UI will be the value of the `label` key:
|
||||
|
||||
```yaml
|
||||
templating:
|
||||
variables:
|
||||
variable1: # The variable name that can be used in queries.
|
||||
label: 'Variable 1' # (Optional) label that will appear in the UI for this text box.
|
||||
type: text
|
||||
options:
|
||||
default_value: 'default' # (Optional) default value.
|
||||
```
|
||||
|
||||
##### `custom` variable type
|
||||
|
||||
CAUTION: **Warning:**
|
||||
This variable type is an _alpha_ feature, and is subject to change at any time
|
||||
without prior notice!
|
||||
|
||||
Each `custom` variable defined in the dashboard YAML creates a dropdown
|
||||
selector on the dashboard UI, allowing you to select a value for each variable.
|
||||
|
||||
The `custom` variable type supports a simple and a full syntax.
|
||||
|
||||
###### Simple syntax
|
||||
|
||||
This example creates a variable called `variable1`, with a default value of `value1`.
|
||||
The dashboard UI will display a dropdown with `value1`, `value2` and `value3`
|
||||
as the choices.
|
||||
|
||||
```yaml
|
||||
templating:
|
||||
variables:
|
||||
variable1: ['value1', 'value2', 'value3']
|
||||
```
|
||||
|
||||
###### Full syntax
|
||||
|
||||
This example creates a variable called `variable1`, with a default value of `value_option_2`.
|
||||
The label for the text box on the UI will be the value of the `label` key.
|
||||
The dashboard UI will display a dropdown with `Option 1` and `Option 2`
|
||||
as the choices.
|
||||
|
||||
If you select `Option 1` from the dropdown, the variable will be replaced with `value option 1`.
|
||||
Similarly, if you select `Option 2`, the variable will be replaced with `value_option_2`:
|
||||
|
||||
```yaml
|
||||
templating:
|
||||
variables:
|
||||
variable1: # The variable name that can be used in queries.
|
||||
label: 'Variable 1' # (Optional) label that will appear in the UI for this dropdown.
|
||||
type: custom
|
||||
options:
|
||||
values:
|
||||
- value: 'value option 1' # The value that will replace the variable in queries.
|
||||
text: 'Option 1' # (Optional) Text that will appear in the UI dropdown.
|
||||
- value: 'value_option_2'
|
||||
text: 'Option 2'
|
||||
default: true # (Optional) This option should be the default value of this variable.
|
||||
```
|
||||
|
||||
##### `metric_label_values` variable type
|
||||
|
||||
CAUTION: **Warning:**
|
||||
This variable type is an _alpha_ feature, and is subject to change at any time
|
||||
without prior notice!
|
||||
|
||||
###### Full syntax
|
||||
|
||||
This example creates a variable called `variable2`. The values of the dropdown will
|
||||
be all the different values of the `backend` label in the Prometheus series described by
|
||||
`up{env="production"}`.
|
||||
|
||||
```yaml
|
||||
templating:
|
||||
variables:
|
||||
variable2: # The variable name that can be interpolated in queries.
|
||||
label: 'Variable 2' # (Optional) label that will appear in the UI for this dropdown.
|
||||
type: metric_label_values
|
||||
options:
|
||||
series_selector: 'up{env="production"}'
|
||||
label: 'backend'
|
||||
```
|
||||
|
||||
### Add related links to custom dashboards
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216385) in GitLab 13.1.
|
||||
|
|
|
@ -133,6 +133,8 @@ module API
|
|||
mount ::API::Boards
|
||||
mount ::API::Branches
|
||||
mount ::API::BroadcastMessages
|
||||
mount ::API::Ci::Pipelines
|
||||
mount ::API::Ci::PipelineSchedules
|
||||
mount ::API::Ci::Runner
|
||||
mount ::API::Ci::Runners
|
||||
mount ::API::Commits
|
||||
|
@ -179,8 +181,6 @@ module API
|
|||
mount ::API::NotificationSettings
|
||||
mount ::API::Pages
|
||||
mount ::API::PagesDomains
|
||||
mount ::API::Pipelines
|
||||
mount ::API::PipelineSchedules
|
||||
mount ::API::ProjectClusters
|
||||
mount ::API::ProjectContainerRepositories
|
||||
mount ::API::ProjectEvents
|
||||
|
|
217
lib/api/ci/pipeline_schedules.rb
Normal file
217
lib/api/ci/pipeline_schedules.rb
Normal file
|
@ -0,0 +1,217 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module API
|
||||
module Ci
|
||||
class PipelineSchedules < Grape::API::Instance
|
||||
include PaginationParams
|
||||
|
||||
before { authenticate! }
|
||||
|
||||
params do
|
||||
requires :id, type: String, desc: 'The ID of a project'
|
||||
end
|
||||
resource :projects, requirements: ::API::API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
|
||||
desc 'Get all pipeline schedules' do
|
||||
success Entities::PipelineSchedule
|
||||
end
|
||||
params do
|
||||
use :pagination
|
||||
optional :scope, type: String, values: %w[active inactive],
|
||||
desc: 'The scope of pipeline schedules'
|
||||
end
|
||||
# rubocop: disable CodeReuse/ActiveRecord
|
||||
get ':id/pipeline_schedules' do
|
||||
authorize! :read_pipeline_schedule, user_project
|
||||
|
||||
schedules = ::Ci::PipelineSchedulesFinder.new(user_project).execute(scope: params[:scope])
|
||||
.preload([:owner, :last_pipeline])
|
||||
present paginate(schedules), with: Entities::PipelineSchedule
|
||||
end
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
|
||||
desc 'Get a single pipeline schedule' do
|
||||
success Entities::PipelineScheduleDetails
|
||||
end
|
||||
params do
|
||||
requires :pipeline_schedule_id, type: Integer, desc: 'The pipeline schedule id'
|
||||
end
|
||||
get ':id/pipeline_schedules/:pipeline_schedule_id' do
|
||||
present pipeline_schedule, with: Entities::PipelineScheduleDetails
|
||||
end
|
||||
|
||||
desc 'Create a new pipeline schedule' do
|
||||
success Entities::PipelineScheduleDetails
|
||||
end
|
||||
params do
|
||||
requires :description, type: String, desc: 'The description of pipeline schedule'
|
||||
requires :ref, type: String, desc: 'The branch/tag name will be triggered', allow_blank: false
|
||||
requires :cron, type: String, desc: 'The cron'
|
||||
optional :cron_timezone, type: String, default: 'UTC', desc: 'The timezone'
|
||||
optional :active, type: Boolean, default: true, desc: 'The activation of pipeline schedule'
|
||||
end
|
||||
post ':id/pipeline_schedules' do
|
||||
authorize! :create_pipeline_schedule, user_project
|
||||
|
||||
pipeline_schedule = ::Ci::CreatePipelineScheduleService
|
||||
.new(user_project, current_user, declared_params(include_missing: false))
|
||||
.execute
|
||||
|
||||
if pipeline_schedule.persisted?
|
||||
present pipeline_schedule, with: Entities::PipelineScheduleDetails
|
||||
else
|
||||
render_validation_error!(pipeline_schedule)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Edit a pipeline schedule' do
|
||||
success Entities::PipelineScheduleDetails
|
||||
end
|
||||
params do
|
||||
requires :pipeline_schedule_id, type: Integer, desc: 'The pipeline schedule id'
|
||||
optional :description, type: String, desc: 'The description of pipeline schedule'
|
||||
optional :ref, type: String, desc: 'The branch/tag name will be triggered'
|
||||
optional :cron, type: String, desc: 'The cron'
|
||||
optional :cron_timezone, type: String, desc: 'The timezone'
|
||||
optional :active, type: Boolean, desc: 'The activation of pipeline schedule'
|
||||
end
|
||||
put ':id/pipeline_schedules/:pipeline_schedule_id' do
|
||||
authorize! :update_pipeline_schedule, pipeline_schedule
|
||||
|
||||
if pipeline_schedule.update(declared_params(include_missing: false))
|
||||
present pipeline_schedule, with: Entities::PipelineScheduleDetails
|
||||
else
|
||||
render_validation_error!(pipeline_schedule)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Take ownership of a pipeline schedule' do
|
||||
success Entities::PipelineScheduleDetails
|
||||
end
|
||||
params do
|
||||
requires :pipeline_schedule_id, type: Integer, desc: 'The pipeline schedule id'
|
||||
end
|
||||
post ':id/pipeline_schedules/:pipeline_schedule_id/take_ownership' do
|
||||
authorize! :update_pipeline_schedule, pipeline_schedule
|
||||
|
||||
if pipeline_schedule.own!(current_user)
|
||||
present pipeline_schedule, with: Entities::PipelineScheduleDetails
|
||||
else
|
||||
render_validation_error!(pipeline_schedule)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Delete a pipeline schedule' do
|
||||
success Entities::PipelineScheduleDetails
|
||||
end
|
||||
params do
|
||||
requires :pipeline_schedule_id, type: Integer, desc: 'The pipeline schedule id'
|
||||
end
|
||||
delete ':id/pipeline_schedules/:pipeline_schedule_id' do
|
||||
authorize! :admin_pipeline_schedule, pipeline_schedule
|
||||
|
||||
destroy_conditionally!(pipeline_schedule)
|
||||
end
|
||||
|
||||
desc 'Play a scheduled pipeline immediately' do
|
||||
detail 'This feature was added in GitLab 12.8'
|
||||
end
|
||||
params do
|
||||
requires :pipeline_schedule_id, type: Integer, desc: 'The pipeline schedule id'
|
||||
end
|
||||
post ':id/pipeline_schedules/:pipeline_schedule_id/play' do
|
||||
authorize! :play_pipeline_schedule, pipeline_schedule
|
||||
|
||||
job_id = RunPipelineScheduleWorker # rubocop:disable CodeReuse/Worker
|
||||
.perform_async(pipeline_schedule.id, current_user.id)
|
||||
|
||||
if job_id
|
||||
created!
|
||||
else
|
||||
render_api_error!('Unable to schedule pipeline run immediately', 500)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Create a new pipeline schedule variable' do
|
||||
success Entities::Variable
|
||||
end
|
||||
params do
|
||||
requires :pipeline_schedule_id, type: Integer, desc: 'The pipeline schedule id'
|
||||
requires :key, type: String, desc: 'The key of the variable'
|
||||
requires :value, type: String, desc: 'The value of the variable'
|
||||
optional :variable_type, type: String, values: ::Ci::PipelineScheduleVariable.variable_types.keys, desc: 'The type of variable, must be one of env_var or file. Defaults to env_var'
|
||||
end
|
||||
post ':id/pipeline_schedules/:pipeline_schedule_id/variables' do
|
||||
authorize! :update_pipeline_schedule, pipeline_schedule
|
||||
|
||||
variable_params = declared_params(include_missing: false)
|
||||
variable = pipeline_schedule.variables.create(variable_params)
|
||||
if variable.persisted?
|
||||
present variable, with: Entities::Variable
|
||||
else
|
||||
render_validation_error!(variable)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Edit a pipeline schedule variable' do
|
||||
success Entities::Variable
|
||||
end
|
||||
params do
|
||||
requires :pipeline_schedule_id, type: Integer, desc: 'The pipeline schedule id'
|
||||
requires :key, type: String, desc: 'The key of the variable'
|
||||
optional :value, type: String, desc: 'The value of the variable'
|
||||
optional :variable_type, type: String, values: ::Ci::PipelineScheduleVariable.variable_types.keys, desc: 'The type of variable, must be one of env_var or file'
|
||||
end
|
||||
put ':id/pipeline_schedules/:pipeline_schedule_id/variables/:key' do
|
||||
authorize! :update_pipeline_schedule, pipeline_schedule
|
||||
|
||||
if pipeline_schedule_variable.update(declared_params(include_missing: false))
|
||||
present pipeline_schedule_variable, with: Entities::Variable
|
||||
else
|
||||
render_validation_error!(pipeline_schedule_variable)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Delete a pipeline schedule variable' do
|
||||
success Entities::Variable
|
||||
end
|
||||
params do
|
||||
requires :pipeline_schedule_id, type: Integer, desc: 'The pipeline schedule id'
|
||||
requires :key, type: String, desc: 'The key of the variable'
|
||||
end
|
||||
delete ':id/pipeline_schedules/:pipeline_schedule_id/variables/:key' do
|
||||
authorize! :admin_pipeline_schedule, pipeline_schedule
|
||||
|
||||
status :accepted
|
||||
present pipeline_schedule_variable.destroy, with: Entities::Variable
|
||||
end
|
||||
end
|
||||
|
||||
helpers do
|
||||
# rubocop: disable CodeReuse/ActiveRecord
|
||||
def pipeline_schedule
|
||||
@pipeline_schedule ||=
|
||||
user_project
|
||||
.pipeline_schedules
|
||||
.preload(:owner, :last_pipeline)
|
||||
.find_by(id: params.delete(:pipeline_schedule_id)).tap do |pipeline_schedule|
|
||||
unless can?(current_user, :read_pipeline_schedule, pipeline_schedule)
|
||||
not_found!('Pipeline Schedule')
|
||||
end
|
||||
end
|
||||
end
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
|
||||
# rubocop: disable CodeReuse/ActiveRecord
|
||||
def pipeline_schedule_variable
|
||||
@pipeline_schedule_variable ||=
|
||||
pipeline_schedule.variables.find_by(key: params[:key]).tap do |pipeline_schedule_variable|
|
||||
unless pipeline_schedule_variable
|
||||
not_found!('Pipeline Schedule Variable')
|
||||
end
|
||||
end
|
||||
end
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
189
lib/api/ci/pipelines.rb
Normal file
189
lib/api/ci/pipelines.rb
Normal file
|
@ -0,0 +1,189 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module API
|
||||
module Ci
|
||||
class Pipelines < Grape::API::Instance
|
||||
include PaginationParams
|
||||
|
||||
before { authenticate_non_get! }
|
||||
|
||||
params do
|
||||
requires :id, type: String, desc: 'The project ID'
|
||||
end
|
||||
resource :projects, requirements: ::API::API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
|
||||
desc 'Get all Pipelines of the project' do
|
||||
detail 'This feature was introduced in GitLab 8.11.'
|
||||
success Entities::PipelineBasic
|
||||
end
|
||||
params do
|
||||
use :pagination
|
||||
optional :scope, type: String, values: %w[running pending finished branches tags],
|
||||
desc: 'The scope of pipelines'
|
||||
optional :status, type: String, values: ::Ci::HasStatus::AVAILABLE_STATUSES,
|
||||
desc: 'The status of pipelines'
|
||||
optional :ref, type: String, desc: 'The ref of pipelines'
|
||||
optional :sha, type: String, desc: 'The sha of pipelines'
|
||||
optional :yaml_errors, type: Boolean, desc: 'Returns pipelines with invalid configurations'
|
||||
optional :name, type: String, desc: 'The name of the user who triggered pipelines'
|
||||
optional :username, type: String, desc: 'The username of the user who triggered pipelines'
|
||||
optional :updated_before, type: DateTime, desc: 'Return pipelines updated before the specified datetime. Format: ISO 8601 YYYY-MM-DDTHH:MM:SSZ'
|
||||
optional :updated_after, type: DateTime, desc: 'Return pipelines updated after the specified datetime. Format: ISO 8601 YYYY-MM-DDTHH:MM:SSZ'
|
||||
optional :order_by, type: String, values: ::Ci::PipelinesFinder::ALLOWED_INDEXED_COLUMNS, default: 'id',
|
||||
desc: 'Order pipelines'
|
||||
optional :sort, type: String, values: %w[asc desc], default: 'desc',
|
||||
desc: 'Sort pipelines'
|
||||
end
|
||||
get ':id/pipelines' do
|
||||
authorize! :read_pipeline, user_project
|
||||
authorize! :read_build, user_project
|
||||
|
||||
pipelines = ::Ci::PipelinesFinder.new(user_project, current_user, params).execute
|
||||
present paginate(pipelines), with: Entities::PipelineBasic
|
||||
end
|
||||
|
||||
desc 'Create a new pipeline' do
|
||||
detail 'This feature was introduced in GitLab 8.14'
|
||||
success Entities::Pipeline
|
||||
end
|
||||
params do
|
||||
requires :ref, type: String, desc: 'Reference'
|
||||
optional :variables, Array, desc: 'Array of variables available in the pipeline'
|
||||
end
|
||||
post ':id/pipeline' do
|
||||
Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-foss/issues/42124')
|
||||
|
||||
authorize! :create_pipeline, user_project
|
||||
|
||||
pipeline_params = declared_params(include_missing: false)
|
||||
.merge(variables_attributes: params[:variables])
|
||||
.except(:variables)
|
||||
|
||||
new_pipeline = ::Ci::CreatePipelineService.new(user_project,
|
||||
current_user,
|
||||
pipeline_params)
|
||||
.execute(:api, ignore_skip_ci: true, save_on_errors: false)
|
||||
|
||||
if new_pipeline.persisted?
|
||||
present new_pipeline, with: Entities::Pipeline
|
||||
else
|
||||
render_validation_error!(new_pipeline)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Gets a the latest pipeline for the project branch' do
|
||||
detail 'This feature was introduced in GitLab 12.3'
|
||||
success Entities::Pipeline
|
||||
end
|
||||
params do
|
||||
optional :ref, type: String, desc: 'branch ref of pipeline'
|
||||
end
|
||||
get ':id/pipelines/latest' do
|
||||
authorize! :read_pipeline, latest_pipeline
|
||||
|
||||
present latest_pipeline, with: Entities::Pipeline
|
||||
end
|
||||
|
||||
desc 'Gets a specific pipeline for the project' do
|
||||
detail 'This feature was introduced in GitLab 8.11'
|
||||
success Entities::Pipeline
|
||||
end
|
||||
params do
|
||||
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
||||
end
|
||||
get ':id/pipelines/:pipeline_id' do
|
||||
authorize! :read_pipeline, pipeline
|
||||
|
||||
present pipeline, with: Entities::Pipeline
|
||||
end
|
||||
|
||||
desc 'Gets the variables for a given pipeline' do
|
||||
detail 'This feature was introduced in GitLab 11.11'
|
||||
success Entities::Variable
|
||||
end
|
||||
params do
|
||||
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
||||
end
|
||||
get ':id/pipelines/:pipeline_id/variables' do
|
||||
authorize! :read_pipeline_variable, pipeline
|
||||
|
||||
present pipeline.variables, with: Entities::Variable
|
||||
end
|
||||
|
||||
desc 'Gets the test report for a given pipeline' do
|
||||
detail 'This feature was introduced in GitLab 13.0. Disabled by default behind feature flag `junit_pipeline_view`'
|
||||
success TestReportEntity
|
||||
end
|
||||
params do
|
||||
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
||||
end
|
||||
get ':id/pipelines/:pipeline_id/test_report' do
|
||||
not_found! unless Feature.enabled?(:junit_pipeline_view, user_project)
|
||||
|
||||
authorize! :read_build, pipeline
|
||||
|
||||
present pipeline.test_reports, with: TestReportEntity, details: true
|
||||
end
|
||||
|
||||
desc 'Deletes a pipeline' do
|
||||
detail 'This feature was introduced in GitLab 11.6'
|
||||
http_codes [[204, 'Pipeline was deleted'], [403, 'Forbidden']]
|
||||
end
|
||||
params do
|
||||
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
||||
end
|
||||
delete ':id/pipelines/:pipeline_id' do
|
||||
authorize! :destroy_pipeline, pipeline
|
||||
|
||||
destroy_conditionally!(pipeline) do
|
||||
::Ci::DestroyPipelineService.new(user_project, current_user).execute(pipeline)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Retry builds in the pipeline' do
|
||||
detail 'This feature was introduced in GitLab 8.11.'
|
||||
success Entities::Pipeline
|
||||
end
|
||||
params do
|
||||
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
||||
end
|
||||
post ':id/pipelines/:pipeline_id/retry' do
|
||||
authorize! :update_pipeline, pipeline
|
||||
|
||||
pipeline.retry_failed(current_user)
|
||||
|
||||
present pipeline, with: Entities::Pipeline
|
||||
end
|
||||
|
||||
desc 'Cancel all builds in the pipeline' do
|
||||
detail 'This feature was introduced in GitLab 8.11.'
|
||||
success Entities::Pipeline
|
||||
end
|
||||
params do
|
||||
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
||||
end
|
||||
post ':id/pipelines/:pipeline_id/cancel' do
|
||||
authorize! :update_pipeline, pipeline
|
||||
|
||||
pipeline.cancel_running
|
||||
|
||||
status 200
|
||||
present pipeline.reset, with: Entities::Pipeline
|
||||
end
|
||||
end
|
||||
|
||||
helpers do
|
||||
def pipeline
|
||||
strong_memoize(:pipeline) do
|
||||
user_project.ci_pipelines.find(params[:pipeline_id])
|
||||
end
|
||||
end
|
||||
|
||||
def latest_pipeline
|
||||
strong_memoize(:latest_pipeline) do
|
||||
user_project.latest_pipeline_for_ref(params[:ref])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,215 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module API
|
||||
class PipelineSchedules < Grape::API::Instance
|
||||
include PaginationParams
|
||||
|
||||
before { authenticate! }
|
||||
|
||||
params do
|
||||
requires :id, type: String, desc: 'The ID of a project'
|
||||
end
|
||||
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
|
||||
desc 'Get all pipeline schedules' do
|
||||
success Entities::PipelineSchedule
|
||||
end
|
||||
params do
|
||||
use :pagination
|
||||
optional :scope, type: String, values: %w[active inactive],
|
||||
desc: 'The scope of pipeline schedules'
|
||||
end
|
||||
# rubocop: disable CodeReuse/ActiveRecord
|
||||
get ':id/pipeline_schedules' do
|
||||
authorize! :read_pipeline_schedule, user_project
|
||||
|
||||
schedules = ::Ci::PipelineSchedulesFinder.new(user_project).execute(scope: params[:scope])
|
||||
.preload([:owner, :last_pipeline])
|
||||
present paginate(schedules), with: Entities::PipelineSchedule
|
||||
end
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
|
||||
desc 'Get a single pipeline schedule' do
|
||||
success Entities::PipelineScheduleDetails
|
||||
end
|
||||
params do
|
||||
requires :pipeline_schedule_id, type: Integer, desc: 'The pipeline schedule id'
|
||||
end
|
||||
get ':id/pipeline_schedules/:pipeline_schedule_id' do
|
||||
present pipeline_schedule, with: Entities::PipelineScheduleDetails
|
||||
end
|
||||
|
||||
desc 'Create a new pipeline schedule' do
|
||||
success Entities::PipelineScheduleDetails
|
||||
end
|
||||
params do
|
||||
requires :description, type: String, desc: 'The description of pipeline schedule'
|
||||
requires :ref, type: String, desc: 'The branch/tag name will be triggered', allow_blank: false
|
||||
requires :cron, type: String, desc: 'The cron'
|
||||
optional :cron_timezone, type: String, default: 'UTC', desc: 'The timezone'
|
||||
optional :active, type: Boolean, default: true, desc: 'The activation of pipeline schedule'
|
||||
end
|
||||
post ':id/pipeline_schedules' do
|
||||
authorize! :create_pipeline_schedule, user_project
|
||||
|
||||
pipeline_schedule = ::Ci::CreatePipelineScheduleService
|
||||
.new(user_project, current_user, declared_params(include_missing: false))
|
||||
.execute
|
||||
|
||||
if pipeline_schedule.persisted?
|
||||
present pipeline_schedule, with: Entities::PipelineScheduleDetails
|
||||
else
|
||||
render_validation_error!(pipeline_schedule)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Edit a pipeline schedule' do
|
||||
success Entities::PipelineScheduleDetails
|
||||
end
|
||||
params do
|
||||
requires :pipeline_schedule_id, type: Integer, desc: 'The pipeline schedule id'
|
||||
optional :description, type: String, desc: 'The description of pipeline schedule'
|
||||
optional :ref, type: String, desc: 'The branch/tag name will be triggered'
|
||||
optional :cron, type: String, desc: 'The cron'
|
||||
optional :cron_timezone, type: String, desc: 'The timezone'
|
||||
optional :active, type: Boolean, desc: 'The activation of pipeline schedule'
|
||||
end
|
||||
put ':id/pipeline_schedules/:pipeline_schedule_id' do
|
||||
authorize! :update_pipeline_schedule, pipeline_schedule
|
||||
|
||||
if pipeline_schedule.update(declared_params(include_missing: false))
|
||||
present pipeline_schedule, with: Entities::PipelineScheduleDetails
|
||||
else
|
||||
render_validation_error!(pipeline_schedule)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Take ownership of a pipeline schedule' do
|
||||
success Entities::PipelineScheduleDetails
|
||||
end
|
||||
params do
|
||||
requires :pipeline_schedule_id, type: Integer, desc: 'The pipeline schedule id'
|
||||
end
|
||||
post ':id/pipeline_schedules/:pipeline_schedule_id/take_ownership' do
|
||||
authorize! :update_pipeline_schedule, pipeline_schedule
|
||||
|
||||
if pipeline_schedule.own!(current_user)
|
||||
present pipeline_schedule, with: Entities::PipelineScheduleDetails
|
||||
else
|
||||
render_validation_error!(pipeline_schedule)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Delete a pipeline schedule' do
|
||||
success Entities::PipelineScheduleDetails
|
||||
end
|
||||
params do
|
||||
requires :pipeline_schedule_id, type: Integer, desc: 'The pipeline schedule id'
|
||||
end
|
||||
delete ':id/pipeline_schedules/:pipeline_schedule_id' do
|
||||
authorize! :admin_pipeline_schedule, pipeline_schedule
|
||||
|
||||
destroy_conditionally!(pipeline_schedule)
|
||||
end
|
||||
|
||||
desc 'Play a scheduled pipeline immediately' do
|
||||
detail 'This feature was added in GitLab 12.8'
|
||||
end
|
||||
params do
|
||||
requires :pipeline_schedule_id, type: Integer, desc: 'The pipeline schedule id'
|
||||
end
|
||||
post ':id/pipeline_schedules/:pipeline_schedule_id/play' do
|
||||
authorize! :play_pipeline_schedule, pipeline_schedule
|
||||
|
||||
job_id = RunPipelineScheduleWorker # rubocop:disable CodeReuse/Worker
|
||||
.perform_async(pipeline_schedule.id, current_user.id)
|
||||
|
||||
if job_id
|
||||
created!
|
||||
else
|
||||
render_api_error!('Unable to schedule pipeline run immediately', 500)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Create a new pipeline schedule variable' do
|
||||
success Entities::Variable
|
||||
end
|
||||
params do
|
||||
requires :pipeline_schedule_id, type: Integer, desc: 'The pipeline schedule id'
|
||||
requires :key, type: String, desc: 'The key of the variable'
|
||||
requires :value, type: String, desc: 'The value of the variable'
|
||||
optional :variable_type, type: String, values: ::Ci::PipelineScheduleVariable.variable_types.keys, desc: 'The type of variable, must be one of env_var or file. Defaults to env_var'
|
||||
end
|
||||
post ':id/pipeline_schedules/:pipeline_schedule_id/variables' do
|
||||
authorize! :update_pipeline_schedule, pipeline_schedule
|
||||
|
||||
variable_params = declared_params(include_missing: false)
|
||||
variable = pipeline_schedule.variables.create(variable_params)
|
||||
if variable.persisted?
|
||||
present variable, with: Entities::Variable
|
||||
else
|
||||
render_validation_error!(variable)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Edit a pipeline schedule variable' do
|
||||
success Entities::Variable
|
||||
end
|
||||
params do
|
||||
requires :pipeline_schedule_id, type: Integer, desc: 'The pipeline schedule id'
|
||||
requires :key, type: String, desc: 'The key of the variable'
|
||||
optional :value, type: String, desc: 'The value of the variable'
|
||||
optional :variable_type, type: String, values: ::Ci::PipelineScheduleVariable.variable_types.keys, desc: 'The type of variable, must be one of env_var or file'
|
||||
end
|
||||
put ':id/pipeline_schedules/:pipeline_schedule_id/variables/:key' do
|
||||
authorize! :update_pipeline_schedule, pipeline_schedule
|
||||
|
||||
if pipeline_schedule_variable.update(declared_params(include_missing: false))
|
||||
present pipeline_schedule_variable, with: Entities::Variable
|
||||
else
|
||||
render_validation_error!(pipeline_schedule_variable)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Delete a pipeline schedule variable' do
|
||||
success Entities::Variable
|
||||
end
|
||||
params do
|
||||
requires :pipeline_schedule_id, type: Integer, desc: 'The pipeline schedule id'
|
||||
requires :key, type: String, desc: 'The key of the variable'
|
||||
end
|
||||
delete ':id/pipeline_schedules/:pipeline_schedule_id/variables/:key' do
|
||||
authorize! :admin_pipeline_schedule, pipeline_schedule
|
||||
|
||||
status :accepted
|
||||
present pipeline_schedule_variable.destroy, with: Entities::Variable
|
||||
end
|
||||
end
|
||||
|
||||
helpers do
|
||||
# rubocop: disable CodeReuse/ActiveRecord
|
||||
def pipeline_schedule
|
||||
@pipeline_schedule ||=
|
||||
user_project
|
||||
.pipeline_schedules
|
||||
.preload(:owner, :last_pipeline)
|
||||
.find_by(id: params.delete(:pipeline_schedule_id)).tap do |pipeline_schedule|
|
||||
unless can?(current_user, :read_pipeline_schedule, pipeline_schedule)
|
||||
not_found!('Pipeline Schedule')
|
||||
end
|
||||
end
|
||||
end
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
|
||||
# rubocop: disable CodeReuse/ActiveRecord
|
||||
def pipeline_schedule_variable
|
||||
@pipeline_schedule_variable ||=
|
||||
pipeline_schedule.variables.find_by(key: params[:key]).tap do |pipeline_schedule_variable|
|
||||
unless pipeline_schedule_variable
|
||||
not_found!('Pipeline Schedule Variable')
|
||||
end
|
||||
end
|
||||
end
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,187 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module API
|
||||
class Pipelines < Grape::API::Instance
|
||||
include PaginationParams
|
||||
|
||||
before { authenticate_non_get! }
|
||||
|
||||
params do
|
||||
requires :id, type: String, desc: 'The project ID'
|
||||
end
|
||||
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
|
||||
desc 'Get all Pipelines of the project' do
|
||||
detail 'This feature was introduced in GitLab 8.11.'
|
||||
success Entities::PipelineBasic
|
||||
end
|
||||
params do
|
||||
use :pagination
|
||||
optional :scope, type: String, values: %w[running pending finished branches tags],
|
||||
desc: 'The scope of pipelines'
|
||||
optional :status, type: String, values: ::Ci::HasStatus::AVAILABLE_STATUSES,
|
||||
desc: 'The status of pipelines'
|
||||
optional :ref, type: String, desc: 'The ref of pipelines'
|
||||
optional :sha, type: String, desc: 'The sha of pipelines'
|
||||
optional :yaml_errors, type: Boolean, desc: 'Returns pipelines with invalid configurations'
|
||||
optional :name, type: String, desc: 'The name of the user who triggered pipelines'
|
||||
optional :username, type: String, desc: 'The username of the user who triggered pipelines'
|
||||
optional :updated_before, type: DateTime, desc: 'Return pipelines updated before the specified datetime. Format: ISO 8601 YYYY-MM-DDTHH:MM:SSZ'
|
||||
optional :updated_after, type: DateTime, desc: 'Return pipelines updated after the specified datetime. Format: ISO 8601 YYYY-MM-DDTHH:MM:SSZ'
|
||||
optional :order_by, type: String, values: ::Ci::PipelinesFinder::ALLOWED_INDEXED_COLUMNS, default: 'id',
|
||||
desc: 'Order pipelines'
|
||||
optional :sort, type: String, values: %w[asc desc], default: 'desc',
|
||||
desc: 'Sort pipelines'
|
||||
end
|
||||
get ':id/pipelines' do
|
||||
authorize! :read_pipeline, user_project
|
||||
authorize! :read_build, user_project
|
||||
|
||||
pipelines = ::Ci::PipelinesFinder.new(user_project, current_user, params).execute
|
||||
present paginate(pipelines), with: Entities::PipelineBasic
|
||||
end
|
||||
|
||||
desc 'Create a new pipeline' do
|
||||
detail 'This feature was introduced in GitLab 8.14'
|
||||
success Entities::Pipeline
|
||||
end
|
||||
params do
|
||||
requires :ref, type: String, desc: 'Reference'
|
||||
optional :variables, Array, desc: 'Array of variables available in the pipeline'
|
||||
end
|
||||
post ':id/pipeline' do
|
||||
Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-foss/issues/42124')
|
||||
|
||||
authorize! :create_pipeline, user_project
|
||||
|
||||
pipeline_params = declared_params(include_missing: false)
|
||||
.merge(variables_attributes: params[:variables])
|
||||
.except(:variables)
|
||||
|
||||
new_pipeline = ::Ci::CreatePipelineService.new(user_project,
|
||||
current_user,
|
||||
pipeline_params)
|
||||
.execute(:api, ignore_skip_ci: true, save_on_errors: false)
|
||||
|
||||
if new_pipeline.persisted?
|
||||
present new_pipeline, with: Entities::Pipeline
|
||||
else
|
||||
render_validation_error!(new_pipeline)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Gets a the latest pipeline for the project branch' do
|
||||
detail 'This feature was introduced in GitLab 12.3'
|
||||
success Entities::Pipeline
|
||||
end
|
||||
params do
|
||||
optional :ref, type: String, desc: 'branch ref of pipeline'
|
||||
end
|
||||
get ':id/pipelines/latest' do
|
||||
authorize! :read_pipeline, latest_pipeline
|
||||
|
||||
present latest_pipeline, with: Entities::Pipeline
|
||||
end
|
||||
|
||||
desc 'Gets a specific pipeline for the project' do
|
||||
detail 'This feature was introduced in GitLab 8.11'
|
||||
success Entities::Pipeline
|
||||
end
|
||||
params do
|
||||
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
||||
end
|
||||
get ':id/pipelines/:pipeline_id' do
|
||||
authorize! :read_pipeline, pipeline
|
||||
|
||||
present pipeline, with: Entities::Pipeline
|
||||
end
|
||||
|
||||
desc 'Gets the variables for a given pipeline' do
|
||||
detail 'This feature was introduced in GitLab 11.11'
|
||||
success Entities::Variable
|
||||
end
|
||||
params do
|
||||
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
||||
end
|
||||
get ':id/pipelines/:pipeline_id/variables' do
|
||||
authorize! :read_pipeline_variable, pipeline
|
||||
|
||||
present pipeline.variables, with: Entities::Variable
|
||||
end
|
||||
|
||||
desc 'Gets the test report for a given pipeline' do
|
||||
detail 'This feature was introduced in GitLab 13.0. Disabled by default behind feature flag `junit_pipeline_view`'
|
||||
success TestReportEntity
|
||||
end
|
||||
params do
|
||||
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
||||
end
|
||||
get ':id/pipelines/:pipeline_id/test_report' do
|
||||
not_found! unless Feature.enabled?(:junit_pipeline_view, user_project)
|
||||
|
||||
authorize! :read_build, pipeline
|
||||
|
||||
present pipeline.test_reports, with: TestReportEntity, details: true
|
||||
end
|
||||
|
||||
desc 'Deletes a pipeline' do
|
||||
detail 'This feature was introduced in GitLab 11.6'
|
||||
http_codes [[204, 'Pipeline was deleted'], [403, 'Forbidden']]
|
||||
end
|
||||
params do
|
||||
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
||||
end
|
||||
delete ':id/pipelines/:pipeline_id' do
|
||||
authorize! :destroy_pipeline, pipeline
|
||||
|
||||
destroy_conditionally!(pipeline) do
|
||||
::Ci::DestroyPipelineService.new(user_project, current_user).execute(pipeline)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Retry builds in the pipeline' do
|
||||
detail 'This feature was introduced in GitLab 8.11.'
|
||||
success Entities::Pipeline
|
||||
end
|
||||
params do
|
||||
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
||||
end
|
||||
post ':id/pipelines/:pipeline_id/retry' do
|
||||
authorize! :update_pipeline, pipeline
|
||||
|
||||
pipeline.retry_failed(current_user)
|
||||
|
||||
present pipeline, with: Entities::Pipeline
|
||||
end
|
||||
|
||||
desc 'Cancel all builds in the pipeline' do
|
||||
detail 'This feature was introduced in GitLab 8.11.'
|
||||
success Entities::Pipeline
|
||||
end
|
||||
params do
|
||||
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
||||
end
|
||||
post ':id/pipelines/:pipeline_id/cancel' do
|
||||
authorize! :update_pipeline, pipeline
|
||||
|
||||
pipeline.cancel_running
|
||||
|
||||
status 200
|
||||
present pipeline.reset, with: Entities::Pipeline
|
||||
end
|
||||
end
|
||||
|
||||
helpers do
|
||||
def pipeline
|
||||
strong_memoize(:pipeline) do
|
||||
user_project.ci_pipelines.find(params[:pipeline_id])
|
||||
end
|
||||
end
|
||||
|
||||
def latest_pipeline
|
||||
strong_memoize(:latest_pipeline) do
|
||||
user_project.latest_pipeline_for_ref(params[:ref])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -19,7 +19,7 @@ module Gitlab
|
|||
end
|
||||
|
||||
unless allowed_to_write_ref?
|
||||
return error("Insufficient permissions for protected ref '#{command.ref}'")
|
||||
error("Insufficient permissions for protected ref '#{command.ref}'")
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ module Gitlab
|
|||
end
|
||||
|
||||
if @command.ambiguous_ref?
|
||||
return error('Ref is ambiguous')
|
||||
error('Ref is ambiguous')
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ module Gitlab
|
|||
begin
|
||||
Rugged::Reference.valid_name?("refs/heads/#{ref_name}")
|
||||
rescue ArgumentError
|
||||
return false
|
||||
false
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -35,7 +35,7 @@ module Gitlab
|
|||
begin
|
||||
Rugged::Reference.valid_name?(expanded_name)
|
||||
rescue ArgumentError
|
||||
return false
|
||||
false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -201,9 +201,9 @@ module Gitlab
|
|||
response = GitalyClient.call(@storage, :repository_service, :fsck, request, timeout: GitalyClient.long_timeout)
|
||||
|
||||
if response.error.empty?
|
||||
return "", 0
|
||||
["", 0]
|
||||
else
|
||||
return response.error.b, 1
|
||||
[response.error.b, 1]
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -101,7 +101,7 @@ module Gitlab
|
|||
|
||||
if project
|
||||
# If a project is found and the user has access, we return the full project path
|
||||
return project.full_path, project.default_branch
|
||||
[project.full_path, project.default_branch]
|
||||
else
|
||||
# If not, we return the first two components as if it were a simple `namespace/project` path,
|
||||
# so that we don't reveal the existence of a nested project the user doesn't have access to.
|
||||
|
@ -112,7 +112,7 @@ module Gitlab
|
|||
# `go get gitlab.com/group/subgroup/project/subpackage` will not work for private projects.
|
||||
# `go get gitlab.com/group/subgroup/project.git/subpackage` will work, since Go is smart enough
|
||||
# to figure that out. `import 'gitlab.com/...'` behaves the same as `go get`.
|
||||
return simple_project_path, 'master'
|
||||
[simple_project_path, 'master']
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -56,7 +56,7 @@ module Gitlab
|
|||
# * Maximum length is 63 bytes
|
||||
# * First/Last Character is not a hyphen
|
||||
def slugify(str)
|
||||
return str.downcase
|
||||
str.downcase
|
||||
.gsub(/[^a-z0-9]/, '-')[0..62]
|
||||
.gsub(/(\A-+|-+\z)/, '')
|
||||
end
|
||||
|
|
|
@ -22,7 +22,7 @@ module GoogleApi
|
|||
|
||||
def get_token(code)
|
||||
ret = client.auth_code.get_token(code, redirect_uri: redirect_uri)
|
||||
return ret.token, ret.expires_at
|
||||
[ret.token, ret.expires_at]
|
||||
end
|
||||
|
||||
protected
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe API::PipelineSchedules do
|
||||
RSpec.describe API::Ci::PipelineSchedules do
|
||||
let_it_be(:developer) { create(:user) }
|
||||
let_it_be(:user) { create(:user) }
|
||||
let_it_be(:project) { create(:project, :repository, public_builds: false) }
|
||||
|
@ -24,7 +24,7 @@ RSpec.describe API::PipelineSchedules do
|
|||
.each do |pipeline_schedule|
|
||||
create(:user).tap do |user|
|
||||
project.add_developer(user)
|
||||
pipeline_schedule.update(owner: user)
|
||||
pipeline_schedule.update!(owner: user)
|
||||
end
|
||||
pipeline_schedule.pipelines << build(:ci_pipeline, project: project)
|
||||
end
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe API::Pipelines do
|
||||
RSpec.describe API::Ci::Pipelines do
|
||||
let_it_be(:user) { create(:user) }
|
||||
let_it_be(:non_member) { create(:user) }
|
||||
|
Loading…
Reference in a new issue