Commit cfe77ce4 authored by Douglas Barbosa Alexandre's avatar Douglas Barbosa Alexandre

Merge remote-tracking branch 'origin/master' into...

Merge remote-tracking branch 'origin/master' into camilstaps/gitlab-ce-new-66023-public-private-fork-counts
parents 934d4925 95d16dc0
...@@ -134,6 +134,15 @@ review-stop: ...@@ -134,6 +134,15 @@ review-stop:
artifacts: artifacts:
paths: [] paths: []
review-cleanup-failed-deployment:
extends: review-stop
stage: prepare
when: on_success
needs: []
allow_failure: false
script:
- delete_failed_release
.review-qa-base: .review-qa-base:
extends: extends:
- .review-docker - .review-docker
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
"style": "dash" "style": "dash"
}, },
"line-length": false, "line-length": false,
"commands-show-output": false,
"no-duplicate-header": { "no-duplicate-header": {
"allow_different_nesting": true "allow_different_nesting": true
}, },
......
...@@ -275,3 +275,8 @@ RSpec/BeSuccessMatcher: ...@@ -275,3 +275,8 @@ RSpec/BeSuccessMatcher:
- 'ee/spec/support/shared_examples/controllers/**/*' - 'ee/spec/support/shared_examples/controllers/**/*'
- 'spec/support/controllers/**/*' - 'spec/support/controllers/**/*'
- 'ee/spec/support/controllers/**/*' - 'ee/spec/support/controllers/**/*'
Scalability/FileUploads:
Enabled: true
Include:
- 'lib/api/**/*.rb'
- 'ee/lib/api/**/*.rb'
export default {
data() {
return {
isCustomStageForm: false,
};
},
methods: {
showAddStageForm: () => {},
hideAddStageForm: () => {},
},
};
...@@ -23,7 +23,10 @@ export default { ...@@ -23,7 +23,10 @@ export default {
</script> </script>
<template> <template>
<div :class="{ active: isActive }" class="stage-nav-item d-flex pl-4 pr-4 m-0 mb-1 ml-2 rounded"> <div
:class="{ active: isActive }"
class="stage-nav-item d-flex pl-4 pr-4 m-0 mb-1 ml-2 rounded border-color-default border-style-solid border-width-1px"
>
<slot></slot> <slot></slot>
<div v-if="canEdit" class="dropdown"> <div v-if="canEdit" class="dropdown">
<gl-button <gl-button
......
...@@ -3,6 +3,7 @@ import Vue from 'vue'; ...@@ -3,6 +3,7 @@ import Vue from 'vue';
import Cookies from 'js-cookie'; import Cookies from 'js-cookie';
import { GlEmptyState } from '@gitlab/ui'; import { GlEmptyState } from '@gitlab/ui';
import filterMixins from 'ee_else_ce/analytics/cycle_analytics/mixins/filter_mixins'; import filterMixins from 'ee_else_ce/analytics/cycle_analytics/mixins/filter_mixins';
import addStageMixin from 'ee_else_ce/analytics/cycle_analytics/mixins/add_stage_mixin';
import Flash from '../flash'; import Flash from '../flash';
import { __ } from '~/locale'; import { __ } from '~/locale';
import Translate from '../vue_shared/translate'; import Translate from '../vue_shared/translate';
...@@ -43,8 +44,12 @@ export default () => { ...@@ -43,8 +44,12 @@ export default () => {
DateRangeDropdown: () => DateRangeDropdown: () =>
import('ee_component/analytics/shared/components/date_range_dropdown.vue'), import('ee_component/analytics/shared/components/date_range_dropdown.vue'),
'stage-nav-item': stageNavItem, 'stage-nav-item': stageNavItem,
CustomStageForm: () =>
import('ee_component/analytics/cycle_analytics/components/custom_stage_form.vue'),
AddStageButton: () =>
import('ee_component/analytics/cycle_analytics/components/add_stage_button.vue'),
}, },
mixins: [filterMixins], mixins: [filterMixins, addStageMixin],
data() { data() {
return { return {
store: CycleAnalyticsStore, store: CycleAnalyticsStore,
...@@ -124,6 +129,7 @@ export default () => { ...@@ -124,6 +129,7 @@ export default () => {
return; return;
} }
this.hideAddStageForm();
this.isLoadingStage = true; this.isLoadingStage = true;
this.store.setStageEvents([], stage); this.store.setStageEvents([], stage);
this.store.setActiveStage(stage); this.store.setActiveStage(stage);
......
<script> <script>
import Icon from '~/vue_shared/components/icon.vue';
export default { export default {
components: {
Icon,
},
props: { props: {
name: { name: {
type: String, type: String,
...@@ -15,15 +20,42 @@ export default { ...@@ -15,15 +20,42 @@ export default {
required: true, required: true,
}, },
}, },
data() {
return {
showGroup: true,
};
},
computed: {
caretIcon() {
return this.collapseGroup && this.showGroup ? 'angle-down' : 'angle-right';
},
},
created() {
this.showGroup = this.collapseGroup;
},
methods: {
collapse() {
this.showGroup = !this.showGroup;
},
},
}; };
</script> </script>
<template> <template>
<div v-if="showPanels" class="card prometheus-panel"> <div v-if="showPanels" class="card prometheus-panel">
<div class="card-header"> <div class="card-header d-flex align-items-center">
<h4>{{ name }}</h4> <h4 class="flex-grow-1">{{ name }}</h4>
<a role="button" @click="collapse">
<icon :size="16" :aria-label="__('Toggle collapse')" :name="caretIcon" />
</a>
</div>
<div
v-if="collapseGroup"
v-show="collapseGroup && showGroup"
class="card-body prometheus-graph-group"
>
<slot></slot>
</div> </div>
<div v-if="collapseGroup" class="card-body prometheus-graph-group"><slot></slot></div>
</div> </div>
<div v-else class="prometheus-graph-group"><slot></slot></div> <div v-else class="prometheus-graph-group"><slot></slot></div>
</template> </template>
...@@ -67,18 +67,14 @@ export default { ...@@ -67,18 +67,14 @@ export default {
saveAssignees() { saveAssignees() {
this.loading = true; this.loading = true;
function setLoadingFalse() {
this.loading = false;
}
this.mediator this.mediator
.saveAssignees(this.field) .saveAssignees(this.field)
.then(setLoadingFalse.bind(this))
.then(() => { .then(() => {
this.loading = false;
refreshUserMergeRequestCounts(); refreshUserMergeRequestCounts();
}) })
.catch(() => { .catch(() => {
setLoadingFalse(); this.loading = false;
return new Flash(__('Error occurred when saving assignees')); return new Flash(__('Error occurred when saving assignees'));
}); });
}, },
......
import Vue from 'vue'; import axios from '~/lib/utils/axios_utils';
import VueResource from 'vue-resource';
Vue.use(VueResource);
export default class SidebarService { export default class SidebarService {
constructor(endpointMap) { constructor(endpointMap) {
...@@ -18,23 +15,15 @@ export default class SidebarService { ...@@ -18,23 +15,15 @@ export default class SidebarService {
} }
get() { get() {
return Vue.http.get(this.endpoint); return axios.get(this.endpoint);
} }
update(key, data) { update(key, data) {
return Vue.http.put( return axios.put(this.endpoint, { [key]: data });
this.endpoint,
{
[key]: data,
},
{
emulateJSON: true,
},
);
} }
getProjectsAutocomplete(searchTerm) { getProjectsAutocomplete(searchTerm) {
return Vue.http.get(this.projectsAutocompleteEndpoint, { return axios.get(this.projectsAutocompleteEndpoint, {
params: { params: {
search: searchTerm, search: searchTerm,
}, },
...@@ -42,11 +31,11 @@ export default class SidebarService { ...@@ -42,11 +31,11 @@ export default class SidebarService {
} }
toggleSubscription() { toggleSubscription() {
return Vue.http.post(this.toggleSubscriptionEndpoint); return axios.post(this.toggleSubscriptionEndpoint);
} }
moveIssue(moveToProjectId) { moveIssue(moveToProjectId) {
return Vue.http.post(this.moveIssueEndpoint, { return axios.post(this.moveIssueEndpoint, {
move_to_project_id: moveToProjectId, move_to_project_id: moveToProjectId,
}); });
} }
......
...@@ -32,7 +32,10 @@ export default class SidebarMediator { ...@@ -32,7 +32,10 @@ export default class SidebarMediator {
// If there are no ids, that means we have to unassign (which is id = 0) // If there are no ids, that means we have to unassign (which is id = 0)
// And it only accepts an array, hence [0] // And it only accepts an array, hence [0]
return this.service.update(field, selected.length === 0 ? [0] : selected); const assignees = selected.length === 0 ? [0] : selected;
const data = { assignee_ids: assignees };
return this.service.update(field, data);
} }
setMoveToProjectId(projectId) { setMoveToProjectId(projectId) {
...@@ -42,8 +45,7 @@ export default class SidebarMediator { ...@@ -42,8 +45,7 @@ export default class SidebarMediator {
fetch() { fetch() {
return this.service return this.service
.get() .get()
.then(response => response.json()) .then(({ data }) => {
.then(data => {
this.processFetchedData(data); this.processFetchedData(data);
}) })
.catch(() => new Flash(__('Error occurred when fetching sidebar data'))); .catch(() => new Flash(__('Error occurred when fetching sidebar data')));
...@@ -71,20 +73,14 @@ export default class SidebarMediator { ...@@ -71,20 +73,14 @@ export default class SidebarMediator {
} }
fetchAutocompleteProjects(searchTerm) { fetchAutocompleteProjects(searchTerm) {
return this.service return this.service.getProjectsAutocomplete(searchTerm).then(({ data }) => {
.getProjectsAutocomplete(searchTerm)
.then(response => response.json())
.then(data => {
this.store.setAutocompleteProjects(data); this.store.setAutocompleteProjects(data);
return this.store.autocompleteProjects; return this.store.autocompleteProjects;
}); });
} }
moveIssue() { moveIssue() {
return this.service return this.service.moveIssue(this.store.moveToProjectId).then(({ data }) => {
.moveIssue(this.store.moveToProjectId)
.then(response => response.json())
.then(data => {
if (window.location.pathname !== data.web_url) { if (window.location.pathname !== data.web_url) {
visitUrl(data.web_url); visitUrl(data.web_url);
} }
......
...@@ -67,6 +67,18 @@ ...@@ -67,6 +67,18 @@
max-height: calc(100vh - 100px); max-height: calc(100vh - 100px);
} }
details {
margin-bottom: $gl-padding;
summary {
margin-bottom: $gl-padding;
}
*:first-child:not(summary) {
margin-top: $gl-padding;
}
}
// Single code lines should wrap // Single code lines should wrap
code { code {
font-family: $monospace-font; font-family: $monospace-font;
......
...@@ -41,7 +41,6 @@ ...@@ -41,7 +41,6 @@
width: 20%; width: 20%;
} }
.fa { .fa {
color: $cycle-analytics-light-gray; color: $cycle-analytics-light-gray;
...@@ -146,7 +145,6 @@ ...@@ -146,7 +145,6 @@
.stage-nav-item { .stage-nav-item {
line-height: 65px; line-height: 65px;
border: 1px solid $border-color;
&.active { &.active {
background: $blue-50; background: $blue-50;
......
...@@ -24,12 +24,16 @@ ...@@ -24,12 +24,16 @@
.settings { .settings {
// border-top for each item except the top one // border-top for each item except the top one
+ .settings {
border-top: 1px solid $border-color; border-top: 1px solid $border-color;
}
&:first-of-type { &:first-of-type {
margin-top: 10px; margin-top: 10px;
border: 0;
}
+ div .settings:first-of-type {
margin-top: 0;
border-top: 1px solid $border-color;
} }
&.animating { &.animating {
......
...@@ -15,3 +15,9 @@ ...@@ -15,3 +15,9 @@
font-size: $size; font-size: $size;
} }
} }
.border-width-1px { border-width: 1px; }
.border-style-dashed { border-style: dashed; }
.border-style-solid { border-style: solid; }
.border-color-blue-300 { border-color: $blue-300; }
.border-color-default { border-color: $border-color; }
...@@ -103,7 +103,7 @@ module EventsHelper ...@@ -103,7 +103,7 @@ module EventsHelper
words << "at" words << "at"
end end
words << event.project_name words << event.resource_parent_name
words.join(" ") words.join(" ")
end end
...@@ -223,3 +223,5 @@ module EventsHelper ...@@ -223,3 +223,5 @@ module EventsHelper
end end
end end
end end
EventsHelper.prepend_if_ee('EE::EventsHelper')
# frozen_string_literal: true
module ReleasesHelper
IMAGE_PATH = 'illustrations/releases.svg'
DOCUMENTATION_PATH = 'user/project/releases/index'
def illustration
image_path(IMAGE_PATH)
end
def help_page
help_page_path(DOCUMENTATION_PATH)
end
def url_for_merge_requests
project_merge_requests_url(@project, params_for_issue_and_mr_paths)
end
def url_for_issues
project_issues_url(@project, params_for_issue_and_mr_paths)
end
def data_for_releases_page
{
project_id: @project.id,
illustration_path: illustration,
documentation_path: help_page,
merge_requests_url: url_for_merge_requests,
issues_url: url_for_issues
}
end
private
def params_for_issue_and_mr_paths
{ scope: 'all', state: 'opened' }
end
end
...@@ -31,15 +31,6 @@ class ApplicationSetting < ApplicationRecord ...@@ -31,15 +31,6 @@ class ApplicationSetting < ApplicationRecord
serialize :repository_storages # rubocop:disable Cop/ActiveRecordSerialize serialize :repository_storages # rubocop:disable Cop/ActiveRecordSerialize
serialize :asset_proxy_whitelist, Array # rubocop:disable Cop/ActiveRecordSerialize serialize :asset_proxy_whitelist, Array # rubocop:disable Cop/ActiveRecordSerialize
self.ignored_columns += %i[
clientside_sentry_dsn
clientside_sentry_enabled
koding_enabled
koding_url
sentry_dsn
sentry_enabled
]
cache_markdown_field :sign_in_text cache_markdown_field :sign_in_text
cache_markdown_field :help_page_text cache_markdown_field :help_page_text
cache_markdown_field :shared_runners_text, pipeline: :plain_markdown cache_markdown_field :shared_runners_text, pipeline: :plain_markdown
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
class Event < ApplicationRecord class Event < ApplicationRecord
include Sortable include Sortable
include FromUnion include FromUnion
include Presentable
default_scope { reorder(nil) } default_scope { reorder(nil) }
CREATED = 1 CREATED = 1
...@@ -135,6 +137,10 @@ class Event < ApplicationRecord ...@@ -135,6 +137,10 @@ class Event < ApplicationRecord
end end
end end
def present
super(presenter_class: ::EventPresenter)
end
# rubocop:disable Metrics/CyclomaticComplexity # rubocop:disable Metrics/CyclomaticComplexity
# rubocop:disable Metrics/PerceivedComplexity # rubocop:disable Metrics/PerceivedComplexity
def visible_to_user?(user = nil) def visible_to_user?(user = nil)
...@@ -161,12 +167,8 @@ class Event < ApplicationRecord ...@@ -161,12 +167,8 @@ class Event < ApplicationRecord
# rubocop:enable Metrics/PerceivedComplexity # rubocop:enable Metrics/PerceivedComplexity
# rubocop:enable Metrics/CyclomaticComplexity # rubocop:enable Metrics/CyclomaticComplexity
def project_name def resource_parent
if project project || group
project.full_name
else
"(deleted project)"
end
end end
def target_title def target_title
......
...@@ -33,8 +33,6 @@ class Note < ApplicationRecord ...@@ -33,8 +33,6 @@ class Note < ApplicationRecord
end end
end end
self.ignored_columns += %i[original_discussion_id]
cache_markdown_field :note, pipeline: :note, issuable_state_filter_enabled: true cache_markdown_field :note, pipeline: :note, issuable_state_filter_enabled: true
redact_field :note redact_field :note
......
# frozen_string_literal: true # frozen_string_literal: true
class NotificationSetting < ApplicationRecord class NotificationSetting < ApplicationRecord
self.ignored_columns += %i[events]
enum level: { global: 3, watch: 2, participating: 1, mention: 4, disabled: 0, custom: 5 } enum level: { global: 3, watch: 2, participating: 1, mention: 4, disabled: 0, custom: 5 }
default_value_for :level, NotificationSetting.levels[:global] default_value_for :level, NotificationSetting.levels[:global]
......
...@@ -1134,6 +1134,10 @@ class Repository ...@@ -1134,6 +1134,10 @@ class Repository
@cache ||= Gitlab::RepositoryCache.new(self) @cache ||= Gitlab::RepositoryCache.new(self)
end end
def redis_set_cache
@redis_set_cache ||= Gitlab::RepositorySetCache.new(self)
end
def request_store_cache def request_store_cache
@request_store_cache ||= Gitlab::RepositoryCache.new(self, backend: Gitlab::SafeRequestStore) @request_store_cache ||= Gitlab::RepositoryCache.new(self, backend: Gitlab::SafeRequestStore)
end end
......
...@@ -23,12 +23,6 @@ class User < ApplicationRecord ...@@ -23,12 +23,6 @@ class User < ApplicationRecord
DEFAULT_NOTIFICATION_LEVEL = :participating DEFAULT_NOTIFICATION_LEVEL = :participating
self.ignored_columns += %i[
authentication_token
email_provider
external_email
]
add_authentication_token_field :incoming_email_token, token_generator: -> { SecureRandom.hex.to_i(16).to_s(36) } add_authentication_token_field :incoming_email_token, token_generator: -> { SecureRandom.hex.to_i(16).to_s(36) }
add_authentication_token_field :feed_token add_authentication_token_field :feed_token
......
# frozen_string_literal: true
class EventPresenter < Gitlab::View::Presenter::Delegated
presents :event
def resource_parent_name
resource_parent&.full_name || ''
end
def target_link_options
case resource_parent
when Group
[event.group, event.target]
when Project
[event.project.namespace.becomes(Namespace), event.project, event.target]
else
''
end
end
end
...@@ -33,7 +33,8 @@ module MergeRequests ...@@ -33,7 +33,8 @@ module MergeRequests
merge_request.assign_attributes(params.to_h.compact) merge_request.assign_attributes(params.to_h.compact)
merge_request.compare_commits = [] merge_request.compare_commits = []
merge_request.target_branch = find_target_branch set_merge_request_target_branch
merge_request.can_be_created = projects_and_branches_valid? merge_request.can_be_created = projects_and_branches_valid?
# compare branches only if branches are valid, otherwise # compare branches only if branches are valid, otherwise
...@@ -93,8 +94,12 @@ module MergeRequests ...@@ -93,8 +94,12 @@ module MergeRequests
project_from_params project_from_params
end end
def find_target_branch def set_merge_request_target_branch
target_branch || target_project.default_branch if source_branch_default? && !target_branch_specified?
merge_request.target_branch = nil
else
merge_request.target_branch ||= target_project.default_branch
end
end end
def source_branch_specified? def source_branch_specified?
...@@ -149,7 +154,15 @@ module MergeRequests ...@@ -149,7 +154,15 @@ module MergeRequests
end end
def same_source_and_target? def same_source_and_target?
source_project == target_project && target_branch == source_branch same_source_and_target_project? && target_branch == source_branch
end
def source_branch_default?
same_source_and_target_project? && source_branch == target_project.default_branch
end
def same_source_and_target_project?
source_project == target_project
end end
def source_branch_exists? def source_branch_exists?
......
return unless event.visible_to_user?(current_user) return unless event.visible_to_user?(current_user)
event = event.present
xml.entry do xml.entry do
xml.id "tag:#{request.host},#{event.created_at.strftime("%Y-%m-%d")}:#{event.id}" xml.id "tag:#{request.host},#{event.created_at.strftime("%Y-%m-%d")}:#{event.id}"
xml.link href: event_feed_url(event) xml.link href: event_feed_url(event)
......
- event = event.present
- if event.visible_to_user?(current_user) - if event.visible_to_user?(current_user)
.event-item .event-item
.event-item-timestamp .event-item-timestamp
......
...@@ -2,6 +2,5 @@ ...@@ -2,6 +2,5 @@
= event_preposition(event) = event_preposition(event)
- if event.project - if event.project
= link_to_project(event.project) = link_to_project(event.project)
- else - elsif event.group
= event.project_name = link_to event.resource_parent_name, group_path(event.group)
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
%span.event-type.d-inline-block.append-right-4{ class: event.action_name } %span.event-type.d-inline-block.append-right-4{ class: event.action_name }
= event.action_name = event.action_name
%span.event-target-type.append-right-4= event.target_type.titleize.downcase %span.event-target-type.append-right-4= event.target_type.titleize.downcase
= link_to [event.project.namespace.becomes(Namespace), event.project, event.target], class: 'has-tooltip event-target-link append-right-4', title: event.target_title do = link_to event.target_link_options, class: 'has-tooltip event-target-link append-right-4', title: event.target_title do
= event.target.reference_link_text = event.target.reference_link_text
- unless event.milestone? - unless event.milestone?
%span.event-target-title.append-right-4{ dir: "auto" } %span.event-target-title.append-right-4{ dir: "auto" }
...@@ -17,4 +17,4 @@ ...@@ -17,4 +17,4 @@
%span.event-type.d-inline-block.append-right-4{ class: event.action_name } %span.event-type.d-inline-block.append-right-4{ class: event.action_name }
= event_action_name(event) = event_action_name(event)
= render "events/event_scope", event: event = render "events/event_scope", event: event if event.resource_parent.present?
...@@ -10,4 +10,4 @@ ...@@ -10,4 +10,4 @@
- if event.project - if event.project
= link_to_project(event.project) = link_to_project(event.project)
- else - else
= event.project_name = event.resource_parent_name
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
selected: f.object.target_project_id selected: f.object.target_project_id
.merge-request-select.dropdown .merge-request-select.dropdown
= f.hidden_field :target_branch = f.hidden_field :target_branch
= dropdown_toggle f.object.target_branch, { toggle: "dropdown", 'field-name': "#{f.object_name}[target_branch]", 'refs-url': refs_project_path(f.object.target_project), selected: f.object.target_branch }, { toggle_class: "js-compare-dropdown js-target-branch monospace" } = dropdown_toggle f.object.target_branch || _("Select target branch"), { toggle: "dropdown", 'field-name': "#{f.object_name}[target_branch]", 'refs-url': refs_project_path(f.object.target_project), selected: f.object.target_branch }, { toggle_class: "js-compare-dropdown js-target-branch monospace" }
.dropdown-menu.dropdown-menu-selectable.js-target-branch-dropdown.git-revision-dropdown .dropdown-menu.dropdown-menu-selectable.js-target-branch-dropdown.git-revision-dropdown
= dropdown_title(_("Select target branch")) = dropdown_title(_("Select target branch"))
= dropdown_filter(_("Search branches")) = dropdown_filter(_("Search branches"))
......
- page_title _('Releases') - page_title _('Releases')
#js-releases-page{ data: { project_id: @project.id, illustration_path: image_path('illustrations/releases.svg'), documentation_path: help_page_path('user/project/releases/index') } } #js-releases-page{ data: data_for_releases_page }
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
= link_to _('Edit'), '#', class: 'js-sidebar-dropdown-toggle edit-link float-right', data: { track_label: "right_sidebar", track_property: "milestone", track_event: "click_edit_button", track_value: "" } = link_to _('Edit'), '#', class: 'js-sidebar-dropdown-toggle edit-link float-right', data: { track_label: "right_sidebar", track_property: "milestone", track_event: "click_edit_button", track_value: "" }
.value.hide-collapsed .value.hide-collapsed
- if milestone.present? - if milestone.present?
= link_to milestone[:title], milestone[:web_url], class: "bold has-tooltip", title: sidebar_milestone_remaining_days(milestone), data: { container: "body", html: 'true', boundary: 'viewport' } = link_to milestone[:title], milestone[:web_url], class: "bold has-tooltip", title: sidebar_milestone_remaining_days(milestone), data: { container: "body", html: 'true', boundary: 'viewport', qa_selector: 'milestone_link' }
- else - else
%span.no-value %span.no-value
= _('None') = _('None')
......
- issuable_type = issuable_sidebar[:type] - issuable_type = issuable_sidebar[:type]
- signed_in = !!issuable_sidebar.dig(:current_user, :id) - signed_in = !!issuable_sidebar.dig(:current_user, :id)
#js-vue-sidebar-assignees{ data: { field: "#{issuable_type}[assignee_ids]", signed_in: signed_in } } #js-vue-sidebar-assignees{ data: { field: "#{issuable_type}", signed_in: signed_in } }
.title.hide-collapsed .title.hide-collapsed
= _('Assignee') = _('Assignee')
= icon('spinner spin') = icon('spinner spin')
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
- if event.project - if event.project
= link_to_project(event.project) = link_to_project(event.project)
- else - else
= event.project_name = event.resource_parent_name
- else - else
made a private contribution made a private contribution
- else - else
......
---
title: Add some padding to details markdown element
merge_request: 32716
author:
type: fixed
---
title: Mention in docs how to disable project snippets
merge_request: 32391
author: Jacopo Beschi @jacopo-beschi
type: other
---
title: Avoid prefilling target branch when source branch is the default one
merge_request: 32701
author:
type: other
---
title: Expose 'protected' field for Tag API endpoint.
merge_request: 32790
author: Andrea Leone
type: added
---
title: Add caret icons to the monitoring dashboard
merge_request: 32239
author:
type: changed
---
title: Remove vue resource from sidebar service
merge_request: 32400
author: Lee Tickett
type: other
...@@ -342,7 +342,7 @@ production: &base ...@@ -342,7 +342,7 @@ production: &base
## Sidekiq ## Sidekiq
sidekiq: sidekiq:
log_format: default # (json is also supported) log_format: json # (default is the original format)
## Auxiliary jobs ## Auxiliary jobs
# Periodically executed jobs, to self-heal GitLab, do external synchronizations, etc. # Periodically executed jobs, to self-heal GitLab, do external synchronizations, etc.
......
...@@ -60,7 +60,7 @@ Sidekiq.configure_server do |config| ...@@ -60,7 +60,7 @@ Sidekiq.configure_server do |config|
# Sidekiq (e.g. in an initializer). # Sidekiq (e.g. in an initializer).
ActiveRecord::Base.clear_all_connections! ActiveRecord::Base.clear_all_connections!
Gitlab::SidekiqMonitor.instance.start if enable_sidekiq_monitor Gitlab::SidekiqDaemon::Monitor.instance.start if enable_sidekiq_monitor
end end
if enable_reliable_fetch? if enable_reliable_fetch?
......
...@@ -65,7 +65,7 @@ scope format: false do ...@@ -65,7 +65,7 @@ scope format: false do
resources :protected_tags, only: [:index, :show, :create, :update, :destroy] resources :protected_tags, only: [:index, :show, :create, :update, :destroy]
end end
scope constraints: { id: /.+/ } do scope constraints: { id: /[^\0]+/ } do
scope controller: :blob do scope controller: :blob do
get '/new/*id', action: :new, as: :new_blob get '/new/*id', action: :new, as: :new_blob
post '/create/*id', action: :create, as: :create_blob post '/create/*id', action: :create, as: :create_blob
......
...@@ -116,3 +116,4 @@ ...@@ -116,3 +116,4 @@
- [incident_management, 2] - [incident_management, 2]
- [jira_connect, 1] - [jira_connect, 1]
- [update_external_pull_requests, 3] - [update_external_pull_requests, 3]
- [refresh_license_compliance_checks, 2]
...@@ -88,9 +88,36 @@ def lint_commit(commit) # rubocop:disable Metrics/AbcSize ...@@ -88,9 +88,36 @@ def lint_commit(commit) # rubocop:disable Metrics/AbcSize
# We ignore revert commits as they are well structured by Git already # We ignore revert commits as they are well structured by Git already
return false if commit.message.start_with?('Revert "') return false if commit.message.start_with?('Revert "')
is_squash = gitlab.mr_json['squash']
is_wip = gitlab.mr_json['work_in_progress']
is_fixup = commit.message.start_with?('fixup!', 'squash!')
if is_fixup
# The MR is set to squash - Danger adds an informative notice
# The MR is not set to squash - Danger fails. if also WIP warn only, not error
if is_squash
return false
end
if is_wip
warn_commit(
commit,
'Squash or Fixup commits must be squashed before merge, or enable squash merge option'
)
else
fail_commit(
commit,
'Squash or Fixup commits must be squashed before merge, or enable squash merge option'
)
end
# Makes no sense to process other rules for fixup commits, they trigger just more noise
return false
end
# Fail if a suggestion commit is used and squash is not enabled # Fail if a suggestion commit is used and squash is not enabled
if commit.message.start_with?('Apply suggestion to') if commit.message.start_with?('Apply suggestion to')
if gitlab.mr_json['squash'] if is_squash
return false return false
else else
fail_commit( fail_commit(
......
# frozen_string_literal: true # frozen_string_literal: true
class AddGroupColumnToEvents < ActiveRecord::Migration[5.2] class AddGroupColumnToEvents < ActiveRecord::Migration[5.2]
include Gitlab::Database::MigrationHelpers
DOWNTIME = false DOWNTIME = false
def change disable_ddl_transaction!
add_reference :events, :group, index: true, foreign_key: { to_table: :namespaces, on_delete: :cascade }
def up
add_column(:events, :group_id, :bigint) unless column_exists?(:events, :group_id)
add_concurrent_index(:events, :group_id)
add_concurrent_foreign_key(:events, :namespaces, column: :group_id, on_delete: :cascade)
end
def down
remove_column(:events, :group_id) if column_exists?(:events, :group_id)
end end
end end
...@@ -3864,7 +3864,7 @@ ActiveRecord::Schema.define(version: 2019_09_05_223900) do ...@@ -3864,7 +3864,7 @@ ActiveRecord::Schema.define(version: 2019_09_05_223900) do
add_foreign_key "epics", "users", column: "assignee_id", name: "fk_dccd3f98fc", on_delete: :nullify add_foreign_key "epics", "users", column: "assignee_id", name: "fk_dccd3f98fc", on_delete: :nullify
add_foreign_key "epics", "users", column: "author_id", name: "fk_3654b61b03", on_delete: :cascade add_foreign_key "epics", "users", column: "author_id", name: "fk_3654b61b03", on_delete: :cascade
add_foreign_key "epics", "users", column: "closed_by_id", name: "fk_aa5798e761", on_delete: :nullify add_foreign_key "epics", "users", column: "closed_by_id", name: "fk_aa5798e761", on_delete: :nullify
add_foreign_key "events", "namespaces", column: "group_id", on_delete: :cascade add_foreign_key "events", "namespaces", column: "group_id", name: "fk_61fbf6ca48", on_delete: :cascade
add_foreign_key "events", "projects", on_delete: :cascade add_foreign_key "events", "projects", on_delete: :cascade
add_foreign_key "events", "users", column: "author_id", name: "fk_edfd187b6f", on_delete: :cascade add_foreign_key "events", "users", column: "author_id", name: "fk_edfd187b6f", on_delete: :cascade
add_foreign_key "external_pull_requests", "projects", on_delete: :cascade add_foreign_key "external_pull_requests", "projects", on_delete: :cascade
......
...@@ -104,6 +104,7 @@ Learn how to install, configure, update, and maintain your GitLab instance. ...@@ -104,6 +104,7 @@ Learn how to install, configure, update, and maintain your GitLab instance.
## User settings and permissions ## User settings and permissions
- [Creating users](../user/profile/account/create_accounts.md): Create users manually or through authentication integrations.
- [Libravatar](../customization/libravatar.md): Use Libravatar instead of Gravatar for user avatars. - [Libravatar](../customization/libravatar.md): Use Libravatar instead of Gravatar for user avatars.
- [Sign-up restrictions](../user/admin_area/settings/sign_up_restrictions.md): block email addresses of specific domains, or whitelist only specific domains. - [Sign-up restrictions](../user/admin_area/settings/sign_up_restrictions.md): block email addresses of specific domains, or whitelist only specific domains.
- [Access restrictions](../user/admin_area/settings/visibility_and_access_controls.md#enabled-git-access-protocols): Define which Git access protocols can be used to talk to GitLab (SSH, HTTP, HTTPS). - [Access restrictions](../user/admin_area/settings/visibility_and_access_controls.md#enabled-git-access-protocols): Define which Git access protocols can be used to talk to GitLab (SSH, HTTP, HTTPS).
......
...@@ -10,7 +10,7 @@ that can be: ...@@ -10,7 +10,7 @@ that can be:
- Mounted to the local disk - Mounted to the local disk
- Exposed as an NFS shared volume - Exposed as an NFS shared volume
- Acessed via [gitaly] on its own machine. - Accessed via [gitaly] on its own machine.
In GitLab, this is configured in `/etc/gitlab/gitlab.rb` by the `git_data_dirs({})` In GitLab, this is configured in `/etc/gitlab/gitlab.rb` by the `git_data_dirs({})`
configuration hash. The storage layouts discussed here will apply to any shard configuration hash. The storage layouts discussed here will apply to any shard
......
...@@ -11,29 +11,56 @@ S/MIME signs and/or encrypts the message itself ...@@ -11,29 +11,56 @@ S/MIME signs and/or encrypts the message itself
## Enable S/MIME signing ## Enable S/MIME signing
This setting must be explicitly enabled and a single pair of key and certificate This setting must be explicitly enabled and a single pair of key and certificate
files must be provided in `gitlab.rb` or `gitlab.yml` if you are using Omnibus files must be provided:
GitLab or installed GitLab from source respectively:
```yaml - Both files must be PEM-encoded.
email_smime: - The key file must be unencrypted so that GitLab can read it without user
intervention.
- Only RSA keys are supported.
NOTE: **Note:** Be mindful of the access levels for your private keys and visibility to
third parties.
**For Omnibus installations:**
1. Edit `/etc/gitlab/gitlab.rb` and adapt the file paths:
```ruby
gitlab_rails['gitlab_email_smime_enabled'] = true
gitlab_rails['gitlab_email_smime_key_file'] = '/etc/gitlab/ssl/gitlab_smime.key'
gitlab_rails['gitlab_email_smime_cert_file'] = '/etc/gitlab/ssl/gitlab_smime.crt'
```
1. Save the file and [reconfigure GitLab](restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
NOTE: **Note:** The key needs to be readable by the GitLab system user (`git` by default).
**For installations from source:**
1. Edit `config/gitlab.yml`:
```yaml
email_smime:
# Uncomment and set to true if you need to enable email S/MIME signing (default: false)
enabled: true enabled: true
# S/MIME private key file in PEM format, unencrypted
# Default is '.gitlab_smime_key' relative to Rails.root (i.e. root of the GitLab app).
key_file: /etc/pki/smime/private/gitlab.key key_file: /etc/pki/smime/private/gitlab.key
# S/MIME public certificate key in PEM format, will be attached to signed messages
# Default is '.gitlab_smime_cert' relative to Rails.root (i.e. root of the GitLab app).
cert_file: /etc/pki/smime/certs/gitlab.crt cert_file: /etc/pki/smime/certs/gitlab.crt
``` ```
- Both files must be provided PEM-encoded. 1. Save the file and [restart GitLab](restart_gitlab.md#installations-from-source) for the changes to take effect.
- The key file must be unencrypted so that Gitlab can read it without user
intervention.
NOTE: **Note:** Be mindful of the access levels for your private keys and visibility to NOTE: **Note:** The key needs to be readable by the GitLab system user (`git` by default).
third parties.
### How to convert S/MIME PKCS#12 / PFX format to PEM encoding ### How to convert S/MIME PKCS#12 / PFX format to PEM encoding
Typically S/MIME certificates are handled in binary PKCS#12 format (`.pfx` or `.p12` Typically S/MIME certificates are handled in binary PKCS#12 format (`.pfx` or `.p12`
extensions), which contain the following in a single encrypted file: extensions), which contain the following in a single encrypted file:
- Server certificate - Public certificate
- Intermediate certificates (if any) - Intermediate certificates (if any)
- Private key - Private key
......
...@@ -270,7 +270,7 @@ is interrupted mid-execution and it is not guaranteed ...@@ -270,7 +270,7 @@ is interrupted mid-execution and it is not guaranteed
that proper rollback of transactions is implemented. that proper rollback of transactions is implemented.
```ruby ```ruby
Gitlab::SidekiqMonitor.cancel_job('job-id') Gitlab::SidekiqDaemon::Monitor.cancel_job('job-id')
``` ```
> This requires the Sidekiq to be run with `SIDEKIQ_MONITOR_WORKER=1` > This requires the Sidekiq to be run with `SIDEKIQ_MONITOR_WORKER=1`
......
...@@ -929,7 +929,7 @@ POST /projects ...@@ -929,7 +929,7 @@ POST /projects
| `ci_config_path` | string | no | The path to CI config file | | `ci_config_path` | string | no | The path to CI config file |
| `auto_devops_enabled` | boolean | no | Enable Auto DevOps for this project | | `auto_devops_enabled` | boolean | no | Enable Auto DevOps for this project |
| `auto_devops_deploy_strategy` | string | no | Auto Deploy strategy (`continuous`, `manual` or `timed_incremental`) | | `auto_devops_deploy_strategy` | string | no | Auto Deploy strategy (`continuous`, `manual` or `timed_incremental`) |
| `repository_storage` | string | no | Which storage shard the repository is on. Available only to admins | | `repository_storage` | string | no | **(STARTER ONLY)** Which storage shard the repository is on. Available only to admins |
| `approvals_before_merge` | integer | no | **(STARTER)** How many approvers should approve merge requests by default | | `approvals_before_merge` | integer | no | **(STARTER)** How many approvers should approve merge requests by default |
| `mirror` | boolean | no | **(STARTER)** Enables pull mirroring in a project | | `mirror` | boolean | no | **(STARTER)** Enables pull mirroring in a project |
| `mirror_trigger_builds` | boolean | no | **(STARTER)** Pull mirroring triggers builds | | `mirror_trigger_builds` | boolean | no | **(STARTER)** Pull mirroring triggers builds |
...@@ -986,7 +986,7 @@ POST /projects/user/:user_id ...@@ -986,7 +986,7 @@ POST /projects/user/:user_id
| `ci_config_path` | string | no | The path to CI config file | | `ci_config_path` | string | no | The path to CI config file |
| `auto_devops_enabled` | boolean | no | Enable Auto DevOps for this project | | `auto_devops_enabled` | boolean | no | Enable Auto DevOps for this project |
| `auto_devops_deploy_strategy` | string | no | Auto Deploy strategy (`continuous`, `manual` or `timed_incremental`) | | `auto_devops_deploy_strategy` | string | no | Auto Deploy strategy (`continuous`, `manual` or `timed_incremental`) |
| `repository_storage` | string | no | Which storage shard the repository is on. Available only to admins | | `repository_storage` | string | no | **(STARTER ONLY)** Which storage shard the repository is on. Available only to admins |
| `approvals_before_merge` | integer | no | **(STARTER)** How many approvers should approve merge requests by default | | `approvals_before_merge` | integer | no | **(STARTER)** How many approvers should approve merge requests by default |
| `external_authorization_classification_label` | string | no | **(PREMIUM)** The classification label for the project | | `external_authorization_classification_label` | string | no | **(PREMIUM)** The classification label for the project |
| `mirror` | boolean | no | **(STARTER)** Enables pull mirroring in a project | | `mirror` | boolean | no | **(STARTER)** Enables pull mirroring in a project |
...@@ -1043,7 +1043,7 @@ PUT /projects/:id ...@@ -1043,7 +1043,7 @@ PUT /projects/:id
| `ci_default_git_depth` | integer | no | Default number of revisions for [shallow cloning](../user/project/pipelines/settings.md#git-shallow-clone) | | `ci_default_git_depth` | integer | no | Default number of revisions for [shallow cloning](../user/project/pipelines/settings.md#git-shallow-clone) |
| `auto_devops_enabled` | boolean | no | Enable Auto DevOps for this project | | `auto_devops_enabled` | boolean | no | Enable Auto DevOps for this project |
| `auto_devops_deploy_strategy` | string | no | Auto Deploy strategy (`continuous`, `manual` or `timed_incremental`) | | `auto_devops_deploy_strategy` | string | no | Auto Deploy strategy (`continuous`, `manual` or `timed_incremental`) |
| `repository_storage` | string | no | Which storage shard the repository is on. Available only to admins | | `repository_storage` | string | no | **(STARTER ONLY)** Which storage shard the repository is on. Available only to admins |
| `approvals_before_merge` | integer | no | **(STARTER)** How many approvers should approve merge request by default | | `approvals_before_merge` | integer | no | **(STARTER)** How many approvers should approve merge request by default |
| `external_authorization_classification_label` | string | no | **(PREMIUM)** The classification label for the project | | `external_authorization_classification_label` | string | no | **(PREMIUM)** The classification label for the project |
| `mirror` | boolean | no | **(STARTER)** Enables pull mirroring in a project | | `mirror` | boolean | no | **(STARTER)** Enables pull mirroring in a project |
......
...@@ -46,7 +46,8 @@ Parameters: ...@@ -46,7 +46,8 @@ Parameters:
}, },
"name": "v1.0.0", "name": "v1.0.0",
"target": "2695effb5807a22ff3d138d593fd856244e155e7", "target": "2695effb5807a22ff3d138d593fd856244e155e7",
"message": null "message": null,
"protected": true
} }
] ]
``` ```
...@@ -94,7 +95,8 @@ Example Response: ...@@ -94,7 +95,8 @@ Example Response:
"committer_email": "contact@arthurverschaeve.be", "committer_email": "contact@arthurverschaeve.be",
"committed_date": "2015-02-01T21:56:31.000+01:00" "committed_date": "2015-02-01T21:56:31.000+01:00"
}, },
"release": null "release": null,
"protected": false
} }
``` ```
...@@ -138,7 +140,8 @@ Parameters: ...@@ -138,7 +140,8 @@ Parameters:
}, },
"name": "v1.0.0", "name": "v1.0.0",
"target": "2695effb5807a22ff3d138d593fd856244e155e7", "target": "2695effb5807a22ff3d138d593fd856244e155e7",
"message": null "message": null,
"protected": false
} }
``` ```
......
...@@ -100,6 +100,7 @@ future GitLab releases.** ...@@ -100,6 +100,7 @@ future GitLab releases.**
| `CI_RUNNER_REVISION` | all | 10.6 | GitLab Runner revision that is executing the current job | | `CI_RUNNER_REVISION` | all | 10.6 | GitLab Runner revision that is executing the current job |
| `CI_RUNNER_TAGS` | 8.10 | 0.5 | The defined runner tags | | `CI_RUNNER_TAGS` | 8.10 | 0.5 | The defined runner tags |
| `CI_RUNNER_VERSION` | all | 10.6 | GitLab Runner version that is executing the current job | | `CI_RUNNER_VERSION` | all | 10.6 | GitLab Runner version that is executing the current job |
| `CI_RUNNER_SHORT_TOKEN` | all | 12.3 | First eight characters of GitLab Runner's token used to authenticate new job requests. Used as Runner's unique ID |
| `CI_SERVER` | all | all | Mark that job is executed in CI environment | | `CI_SERVER` | all | all | Mark that job is executed in CI environment |
| `CI_SERVER_HOST` | 12.1 | all | Host component of the GitLab instance URL, without protocol and port (like gitlab.example.com) | | `CI_SERVER_HOST` | 12.1 | all | Host component of the GitLab instance URL, without protocol and port (like gitlab.example.com) |
| `CI_SERVER_NAME` | all | all | The name of CI server that is used to coordinate jobs | | `CI_SERVER_NAME` | all | all | The name of CI server that is used to coordinate jobs |
......
...@@ -99,7 +99,7 @@ automatically. ...@@ -99,7 +99,7 @@ automatically.
Its simplest usage is to provide the value for `title`: Its simplest usage is to provide the value for `title`:
```text ```text
$ bin/changelog 'Hey DZ, I added a feature to GitLab!' bin/changelog 'Hey DZ, I added a feature to GitLab!'
``` ```
At this point the script would ask you to select the category of the change (mapped to the `type` field in the entry): At this point the script would ask you to select the category of the change (mapped to the `type` field in the entry):
......
...@@ -72,7 +72,7 @@ from teams other than your own. ...@@ -72,7 +72,7 @@ from teams other than your own.
1. If your merge request includes adding a new UI/UX paradigm [^1], it must be 1. If your merge request includes adding a new UI/UX paradigm [^1], it must be
**approved by a [UX lead][team]**. **approved by a [UX lead][team]**.
1. If your merge request includes a new dependency or a filesystem change, it must be 1. If your merge request includes a new dependency or a filesystem change, it must be
**approved by a [Distribution team member][team]**. See how to work with the [Distribution team](https://about.gitlab.com/handbook/engineering/dev-backend/distribution/) for more details. **approved by a [Distribution team member][team]**. See how to work with the [Distribution team](https://about.gitlab.com/handbook/engineering/development/enablement/distribution/#how-to-work-with-distribution) for more details.
#### Security requirements #### Security requirements
......
...@@ -27,7 +27,7 @@ no overhead at all. ...@@ -27,7 +27,7 @@ no overhead at all.
To enable `GITLAB_TRACING`, a valid _"configuration-string"_ value should be set, with a URL-like To enable `GITLAB_TRACING`, a valid _"configuration-string"_ value should be set, with a URL-like
form: form:
```console ```sh
GITLAB_TRACING=opentracing://<driver>?<param_name>=<param_value>&<param_name_2>=<param_value_2> GITLAB_TRACING=opentracing://<driver>?<param_name>=<param_value>&<param_name_2>=<param_value_2>
``` ```
...@@ -90,7 +90,7 @@ documentation](https://www.jaegertracing.io/docs/1.9/getting-started/). ...@@ -90,7 +90,7 @@ documentation](https://www.jaegertracing.io/docs/1.9/getting-started/).
If you have Docker available, the easier approach to running the Jaeger all-in-one is through If you have Docker available, the easier approach to running the Jaeger all-in-one is through
Docker, using the following command: Docker, using the following command:
```console ```sh
$ docker run \ $ docker run \
--rm \ --rm \
-e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \ -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
...@@ -121,8 +121,8 @@ appropriate configuration string. ...@@ -121,8 +121,8 @@ appropriate configuration string.
**TL;DR:** If you are running everything on the same host, use the following value: **TL;DR:** If you are running everything on the same host, use the following value:
```console ```sh
$ export GITLAB_TRACING="opentracing://jaeger?http_endpoint=http%3A%2F%2Flocalhost%3A14268%2Fapi%2Ftraces&sampler=const&sampler_param=1" export GITLAB_TRACING="opentracing://jaeger?http_endpoint=http%3A%2F%2Flocalhost%3A14268%2Fapi%2Ftraces&sampler=const&sampler_param=1"
``` ```
This configuration string uses the Jaeger driver `opentracing://jaeger` with the following options: This configuration string uses the Jaeger driver `opentracing://jaeger` with the following options:
...@@ -152,7 +152,7 @@ application. ...@@ -152,7 +152,7 @@ application.
When `GITLAB_TRACING` is configured properly, the application will log this on startup: When `GITLAB_TRACING` is configured properly, the application will log this on startup:
```console ```sh
13:41:53 gitlab-workhorse.1 | 2019/02/12 13:41:53 Tracing enabled 13:41:53 gitlab-workhorse.1 | 2019/02/12 13:41:53 Tracing enabled
... ...
13:41:54 gitaly.1 | 2019/02/12 13:41:54 Tracing enabled 13:41:54 gitaly.1 | 2019/02/12 13:41:54 Tracing enabled
...@@ -161,7 +161,7 @@ When `GITLAB_TRACING` is configured properly, the application will log this on s ...@@ -161,7 +161,7 @@ When `GITLAB_TRACING` is configured properly, the application will log this on s
If `GITLAB_TRACING` is not configured correctly, this will also be logged: If `GITLAB_TRACING` is not configured correctly, this will also be logged:
```console ```sh
13:43:45 gitaly.1 | 2019/02/12 13:43:45 skipping tracing configuration step: tracer: unable to load driver mytracer 13:43:45 gitaly.1 | 2019/02/12 13:43:45 skipping tracing configuration step: tracer: unable to load driver mytracer
``` ```
......
...@@ -262,7 +262,7 @@ table_display_block: true ...@@ -262,7 +262,7 @@ table_display_block: true
## Punctuation ## Punctuation
Check the general punctuation rules for the GitLab documentation on the table below. Check the general punctuation rules for the GitLab documentation on the table below.
Check specific punctuation rules for [list items](#list-items) below. Check specific punctuation rules for [lists](#lists) below.
| Rule | Example | | Rule | Example |
| ---- | ------- | | ---- | ------- |
...@@ -274,37 +274,44 @@ Check specific punctuation rules for [list items](#list-items) below. ...@@ -274,37 +274,44 @@ Check specific punctuation rules for [list items](#list-items) below.
| Always add a space before and after dashes when using it in a sentence (for replacing a comma, for example). | _You should try this - or not._ | | Always add a space before and after dashes when using it in a sentence (for replacing a comma, for example). | _You should try this - or not._ |
| Always use lowercase after a colon. | _Related Issues: a way to create a relationship between issues._ | | Always use lowercase after a colon. | _Related Issues: a way to create a relationship between issues._ |
## List items ## Lists
- Always start list items with a capital letter, unless they are parameters or commands - Always start list items with a capital letter, unless they are parameters or commands
that are in backticks, or similar. that are in backticks, or similar.
- Always leave a blank line before and after a list. - Always leave a blank line before and after a list.
- Begin a line with spaces (not tabs) to denote a [nested subitem](#nesting-inside-a-list-item). - Begin a line with spaces (not tabs) to denote a [nested subitem](#nesting-inside-a-list-item).
- Only use ordered lists when their items describe a sequence of steps to follow:
Do: ### Ordered vs. unordered lists
These are the steps to do something: Only use ordered lists when their items describe a sequence of steps to follow.
1. First, do step 1 Do:
1. Then, do step 2
1. Finally, do step 3 ```md
These are the steps to do something:
1. First, do the first step.
1. Then, do the next step.
1. Finally, do the last step.
```
Don't: Don't:
This is a list of different features: ```md
This is a list of available features:
1. Feature 1 1. Feature 1
1. Feature 2 1. Feature 2
1. Feature 3 1. Feature 3
```
**Markup:** ### Markup
- Use dashes (`-`) for unordered lists instead of asterisks (`*`). - Use dashes (`-`) for unordered lists instead of asterisks (`*`).
- Prefix `1.` to each item in an ordered list. - Prefix `1.` to every item in an ordered list.
When rendered, the list items will appear with sequential numbering automatically. When rendered, the list items will appear with sequential numbering automatically.
**Punctuation:** ### Punctuation
- Do not add commas (`,`) or semicolons (`;`) to the end of list items. - Do not add commas (`,`) or semicolons (`;`) to the end of list items.
- Only add periods to the end of a list item if the item consists of a complete sentence. - Only add periods to the end of a list item if the item consists of a complete sentence.
...@@ -343,7 +350,7 @@ Do: ...@@ -343,7 +350,7 @@ Do:
- Let's say this is also a complete sentence. - Let's say this is also a complete sentence.
- Not a complete sentence. - Not a complete sentence.
Don't (third item should have a `.` to match the first and second items): Don't (vary use of periods; majority rules):
- Let's say this is a complete sentence. - Let's say this is a complete sentence.
- Let's say this is also a complete sentence. - Let's say this is also a complete sentence.
......
...@@ -13,7 +13,7 @@ _Note:_ The action itself will not update the state, only a mutation should upda ...@@ -13,7 +13,7 @@ _Note:_ The action itself will not update the state, only a mutation should upda
## File structure ## File structure
When using Vuex at GitLab, separate this concerns into different files to improve readability: When using Vuex at GitLab, separate these concerns into different files to improve readability:
``` ```
└── store └── store
......
...@@ -81,9 +81,7 @@ If you're using Pry you can use the `$` command to display the source code of a ...@@ -81,9 +81,7 @@ If you're using Pry you can use the `$` command to display the source code of a
method (along with its source location), this is easier than running the above method (along with its source location), this is easier than running the above
Ruby code. In case of the above snippet you'd run the following: Ruby code. In case of the above snippet you'd run the following:
``` - `$ Banzai::Renderer.render`
$ Banzai::Renderer.render
```
This will print out something along the lines of: This will print out something along the lines of:
......
...@@ -123,7 +123,7 @@ Keeping that in mind, to create a profile, identify (or create) a spec that ...@@ -123,7 +123,7 @@ Keeping that in mind, to create a profile, identify (or create) a spec that
exercises the troublesome code path, then run it using the `bin/rspec-stackprof` exercises the troublesome code path, then run it using the `bin/rspec-stackprof`
helper, e.g.: helper, e.g.:
``` ```sh
$ LIMIT=10 bin/rspec-stackprof spec/policies/project_policy_spec.rb $ LIMIT=10 bin/rspec-stackprof spec/policies/project_policy_spec.rb
8/8 |====== 100 ======>| Time: 00:00:18 8/8 |====== 100 ======>| Time: 00:00:18
...@@ -157,22 +157,22 @@ it calls, were being executed. ...@@ -157,22 +157,22 @@ it calls, were being executed.
To create a graphical view of the call stack: To create a graphical view of the call stack:
```shell ```sh
$ stackprof tmp/project_policy_spec.rb.dump --graphviz > project_policy_spec.dot stackprof tmp/project_policy_spec.rb.dump --graphviz > project_policy_spec.dot
$ dot -Tsvg project_policy_spec.dot > project_policy_spec.svg dot -Tsvg project_policy_spec.dot > project_policy_spec.svg
``` ```
To load the profile in [kcachegrind](https://kcachegrind.github.io/): To load the profile in [kcachegrind](https://kcachegrind.github.io/):
``` ```sh
$ stackprof tmp/project_policy_spec.dump --callgrind > project_policy_spec.callgrind stackprof tmp/project_policy_spec.dump --callgrind > project_policy_spec.callgrind
$ kcachegrind project_policy_spec.callgrind # Linux kcachegrind project_policy_spec.callgrind # Linux
$ qcachegrind project_policy_spec.callgrind # Mac qcachegrind project_policy_spec.callgrind # Mac
``` ```
It may be useful to zoom in on a specific method, e.g.: It may be useful to zoom in on a specific method, e.g.:
``` ```sh
$ stackprof tmp/project_policy_spec.rb.dump --method warm_asset_cache $ stackprof tmp/project_policy_spec.rb.dump --method warm_asset_cache
TestEnv#warm_asset_cache (/Users/lupine/dev/gitlab.com/gitlab-org/gitlab-development-kit/gitlab/spec/support/test_env.rb:164) TestEnv#warm_asset_cache (/Users/lupine/dev/gitlab.com/gitlab-org/gitlab-development-kit/gitlab/spec/support/test_env.rb:164)
samples: 0 self (0.0%) / 6288 total (36.9%) samples: 0 self (0.0%) / 6288 total (36.9%)
...@@ -225,9 +225,9 @@ may have changed over time. ...@@ -225,9 +225,9 @@ may have changed over time.
To activate profiling in your local environment, run the following: To activate profiling in your local environment, run the following:
``` ```sh
$ export RSPEC_PROFILING=yes export RSPEC_PROFILING=yes
$ rake rspec_profiling:install rake rspec_profiling:install
``` ```
This creates an SQLite3 database in `tmp/rspec_profiling`, into which statistics This creates an SQLite3 database in `tmp/rspec_profiling`, into which statistics
...@@ -237,7 +237,7 @@ variable set. ...@@ -237,7 +237,7 @@ variable set.
Ad-hoc investigation of the collected results can be performed in an interactive Ad-hoc investigation of the collected results can be performed in an interactive
shell: shell:
``` ```sh
$ rake rspec_profiling:console $ rake rspec_profiling:console
irb(main):001:0> results.count irb(main):001:0> results.count
=> 231 => 231
......
...@@ -20,9 +20,18 @@ We have started to migrate frontend tests to the [Jest](https://jestjs.io) testi ...@@ -20,9 +20,18 @@ We have started to migrate frontend tests to the [Jest](https://jestjs.io) testi
Jest tests can be found in `/spec/frontend` and `/ee/spec/frontend` in EE. Jest tests can be found in `/spec/frontend` and `/ee/spec/frontend` in EE.
It is not yet a requirement to use Jest. You can view the ### When should I use Jest over Karma?
[epic](https://gitlab.com/groups/gitlab-org/-/epics/873) of issues
we need to solve before being able to use Jest for all our needs. If you need to update an existing Karma test file (found in `spec/javascripts`), you do not
need to migrate the whole spec to Jest. Simply updating the Karma spec to test your change
is fine. It is probably more appropriate to migrate to Jest in a separate merge request.
If you need to create a new test file, we strongly recommend creating one in Jest. This will
help support our migration and we think you'll love using Jest.
As always, please use discretion. Jest solves a lot of issues we experienced in Karma and
provides a better developer experience, however there are potentially unexpected issues
which could arise (especially with testing against browser specific features).
### Differences to Karma ### Differences to Karma
......
...@@ -47,14 +47,14 @@ to avoid getting this error, you need to remove all instances of the ...@@ -47,14 +47,14 @@ to avoid getting this error, you need to remove all instances of the
**Omnibus Installation** **Omnibus Installation**
``` ```sh
$ sudo gitlab-rails runner "Service.where(type: ['JenkinsService', 'JenkinsDeprecatedService', 'GithubService']).delete_all" sudo gitlab-rails runner "Service.where(type: ['JenkinsService', 'JenkinsDeprecatedService', 'GithubService']).delete_all"
``` ```
**Source Installation** **Source Installation**
``` ```sh
$ bundle exec rails runner "Service.where(type: ['JenkinsService', 'JenkinsDeprecatedService', 'GithubService']).delete_all" production bundle exec rails runner "Service.where(type: ['JenkinsService', 'JenkinsDeprecatedService', 'GithubService']).delete_all" production
``` ```
### Variables environment scopes ### Variables environment scopes
...@@ -89,10 +89,10 @@ To downgrade a source installation, you need to replace the current remote of ...@@ -89,10 +89,10 @@ To downgrade a source installation, you need to replace the current remote of
your GitLab installation with the Community Edition's remote, fetch the latest your GitLab installation with the Community Edition's remote, fetch the latest
changes, and checkout the latest stable branch: changes, and checkout the latest stable branch:
``` ```sh
$ git remote set-url origin git@gitlab.com:gitlab-org/gitlab-ce.git git remote set-url origin git@gitlab.com:gitlab-org/gitlab-ce.git
$ git fetch --all git fetch --all
$ git checkout 8-x-stable git checkout 8-x-stable
``` ```
Remember to follow the correct [update guides](../update/README.md) to make Remember to follow the correct [update guides](../update/README.md) to make
......
...@@ -613,6 +613,9 @@ To back up GitLab: ...@@ -613,6 +613,9 @@ To back up GitLab:
sudo gitlab-backup create sudo gitlab-backup create
``` ```
NOTE: **Note**
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
### Restoring GitLab from a backup ### Restoring GitLab from a backup
To restore GitLab, first review the [restore documentation](../../raketasks/backup_restore.md#restore), To restore GitLab, first review the [restore documentation](../../raketasks/backup_restore.md#restore),
...@@ -631,6 +634,9 @@ released, you can update your GitLab instance: ...@@ -631,6 +634,9 @@ released, you can update your GitLab instance:
sudo gitlab-backup create sudo gitlab-backup create
``` ```
NOTE: **Note**
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
1. Update the repositories and install GitLab: 1. Update the repositories and install GitLab:
```sh ```sh
......
...@@ -225,7 +225,7 @@ First, we will create a new project to host our application. You can do this ...@@ -225,7 +225,7 @@ First, we will create a new project to host our application. You can do this
either by running the CLI client: either by running the CLI client:
```bash ```bash
$ oc new-project gitlab oc new-project gitlab
``` ```
or by using the web interface: or by using the web interface:
......
...@@ -158,7 +158,7 @@ For installation from source: ...@@ -158,7 +158,7 @@ For installation from source:
You will also need to disable Git SSL verification on the server hosting GitLab. You will also need to disable Git SSL verification on the server hosting GitLab.
``` ```
$ git config --global http.sslVerify false git config --global http.sslVerify false
``` ```
For the changes to take effect, [reconfigure GitLab] if you installed For the changes to take effect, [reconfigure GitLab] if you installed
......
...@@ -77,6 +77,9 @@ sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production SKIP=r ...@@ -77,6 +77,9 @@ sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production SKIP=r
If this fails you need to fix it before upgrading to 8.0. Also see If this fails you need to fix it before upgrading to 8.0. Also see
<https://about.gitlab.com/get-help/> <https://about.gitlab.com/get-help/>
NOTE: **Note**
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
### 2. Check source and target database types ### 2. Check source and target database types
Check what databases you use on your GitLab server and your CI server. Check what databases you use on your GitLab server and your CI server.
......
...@@ -80,6 +80,9 @@ Use this command if you've installed GitLab with the Omnibus package: ...@@ -80,6 +80,9 @@ Use this command if you've installed GitLab with the Omnibus package:
sudo gitlab-backup create sudo gitlab-backup create
``` ```
NOTE: **Note**
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
Use this if you've installed GitLab from source: Use this if you've installed GitLab from source:
```sh ```sh
...@@ -92,6 +95,9 @@ If you are running GitLab within a Docker container, you can run the backup from ...@@ -92,6 +95,9 @@ If you are running GitLab within a Docker container, you can run the backup from
docker exec -t <container name> gitlab-backup create docker exec -t <container name> gitlab-backup create
``` ```
NOTE: **Note**
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
If you are using the [GitLab helm chart](https://gitlab.com/gitlab-org/charts/gitlab) on a If you are using the [GitLab helm chart](https://gitlab.com/gitlab-org/charts/gitlab) on a
Kubernetes cluster, you can run the backup task using `backup-utility` script on Kubernetes cluster, you can run the backup task using `backup-utility` script on
the GitLab task runner pod via `kubectl`. Refer to [backing up a GitLab installation](https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/backup-restore/backup.md#backing-up-a-gitlab-installation) for more details: the GitLab task runner pod via `kubectl`. Refer to [backing up a GitLab installation](https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/backup-restore/backup.md#backing-up-a-gitlab-installation) for more details:
...@@ -202,6 +208,9 @@ To use the `copy` strategy instead of the default streaming strategy, specify ...@@ -202,6 +208,9 @@ To use the `copy` strategy instead of the default streaming strategy, specify
sudo gitlab-backup create STRATEGY=copy sudo gitlab-backup create STRATEGY=copy
``` ```
NOTE: **Note**
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
### Backup filename ### Backup filename
By default a backup file is created according to the specification in [the Backup timestamp](#backup-timestamp) section above. You can however override the `[TIMESTAMP]` part of the filename by setting the `BACKUP` environment variable. For example: By default a backup file is created according to the specification in [the Backup timestamp](#backup-timestamp) section above. You can however override the `[TIMESTAMP]` part of the filename by setting the `BACKUP` environment variable. For example:
...@@ -210,6 +219,9 @@ By default a backup file is created according to the specification in [the Backu ...@@ -210,6 +219,9 @@ By default a backup file is created according to the specification in [the Backu
sudo gitlab-backup create BACKUP=dump sudo gitlab-backup create BACKUP=dump
``` ```
NOTE: **Note**
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
The resulting file will then be `dump_gitlab_backup.tar`. This is useful for systems that make use of rsync and incremental backups, and will result in considerably faster transfer speeds. The resulting file will then be `dump_gitlab_backup.tar`. This is useful for systems that make use of rsync and incremental backups, and will result in considerably faster transfer speeds.
### Rsyncable ### Rsyncable
...@@ -222,6 +234,9 @@ Note that the `--rsyncable` option in `gzip` is not guaranteed to be available o ...@@ -222,6 +234,9 @@ Note that the `--rsyncable` option in `gzip` is not guaranteed to be available o
sudo gitlab-backup create BACKUP=dump GZIP_RSYNCABLE=yes sudo gitlab-backup create BACKUP=dump GZIP_RSYNCABLE=yes
``` ```
NOTE: **Note**
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
### Excluding specific directories from the backup ### Excluding specific directories from the backup
You can choose what should be exempt from the backup up by adding the environment variable `SKIP`. You can choose what should be exempt from the backup up by adding the environment variable `SKIP`.
...@@ -247,6 +262,9 @@ For Omnibus GitLab packages: ...@@ -247,6 +262,9 @@ For Omnibus GitLab packages:
sudo gitlab-backup create SKIP=db,uploads sudo gitlab-backup create SKIP=db,uploads
``` ```
NOTE: **Note**
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
For installations from source: For installations from source:
```sh ```sh
...@@ -452,6 +470,9 @@ sudo gitlab-backup create DIRECTORY=daily ...@@ -452,6 +470,9 @@ sudo gitlab-backup create DIRECTORY=daily
sudo gitlab-backup create DIRECTORY=weekly sudo gitlab-backup create DIRECTORY=weekly
``` ```
NOTE: **Note**
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
### Uploading to locally mounted shares ### Uploading to locally mounted shares
You may also send backups to a mounted share (`NFS` / `CIFS` / `SMB` / etc.) by You may also send backups to a mounted share (`NFS` / `CIFS` / `SMB` / etc.) by
...@@ -569,6 +590,9 @@ There, add the following line to schedule the backup for everyday at 2 AM: ...@@ -569,6 +590,9 @@ There, add the following line to schedule the backup for everyday at 2 AM:
0 2 * * * /opt/gitlab/bin/gitlab-backup create CRON=1 0 2 * * * /opt/gitlab/bin/gitlab-backup create CRON=1
``` ```
NOTE: **Note**
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
You may also want to set a limited lifetime for backups to prevent regular You may also want to set a limited lifetime for backups to prevent regular
backups using all your disk space. backups using all your disk space.
...@@ -729,6 +753,14 @@ restore: ...@@ -729,6 +753,14 @@ restore:
sudo gitlab-backup restore BACKUP=1493107454_2018_04_25_10.6.4-ce sudo gitlab-backup restore BACKUP=1493107454_2018_04_25_10.6.4-ce
``` ```
NOTE: **Note**
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:restore`.
CAUTION: **Warning:**
`gitlab-rake gitlab:backup:restore` does not set the right file system permissions on your Registry directory.
This is a [known issue](https://gitlab.com/gitlab-org/gitlab-ce/issues/62759). On GitLab 12.2 or newer, you can
use `gitlab-backup restore` to avoid this issue.
Next, restore `/etc/gitlab/gitlab-secrets.json` if necessary as mentioned above. Next, restore `/etc/gitlab/gitlab-secrets.json` if necessary as mentioned above.
Reconfigure, restart and check GitLab: Reconfigure, restart and check GitLab:
...@@ -763,6 +795,14 @@ For docker installations, the restore task can be run from host: ...@@ -763,6 +795,14 @@ For docker installations, the restore task can be run from host:
docker exec -it <name of container> gitlab-backup restore docker exec -it <name of container> gitlab-backup restore
``` ```
NOTE: **Note**
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:restore`.
CAUTION: **Warning:**
`gitlab-rake gitlab:backup:restore` does not set the right file system permissions on your Registry directory.
This is a [known issue](https://gitlab.com/gitlab-org/gitlab-ce/issues/62759). On GitLab 12.2 or newer, you can
use `gitlab-backup restore` to avoid this issue.
The GitLab helm chart uses a different process, documented in The GitLab helm chart uses a different process, documented in
[restoring a GitLab helm chart installation](https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/backup-restore/restore.md). [restoring a GitLab helm chart installation](https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/backup-restore/restore.md).
...@@ -978,7 +1018,7 @@ sudo chown -R registry:registry /var/opt/gitlab/gitlab-rails/shared/registry/doc ...@@ -978,7 +1018,7 @@ sudo chown -R registry:registry /var/opt/gitlab/gitlab-rails/shared/registry/doc
NOTE: **Note:** NOTE: **Note:**
If you have changed the default filesystem location for the registry, you will If you have changed the default filesystem location for the registry, you will
want to run the chown against your custom location instead of want to run the `chown` against your custom location instead of
`/var/opt/gitlab/gitlab-rails/shared/registry/docker`. `/var/opt/gitlab/gitlab-rails/shared/registry/docker`.
[reconfigure GitLab]: ../administration/restart_gitlab.md#omnibus-gitlab-reconfigure [reconfigure GitLab]: ../administration/restart_gitlab.md#omnibus-gitlab-reconfigure
...@@ -990,6 +1030,7 @@ While running the backup, you may receive a gzip error: ...@@ -990,6 +1030,7 @@ While running the backup, you may receive a gzip error:
```sh ```sh
sudo /opt/gitlab/bin/gitlab-backup create sudo /opt/gitlab/bin/gitlab-backup create
...
Dumping ... Dumping ...
... ...
gzip: stdout: Input/output error gzip: stdout: Input/output error
...@@ -999,5 +1040,5 @@ Backup failed ...@@ -999,5 +1040,5 @@ Backup failed
If this happens, check the following: If this happens, check the following:
1. Confirm there is sufficent diskspace for the gzip operation. 1. Confirm there is sufficient disk space for the gzip operation.
1. If NFS is being used, check if the mount option `timeo` is set. The default is `600`, and changing this to smaller values have resulted in this error. 1. If NFS is being used, check if the mount option `timeout` is set. The default is `600`, and changing this to smaller values have resulted in this error.
...@@ -42,17 +42,17 @@ If you are using an installation from source, replace `/var/opt/gitlab/` with `/ ...@@ -42,17 +42,17 @@ If you are using an installation from source, replace `/var/opt/gitlab/` with `/
#### Omnibus Installation #### Omnibus Installation
``` ```sh
$ sudo gitlab-rake gitlab:import:repos['/var/opt/gitlab/git-data/repository-import-<date>'] sudo gitlab-rake gitlab:import:repos['/var/opt/gitlab/git-data/repository-import-<date>']
``` ```
#### Installation from source #### Installation from source
Before running this command you need to change the directory to where your GitLab installation is located: Before running this command you need to change the directory to where your GitLab installation is located:
``` ```sh
$ cd /home/git/gitlab cd /home/git/gitlab
$ sudo -u git -H bundle exec rake gitlab:import:repos['/var/opt/gitlab/git-data/repository-import-<date>'] RAILS_ENV=production sudo -u git -H bundle exec rake gitlab:import:repos['/var/opt/gitlab/git-data/repository-import-<date>'] RAILS_ENV=production
``` ```
#### Example output #### Example output
......
# Proxying assets
A possible security concern when managing a public facing GitLab instance is A possible security concern when managing a public facing GitLab instance is
the ability to steal a users IP address by referencing images in issues, comments, etc. the ability to steal a users IP address by referencing images in issues, comments, etc.
For example, adding `![Example image](http://example.com/example.png)` to For example, adding `![Example image](http://example.com/example.png)` to
an issue description will cause the image to be loaded from the external an issue description will cause the image to be loaded from the external
server in order to be displayed. However this also allows the external server server in order to be displayed. However, this also allows the external server
to log the IP address of the user. to log the IP address of the user.
One way to mitigate this is by proxying any external images to a server you One way to mitigate this is by proxying any external images to a server you
control. GitLab handles this by allowing you to run the "Camo" server control.
[cactus/go-camo](https://github.com/cactus/go-camo#how-it-works).
The image request is sent to the Camo server, which then makes the request for GitLab can be configured to use an asset proxy server when requesting external images/videos in
the original image. This way an attacker only ever seems the IP address issues, comments, etc. This helps ensure that malicious images do not expose the user's IP address
of your Camo server. when they are fetched.
We currently recommend using [cactus/go-camo](https://github.com/cactus/go-camo#how-it-works)
as it supports proxying video and is more configurable.
## Installing Camo server
A Camo server is used to act as the proxy.
To install a Camo server as an asset proxy:
1. Deploy a `go-camo` server. Helpful instructions can be found in
[building catus/go-camo](https://github.com/cactus/go-camo#building).
1. Make sure your instance of GitLab is running, and that you have created a private API token.
Using the API, configure the asset proxy settings on your GitLab instance. For example:
```sh
curl --request "PUT" "https://gitlab.example.com/api/v4/application/settings?\
asset_proxy_enabled=true&\
asset_proxy_url=https://proxy.gitlab.example.com&\
asset_proxy_secret_key=<somekey>" \
--header 'PRIVATE-TOKEN: <my_private_token>'
```
The following settings are supported:
| Attribute | Description |
|:-------------------------|:-------------------------------------------------------------------------------------------------------------------------------------|
| `asset_proxy_enabled` | Enable proxying of assets. If enabled, requires: `asset_proxy_url`). |
| `asset_proxy_secret_key` | Shared secret with the asset proxy server. |
| `asset_proxy_url` | URL of the asset proxy server. |
| `asset_proxy_whitelist` | Assets that match these domain(s) will NOT be proxied. Wildcards allowed. Your GitLab installation URL is automatically whitelisted. |
1. Restart the server for the changes to take effect. Each time you change any values for the asset
proxy, you need to restart the server.
## Using the Camo server
Once the Camo server is running and you've enabled the GitLab settings, any image or video that
references an external source will get proxied to the Camo server.
Once you have your Camo server up and running, you can configure GitLab to For example, the following is a link to an image in Markdown:
proxy image requests to it. The following settings are supported:
| Attribute | Description | ```markdown
| ------------------------- | ----------- | ![logo](https://about.gitlab.com/images/press/logo/jpg/gitlab-icon-rgb.jpg)
| `asset_proxy_enabled` | (**If enabled, requires:** `asset_proxy_url`) Enable proxying of assets. | ```
| `asset_proxy_secret_key` | Shared secret with the asset proxy server. |
| `asset_proxy_url` | URL of the asset proxy server. |
| `asset_proxy_whitelist` | Assets that match these domain(s) will NOT be proxied. Wildcards allowed. Your GitLab installation URL is automatically whitelisted. |
These can be set via the [Application setting API](../api/settings.md) The following is an example of a source link that could result:
Note that a GitLab restart is required to apply any changes. ```text
http://proxy.gitlab.example.com/f9dd2b40157757eb82afeedbf1290ffb67a3aeeb/68747470733a2f2f61626f75742e6769746c61622e636f6d2f696d616765732f70726573732f6c6f676f2f6a70672f6769746c61622d69636f6e2d7267622e6a7067
```
...@@ -4,8 +4,11 @@ type: reference, howto ...@@ -4,8 +4,11 @@ type: reference, howto
# Dependency Scanning **(ULTIMATE)** # Dependency Scanning **(ULTIMATE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/5105) > [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/5105) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 10.7.
in [GitLab Ultimate](https://about.gitlab.com/pricing/) 10.7.
Dependency Scanning helps to automatically find security vulnerabilities in your dependencies
while you are developing and testing your applications, for example when your
application is using an external (open source) library which is known to be vulnerable.
## Overview ## Overview
...@@ -18,7 +21,7 @@ in your existing `.gitlab-ci.yml` file or by implicitly using ...@@ -18,7 +21,7 @@ in your existing `.gitlab-ci.yml` file or by implicitly using
that is provided by [Auto DevOps](../../../topics/autodevops/index.md). that is provided by [Auto DevOps](../../../topics/autodevops/index.md).
GitLab checks the Dependency Scanning report, compares the found vulnerabilities GitLab checks the Dependency Scanning report, compares the found vulnerabilities
between the source and target branches, and shows the information right on the between the source and target branches, and shows the information on the
merge request. merge request.
![Dependency Scanning Widget](img/dependency_scanning.png) ![Dependency Scanning Widget](img/dependency_scanning.png)
...@@ -32,12 +35,6 @@ The results are sorted by the severity of the vulnerability: ...@@ -32,12 +35,6 @@ The results are sorted by the severity of the vulnerability:
1. Unknown 1. Unknown
1. Everything else 1. Everything else
## Use cases
It helps to automatically find security vulnerabilities in your dependencies
while you are developing and testing your applications. For example when your
application is using an external (open source) library which is known to be vulnerable.
## Requirements ## Requirements
To run a Dependency Scanning job, you need GitLab Runner with the To run a Dependency Scanning job, you need GitLab Runner with the
...@@ -146,7 +143,7 @@ Dependency Scanning can be [configured](#customizing-the-dependency-scanning-set ...@@ -146,7 +143,7 @@ Dependency Scanning can be [configured](#customizing-the-dependency-scanning-set
using environment variables. using environment variables.
| Environment variable | Description | Example usage | | Environment variable | Description | Example usage |
|-------------------------------- |-------------| | | --------------------------------------- | ----------- | ------------- |
| `DS_ANALYZER_IMAGES` | Comma separated list of custom images. The official default images are still enabled. Read more about [customizing analyzers](analyzers.md). | | | `DS_ANALYZER_IMAGES` | Comma separated list of custom images. The official default images are still enabled. Read more about [customizing analyzers](analyzers.md). | |
| `DS_ANALYZER_IMAGE_PREFIX` | Override the name of the Docker registry providing the official default images (proxy). Read more about [customizing analyzers](analyzers.md). | | | `DS_ANALYZER_IMAGE_PREFIX` | Override the name of the Docker registry providing the official default images (proxy). Read more about [customizing analyzers](analyzers.md). | |
| `DS_ANALYZER_IMAGE_TAG` | Override the Docker tag of the official default images. Read more about [customizing analyzers](analyzers.md). | | | `DS_ANALYZER_IMAGE_TAG` | Override the Docker tag of the official default images. Read more about [customizing analyzers](analyzers.md). | |
...@@ -162,10 +159,39 @@ using environment variables. ...@@ -162,10 +159,39 @@ using environment variables.
| `PIP_INDEX_URL` | Base URL of Python Package Index (default `https://pypi.org/simple`). | | | `PIP_INDEX_URL` | Base URL of Python Package Index (default `https://pypi.org/simple`). | |
| `PIP_EXTRA_INDEX_URL` | Array of [extra URLs](https://pip.pypa.io/en/stable/reference/pip_install/#cmdoption-extra-index-url) of package indexes to use in addition to `PIP_INDEX_URL`. Comma separated. | | | `PIP_EXTRA_INDEX_URL` | Array of [extra URLs](https://pip.pypa.io/en/stable/reference/pip_install/#cmdoption-extra-index-url) of package indexes to use in addition to `PIP_INDEX_URL`. Comma separated. | |
## Interacting with the vulnerabilities
Once a vulnerability is found, you can interact with it. Read more on how to
[interact with the vulnerabilities](../index.md#interacting-with-the-vulnerabilities).
## Solutions for vulnerabilities (auto-remediation)
Some vulnerabilities can be fixed by applying the solution that GitLab
automatically generates.
Read more about the [solutions for vulnerabilities](../index.md#solutions-for-vulnerabilities-auto-remediation).
## Security Dashboard
The Security Dashboard is a good place to get an overview of all the security
vulnerabilities in your groups, projects and pipelines. Read more about the
[Security Dashboard](../security_dashboard/index.md).
## Vulnerabilities database update
For more information about the vulnerabilities database update, check the
[maintenance table](../index.md#maintenance-and-update-of-the-vulnerabilities-database).
## Dependency List
An additional benefit of Dependency Scanning is the ability to view your
project's dependencies and their known vulnerabilities. Read more about
the [Dependency List](../dependency_list/index.md).
## Reports JSON format ## Reports JSON format
CAUTION: **Caution:** CAUTION: **Caution:**
The JSON report artifacts are not a public API of Dependency Scanning and their format may change in future. The JSON report artifacts are not a public API of Dependency Scanning and their format may change in the future.
The Dependency Scanning tool emits a JSON report file. Here is an example of the report structure with all important parts of The Dependency Scanning tool emits a JSON report file. Here is an example of the report structure with all important parts of
it highlighted: it highlighted:
...@@ -315,28 +341,6 @@ the report JSON unless stated otherwise. Presence of optional fields depends on ...@@ -315,28 +341,6 @@ the report JSON unless stated otherwise. Presence of optional fields depends on
| `remediations[].summary` | Overview of how the vulnerabilities have been fixed. | | `remediations[].summary` | Overview of how the vulnerabilities have been fixed. |
| `remediations[].diff` | base64-encoded remediation code diff, compatible with [`git apply`](https://git-scm.com/docs/git-format-patch#_discussion). | | `remediations[].diff` | base64-encoded remediation code diff, compatible with [`git apply`](https://git-scm.com/docs/git-format-patch#_discussion). |
## Security Dashboard
The Security Dashboard is a good place to get an overview of all the security
vulnerabilities in your groups, projects and pipelines. Read more about the
[Security Dashboard](../security_dashboard/index.md).
## Interacting with the vulnerabilities
Once a vulnerability is found, you can interact with it. Read more on how to
[interact with the vulnerabilities](../index.md#interacting-with-the-vulnerabilities).
## Vulnerabilities database update
For more information about the vulnerabilities database update, check the
[maintenance table](../index.md#maintenance-and-update-of-the-vulnerabilities-database).
## Dependency List **(ULTIMATE)**
An additional benefit of Dependency Scanning is the ability to view your
project's dependencies and their known vulnerabilities. Read more about
the [Dependency List](../dependency_list/index.md).
## Versioning and release process ## Versioning and release process
Please check the [Release Process documentation](https://gitlab.com/gitlab-org/security-products/release/blob/master/docs/release_process.md). Please check the [Release Process documentation](https://gitlab.com/gitlab-org/security-products/release/blob/master/docs/release_process.md).
......
...@@ -71,8 +71,7 @@ entry, a detailed information will pop up with different possible options: ...@@ -71,8 +71,7 @@ entry, a detailed information will pop up with different possible options:
- [Create issue](#creating-an-issue-for-a-vulnerability): The new issue will - [Create issue](#creating-an-issue-for-a-vulnerability): The new issue will
have the title and description pre-populated with the information from the have the title and description pre-populated with the information from the
vulnerability report and will be created as [confidential](../project/issues/confidential_issues.md) by default. vulnerability report and will be created as [confidential](../project/issues/confidential_issues.md) by default.
- [Solution](#solutions-for-vulnerabilities): For some vulnerabilities - [Solution](#solutions-for-vulnerabilities-auto-remediation): For some vulnerabilities,
([Dependency Scanning](dependency_scanning/index.md) and [Container Scanning](container_scanning/index.md))
a solution is provided for how to fix the vulnerability. a solution is provided for how to fix the vulnerability.
![Interacting with security reports](img/interactive_reports.png) ![Interacting with security reports](img/interactive_reports.png)
...@@ -109,17 +108,16 @@ the vulnerability will now have an associated issue next to the name. ...@@ -109,17 +108,16 @@ the vulnerability will now have an associated issue next to the name.
![Linked issue in the group security dashboard](img/issue.png) ![Linked issue in the group security dashboard](img/issue.png)
### Solutions for vulnerabilities ### Solutions for vulnerabilities (auto-remediation)
> Introduced in [GitLab Ultimate](https://about.gitlab.com/pricing) 11.7. > [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/5656) in [GitLab Ultimate](https://about.gitlab.com/pricing) 11.7.
CAUTION: **Warning:**
Automatic Patch creation is only available for a subset of
[Dependency Scanning](dependency_scanning/index.md). At the moment only Node.JS
projects managed with yarn are supported.
Some vulnerabilities can be fixed by applying the solution that GitLab Some vulnerabilities can be fixed by applying the solution that GitLab
automatically generates. automatically generates. The following scanners are supported:
- [Dependency Scanning](dependency_scanning/index.md):
Automatic Patch creation is only available for Node.JS projects managed with
`yarn`.
#### Manually applying the suggested patch #### Manually applying the suggested patch
...@@ -136,13 +134,12 @@ generated by GitLab. To apply the fix: ...@@ -136,13 +134,12 @@ generated by GitLab. To apply the fix:
#### Creating a merge request from a vulnerability #### Creating a merge request from a vulnerability
> [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/9224) in > [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/9224) in [GitLab Ultimate](https://about.gitlab.com/pricing) 11.9.
> [GitLab Ultimate](https://about.gitlab.com/pricing) 11.9.
In certain cases, GitLab will allow you to create a merge request that will In certain cases, GitLab will allow you to create a merge request that will
automatically remediate the vulnerability. Any vulnerability that has a automatically remediate the vulnerability. Any vulnerability that has a
[solution](#solutions-for-vulnerabilities) can have a merge request created to [solution](#solutions-for-vulnerabilities-auto-remediation) can have a merge
automatically solve the issue. request created to automatically solve the issue.
If this action is available there will be a **Create merge request** button in the vulnerability modal. If this action is available there will be a **Create merge request** button in the vulnerability modal.
Clicking on this button will create a merge request to apply the solution onto the source branch. Clicking on this button will create a merge request to apply the solution onto the source branch.
......
...@@ -1292,7 +1292,7 @@ Example: ...@@ -1292,7 +1292,7 @@ Example:
Additionally, you can choose the alignment of text within columns by adding colons (`:`) Additionally, you can choose the alignment of text within columns by adding colons (`:`)
to the sides of the "dash" lines in the second row. This will affect every cell in the column. to the sides of the "dash" lines in the second row. This will affect every cell in the column.
> Note that the headers are always right aligned [within GitLab itself itself](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/user/markdown.md#tables). > Note that the headers are always right aligned [within GitLab itself](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/user/markdown.md#tables).
```markdown ```markdown
| Left Aligned | Centered | Right Aligned | Left Aligned | Centered | Right Aligned | | Left Aligned | Centered | Right Aligned | Left Aligned | Centered | Right Aligned |
......
---
type: reference
---
# Creating users **(CORE ONLY)**
You can create users:
- Manually through the sign in page or Admin Area.
- Automatically through user authentication integrations.
## Create users on sign in page
If you have [sign-up enabled](../../admin_area/settings/sign_up_restrictions.md), users can create their own accounts using the **Register** tab on the sign in page.
![Register Tab](img/register_tab.png)
## Create users in admin area
As an admin user, you can manually create users by:
1. Navigating to **Admin Area > Overview > Users** (`/admin/users` page).
1. Selecting the **New User** button.
You can also [create users through the API](../../../api/users.md) as an admin.
![Admin User Button](img/admin_user_button.png)
![Admin User Form](img/admin_user_form.png)
## Create users through integrations
Users will be:
- Automatically created upon first login with the [LDAP integration](../../../administration/auth/ldap.md).
- Created when first logging in via an [OmniAuth provider](../../../integration/omniauth.md) if the `allow_single_sign_on` setting is present.
...@@ -8,6 +8,10 @@ Each GitLab account has a user profile, and settings. Your [profile](#user-profi ...@@ -8,6 +8,10 @@ Each GitLab account has a user profile, and settings. Your [profile](#user-profi
contains information about you, and your GitLab activity. Your [settings](#profile-settings) contains information about you, and your GitLab activity. Your [settings](#profile-settings)
allow you to customize some aspects of GitLab to suit yourself. allow you to customize some aspects of GitLab to suit yourself.
## Creating users
There are several ways to create users on GitLab. See the [creating users documentation](account/create_accounts.md) for more details.
## Signing in ## Signing in
There are several ways to sign into your GitLab account. There are several ways to sign into your GitLab account.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
> [Introduced][ee-1659] in [GitLab Premium][eep] 9.1. > [Introduced][ee-1659] in [GitLab Premium][eep] 9.1.
A popular [Continuous Integration](https://en.wikipedia.org/wiki/Continuous_integration) A popular [Continuous Deployment](https://en.wikipedia.org/wiki/Continuous_deployment)
strategy, where a small portion of the fleet is updated to the new version of strategy, where a small portion of the fleet is updated to the new version of
your application. your application.
......
...@@ -1327,3 +1327,6 @@ console: ...@@ -1327,3 +1327,6 @@ console:
example.com - - [14/May/2014:07:45:26 EDT] "POST / HTTP/1.1" 200 0 example.com - - [14/May/2014:07:45:26 EDT] "POST / HTTP/1.1" 200 0
- -> / - -> /
``` ```
NOTE: **Note:**
You may need to [allow requests to the local network](../../../security/webhooks.md) for this receiver to be added.
...@@ -630,10 +630,7 @@ troubleshooting steps. ...@@ -630,10 +630,7 @@ troubleshooting steps.
### Merge request cannot retrieve the pipeline status ### Merge request cannot retrieve the pipeline status
This can occur for one of two reasons: This can occur if Sidekiq doesn't pick up the changes fast enough.
- Sidekiq doesn't pick up the changes fast enough
- Because of the bug described in [#41545](https://gitlab.com/gitlab-org/gitlab-ce/issues/41545)
#### Sidekiq #### Sidekiq
......
...@@ -184,6 +184,10 @@ the merge request. To enable this feature: ...@@ -184,6 +184,10 @@ the merge request. To enable this feature:
When this feature is enabled, all merge requests will need approval When this feature is enabled, all merge requests will need approval
from one code owner per matched rule before it can be merged. from one code owner per matched rule before it can be merged.
NOTE: **Note:** Only the `CODEOWNERS` file on the default branch is evaluated for
Merge Request approvals. If `CODEOWNERS` is changed on a non-default branch, those
changes will not affect approvals until merged to the default branch.
## Overriding the merge request approvals default settings ## Overriding the merge request approvals default settings
> Introduced in GitLab Enterprise Edition 9.4. > Introduced in GitLab Enterprise Edition 9.4.
...@@ -196,7 +200,7 @@ If approvals are [set at the project level](#editing-approvals), the ...@@ -196,7 +200,7 @@ If approvals are [set at the project level](#editing-approvals), the
default configuration (number of required approvals and approvers) can be default configuration (number of required approvals and approvers) can be
overridden for each merge request in that project. overridden for each merge request in that project.
One possible scenario would be to to assign a group of approvers at the project One possible scenario would be to assign a group of approvers at the project
level and change them later when creating or editing the merge request. level and change them later when creating or editing the merge request.
First, you have to enable this option in the project's settings: First, you have to enable this option in the project's settings:
......
...@@ -26,7 +26,7 @@ and [OpenShift](https://github.com/jaegertracing/jaeger-openshift). ...@@ -26,7 +26,7 @@ and [OpenShift](https://github.com/jaegertracing/jaeger-openshift).
GitLab provides an easy way to open the Jaeger UI from within your project: GitLab provides an easy way to open the Jaeger UI from within your project:
1. [Set up Jaeger](#deploying-jaeger) and configure your application using one of the 1. [Set up Jaeger](https://www.jaegertracing.io) and configure your application using one of the
[client libraries](https://www.jaegertracing.io/docs/latest/client-libraries/). [client libraries](https://www.jaegertracing.io/docs/latest/client-libraries/).
1. Navigate to your project's **Settings > Operations** and provide the Jaeger URL. 1. Navigate to your project's **Settings > Operations** and provide the Jaeger URL.
1. Click **Save changes** for the changes to take effect. 1. Click **Save changes** for the changes to take effect.
......
...@@ -53,9 +53,9 @@ write in the `.gitlab-ci.yml` the script you want to run so ...@@ -53,9 +53,9 @@ write in the `.gitlab-ci.yml` the script you want to run so
GitLab Runner will do it for you. It looks more complicated than it GitLab Runner will do it for you. It looks more complicated than it
is. What you need to tell the Runner: is. What you need to tell the Runner:
``` ```sh
$ gem install jekyll gem install jekyll
$ jekyll build jekyll build
``` ```
### Script ### Script
......
...@@ -32,6 +32,8 @@ links will be missing from the sidebar UI. ...@@ -32,6 +32,8 @@ links will be missing from the sidebar UI.
You can still access them with direct links if you can access Merge Requests. This is deliberate, if you can see You can still access them with direct links if you can access Merge Requests. This is deliberate, if you can see
Issues or Merge Requests, both of which use Labels and Milestones, then you shouldn't be denied access to Labels and Milestones pages. Issues or Merge Requests, both of which use Labels and Milestones, then you shouldn't be denied access to Labels and Milestones pages.
Project [Snippets](../../snippets.md) are enabled by default.
#### Disabling email notifications #### Disabling email notifications
You can disable all email notifications related to the project by selecting the You can disable all email notifications related to the project by selecting the
......
...@@ -33,6 +33,11 @@ overview that shows snippets you created and allows you to explore all snippets. ...@@ -33,6 +33,11 @@ overview that shows snippets you created and allows you to explore all snippets.
If you want to discover snippets that belong to a specific project, you can navigate If you want to discover snippets that belong to a specific project, you can navigate
to the Snippets page via the left side navigation on the project page. to the Snippets page via the left side navigation on the project page.
Project snippets are enabled and available by default, but they can
be disabled by navigating to your project's **Settings**, expanding
**Visibility, project features, permissions** and scrolling down to
**Snippets**. From there, you can toggle to disable them or select a
different visibility level from the dropdown menu.
## Snippet comments ## Snippet comments
......
...@@ -134,13 +134,13 @@ There are two ways to manually do the same thing as automatic uploading (describ ...@@ -134,13 +134,13 @@ There are two ways to manually do the same thing as automatic uploading (describ
**Option 1: rake task** **Option 1: rake task**
``` ```sh
$ rake gitlab:lfs:migrate rake gitlab:lfs:migrate
``` ```
**Option 2: rails console** **Option 2: rails console**
``` ```sh
$ sudo gitlab-rails console # Login to rails console $ sudo gitlab-rails console # Login to rails console
> # Upload LFS files manually > # Upload LFS files manually
......
...@@ -1312,6 +1312,10 @@ module API ...@@ -1312,6 +1312,10 @@ module API
options[:project].releases.find_by(tag: repo_tag.name) options[:project].releases.find_by(tag: repo_tag.name)
end end
# rubocop: enable CodeReuse/ActiveRecord # rubocop: enable CodeReuse/ActiveRecord
expose :protected do |repo_tag, options|
::ProtectedTag.protected?(options[:project], repo_tag.name)
end
end end
class Runner < Grape::Entity class Runner < Grape::Entity
......
...@@ -5,10 +5,10 @@ module API ...@@ -5,10 +5,10 @@ module API
include Gitlab::Utils include Gitlab::Utils
include Helpers::Pagination include Helpers::Pagination
SUDO_HEADER = "HTTP_SUDO".freeze SUDO_HEADER = "HTTP_SUDO"
GITLAB_SHARED_SECRET_HEADER = "Gitlab-Shared-Secret".freeze GITLAB_SHARED_SECRET_HEADER = "Gitlab-Shared-Secret"
SUDO_PARAM = :sudo SUDO_PARAM = :sudo
API_USER_ENV = 'gitlab.api.user'.freeze API_USER_ENV = 'gitlab.api.user'
def declared_params(options = {}) def declared_params(options = {})
options = { include_parent_namespaces: false }.merge(options) options = { include_parent_namespaces: false }.merge(options)
......
...@@ -38,7 +38,8 @@ module API ...@@ -38,7 +38,8 @@ module API
optional :only_allow_merge_if_pipeline_succeeds, type: Boolean, desc: 'Only allow to merge if builds succeed' optional :only_allow_merge_if_pipeline_succeeds, type: Boolean, desc: 'Only allow to merge if builds succeed'
optional :only_allow_merge_if_all_discussions_are_resolved, type: Boolean, desc: 'Only allow to merge if all discussions are resolved' optional :only_allow_merge_if_all_discussions_are_resolved, type: Boolean, desc: 'Only allow to merge if all discussions are resolved'
optional :tag_list, type: Array[String], desc: 'The list of tags for a project' optional :tag_list, type: Array[String], desc: 'The list of tags for a project'
optional :avatar, type: File, desc: 'Avatar image for project' # TODO: remove rubocop disable - https://gitlab.com/gitlab-org/gitlab-ee/issues/14960
optional :avatar, type: File, desc: 'Avatar image for project' # rubocop:disable Scalability/FileUploads
optional :printing_merge_request_link_enabled, type: Boolean, desc: 'Show link to create/view merge request when pushing from the command line' optional :printing_merge_request_link_enabled, type: Boolean, desc: 'Show link to create/view merge request when pushing from the command line'
optional :merge_method, type: String, values: %w(ff rebase_merge merge), desc: 'The merge method used when merging merge requests' optional :merge_method, type: String, values: %w(ff rebase_merge merge), desc: 'The merge method used when merging merge requests'
optional :initialize_with_readme, type: Boolean, desc: "Initialize a project with a README.md" optional :initialize_with_readme, type: Boolean, desc: "Initialize a project with a README.md"
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
module API module API
module Helpers module Helpers
module Runner module Runner
JOB_TOKEN_HEADER = 'HTTP_JOB_TOKEN'.freeze JOB_TOKEN_HEADER = 'HTTP_JOB_TOKEN'
JOB_TOKEN_PARAM = :token JOB_TOKEN_PARAM = :token
def runner_registration_token_valid? def runner_registration_token_valid?
......
...@@ -90,8 +90,11 @@ module API ...@@ -90,8 +90,11 @@ module API
end end
params do params do
requires :domain, type: String, desc: 'The domain' requires :domain, type: String, desc: 'The domain'
# rubocop:disable Scalability/FileUploads
# TODO: remove rubocop disable - https://gitlab.com/gitlab-org/gitlab-ee/issues/14960
optional :certificate, allow_blank: false, types: [File, String], desc: 'The certificate', as: :user_provided_certificate optional :certificate, allow_blank: false, types: [File, String], desc: 'The certificate', as: :user_provided_certificate
optional :key, allow_blank: false, types: [File, String], desc: 'The key', as: :user_provided_key optional :key, allow_blank: false, types: [File, String], desc: 'The key', as: :user_provided_key
# rubocop:enable Scalability/FileUploads
all_or_none_of :user_provided_certificate, :user_provided_key all_or_none_of :user_provided_certificate, :user_provided_key
end end
post ":id/pages/domains" do post ":id/pages/domains" do
...@@ -111,8 +114,11 @@ module API ...@@ -111,8 +114,11 @@ module API
desc 'Updates a pages domain' desc 'Updates a pages domain'
params do params do
requires :domain, type: String, desc: 'The domain' requires :domain, type: String, desc: 'The domain'
# rubocop:disable Scalability/FileUploads
# TODO: remove rubocop disable - https://gitlab.com/gitlab-org/gitlab-ee/issues/14960
optional :certificate, allow_blank: false, types: [File, String], desc: 'The certificate', as: :user_provided_certificate optional :certificate, allow_blank: false, types: [File, String], desc: 'The certificate', as: :user_provided_certificate
optional :key, allow_blank: false, types: [File, String], desc: 'The key', as: :user_provided_key optional :key, allow_blank: false, types: [File, String], desc: 'The key', as: :user_provided_key
# rubocop:enable Scalability/FileUploads
end end
put ":id/pages/domains/:domain", requirements: PAGES_DOMAINS_ENDPOINT_REQUIREMENTS do put ":id/pages/domains/:domain", requirements: PAGES_DOMAINS_ENDPOINT_REQUIREMENTS do
authorize! :update_pages, user_project authorize! :update_pages, user_project
......
...@@ -27,7 +27,8 @@ module API ...@@ -27,7 +27,8 @@ module API
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
params do params do
requires :path, type: String, desc: 'The new project path and name' requires :path, type: String, desc: 'The new project path and name'
requires :file, type: File, desc: 'The project export file to be imported' # TODO: remove rubocop disable - https://gitlab.com/gitlab-org/gitlab-ee/issues/14960
requires :file, type: File, desc: 'The project export file to be imported' # rubocop:disable Scalability/FileUploads
optional :namespace, type: String, desc: "The ID or name of the namespace that the project will be imported into. Defaults to the current user's namespace." optional :namespace, type: String, desc: "The ID or name of the namespace that the project will be imported into. Defaults to the current user's namespace."
optional :overwrite, type: Boolean, default: false, desc: 'If there is a project in the same namespace and with the same name overwrite it' optional :overwrite, type: Boolean, default: false, desc: 'If there is a project in the same namespace and with the same name overwrite it'
optional :override_params, optional :override_params,
......
...@@ -478,7 +478,8 @@ module API ...@@ -478,7 +478,8 @@ module API
desc 'Upload a file' desc 'Upload a file'
params do params do
requires :file, type: File, desc: 'The file to be uploaded' # TODO: remove rubocop disable - https://gitlab.com/gitlab-org/gitlab-ee/issues/14960
requires :file, type: File, desc: 'The file to be uploaded' # rubocop:disable Scalability/FileUploads
end end
post ":id/uploads" do post ":id/uploads" do
UploadService.new(user_project, params[:file]).execute.to_h UploadService.new(user_project, params[:file]).execute.to_h
......
...@@ -50,7 +50,8 @@ module API ...@@ -50,7 +50,8 @@ module API
optional :admin, type: Boolean, desc: 'Flag indicating the user is an administrator' optional :admin, type: Boolean, desc: 'Flag indicating the user is an administrator'
optional :can_create_group, type: Boolean, desc: 'Flag indicating the user can create groups' optional :can_create_group, type: Boolean, desc: 'Flag indicating the user can create groups'
optional :external, type: Boolean, desc: 'Flag indicating the user is an external user' optional :external, type: Boolean, desc: 'Flag indicating the user is an external user'
optional :avatar, type: File, desc: 'Avatar image for user' # TODO: remove rubocop disable - https://gitlab.com/gitlab-org/gitlab-ee/issues/14960
optional :avatar, type: File, desc: 'Avatar image for user' # rubocop:disable Scalability/FileUploads
optional :private_profile, type: Boolean, default: false, desc: 'Flag indicating the user has a private profile' optional :private_profile, type: Boolean, default: false, desc: 'Flag indicating the user has a private profile'
all_or_none_of :extern_uid, :provider all_or_none_of :extern_uid, :provider
......
...@@ -4,7 +4,7 @@ module Backup ...@@ -4,7 +4,7 @@ module Backup
class Manager class Manager
ARCHIVES_TO_BACKUP = %w[uploads builds artifacts pages lfs registry].freeze ARCHIVES_TO_BACKUP = %w[uploads builds artifacts pages lfs registry].freeze
FOLDERS_TO_BACKUP = %w[repositories db].freeze FOLDERS_TO_BACKUP = %w[repositories db].freeze
FILE_NAME_SUFFIX = '_gitlab_backup.tar'.freeze FILE_NAME_SUFFIX = '_gitlab_backup.tar'
attr_reader :progress attr_reader :progress
......
...@@ -5,7 +5,7 @@ module Banzai ...@@ -5,7 +5,7 @@ module Banzai
# HTML filter that renders `color` followed by a color "chip". # HTML filter that renders `color` followed by a color "chip".
# #
class ColorFilter < HTML::Pipeline::Filter class ColorFilter < HTML::Pipeline::Filter
COLOR_CHIP_CLASS = 'gfm-color_chip'.freeze COLOR_CHIP_CLASS = 'gfm-color_chip'
def call def call
doc.css('code').each do |node| doc.css('code').each do |node|
......
...@@ -5,8 +5,8 @@ module Banzai ...@@ -5,8 +5,8 @@ module Banzai
# HTML Filter to modify the attributes of external links # HTML Filter to modify the attributes of external links
class ExternalLinkFilter < HTML::Pipeline::Filter class ExternalLinkFilter < HTML::Pipeline::Filter
SCHEMES = ['http', 'https', nil].freeze SCHEMES = ['http', 'https', nil].freeze
RTLO = "\u202E".freeze RTLO = "\u202E"
ENCODED_RTLO = '%E2%80%AE'.freeze ENCODED_RTLO = '%E2%80%AE'
def call def call
links.each do |node| links.each do |node|
......
...@@ -17,8 +17,8 @@ module Banzai ...@@ -17,8 +17,8 @@ module Banzai
# #
class FootnoteFilter < HTML::Pipeline::Filter class FootnoteFilter < HTML::Pipeline::Filter
INTEGER_PATTERN = /\A\d+\z/.freeze INTEGER_PATTERN = /\A\d+\z/.freeze
FOOTNOTE_ID_PREFIX = 'fn'.freeze FOOTNOTE_ID_PREFIX = 'fn'
FOOTNOTE_LINK_ID_PREFIX = 'fnref'.freeze FOOTNOTE_LINK_ID_PREFIX = 'fnref'
FOOTNOTE_LI_REFERENCE_PATTERN = /\A#{FOOTNOTE_ID_PREFIX}\d+\z/.freeze FOOTNOTE_LI_REFERENCE_PATTERN = /\A#{FOOTNOTE_ID_PREFIX}\d+\z/.freeze
FOOTNOTE_LINK_REFERENCE_PATTERN = /\A#{FOOTNOTE_LINK_ID_PREFIX}\d+\z/.freeze FOOTNOTE_LINK_REFERENCE_PATTERN = /\A#{FOOTNOTE_LINK_ID_PREFIX}\d+\z/.freeze
FOOTNOTE_START_NUMBER = 1 FOOTNOTE_START_NUMBER = 1
......
...@@ -11,14 +11,14 @@ module Banzai ...@@ -11,14 +11,14 @@ module Banzai
# #
class MathFilter < HTML::Pipeline::Filter class MathFilter < HTML::Pipeline::Filter
# Attribute indicating inline or display math. # Attribute indicating inline or display math.
STYLE_ATTRIBUTE = 'data-math-style'.freeze STYLE_ATTRIBUTE = 'data-math-style'
# Class used for tagging elements that should be rendered # Class used for tagging elements that should be rendered
TAG_CLASS = 'js-render-math'.freeze TAG_CLASS = 'js-render-math'
INLINE_CLASSES = "code math #{TAG_CLASS}".freeze INLINE_CLASSES = "code math #{TAG_CLASS}"
DOLLAR_SIGN = '$'.freeze DOLLAR_SIGN = '$'
def call def call
doc.css('code').each do |code| doc.css('code').each do |code|
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment