Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2020-06-16 18:09:01 +00:00
parent 10fd79745d
commit 4f5c8572e9
660 changed files with 1565 additions and 883 deletions

View File

@ -1,9 +1,10 @@
<script>
import { GlIcon, GlIntersectionObserver } from '@gitlab/ui';
import Visibility from 'visibilityjs';
import { __, s__, sprintf } from '~/locale';
import createFlash from '~/flash';
import { visitUrl } from '../../lib/utils/url_utility';
import Poll from '../../lib/utils/poll';
import { visitUrl } from '~/lib/utils/url_utility';
import Poll from '~/lib/utils/poll';
import eventHub from '../event_hub';
import Service from '../services/index';
import Store from '../stores';
@ -12,10 +13,13 @@ import descriptionComponent from './description.vue';
import editedComponent from './edited.vue';
import formComponent from './form.vue';
import PinnedLinks from './pinned_links.vue';
import recaptchaModalImplementor from '../../vue_shared/mixins/recaptcha_modal_implementor';
import recaptchaModalImplementor from '~/vue_shared/mixins/recaptcha_modal_implementor';
import { IssuableStatus, IssuableStatusText, IssuableType } from '../constants';
export default {
components: {
GlIcon,
GlIntersectionObserver,
descriptionComponent,
titleComponent,
editedComponent,
@ -69,6 +73,11 @@ export default {
type: String,
required: true,
},
issuableStatus: {
type: String,
required: false,
default: '',
},
initialTitleHtml: {
type: String,
required: true,
@ -162,6 +171,7 @@ export default {
state: store.state,
showForm: false,
templatesRequested: false,
isStickyHeaderShowing: false,
};
},
computed: {
@ -196,6 +206,18 @@ export default {
defaultErrorMessage() {
return sprintf(s__('Error updating %{issuableType}'), { issuableType: this.issuableType });
},
isOpenStatus() {
return this.issuableStatus === IssuableStatus.Open;
},
statusIcon() {
return this.isOpenStatus ? 'issue-open-m' : 'mobile-issue-close';
},
statusText() {
return IssuableStatusText[this.issuableStatus];
},
shouldShowStickyHeader() {
return this.isStickyHeaderShowing && this.issuableType === IssuableType.Issue;
},
},
created() {
this.service = new Service(this.endpoint);
@ -349,6 +371,14 @@ export default {
);
});
},
hideStickyHeader() {
this.isStickyHeaderShowing = false;
},
showStickyHeader() {
this.isStickyHeaderShowing = true;
},
},
};
</script>
@ -385,10 +415,40 @@ export default {
:title-text="state.titleText"
:show-inline-edit-button="showInlineEditButton"
/>
<gl-intersection-observer @appear="hideStickyHeader" @disappear="showStickyHeader">
<transition name="issuable-header-slide">
<div
v-if="shouldShowStickyHeader"
class="issue-sticky-header gl-fixed gl-z-index-2 gl-bg-white gl-border-1 gl-border-b-solid gl-border-b-gray-200 gl-py-3"
data-testid="issue-sticky-header"
>
<div
class="issue-sticky-header-text gl-display-flex gl-align-items-center gl-mx-auto gl-px-5"
>
<p
class="issuable-status-box status-box gl-my-0"
:class="[isOpenStatus ? 'status-box-open' : 'status-box-issue-closed']"
>
<gl-icon :name="statusIcon" class="gl-display-block d-sm-none gl-h-6!" />
<span class="gl-display-none d-sm-block">{{ statusText }}</span>
</p>
<p
class="gl-font-weight-bold gl-overflow-hidden gl-white-space-nowrap gl-text-overflow-ellipsis gl-my-0"
:title="state.titleText"
>
{{ state.titleText }}
</p>
</div>
</div>
</transition>
</gl-intersection-observer>
<pinned-links
:zoom-meeting-url="zoomMeetingUrl"
:published-incident-url="publishedIncidentUrl"
/>
<description-component
v-if="state.descriptionHtml"
:can-update="canUpdate"
@ -401,6 +461,7 @@ export default {
:lock-version="state.lock_version"
@taskListUpdateFailed="updateStoreState"
/>
<edited-component
v-if="hasUpdated"
:updated-at="state.updatedAt"

View File

@ -0,0 +1,17 @@
import { __ } from '~/locale';
export const IssuableStatus = {
Open: 'opened',
Closed: 'closed',
};
export const IssuableStatusText = {
[IssuableStatus.Open]: __('Open'),
[IssuableStatus.Closed]: __('Closed'),
};
export const IssuableType = {
Issue: 'issue',
Epic: 'epic',
MergeRequest: 'merge_request',
};

View File

@ -2,7 +2,8 @@
import { GlResizeObserverDirective } from '@gitlab/ui';
import { GlStackedColumnChart } from '@gitlab/ui/dist/charts';
import { getSvgIconPathContent } from '~/lib/utils/icon_utils';
import { chartHeight } from '../../constants';
import { chartHeight, legendLayoutTypes } from '../../constants';
import { s__ } from '~/locale';
import { graphDataValidatorForValues } from '../../utils';
import { getTimeAxisOptions, axisTypes } from './options';
import { timezones } from '../../format_date';
@ -25,6 +26,31 @@ export default {
required: false,
default: timezones.LOCAL,
},
legendLayout: {
type: String,
required: false,
default: legendLayoutTypes.table,
},
legendAverageText: {
type: String,
required: false,
default: s__('Metrics|Avg'),
},
legendCurrentText: {
type: String,
required: false,
default: s__('Metrics|Current'),
},
legendMaxText: {
type: String,
required: false,
default: s__('Metrics|Max'),
},
legendMinText: {
type: String,
required: false,
default: s__('Metrics|Min'),
},
},
data() {
return {
@ -119,6 +145,11 @@ export default {
:width="width"
:height="height"
:series-names="seriesNames"
:legend-layout="legendLayout"
:legend-average-text="legendAverageText"
:legend-current-text="legendCurrentText"
:legend-max-text="legendMaxText"
:legend-min-text="legendMinText"
/>
</div>
</template>

View File

@ -5,7 +5,7 @@ import { GlAreaChart, GlLineChart, GlChartSeriesLabel } from '@gitlab/ui/dist/ch
import { s__ } from '~/locale';
import { getSvgIconPathContent } from '~/lib/utils/icon_utils';
import Icon from '~/vue_shared/components/icon.vue';
import { panelTypes, chartHeight, lineTypes, lineWidths } from '../../constants';
import { panelTypes, chartHeight, lineTypes, lineWidths, legendLayoutTypes } from '../../constants';
import { getYAxisOptions, getTimeAxisOptions, getChartGrid, getTooltipFormatter } from './options';
import { annotationsYAxis, generateAnnotationsSeries } from './annotations';
import { makeDataSeries } from '~/helpers/monitor_helper';
@ -75,16 +75,31 @@ export default {
required: false,
default: () => [],
},
legendLayout: {
type: String,
required: false,
default: legendLayoutTypes.table,
},
legendAverageText: {
type: String,
required: false,
default: s__('Metrics|Avg'),
},
legendCurrentText: {
type: String,
required: false,
default: s__('Metrics|Current'),
},
legendMaxText: {
type: String,
required: false,
default: s__('Metrics|Max'),
},
legendMinText: {
type: String,
required: false,
default: s__('Metrics|Min'),
},
groupId: {
type: String,
required: false,
@ -368,8 +383,11 @@ export default {
:thresholds="thresholds"
:width="width"
:height="height"
:average-text="legendAverageText"
:max-text="legendMaxText"
:legend-layout="legendLayout"
:legend-average-text="legendAverageText"
:legend-current-text="legendCurrentText"
:legend-max-text="legendMaxText"
:legend-min-text="legendMinText"
@created="onChartCreated"
@updated="onChartUpdated"
>

View File

@ -135,6 +135,19 @@ export const linkTypes = {
GRAFANA: 'grafana',
};
/**
* These are the supported values for the GitLab-UI
* chart legend layout.
*
* Currently defined in
* https://gitlab.com/gitlab-org/gitlab-ui/-/blob/master/src/utils/charts/constants.js
*
*/
export const legendLayoutTypes = {
inline: 'inline',
table: 'table',
};
/**
* These Vuex store properties are allowed to be
* replaced dynamically after component has been created

View File

@ -304,6 +304,72 @@ ul.related-merge-requests > li {
}
}
.issue-sticky-header {
@include gl-left-0;
@include gl-w-full;
top: $header-height;
// collapsed right sidebar
@include media-breakpoint-up(sm) {
width: calc(100% - #{$gutter-collapsed-width});
}
.issue-sticky-header-text {
max-width: $limited-layout-width;
}
}
.with-performance-bar .issue-sticky-header {
top: $header-height + $performance-bar-height;
}
@include media-breakpoint-up(md) {
// collapsed left sidebar + collapsed right sidebar
.issue-sticky-header {
left: $contextual-sidebar-collapsed-width;
width: calc(100% - #{$contextual-sidebar-collapsed-width} - #{$gutter-collapsed-width});
}
// collapsed left sidebar + expanded right sidebar
.right-sidebar-expanded .issue-sticky-header {
width: calc(100% - #{$contextual-sidebar-collapsed-width} - #{$gutter-width});
}
}
@include media-breakpoint-up(xl) {
// expanded left sidebar + collapsed right sidebar
.issue-sticky-header {
left: $contextual-sidebar-width;
width: calc(100% - #{$contextual-sidebar-width} - #{$gutter-collapsed-width});
}
// collapsed left sidebar + collapsed right sidebar
.page-with-icon-sidebar .issue-sticky-header {
left: $contextual-sidebar-collapsed-width;
width: calc(100% - #{$contextual-sidebar-collapsed-width} - #{$gutter-collapsed-width});
}
// expanded left sidebar + expanded right sidebar
.right-sidebar-expanded .issue-sticky-header {
width: calc(100% - #{$contextual-sidebar-width} - #{$gutter-width});
}
// collapsed left sidebar + expanded right sidebar
.right-sidebar-expanded.page-with-icon-sidebar .issue-sticky-header {
width: calc(100% - #{$contextual-sidebar-collapsed-width} - #{$gutter-width});
}
}
.issuable-header-slide-enter-active,
.issuable-header-slide-leave-active {
@include gl-transition-slow;
}
.issuable-header-slide-enter,
.issuable-header-slide-leave-to {
transform: translateY(-100%);
}
.issuable-list-root {
.gl-label-link {
text-decoration: none;

View File

@ -1,26 +0,0 @@
# frozen_string_literal: true
class JwksController < ActionController::Base # rubocop:disable Rails/ApplicationController
def index
render json: { keys: keys }
end
private
def keys
[
# We keep openid_connect_signing_key so that we can seamlessly
# replace it with ci_jwt_signing_key and remove it on the next release.
# TODO: Remove openid_connect_signing_key in 13.2
# https://gitlab.com/gitlab-org/gitlab/-/issues/221031
Rails.application.secrets.openid_connect_signing_key,
Rails.application.secrets.ci_jwt_signing_key
].compact.map do |key_data|
OpenSSL::PKey::RSA.new(key_data)
.public_key
.to_jwk
.slice(:kty, :kid, :e, :n)
.merge(use: 'sig', alg: 'RS256')
end
end
end

View File

@ -276,6 +276,7 @@ module IssuablesHelper
canUpdate: can?(current_user, :"update_#{issuable.to_ability_name}", issuable),
canDestroy: can?(current_user, :"destroy_#{issuable.to_ability_name}", issuable),
issuableRef: issuable.to_reference,
issuableStatus: issuable.state,
markdownPreviewPath: preview_markdown_path(parent),
markdownDocsPath: help_page_path('user/markdown'),
lockVersion: issuable.lock_version,

View File

@ -297,10 +297,21 @@ module ApplicationSettingImplementation
performance_bar_allowed_group_id.present?
end
# Choose one of the available repository storage options. Currently all have
# equal weighting.
def normalized_repository_storage_weights
strong_memoize(:normalized_repository_storage_weights) do
weights_total = repository_storages_weighted.values.reduce(:+)
repository_storages_weighted.transform_values do |w|
next w if weights_total == 0
w.to_f / weights_total
end
end
end
# Choose one of the available repository storage options based on a normalized weighted probability.
def pick_repository_storage
repository_storages.sample
normalized_repository_storage_weights.max_by { |_, weight| rand**(1.0 / weight) }.first
end
def runners_registration_token

View File

@ -25,9 +25,11 @@ module BlobViewer
private
def parse_blob_data
::PerformanceMonitoring::PrometheusDashboard.from_json(YAML.safe_load(blob.data))
yaml = ::Gitlab::Config::Loader::Yaml.new(blob.data).load_raw!
::PerformanceMonitoring::PrometheusDashboard.from_json(yaml)
nil
rescue Psych::SyntaxError => error
rescue Gitlab::Config::Loader::FormatError => error
wrap_yml_syntax_error(error)
rescue ActiveModel::ValidationError => invalid
invalid.model.errors

View File

@ -26,7 +26,8 @@ module Ci
RUNNER_FEATURES = {
upload_multiple_artifacts: -> (build) { build.publishes_artifacts_reports? },
refspecs: -> (build) { build.merge_request_ref? },
artifacts_exclude: -> (build) { build.supports_artifacts_exclude? }
artifacts_exclude: -> (build) { build.supports_artifacts_exclude? },
release_steps: -> (build) { build.release_steps? }
}.freeze
DEFAULT_RETRIES = {
@ -815,6 +816,7 @@ module Ci
def steps
[Gitlab::Ci::Build::Step.from_commands(self),
Gitlab::Ci::Build::Step.from_release(self),
Gitlab::Ci::Build::Step.from_after_script(self)].compact
end
@ -878,6 +880,16 @@ module Ci
options&.dig(:artifacts, :reports)&.any?
end
def supports_artifacts_exclude?
options&.dig(:artifacts, :exclude)&.any? &&
Gitlab::Ci::Features.artifacts_exclude_enabled?
end
def release_steps?
options.dig(:release)&.any? &&
Gitlab::Ci::Features.release_generation_enabled?
end
def hide_secrets(trace)
return unless trace
@ -951,11 +963,6 @@ module Ci
failure_reason: :data_integrity_failure)
end
def supports_artifacts_exclude?
options&.dig(:artifacts, :exclude)&.any? &&
Gitlab::Ci::Features.artifacts_exclude_enabled?
end
def degradation_threshold
var = yaml_variables.find { |v| v[:key] == DEGRADATION_THRESHOLD_VARIABLE_NAME }
var[:value]&.to_i if var

View File

@ -50,6 +50,8 @@ class MergeRequestNoteableEntity < IssuableEntity
merge_request.project.archived?
end
expose :project_id
expose :archived_project_docs_path, if: -> (merge_request) { merge_request.project.archived? } do |merge_request|
help_page_path('user/project/settings/index.md', anchor: 'archiving-a-project')
end

View File

@ -1,16 +1,16 @@
- if group_container_registry_nav?
= nav_link(path: group_packages_nav_link_paths) do
= nav_link(controller: 'groups/registry/repositories') do
= link_to group_container_registries_path(@group), title: _('Container Registry') do
.nav-icon-container
= sprite_icon('package')
%span.nav-item-name
= _('Packages & Registries')
%ul.sidebar-sub-level-items
= nav_link(controller: [:packages, :repositories], html_options: { class: "fly-out-top-item" } ) do
= nav_link(controller: 'groups/registry/repositories', html_options: { class: "fly-out-top-item" } ) do
= link_to group_container_registries_path(@group), title: _('Container Registry') do
%strong.fly-out-top-item-name
= _('Packages & Registries')
%li.divider.fly-out-top-item
= nav_link(controller: 'groups/container_registries') do
= nav_link(controller: 'groups/registry/repositories') do
= link_to group_container_registries_path(@group), title: _('Container Registry') do
%span= _('Container Registry')

View File

@ -0,0 +1,5 @@
---
title: Change legends in monitor dashboards to tabular layout
merge_request: 30131
author:
type: changed

View File

@ -1,5 +0,0 @@
---
title: Use dedicated RSA key to sign CI_JOB_JWT
merge_request: 34249
author:
type: added

View File

@ -0,0 +1,5 @@
---
title: Add sticky title on Issue pages
merge_request: 33983
author:
type: added

View File

@ -0,0 +1,5 @@
---
title: Pick repository storage based on weight
merge_request: 34095
author:
type: changed

View File

@ -0,0 +1,5 @@
---
title: Display error for YAML files that are too large
merge_request: 34199
author:
type: changed

View File

@ -39,8 +39,7 @@ def create_tokens
secret_key_base: file_secret_key || generate_new_secure_token,
otp_key_base: env_secret_key || file_secret_key || generate_new_secure_token,
db_key_base: generate_new_secure_token,
openid_connect_signing_key: generate_new_rsa_private_key,
ci_jwt_signing_key: generate_new_rsa_private_key
openid_connect_signing_key: generate_new_rsa_private_key
}
missing_secrets = set_missing_keys(defaults)

View File

@ -81,6 +81,8 @@ en:
Grants read-write access to repositories on private projects using Git-over-HTTP (not using the API).
read_registry:
Grants read-only access to container registry images on private projects.
write_registry:
Grants write access to container registry images on private projects.
openid:
Grants permission to authenticate with GitLab using OpenID Connect. Also gives read-only access to the user's profile and group memberships.
sudo:

View File

@ -171,8 +171,9 @@ Rails.application.routes.draw do
resources :abuse_reports, only: [:new, :create]
# JWKS (JSON Web Key Set) endpoint
# Used by third parties to verify CI_JOB_JWT
get 'jwks' => 'jwks#index'
# Used by third parties to verify CI_JOB_JWT, placeholder route
# in case we decide to move away from doorkeeper-openid_connect
get 'jwks' => 'doorkeeper/openid_connect/discovery#keys'
end
# End of the /-/ scope.

View File

@ -0,0 +1,9 @@
# frozen_string_literal: true
class AddIpAddressToAuditEvents < ActiveRecord::Migration[6.0]
DOWNTIME = false
def change
add_column :audit_events, :ip_address, :inet
end
end

View File

@ -697,7 +697,8 @@ CREATE TABLE public.audit_events (
entity_type character varying NOT NULL,
details text,
created_at timestamp without time zone,
updated_at timestamp without time zone
updated_at timestamp without time zone,
ip_address inet
);
CREATE SEQUENCE public.audit_events_id_seq
@ -13982,6 +13983,7 @@ COPY "schema_migrations" (version) FROM STDIN;
20200604174544
20200604174558
20200605003204
20200605093113
20200608072931
20200608075553
20200608214008

View File

@ -50,7 +50,7 @@ The JWT's payload looks like this:
}
```
The JWT is encoded by using RS256 and signed with a dedicated RSA private key. The expire time for the token will be set to job's timeout, if specifed, or 5 minutes if it is not. The key used to sign this token may change without any notice. In such case retrying the job will generate new JWT using the current signing key.
The JWT is encoded by using RS256 and signed with your GitLab instance's OpenID Connect private key. The expire time for the token will be set to job's timeout, if specifed, or 5 minutes if it is not. The key used to sign this token may change without any notice. In such case retrying the job will generate new JWT using the current signing key.
You can use this JWT and your instance's JWKS endpoint (`https://gitlab.example.com/-/jwks`) to authenticate with a Vault server that is configured to allow the JWT Authentication method for authentication.

View File

@ -266,6 +266,17 @@ as artifacts.
The collected Metrics report will be uploaded to GitLab as an artifact and will
be automatically shown in merge requests.
#### `artifacts:reports:requirements` **(ULTIMATE)**
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2859) in GitLab 13.1.
> - Requires GitLab Runner 11.5 and above.
The `requirements` report collects `requirements.json` files as artifacts.
The collected Requirements report will be uploaded to GitLab as an artifact and
existing [requirements](../../user/project/requirements/index.md) will be
marked as Satisfied.
## Browsing artifacts
> - From GitLab 9.2, PDFs, images, videos, and other formats can be previewed directly in the job artifacts browser without the need to download them.

View File

@ -562,6 +562,8 @@ appear to be associated to any of the services running, since they all appear to
| `sast_jobs` | `counts` | | | |
| `status_page_projects` | `counts` | `monitor` | | Projects with status page enabled |
| `status_page_issues` | `counts` | `monitor` | | Issues published to a Status Page |
| `status_page_incident_publishes` | `counts` | `monitor` | | Cumulative count of usages of publish operation |
| `status_page_incident_unpublishes` | `counts` | `monitor` | | Cumulative count of usages of unpublish operation |
| `epics_deepest_relationship_level` | `counts` | | | |
| `operations_dashboard_default_dashboard` | `counts` | `monitor` | | Active users with enabled operations dashboard |
| `operations_dashboard_users_with_projects_added` | `counts` | `monitor` | | Active users with projects on operations dashboard|

View File

@ -512,7 +512,9 @@ Here are some common pitfalls and how to overcome them:
pp s.search_objects.class.name
```
If you see `Elasticsearch::Model::Response::Records`, you are using Elasticsearch.
If you see `"ActiveRecord::Relation"`, you are **not** using Elasticsearch.
If you see `"Kaminari::PaginatableArray"` you are using Elasticsearch.
NOTE: **Note**:
The above instructions are used to verify that GitLab is using Elasticsearch only when indexing all namespaces. This is not to be used for scenarios that only index a [subset of namespaces](#limiting-namespaces-and-projects).
@ -628,9 +630,9 @@ Here are some common pitfalls and how to overcome them:
You probably have not used either `http://` or `https://` as part of your value in the **"URL"** field of the Elasticsearch Integration Menu. Please make sure you are using either `http://` or `https://` in this field as the [Elasticsearch client for Go](https://github.com/olivere/elastic) that we are using [needs the prefix for the URL to be accepted as valid](https://github.com/olivere/elastic/commit/a80af35aa41856dc2c986204e2b64eab81ccac3a).
Once you have corrected the formatting of the URL, delete the index (via the [dedicated Rake task](#gitlab-elasticsearch-rake-tasks)) and [reindex the content of your instance](#adding-gitlabs-data-to-the-elasticsearch-index).
### Low level troubleshooting
### Low-level troubleshooting
There is more [low level troubleshooting documentation](../administration/troubleshooting/elasticsearch.md) for when you experience other issues, including poor performance.
There is a [more structured, lower-level troubleshooting document](../administration/troubleshooting/elasticsearch.md) for when you experience other issues, including poor performance.
### Known Issues

View File

@ -141,3 +141,9 @@ composer update
```
If successful, you should be able to see the output indicating that the package has been successfully installed.
CAUTION: **Important:**
Make sure to never commit the `auth.json` file to your repository. To install packages from a CI job,
consider using the [`composer config`](https://getcomposer.org/doc/articles/handling-private-packages-with-satis.md#authentication) tool with your personal access token
stored in a [GitLab CI/CD environment variable](../../../ci/variables/README.md) or in
[Hashicorp Vault](../../../ci/examples/authenticating-with-hashicorp-vault/index.md).

View File

@ -513,7 +513,7 @@ then goes through a process of excluding tags from it until only the ones to be
1. Excludes any tags that do not have a manifest (not part of the options).
1. Orders the remaining tags by `created_date`.
1. Excludes from the list the N tags based on the `keep_n` value (Number of tags to retain).
1. Excludes from the list the tags older than the `older_than` value (Expiration interval).
1. Excludes from the list the tags more recent than the `older_than` value (Expiration interval).
1. Excludes from the list any tags matching the `name_regex_keep` value (Images to preserve).
1. Finally, the remaining tags in the list are deleted from the Container Registry.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View File

@ -61,7 +61,7 @@ will help you to quickly create a deployment:
1. Navigate to your project's **CI/CD > Pipelines** page, and run a pipeline on any branch.
1. When the pipeline has run successfully, graphs will be available on the **Operations > Metrics** page.
![Monitoring Dashboard](img/prometheus_monitoring_dashboard_v12_8.png)
![Monitoring Dashboard](img/prometheus_monitoring_dashboard_v13_1.png)
#### Using the Metrics Dashboard
@ -361,6 +361,13 @@ When **Metrics Dashboard YAML definition is invalid** at least one of the follow
1. `query: can't be blank` [learn more](#metrics-metrics-properties)
1. `query_range: can't be blank` [learn more](#metrics-metrics-properties)
1. `unit: can't be blank` [learn more](#metrics-metrics-properties)
1. `YAML syntax: The parsed YAML is too big`
This is displayed when the YAML file is larger than 1 MB.
1. `YAML syntax: Invalid configuration format`
This is displayed when the YAML file is empty or does not contain valid YAML.
Metrics Dashboard YAML definition validation information is also available as a [GraphQL API field](../../../api/graphql/reference/index.md#metricsdashboard)

View File

@ -248,6 +248,11 @@ enable this feature:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5981) in [GitLab Starter](https://about.gitlab.com/pricing/) 12.0.
NOTE: **Note:**
To require authentication when approving a merge request, you must enable
**Password authentication enabled for web interface** under [sign-in restrictions](../../admin_area/settings/sign_in_restrictions.md#password-authentication-enabled).
in the Admin area.
You can force the approver to enter a password in order to authenticate before adding
the approval. This enables an Electronic Signature for approvals such as the one defined
by [CFR Part 11](https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfcfr/CFRSearch.cfm?CFRPart=11&showFR=1&subpartNode=21:1.0.1.1.8.3)).

View File

@ -2,7 +2,7 @@
type: reference, howto
---
# Protected Branches
# Protected branches
[Permissions](../permissions.md) in GitLab are fundamentally defined around the
idea of having read or write permission to the repository and branches. To impose

View File

@ -2,13 +2,13 @@
type: reference, howto
---
# Protected Tags
# Protected tags
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/10356) in GitLab 9.1.
Protected Tags allow control over who has permission to create tags as well as preventing accidental update or deletion once created. Each rule allows you to match either an individual tag name, or use wildcards to control multiple tags at once.
Protected tags allow control over who has permission to create tags as well as preventing accidental update or deletion once created. Each rule allows you to match either an individual tag name, or use wildcards to control multiple tags at once.
This feature evolved out of [Protected Branches](protected_branches.md)
This feature evolved out of [protected branches](protected_branches.md)
## Overview

View File

@ -5,32 +5,34 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
# Reducing the repository size using Git
# Reduce repository size
When large files are added to a Git repository this makes fetching the
repository slower, because everyone will need to download the file. These files
can also take up a large amount of storage space on the server over time.
Git repositories become larger over time. When large files are added to a Git repository:
Rewriting a repository can remove unwanted history to make the repository
smaller. [`git filter-repo`](https://github.com/newren/git-filter-repo) is a
tool for quickly rewriting Git repository history, and is recommended over [`git
filter-branch`](https://git-scm.com/docs/git-filter-branch) and
[BFG](https://rtyley.github.io/bfg-repo-cleaner/).
- Fetching the repository becomes slower because everyone must download the files.
- They take up a large amount of storage space on the server.
- Git repository storage limits [can be reached](#storage-limits).
Rewriting a repository can remove unwanted history to make the repository smaller.
[`git filter-repo`](https://github.com/newren/git-filter-repo) is a tool for quickly rewriting Git
repository history, and is recommended over both:
- [`git filter-branch`](https://git-scm.com/docs/git-filter-branch).
- [BFG](https://rtyley.github.io/bfg-repo-cleaner/).
DANGER: **Danger:**
Rewriting repository history is a destructive operation. Make sure to backup
your repository before you begin. The best way is to [export the
project](../settings/import_export.html#exporting-a-project-and-its-data).
Rewriting repository history is a destructive operation. Make sure to backup your repository before
you begin. The best way back up a repository is to
[export the project](../settings/import_export.md#exporting-a-project-and-its-data).
## Purging files from your repository history
## Purge files from repository history
To make cloning your project faster, rewrite branches and tags to remove
unwanted files.
To make cloning your project faster, rewrite branches and tags to remove unwanted files.
1. [Install `git filter-repo`](https://github.com/newren/git-filter-repo/blob/master/INSTALL.md)
using a supported package manager, or from source.
using a supported package manager or from source.
1. Clone a fresh copy of the repository using `--bare`.
1. Clone a fresh copy of the repository using `--bare`:
```shell
git clone --bare https://example.gitlab.com/my/project.git
@ -44,84 +46,92 @@ unwanted files.
git filter-repo --strip-blobs-bigger-than 10M
```
To purge specific large files by path, the `--path` and `--invert-paths`
options can be combined.
To purge specific large files by path, the `--path` and `--invert-paths` options can be combined:
```shell
git filter-repo --path path/to/big/file.m4v --invert-paths
```
See the [`git filter-repo` documentation](https://htmlpreview.github.io/?https://github.com/newren/git-filter-repo/blob/docs/html/git-filter-repo.html#EXAMPLES)
for more examples, and the complete documentation.
See the
[`git filter-repo` documentation](https://htmlpreview.github.io/?https://github.com/newren/git-filter-repo/blob/docs/html/git-filter-repo.html#EXAMPLES)
for more examples and the complete documentation.
1. Force push your changes to overwrite all branches on GitLab.
1. Running `git filter-repo` removes all remotes. To restore the remote for your project, run:
```shell
git remote add origin https://example.gitlab.com/<namespace>/<project_name>.git
```
1. Force push your changes to overwrite all branches on GitLab:
```shell
git push origin --force --all
```
[Protected Branches](../protected_branches.md) will cause this to fail. To
proceed you will need to remove branch protection, push, and then
reconfigure protected branches.
[Protected branches](../protected_branches.md) will cause this to fail. To proceed, you must
remove branch protection, push, and then re-enable protected branches.
1. To remove large files from tagged releases, force push your changes to all
tags on GitLab.
1. To remove large files from tagged releases, force push your changes to all tags on GitLab:
```shell
git push origin --force --tags
```
[Protected Tags](../protected_tags.md) will cause this to
fail. To proceed you will need to remove tag protection, push, and then
reconfigure protected tags.
[Protected tags](../protected_tags.md) will cause this to fail. To proceed, you must remove tag
protection, push, and then re-enable protected tags.
## Purging files from GitLab storage
## Purge files from GitLab storage
To reduce the size of your repository in GitLab you will need to remove GitLab
internal refs that reference commits contain large files. Before completing
these steps, first [purged files from your repository history](#purging-files-from-your-repository-history).
To reduce the size of your repository in GitLab, you must remove GitLab internal references to
commits that contain large files. Before completing these steps,
[purge files from your repository history](#purge-files-from-repository-history).
As well as branches and tags, which are a type of Git ref, GitLab automatically
creates other refs. These refs prevent dead links to commits, or missing diffs
when viewing merge requests. [Repository cleanup](#repository-cleanup) can be
used to remove these from GitLab.
As well as [branches](branches/index.md) and tags, which are a type of Git ref, GitLab automatically
creates other refs. These refs prevent dead links to commits, or missing diffs when viewing merge
requests. [Repository cleanup](#repository-cleanup) can be used to remove these from GitLab.
The internal refs for merge requests (`refs/merge-requests/*`),
[pipelines](../../../ci/pipelines/index.md#troubleshooting-fatal-reference-is-not-a-tree)
(`refs/pipelines/*`), and environments (`refs/environments/*`) are not
advertised, which means they are not included when fetching, which makes
fetching faster. The hidden refs to prevent commits with discussion from being
deleted (`refs/keep-around/*`) cannot be fetched at all. These refs can,
however, be accessed from the Git bundle inside the project export.
The following internal refs are not advertised:
- `refs/merge-requests/*` for merge requests.
- `refs/pipelines/*` for
[pipelines](../../../ci/pipelines/index.md#troubleshooting-fatal-reference-is-not-a-tree).
- `refs/environments/*` for environments.
This means they are not usually included when fetching, which makes fetching faster. In addition,
`refs/keep-around/*` are hidden refs to prevent commits with discussion from being deleted and
cannot be fetched at all.
However, these refs can be accessed from the Git bundle inside a project export.
1. [Install `git filter-repo`](https://github.com/newren/git-filter-repo/blob/master/INSTALL.md)
using a supported package manager, or from source.
using a supported package manager or from source.
1. Generate a fresh [export from the project](../settings/import_export.md#exporting-a-project-and-its-data) and
download to your computer.
1. Generate a fresh [export from the
project](../settings/import_export.html#exporting-a-project-and-its-data) and download it.
1. Decompress the backup using `tar`
1. Decompress the backup using `tar`:
```shell
tar xzf project-backup.tar.gz
```
This will contain a `project.bundle` file, which was created by [`git bundle`](https://git-scm.com/docs/git-bundle)
This will contain a `project.bundle` file, which was created by
[`git bundle`](https://git-scm.com/docs/git-bundle).
1. Clone a fresh copy of the repository from the bundle.
1. Clone a fresh copy of the repository from the bundle:
```shell
git clone --bare --mirror /path/to/project.bundle
```
1. Using `git filter-repo`, purge any files from the history of your repository.
Because we are trying to remove internal refs, we will rely on the
`commit-map` produced by each run to tell us which internal refs to remove.
1. Using `git filter-repo`, purge any files from the history of your repository. Because we are
trying to remove internal refs, we will rely on the `commit-map` produced by each run to tell us
which internal refs to remove.
NOTE:**Note:**
`git filter-repo` creates a new `commit-map` file every run, and overwrite the
`commit-map` from the previous run. You will need this file from **every**
run. Do the next step every time you run `git filter-repo`.
`git filter-repo` creates a new `commit-map` file every run, and overwrite the `commit-map` from
the previous run. You will need this file from **every** run. Do the next step every time you run
`git filter-repo`.
To purge all large files, the `--strip-blobs-bigger-than` option can be used:
@ -129,110 +139,106 @@ however, be accessed from the Git bundle inside the project export.
git filter-repo --strip-blobs-bigger-than 10M
```
To purge specific large files by path, the `--path` and `--invert-paths`
options can be combined.
To purge specific large files by path, the `--path` and `--invert-paths` options can be combined.
```shell
git filter-repo --path path/to/big/file.m4v --invert-paths
```
See the [`git filter-repo` documentation](https://htmlpreview.github.io/?https://github.com/newren/git-filter-repo/blob/docs/html/git-filter-repo.html#EXAMPLES)
for more examples, and the complete documentation.
See the
[`git filter-repo` documentation](https://htmlpreview.github.io/?https://github.com/newren/git-filter-repo/blob/docs/html/git-filter-repo.html#EXAMPLES)
for more examples and the complete documentation.
1. After running `git filter-repo`, the header and unchanged commits need to be
removed from the `commit-map` before uploading to GitLab.
```shell
tail -n +2 filter-repo/commit-map | grep -E -v '^(\w+) \1$' >> commit-map.txt
```
This command can be run after each run of `git filter-repo` to append the
output of the run to `commit-map.txt`
1. Navigate to **Project > Settings > Repository > Repository Cleanup**.
Upload the `commit-map.txt` file and press **Start cleanup**. This will
remove any internal Git references to the old commits, and run `git gc`
against the repository. You will receive an email once it has completed.
1. Run a [repository cleanup](#repository-cleanup).
## Repository cleanup
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/19376) in GitLab 11.6.
Repository cleanup allows you to upload a text file of objects and GitLab will remove
internal Git references to these objects.
Repository cleanup allows you to upload a text file of objects and GitLab will remove internal Git
references to these objects. You can use
[`git filter-repo`](https://github.com/newren/git-filter-repo) to produce a list of objects (in a
`commit-map` file) that can be used with repository cleanup.
To clean up a repository:
1. Go to the project for the repository.
1. Navigate to **{settings}** **Settings > Repository**.
1. Upload a list of objects.
1. Upload a list of objects. For example, a `commit-map` file.
1. Click **Start cleanup**.
This will remove any internal Git references to old commits, and run `git gc`
against the repository. You will receive an email once it has completed.
This will:
These tools produce suitable output for purging history on the server:
- Remove any internal Git references to old commits.
- Run `git gc` against the repository.
- [`git filter-repo`](https://github.com/newren/git-filter-repo): use the
`commit-map` file.
You will receive an email once it has completed.
- [BFG](https://rtyley.github.io/bfg-repo-cleaner/): use the
`object-id-map.old-new.txt` file.
When using repository cleanup, note:
NOTE: **Note:**
Housekeeping prunes loose objects older than 2 weeks. This means objects added
in the last 2 weeks will not be removed immediately. If you have access to the
Gitaly server, you may run `git gc --prune=now` to prune all loose object
immediately.
- Housekeeping prunes loose objects older than 2 weeks. This means objects added in the last 2 weeks
will not be removed immediately. If you have access to the
[Gitaly](../../../administration/gitaly/index.md) server, you may run `git gc --prune=now` to
prune all loose objects immediately.
- This process will remove some copies of the rewritten commits from GitLab's cache and database,
but there are still numerous gaps in coverage and some of the copies may persist indefinitely.
[Clearing the instance cache](../../../administration/raketasks/maintenance.md#clear-redis-cache)
may help to remove some of them, but it should not be depended on for security purposes!
NOTE: **Note:**
This process will remove some copies of the rewritten commits from GitLab's
cache and database, but there are still numerous gaps in coverage - at present,
some of the copies may persist indefinitely. [Clearing the instance
cache](../../../administration/raketasks/maintenance.md#clear-redis-cache) may
help to remove some of them, but it should not be depended on for security
purposes!
## Storage limits
## Exceeding storage limit
Repository size limits:
A GitLab Enterprise Edition administrator can set a [repository size
limit](../../admin_area/settings/account_and_limit_settings.md) which will
prevent you from exceeding it.
- Can [be set by an administrator](../../admin_area/settings/account_and_limit_settings.md#repository-size-limit-starter-only)
on self-managed instances. **(STARTER ONLY)**
- Are [set for GitLab.com](../../gitlab_com/index.md#repository-size-limit).
When a project has reached its size limit, you will not be able to push to it,
create a new merge request, or merge existing ones. You will still be able to
create new issues, and clone the project though. Uploading LFS objects will
also be denied.
When a project has reached its size limit, you cannot:
If you exceed the repository size limit, your first thought might be to remove
some data, make a new commit and push back to the repository. Perhaps you can
move some blobs to LFS, or remove some old dependency updates from history.
Unfortunately, it's not so easy and that workflow won't work. Deleting files in
a commit doesn't actually reduce the size of the repo since the earlier commits
and blobs are still around. What you need to do is rewrite history with Git's
[`filter-branch` option](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History#The-Nuclear-Option:-filter-branch),
or an open source community-maintained tool like the
- Push to the project.
- Create a new merge request.
- Merge existing merge requests.
- Upload LFS objects.
You can still:
- Create new issues.
- Clone the project.
If you exceed the repository size limit, you might try to:
1. Remove some data.
1. Make a new commit.
1. Push back to the repository.
Perhaps you might also:
- Move some blobs to LFS.
- Remove some old dependency updates from history.
Unfortunately, this workflow won't work. Deleting files in a commit doesn't actually reduce the size
of the repository because the earlier commits and blobs still exist.
What you need to do is rewrite history. We recommend the open-source community-maintained tool
[`git filter-repo`](https://github.com/newren/git-filter-repo).
Note that even with that method, until `git gc` runs on the GitLab side, the
"removed" commits and blobs will still be around. You also need to be able to
push the rewritten history to GitLab, which may be impossible if you've already
NOTE: **Note:**
Until `git gc` runs on the GitLab side, the "removed" commits and blobs will still exist. You also
must be able to push the rewritten history to GitLab, which may be impossible if you've already
exceeded the maximum size limit.
In order to lift these restrictions, the administrator of the GitLab instance
needs to increase the limit on the particular project that exceeded it, so it's
always better to spot that you're approaching the limit and act proactively to
stay underneath it. If you hit the limit, and your admin can't - or won't -
temporarily increase it for you, your only option is to prune all the unneeded
stuff locally, and then create a new project on GitLab and start using that
instead.
In order to lift these restrictions, the administrator of the self-managed GitLab instance must
increase the limit on the particular project that exceeded it. Therefore, it's always better to
proactively stay underneath the limit. If you hit the limit, and can't have it temporarily
increased, your only option is to:
1. Prune all the unneeded stuff locally.
1. Create a new project on GitLab and start using that instead.
CAUTION: **Caution:**
This process is not suitable for removing sensitive data like password or keys
from your repository. Information about commits, including file content, is
cached in the database, and will remain visible even after they have been
removed from the repository.
This process is not suitable for removing sensitive data like password or keys from your repository.
Information about commits, including file content, is cached in the database, and will remain
visible even after they have been removed from the repository.
<!-- ## Troubleshooting

View File

@ -93,3 +93,61 @@ You can also sort requirements list by:
- Created date
- Last updated
## Allow requirements to be satisfied from a CI job
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2859) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.1.
GitLab supports [requirements test
reports](../../../ci/pipelines/job_artifacts.md#artifactsreportsrequirements-ultimate) now.
You can add a job to your CI pipeline that, when triggered, marks all existing
requirements as Satisfied.
### Add the manual job to CI
To configure your CI to mark requirements as Satisfied when the manual job is
triggered, add the code below to your `.gitlab-ci.yml` file.
```yaml
requirements_confirmation:
when: manual
allow_failure: false
script:
- mkdir tmp
- echo "{\"*\":\"passed\"}" > tmp/requirements.json
artifacts:
reports:
requirements: tmp/requirements.json
```
This definition adds a manually-triggered (`when: manual`) job to the CI
pipeline. It's blocking (`allow_failure: false`), but it's up to you what
conditions you use for triggering the CI job. Also, you can use any existing CI job
to mark all requirements as satisfied, as long as the `requirements.json`
artifact is generated and uploaded by the CI job.
When you manually trigger this job, the `requirements.json` file containing
`{"*":"passed"}` is uploaded as an artifact to the server. On the server side,
the requirement report is checked for the "all passed" record
(`{"*":"passed"}`), and on success, it marks all existing open requirements as
Satisfied.
### Add the manual job to CI conditionally
To configure your CI to include the manual job only when there are some open
requirements, add a rule which checks `CI_HAS_OPEN_REQUIREMENTS` CI variable.
```yaml
requirements_confirmation:
rules:
- if: "$CI_HAS_OPEN_REQUIREMENTS" == "true"
when: manual
- when: never
allow_failure: false
script:
- mkdir tmp
- echo "{\"*\":\"passed\"}" > tmp/requirements.json
artifacts:
reports:
requirements: tmp/requirements.json
```

View File

@ -20,6 +20,19 @@ module Gitlab
end
end
def from_release(job)
return unless Gitlab::Ci::Features.release_generation_enabled?
release = job.options[:release]
return unless release
self.new(:release).tap do |step|
step.script = Gitlab::Ci::Build::Releaser.new(config: job.options[:release]).script
step.timeout = job.metadata_timeout
step.when = WHEN_ON_SUCCESS
end
end
def from_after_script(job)
after_script = job.options[:after_script]
return unless after_script

View File

@ -28,7 +28,7 @@ module Gitlab
in: %i[release],
message: 'release features are not enabled'
},
unless: -> { Feature.enabled?(:ci_release_generation, default_enabled: false) }
unless: -> { Gitlab::Ci::Features.release_generation_enabled? }
with_options allow_nil: true do
validates :allow_failure, boolean: true

View File

@ -37,6 +37,10 @@ module Gitlab
def self.atomic_processing?(project)
::Feature.enabled?(:ci_atomic_processing, project, default_enabled: true)
end
def self.release_generation_enabled?
::Feature.enabled?(:ci_release_generation)
end
end
end
end

View File

@ -60,7 +60,7 @@ module Gitlab
end
def key
@key ||= OpenSSL::PKey::RSA.new(Rails.application.secrets.ci_jwt_signing_key)
@key ||= OpenSSL::PKey::RSA.new(Rails.application.secrets.openid_connect_signing_key)
end
def public_key

View File

@ -3,7 +3,7 @@
module Gitlab
module Ci
module Status
# Base abstract class fore core status
# Base abstract class for core status
#
class Core
include Gitlab::Routing

View File

@ -88,7 +88,7 @@ module Gitlab
end
def release(job)
job[:release] if Feature.enabled?(:ci_release_generation, default_enabled: false)
job[:release] if Gitlab::Ci::Features.release_generation_enabled?
end
def stage_builds_attributes(stage)

View File

@ -2140,6 +2140,9 @@ msgstr ""
msgid "Allow users to request access (if visibility is public or internal)"
msgstr ""
msgid "Allowed Geo IP"
msgstr ""
msgid "Allowed email domain restriction only permitted for top-level groups"
msgstr ""
@ -5644,6 +5647,9 @@ msgstr ""
msgid "Coming soon"
msgstr ""
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
msgid "Command"
msgstr ""
@ -5952,6 +5958,9 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
msgid "Connection timeout"
msgstr ""
msgid "Contact sales to upgrade"
msgstr ""
@ -14081,6 +14090,9 @@ msgstr ""
msgid "Metrics|Create metric"
msgstr ""
msgid "Metrics|Current"
msgstr ""
msgid "Metrics|Delete metric"
msgstr ""
@ -14131,6 +14143,9 @@ msgstr ""
msgid "Metrics|Max"
msgstr ""
msgid "Metrics|Min"
msgstr ""
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
@ -15338,15 +15353,51 @@ msgstr ""
msgid "On track"
msgstr ""
msgid "OnDemandScans|Attached branch"
msgstr ""
msgid "OnDemandScans|Attached branch is where the scan job runs."
msgstr ""
msgid "OnDemandScans|Could not run the scan. Please try again."
msgstr ""
msgid "OnDemandScans|Create new DAST scan"
msgstr ""
msgid "OnDemandScans|DAST will scan the target URL and any discovered sub URLs."
msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
msgid "OnDemandScans|On-demand Scans"
msgstr ""
msgid "OnDemandScans|On-demand scans run outside the DevOps cycle and find vulnerabilities in your projects. %{learnMoreLinkStart}Learn more%{learnMoreLinkEnd}"
msgstr ""
msgid "OnDemandScans|Only a passive scan can be performed on demand."
msgstr ""
msgid "OnDemandScans|Passive DAST Scan"
msgstr ""
msgid "OnDemandScans|Please enter a valid URL format, ex: http://www.example.com/home"
msgstr ""
msgid "OnDemandScans|Run this scan"
msgstr ""
msgid "OnDemandScans|Scan mode"
msgstr ""
msgid "OnDemandScans|Schedule or run scans immediately against target sites. Currently available on-demand scan type: DAST. %{helpLinkStart}More information%{helpLinkEnd}"
msgstr ""
msgid "OnDemandScans|Target URL"
msgstr ""
msgid "Onboarding"
msgstr ""
@ -20304,6 +20355,9 @@ msgstr ""
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
msgid "Set the timeout in seconds to send a secondary node status to the primary and IPs allowed for the secondary nodes."
msgstr ""
msgid "Set time estimate"
msgstr ""
@ -23266,6 +23320,9 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
msgid "Time in seconds"
msgstr ""
msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
msgstr ""
@ -24437,6 +24494,9 @@ msgstr ""
msgid "User IDs"
msgstr ""
msgid "User Lists can only be created and modified with %{linkStart}the API%{linkEnd}"
msgstr ""
msgid "User OAuth applications"
msgstr ""

View File

@ -1,31 +0,0 @@
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe JwksController do
describe 'GET #index' do
let(:oidc_jwk) { OpenSSL::PKey::RSA.new(Rails.application.secrets.openid_connect_signing_key).to_jwk }
let(:ci_jwk) { OpenSSL::PKey::RSA.new(Rails.application.secrets.ci_jwt_signing_key).to_jwk }
it 'returns signing keys used to sign CI_JOB_JWT' do
get :index
expect(response).to have_gitlab_http_status(:ok)
ids = json_response['keys'].map { |jwk| jwk['kid'] }
expect(ids).to contain_exactly(ci_jwk['kid'], oidc_jwk['kid'])
end
it 'does not leak private key data' do
get :index
aggregate_failures do
json_response['keys'].each do |jwk|
expect(jwk.keys).to contain_exactly('kty', 'kid', 'e', 'n', 'use', 'alg')
expect(jwk['use']).to eq('sig')
expect(jwk['alg']).to eq('RS256')
end
end
end
end
end

View File

@ -378,6 +378,21 @@ FactoryBot.define do
end
end
trait :release_options do
options do
{
only: 'tags',
script: ['make changelog | tee release_changelog.txt'],
release: {
name: 'Release $CI_COMMIT_SHA',
description: 'Created using the release-cli $EXTRA_DESCRIPTION',
tag_name: 'release-$CI_COMMIT_SHA',
ref: '$CI_COMMIT_SHA'
}
}
end
end
trait :no_options do
options { {} }
end

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe "Admin Runners" do
RSpec.describe "Admin Runners" do
include StubENV
include FilteredSearchHelpers
include SortingHelper

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe "Admin > Admin sees project statistics" do
RSpec.describe "Admin > Admin sees project statistics" do
let(:current_user) { create(:admin) }
before do

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe "Admin > Admin sees projects statistics" do
RSpec.describe "Admin > Admin sees projects statistics" do
let(:current_user) { create(:admin) }
before do

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Admin Serverless Domains', :js do
RSpec.describe 'Admin Serverless Domains', :js do
let(:sample_domain) { build(:pages_domain) }
before do

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_not_mock_admin_mode do
RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_not_mock_admin_mode do
include StubENV
include TermsHelper
include UsageDataHelpers

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Admin System Info' do
RSpec.describe 'Admin System Info' do
before do
sign_in(create(:admin))
end

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Admin > Users > Impersonation Tokens', :js do
RSpec.describe 'Admin > Users > Impersonation Tokens', :js do
let(:admin) { create(:admin) }
let!(:user) { create(:user) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe "Admin::Users" do
RSpec.describe "Admin::Users" do
include Spec::Support::Helpers::Features::ResponsiveTableHelpers
let!(:user) do

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Admin uses repository checks', :request_store, :clean_gitlab_redis_shared_state, :do_not_mock_admin_mode do
RSpec.describe 'Admin uses repository checks', :request_store, :clean_gitlab_redis_shared_state, :do_not_mock_admin_mode do
include StubENV
let(:admin) { create(:admin) }

View File

@ -3,7 +3,7 @@
require 'spec_helper'
require_relative '../../../../spec/features/clusters/installing_applications_shared_examples'
describe 'Instance-level Cluster Applications', :js do
RSpec.describe 'Instance-level Cluster Applications', :js do
include GoogleApi::CloudPlatformHelpers
let(:user) { create(:admin) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Instance-level AWS EKS Cluster', :js do
RSpec.describe 'Instance-level AWS EKS Cluster', :js do
let(:user) { create(:admin) }
before do

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'admin visits dashboard' do
RSpec.describe 'admin visits dashboard' do
include ProjectForksHelper
before do

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Admin activates Prometheus', :js do
RSpec.describe 'Admin activates Prometheus', :js do
let(:admin) { create(:user, :admin) }
before do

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe "Dashboard Issues Feed" do
RSpec.describe "Dashboard Issues Feed" do
describe "GET /issues" do
let!(:user) { create(:user, email: 'private1@example.com', public_email: 'public1@example.com') }
let!(:assignee) { create(:user, email: 'private2@example.com', public_email: 'public2@example.com') }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe "Dashboard Feed" do
RSpec.describe "Dashboard Feed" do
describe "GET /" do
let!(:user) { create(:user, name: "Jonh") }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Issues Feed' do
RSpec.describe 'Issues Feed' do
describe 'GET /issues' do
let!(:user) { create(:user, email: 'private1@example.com', public_email: 'public1@example.com') }
let!(:assignee) { create(:user, email: 'private2@example.com', public_email: 'public2@example.com') }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe "User Feed" do
RSpec.describe "User Feed" do
describe "GET /" do
let!(:user) { create(:user) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Issue Boards add issue modal', :js do
RSpec.describe 'Issue Boards add issue modal', :js do
let(:project) { create(:project, :public) }
let(:board) { create(:board, project: project) }
let(:user) { create(:user) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Issue Boards', :js do
RSpec.describe 'Issue Boards', :js do
include DragTo
include MobileHelpers

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Issue Boards focus mode', :js do
RSpec.describe 'Issue Boards focus mode', :js do
let(:project) { create(:project, :public) }
before do

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Issue Boards', :js do
RSpec.describe 'Issue Boards', :js do
include DragTo
let(:project) { create(:project, :public) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Issue Boards shortcut', :js do
RSpec.describe 'Issue Boards shortcut', :js do
context 'issues are enabled' do
let(:project) { create(:project) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Issue Boards add issue modal filtering', :js do
RSpec.describe 'Issue Boards add issue modal filtering', :js do
let(:project) { create(:project, :public) }
let(:board) { create(:board, project: project) }
let(:planning) { create(:label, project: project, name: 'Planning') }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Multi Select Issue', :js do
RSpec.describe 'Multi Select Issue', :js do
include DragTo
let(:group) { create(:group, :nested) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Multiple Issue Boards', :js do
RSpec.describe 'Multiple Issue Boards', :js do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :public) }
let_it_be(:planning) { create(:label, project: project, name: 'Planning') }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Issue Boards new issue', :js do
RSpec.describe 'Issue Boards new issue', :js do
let(:project) { create(:project, :public) }
let(:board) { create(:board, project: project) }
let!(:list) { create(:list, board: board, position: 0) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Ensure Boards do not show stale data on browser back', :js do
RSpec.describe 'Ensure Boards do not show stale data on browser back', :js do
let(:project) {create(:project, :public)}
let(:board) {create(:board, project: project)}
let(:user) {create(:user)}

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Issue Boards', :js do
RSpec.describe 'Issue Boards', :js do
include BoardHelpers
include FilteredSearchHelpers

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Sub-group project issue boards', :js do
RSpec.describe 'Sub-group project issue boards', :js do
let(:group) { create(:group) }
let(:nested_group_1) { create(:group, parent: group) }
let(:project) { create(:project, group: nested_group_1) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Broadcast Messages' do
RSpec.describe 'Broadcast Messages' do
let_it_be(:user) { create(:user) }
shared_examples 'a Broadcast Messages' do |type|

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Contributions Calendar', :js do
RSpec.describe 'Contributions Calendar', :js do
include MobileHelpers
let(:user) { create(:user) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Clusterable > Show page' do
RSpec.describe 'Clusterable > Show page' do
include KubernetesHelpers
let(:current_user) { create(:user) }

View File

@ -1,6 +1,6 @@
# frozen_string_literal: true
shared_examples "installing applications for a cluster" do |managed_apps_local_tiller|
RSpec.shared_examples "installing applications for a cluster" do |managed_apps_local_tiller|
before do
stub_feature_flags(managed_apps_local_tiller: managed_apps_local_tiller)
@ -279,7 +279,7 @@ shared_examples "installing applications for a cluster" do |managed_apps_local_t
end
end
shared_examples "installing applications on a cluster" do
RSpec.shared_examples "installing applications on a cluster" do
it_behaves_like "installing applications for a cluster", false
it_behaves_like "installing applications for a cluster", true
end

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Commit > User uses quick actions', :js do
RSpec.describe 'Commit > User uses quick actions', :js do
include Spec::Support::Helpers::Features::NotesHelpers
include RepoHelpers

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Commit > User view commits' do
RSpec.describe 'Commit > User view commits' do
let_it_be(:project) { create(:project, :public, :repository) }
let_it_be(:user) { project.creator }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Commits' do
RSpec.describe 'Commits' do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Contextual sidebar', :js do
RSpec.describe 'Contextual sidebar', :js do
let(:user) { create(:user) }
let(:project) { create(:project) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Value Stream Analytics', :js do
RSpec.describe 'Value Stream Analytics', :js do
let(:user) { create(:user) }
let(:guest) { create(:user) }
let(:project) { create(:project, :repository) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Dashboard > Activity' do
RSpec.describe 'Dashboard > Activity' do
let(:user) { create(:user) }
before do

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Tooltips on .timeago dates', :js do
RSpec.describe 'Tooltips on .timeago dates', :js do
let(:user) { create(:user) }
let(:project) { create(:project, name: 'test', namespace: user.namespace) }
let(:created_date) { Date.yesterday.to_time }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'The group dashboard' do
RSpec.describe 'The group dashboard' do
include ExternalAuthorizationServiceHelpers
let(:user) { create(:user) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Dashboard Groups page', :js do
RSpec.describe 'Dashboard Groups page', :js do
let(:user) { create :user }
let(:group) { create(:group) }
let(:nested_group) { create(:group, :nested) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Showing analytics' do
RSpec.describe 'Showing analytics' do
before do
sign_in user if user
end

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Navigation bar counter', :use_clean_rails_memory_store_caching do
RSpec.describe 'Navigation bar counter', :use_clean_rails_memory_store_caching do
let(:user) { create(:user) }
let(:project) { create(:project, namespace: user.namespace) }
let(:issue) { create(:issue, project: project) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Dashboard Issues filtering', :js do
RSpec.describe 'Dashboard Issues filtering', :js do
include Spec::Support::Helpers::Features::SortingHelpers
include FilteredSearchHelpers

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Dashboard > label filter', :js do
RSpec.describe 'Dashboard > label filter', :js do
include FilteredSearchHelpers
let(:filtered_search) { find('.filtered-search') }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Dashboard Merge Requests' do
RSpec.describe 'Dashboard Merge Requests' do
include Spec::Support::Helpers::Features::SortingHelpers
include FilteredSearchHelpers
include ProjectForksHelper

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Dashboard > Milestones' do
RSpec.describe 'Dashboard > Milestones' do
describe 'as anonymous user' do
before do
visit dashboard_milestones_path

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Project member activity', :js do
RSpec.describe 'Project member activity', :js do
let(:user) { create(:user) }
let(:project) { create(:project, :public, name: 'x', namespace: user.namespace) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Dashboard Projects' do
RSpec.describe 'Dashboard Projects' do
let(:user) { create(:user) }
let(:project) { create(:project, :repository, name: 'awesome stuff') }
let(:project2) { create(:project, :public, name: 'Community project') }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Root explore' do
RSpec.describe 'Root explore' do
let_it_be(:public_project) { create(:project, :public) }
let_it_be(:archived_project) { create(:project, :archived) }
let_it_be(:internal_project) { create(:project, :internal) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Dashboard shortcuts', :js do
RSpec.describe 'Dashboard shortcuts', :js do
context 'logged in' do
let(:user) { create(:user) }
let(:project) { create(:project) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Dashboard snippets' do
RSpec.describe 'Dashboard snippets' do
let_it_be(:user) { create(:user) }
context 'when the project has snippets' do

View File

@ -2,7 +2,7 @@
require 'spec_helper'
describe 'Dashboard > Todo target states' do
RSpec.describe 'Dashboard > Todo target states' do
let(:user) { create(:user) }
let(:author) { create(:user) }
let(:project) { create(:project, :public) }

Some files were not shown because too many files have changed in this diff Show More