Commit d77433a8 authored by Clement Ho's avatar Clement Ho

Merge branch 'master' into 'bootstrap4'

# Conflicts:
#   app/views/shared/runners/_form.html.haml
parents f6e47f6f 0afcfd31
...@@ -218,9 +218,6 @@ gem 'ruby-fogbugz', '~> 0.2.1' ...@@ -218,9 +218,6 @@ gem 'ruby-fogbugz', '~> 0.2.1'
# Kubernetes integration # Kubernetes integration
gem 'kubeclient', '~> 3.0' gem 'kubeclient', '~> 3.0'
# d3
gem 'd3_rails', '~> 3.5.0'
# Sanitize user input # Sanitize user input
gem 'sanitize', '~> 2.0' gem 'sanitize', '~> 2.0'
gem 'babosa', '~> 1.0.2' gem 'babosa', '~> 1.0.2'
...@@ -260,7 +257,7 @@ gem 'addressable', '~> 2.5.2' ...@@ -260,7 +257,7 @@ gem 'addressable', '~> 2.5.2'
gem 'bootstrap-sass', '~> 3.3.0' gem 'bootstrap-sass', '~> 3.3.0'
gem 'font-awesome-rails', '~> 4.7' gem 'font-awesome-rails', '~> 4.7'
gem 'gemojione', '~> 3.3' gem 'gemojione', '~> 3.3'
gem 'gon', '~> 6.1.0' gem 'gon', '~> 6.2'
gem 'jquery-atwho-rails', '~> 1.3.2' gem 'jquery-atwho-rails', '~> 1.3.2'
gem 'request_store', '~> 1.3' gem 'request_store', '~> 1.3'
gem 'select2-rails', '~> 3.5.9' gem 'select2-rails', '~> 3.5.9'
...@@ -297,7 +294,7 @@ group :metrics do ...@@ -297,7 +294,7 @@ group :metrics do
gem 'influxdb', '~> 0.2', require: false gem 'influxdb', '~> 0.2', require: false
# Prometheus # Prometheus
gem 'prometheus-client-mmap', '~> 0.9.1' gem 'prometheus-client-mmap', '~> 0.9.2'
gem 'raindrops', '~> 0.18' gem 'raindrops', '~> 0.18'
end end
...@@ -434,4 +431,4 @@ gem 'lograge', '~> 0.5' ...@@ -434,4 +431,4 @@ gem 'lograge', '~> 0.5'
gem 'grape_logging', '~> 1.7' gem 'grape_logging', '~> 1.7'
# Asset synchronization # Asset synchronization
gem 'asset_sync', '~> 2.2.0' gem 'asset_sync', '~> 2.4'
...@@ -59,7 +59,7 @@ GEM ...@@ -59,7 +59,7 @@ GEM
asciidoctor (1.5.6.2) asciidoctor (1.5.6.2)
asciidoctor-plantuml (0.0.8) asciidoctor-plantuml (0.0.8)
asciidoctor (~> 1.5) asciidoctor (~> 1.5)
asset_sync (2.2.0) asset_sync (2.4.0)
activemodel (>= 4.1.0) activemodel (>= 4.1.0)
fog-core fog-core
mime-types (>= 2.99) mime-types (>= 2.99)
...@@ -147,8 +147,6 @@ GEM ...@@ -147,8 +147,6 @@ GEM
creole (0.5.0) creole (0.5.0)
css_parser (1.5.0) css_parser (1.5.0)
addressable addressable
d3_rails (3.5.11)
railties (>= 3.1.0)
daemons (1.2.3) daemons (1.2.3)
database_cleaner (1.5.3) database_cleaner (1.5.3)
debug_inspector (0.0.2) debug_inspector (0.0.2)
...@@ -197,7 +195,7 @@ GEM ...@@ -197,7 +195,7 @@ GEM
et-orbi (1.0.3) et-orbi (1.0.3)
tzinfo tzinfo
eventmachine (1.0.8) eventmachine (1.0.8)
excon (0.60.0) excon (0.62.0)
execjs (2.6.0) execjs (2.6.0)
expression_parser (0.9.0) expression_parser (0.9.0)
factory_bot (4.8.2) factory_bot (4.8.2)
...@@ -334,9 +332,8 @@ GEM ...@@ -334,9 +332,8 @@ GEM
activesupport (>= 4.2.0) activesupport (>= 4.2.0)
gollum-grit_adapter (1.0.1) gollum-grit_adapter (1.0.1)
gitlab-grit (~> 2.7, >= 2.7.1) gitlab-grit (~> 2.7, >= 2.7.1)
gon (6.1.0) gon (6.2.0)
actionpack (>= 3.0) actionpack (>= 3.0)
json
multi_json multi_json
request_store (>= 1.0) request_store (>= 1.0)
google-api-client (0.19.8) google-api-client (0.19.8)
...@@ -634,7 +631,7 @@ GEM ...@@ -634,7 +631,7 @@ GEM
parser parser
unparser unparser
procto (0.0.3) procto (0.0.3)
prometheus-client-mmap (0.9.1) prometheus-client-mmap (0.9.2)
pry (0.10.4) pry (0.10.4)
coderay (~> 1.1.0) coderay (~> 1.1.0)
method_source (~> 0.8.1) method_source (~> 0.8.1)
...@@ -998,7 +995,7 @@ DEPENDENCIES ...@@ -998,7 +995,7 @@ DEPENDENCIES
asana (~> 0.6.0) asana (~> 0.6.0)
asciidoctor (~> 1.5.6) asciidoctor (~> 1.5.6)
asciidoctor-plantuml (= 0.0.8) asciidoctor-plantuml (= 0.0.8)
asset_sync (~> 2.2.0) asset_sync (~> 2.4)
attr_encrypted (~> 3.1.0) attr_encrypted (~> 3.1.0)
awesome_print (~> 1.2.0) awesome_print (~> 1.2.0)
babosa (~> 1.0.2) babosa (~> 1.0.2)
...@@ -1024,7 +1021,6 @@ DEPENDENCIES ...@@ -1024,7 +1021,6 @@ DEPENDENCIES
concurrent-ruby (~> 1.0.5) concurrent-ruby (~> 1.0.5)
connection_pool (~> 2.0) connection_pool (~> 2.0)
creole (~> 0.5.0) creole (~> 0.5.0)
d3_rails (~> 3.5.0)
database_cleaner (~> 1.5.0) database_cleaner (~> 1.5.0)
deckar01-task_list (= 2.0.0) deckar01-task_list (= 2.0.0)
default_value_for (~> 3.0.0) default_value_for (~> 3.0.0)
...@@ -1068,7 +1064,7 @@ DEPENDENCIES ...@@ -1068,7 +1064,7 @@ DEPENDENCIES
gitlab-markup (~> 1.6.2) gitlab-markup (~> 1.6.2)
gitlab-styles (~> 2.3) gitlab-styles (~> 2.3)
gitlab_omniauth-ldap (~> 2.0.4) gitlab_omniauth-ldap (~> 2.0.4)
gon (~> 6.1.0) gon (~> 6.2)
google-api-client (~> 0.19.8) google-api-client (~> 0.19.8)
google-protobuf (= 3.5.1) google-protobuf (= 3.5.1)
gpgme gpgme
...@@ -1133,7 +1129,7 @@ DEPENDENCIES ...@@ -1133,7 +1129,7 @@ DEPENDENCIES
peek-sidekiq (~> 1.0.3) peek-sidekiq (~> 1.0.3)
pg (~> 0.18.2) pg (~> 0.18.2)
premailer-rails (~> 1.9.7) premailer-rails (~> 1.9.7)
prometheus-client-mmap (~> 0.9.1) prometheus-client-mmap (~> 0.9.2)
pry-byebug (~> 3.4.1) pry-byebug (~> 3.4.1)
pry-rails (~> 0.3.4) pry-rails (~> 0.3.4)
rack-attack (~> 4.4.1) rack-attack (~> 4.4.1)
......
...@@ -82,7 +82,6 @@ export default () => { ...@@ -82,7 +82,6 @@ export default () => {
this.service this.service
.fetchCycleAnalyticsData(fetchOptions) .fetchCycleAnalyticsData(fetchOptions)
.then(resp => resp.json())
.then((response) => { .then((response) => {
this.store.setCycleAnalyticsData(response); this.store.setCycleAnalyticsData(response);
this.selectDefaultStage(); this.selectDefaultStage();
...@@ -116,7 +115,6 @@ export default () => { ...@@ -116,7 +115,6 @@ export default () => {
stage, stage,
startDate: this.startDate, startDate: this.startDate,
}) })
.then(resp => resp.json())
.then((response) => { .then((response) => {
this.isEmptyStage = !response.events.length; this.isEmptyStage = !response.events.length;
this.store.setStageEvents(response.events, stage); this.store.setStageEvents(response.events, stage);
......
import Vue from 'vue'; import axios from '~/lib/utils/axios_utils';
import VueResource from 'vue-resource';
Vue.use(VueResource);
export default class CycleAnalyticsService { export default class CycleAnalyticsService {
constructor(options) { constructor(options) {
this.requestPath = options.requestPath; this.axios = axios.create({
this.cycleAnalytics = Vue.resource(this.requestPath); baseURL: options.requestPath,
});
} }
fetchCycleAnalyticsData(options = { startDate: 30 }) { fetchCycleAnalyticsData(options = { startDate: 30 }) {
return this.cycleAnalytics.get({ cycle_analytics: { start_date: options.startDate } }); return this.axios
.get('', {
params: {
'cycle_analytics[start_date]': options.startDate,
},
})
.then(x => x.data);
} }
fetchStageData(options) { fetchStageData(options) {
...@@ -19,12 +23,12 @@ export default class CycleAnalyticsService { ...@@ -19,12 +23,12 @@ export default class CycleAnalyticsService {
startDate, startDate,
} = options; } = options;
return Vue.http.get(`${this.requestPath}/events/${stage.name}.json`, { return this.axios
params: { .get(`events/${stage.name}.json`, {
cycle_analytics: { params: {
start_date: startDate, 'cycle_analytics[start_date]': startDate,
}, },
}, })
}); .then(x => x.data);
} }
} }
import Vue from 'vue'; import axios from '~/lib/utils/axios_utils';
import VueResource from 'vue-resource';
Vue.use(VueResource);
export default class DeployKeysService { export default class DeployKeysService {
constructor(endpoint) { constructor(endpoint) {
this.endpoint = endpoint; this.axios = axios.create({
baseURL: endpoint,
this.resource = Vue.resource( });
`${this.endpoint}{/id}`,
{},
{
enable: {
method: 'PUT',
url: `${this.endpoint}{/id}/enable`,
},
disable: {
method: 'PUT',
url: `${this.endpoint}{/id}/disable`,
},
},
);
} }
getKeys() { getKeys() {
return this.resource.get().then(response => response.json()); return this.axios.get()
.then(response => response.data);
} }
enableKey(id) { enableKey(id) {
return this.resource.enable({ id }, {}); return this.axios.put(`${id}/enable`)
.then(response => response.data);
} }
disableKey(id) { disableKey(id) {
return this.resource.disable({ id }, {}); return this.axios.put(`${id}/disable`)
.then(response => response.data);
} }
} }
<script> <script>
import { mapActions, mapState } from 'vuex'; import { mapActions, mapState, mapGetters } from 'vuex';
import { sprintf, __ } from '~/locale'; import { sprintf, __ } from '~/locale';
import * as consts from '../../stores/modules/commit/constants'; import * as consts from '../../stores/modules/commit/constants';
import RadioGroup from './radio_group.vue'; import RadioGroup from './radio_group.vue';
...@@ -10,6 +10,7 @@ export default { ...@@ -10,6 +10,7 @@ export default {
}, },
computed: { computed: {
...mapState(['currentBranchId', 'changedFiles', 'stagedFiles']), ...mapState(['currentBranchId', 'changedFiles', 'stagedFiles']),
...mapGetters(['currentProject']),
commitToCurrentBranchText() { commitToCurrentBranchText() {
return sprintf( return sprintf(
__('Commit to %{branchName} branch'), __('Commit to %{branchName} branch'),
...@@ -52,6 +53,7 @@ export default { ...@@ -52,6 +53,7 @@ export default {
:show-input="true" :show-input="true"
/> />
<radio-group <radio-group
v-if="currentProject.merge_requests_enabled"
:value="$options.commitToNewBranchMR" :value="$options.commitToNewBranchMR"
:label="__('Create a new branch and merge request')" :label="__('Create a new branch and merge request')"
:show-input="true" :show-input="true"
......
...@@ -110,8 +110,8 @@ export default { ...@@ -110,8 +110,8 @@ export default {
Welcome to the GitLab IDE Welcome to the GitLab IDE
</h4> </h4>
<p> <p>
You can select a file in the left sidebar to begin Select a file from the left sidebar to begin editing.
editing and use the right sidebar to commit your changes. Afterwards, you'll be able to commit your changes.
</p> </p>
</div> </div>
</div> </div>
......
...@@ -14,12 +14,12 @@ export default class Model { ...@@ -14,12 +14,12 @@ export default class Model {
(this.originalModel = this.monaco.editor.createModel( (this.originalModel = this.monaco.editor.createModel(
head ? head.content : this.file.raw, head ? head.content : this.file.raw,
undefined, undefined,
new this.monaco.Uri(null, null, `original/${this.file.key}`), new this.monaco.Uri(null, null, `original/${this.path}`),
)), )),
(this.model = this.monaco.editor.createModel( (this.model = this.monaco.editor.createModel(
this.content, this.content,
undefined, undefined,
new this.monaco.Uri(null, null, this.file.key), new this.monaco.Uri(null, null, this.path),
)), )),
); );
if (this.file.mrChange) { if (this.file.mrChange) {
...@@ -27,7 +27,7 @@ export default class Model { ...@@ -27,7 +27,7 @@ export default class Model {
(this.baseModel = this.monaco.editor.createModel( (this.baseModel = this.monaco.editor.createModel(
this.file.baseRaw, this.file.baseRaw,
undefined, undefined,
new this.monaco.Uri(null, null, `target/${this.file.path}`), new this.monaco.Uri(null, null, `target/${this.path}`),
)), )),
); );
} }
......
...@@ -196,6 +196,8 @@ export const unstageChange = ({ commit }, path) => { ...@@ -196,6 +196,8 @@ export const unstageChange = ({ commit }, path) => {
}; };
export const openPendingTab = ({ commit, getters, dispatch, state }, { file, keyPrefix }) => { export const openPendingTab = ({ commit, getters, dispatch, state }, { file, keyPrefix }) => {
if (getters.activeFile && getters.activeFile.key === `${keyPrefix}-${file.key}`) return false;
state.openFiles.forEach(f => eventHub.$emit(`editor.update.model.dispose.${f.key}`)); state.openFiles.forEach(f => eventHub.$emit(`editor.update.model.dispose.${f.key}`));
commit(types.ADD_PENDING_TAB, { file, keyPrefix }); commit(types.ADD_PENDING_TAB, { file, keyPrefix });
......
...@@ -36,7 +36,9 @@ ul.notes-form, ...@@ -36,7 +36,9 @@ ul.notes-form,
.gutter-toggle, .gutter-toggle,
.issuable-details .content-block-small, .issuable-details .content-block-small,
.edit-link, .edit-link,
.note-action-button { .note-action-button,
.right-sidebar,
.flash-container {
display: none !important; display: none !important;
} }
...@@ -53,3 +55,7 @@ pre { ...@@ -53,3 +55,7 @@ pre {
.right-sidebar { .right-sidebar {
top: 0; top: 0;
} }
a[href]::after {
content: none !important;
}
...@@ -7,9 +7,9 @@ class Import::BaseController < ApplicationController ...@@ -7,9 +7,9 @@ class Import::BaseController < ApplicationController
def find_jobs(import_type) def find_jobs(import_type)
current_user.created_projects current_user.created_projects
.includes(:import_state) .includes(:import_state)
.where(import_type: import_type) .where(import_type: import_type)
.to_json(only: [:id], methods: [:import_status]) .to_json(only: [:id], methods: [:import_status])
end end
def find_or_create_namespace(names, owner) def find_or_create_namespace(names, owner)
......
...@@ -58,6 +58,7 @@ module Ci ...@@ -58,6 +58,7 @@ module Ci
validate :tag_constraints validate :tag_constraints
validate :either_projects_or_group validate :either_projects_or_group
validates :access_level, presence: true validates :access_level, presence: true
validates :runner_type, presence: true
acts_as_taggable acts_as_taggable
......
...@@ -43,12 +43,20 @@ module Clusters ...@@ -43,12 +43,20 @@ module Clusters
def create_and_assign_runner def create_and_assign_runner
transaction do transaction do
project.runners.create!(name: 'kubernetes-cluster', tag_list: %w(kubernetes cluster)).tap do |runner| project.runners.create!(runner_create_params).tap do |runner|
update!(runner_id: runner.id) update!(runner_id: runner.id)
end end
end end
end end
def runner_create_params
{
name: 'kubernetes-cluster',
runner_type: :project_type,
tag_list: %w(kubernetes cluster)
}
end
def gitlab_url def gitlab_url
Gitlab::Routing.url_helpers.root_url(only_path: false) Gitlab::Routing.url_helpers.root_url(only_path: false)
end end
......
...@@ -30,6 +30,8 @@ module TimeTrackable ...@@ -30,6 +30,8 @@ module TimeTrackable
return if @time_spent == 0 return if @time_spent == 0
touch if touchable?
if @time_spent == :reset if @time_spent == :reset
reset_spent_time reset_spent_time
else else
...@@ -53,6 +55,10 @@ module TimeTrackable ...@@ -53,6 +55,10 @@ module TimeTrackable
private private
def touchable?
valid? && persisted?
end
def reset_spent_time def reset_spent_time
timelogs.new(time_spent: total_time_spent * -1, user: @time_spent_user) # rubocop:disable Gitlab/ModuleWithInstanceVariables timelogs.new(time_spent: total_time_spent * -1, user: @time_spent_user) # rubocop:disable Gitlab/ModuleWithInstanceVariables
end end
......
...@@ -37,7 +37,7 @@ class Repository ...@@ -37,7 +37,7 @@ class Repository
changelog license_blob license_key gitignore koding_yml changelog license_blob license_key gitignore koding_yml
gitlab_ci_yml branch_names tag_names branch_count gitlab_ci_yml branch_names tag_names branch_count
tag_count avatar exists? root_ref has_visible_content? tag_count avatar exists? root_ref has_visible_content?
issue_template_names merge_request_template_names).freeze issue_template_names merge_request_template_names xcode_project?).freeze
# Methods that use cache_method but only memoize the value # Methods that use cache_method but only memoize the value
MEMOIZED_CACHED_METHODS = %i(license).freeze MEMOIZED_CACHED_METHODS = %i(license).freeze
...@@ -55,7 +55,8 @@ class Repository ...@@ -55,7 +55,8 @@ class Repository
gitlab_ci: :gitlab_ci_yml, gitlab_ci: :gitlab_ci_yml,
avatar: :avatar, avatar: :avatar,
issue_template: :issue_template_names, issue_template: :issue_template_names,
merge_request_template: :merge_request_template_names merge_request_template: :merge_request_template_names,
xcode_config: :xcode_project?
}.freeze }.freeze
def initialize(full_path, project, disk_path: nil, is_wiki: false) def initialize(full_path, project, disk_path: nil, is_wiki: false)
...@@ -594,6 +595,11 @@ class Repository ...@@ -594,6 +595,11 @@ class Repository
end end
cache_method :gitlab_ci_yml cache_method :gitlab_ci_yml
def xcode_project?
file_on_head(:xcode_config).present?
end
cache_method :xcode_project?
def head_commit def head_commit
@head_commit ||= commit(self.root_ref) @head_commit ||= commit(self.root_ref)
end end
......
...@@ -87,7 +87,7 @@ module Projects ...@@ -87,7 +87,7 @@ module Projects
new_path = removal_path(path) new_path = removal_path(path)
if mv_repository(path, new_path) if mv_repository(path, new_path)
log_info("Repository \"#{path}\" moved to \"#{new_path}\"") log_info(%Q{Repository "#{path}" moved to "#{new_path}" for project "#{project.full_path}"})
project.run_after_commit do project.run_after_commit do
# self is now project # self is now project
......
...@@ -49,7 +49,7 @@ module Users ...@@ -49,7 +49,7 @@ module Users
migrate_merge_requests migrate_merge_requests
migrate_notes migrate_notes
migrate_abuse_reports migrate_abuse_reports
migrate_award_emojis migrate_award_emoji
end end
def migrate_issues def migrate_issues
...@@ -70,7 +70,7 @@ module Users ...@@ -70,7 +70,7 @@ module Users
user.reported_abuse_reports.update_all(reporter_id: ghost_user.id) user.reported_abuse_reports.update_all(reporter_id: ghost_user.id)
end end
def migrate_award_emojis def migrate_award_emoji
user.award_emoji.update_all(user_id: ghost_user.id) user.award_emoji.update_all(user_id: ghost_user.id)
end end
end end
......
- link = link_to 'Runners API', help_page_path('api/runners.md') - link = link_to _('Runners API'), help_page_path('api/runners.md')
%h3 %h3
= _('Group Runners') = _('Group Runners')
......
- page_title "Edit", "#{@runner.description} ##{@runner.id}", "Runners" - page_title _('Edit'), "#{@runner.description} ##{@runner.id}", 'Runners'
%h4 Runner ##{@runner.id} %h4 Runner ##{@runner.id}
......
- link = link_to 'Runners API', help_page_path('api/runners.md') - link = link_to _('Runners API'), help_page_path('api/runners.md')
%h3 %h3
= _('Group Runners') = _('Group Runners')
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
= _('This group does not provide any group Runners yet.') = _('This group does not provide any group Runners yet.')
- if can?(current_user, :admin_pipeline, @project.group) - if can?(current_user, :admin_pipeline, @project.group)
- group_link = link_to 'Group CI/CD settings', group_settings_ci_cd_path(@project.group) - group_link = link_to _('Group CI/CD settings'), group_settings_ci_cd_path(@project.group)
= _('Group masters can register group runners in the %{link}').html_safe % { link: group_link } = _('Group masters can register group runners in the %{link}').html_safe % { link: group_link }
- else - else
= _('Ask your group master to setup a group Runner.') = _('Ask your group master to setup a group Runner.')
......
%h3 Shared Runners %h3
= _('Shared Runners')
.bs-callout.shared-runners-description .bs-callout.shared-runners-description
- if Gitlab::CurrentSettings.shared_runners_text.present? - if Gitlab::CurrentSettings.shared_runners_text.present?
...@@ -17,8 +18,7 @@ ...@@ -17,8 +18,7 @@
&nbsp; for this project &nbsp; for this project
- if @shared_runners_count.zero? - if @shared_runners_count.zero?
This GitLab instance does not provide any shared Runners yet. Instance = _('This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area.')
administrators can register shared Runners in the admin area.
- else - else
%h4.underlined-title Available shared Runners : #{@shared_runners_count} %h4.underlined-title Available shared Runners : #{@shared_runners_count}
%ul.bordered-list.available-shared-runners %ul.bordered-list.available-shared-runners
......
%h3 Specific Runners %h3
= _('Specific Runners')
= render partial: 'ci/runner/how_to_setup_specific_runner', = render partial: 'ci/runner/how_to_setup_specific_runner',
locals: { registration_token: @project.runners_token } locals: { registration_token: @project.runners_token }
......
- page_title "Edit", "#{@runner.description} ##{@runner.id}", "Runners" - page_title _('Edit'), "#{@runner.description} ##{@runner.id}", 'Runners'
%h4 Runner ##{@runner.id} %h4 Runner ##{@runner.id}
......
...@@ -20,11 +20,11 @@ ...@@ -20,11 +20,11 @@
%span.light Indicates whether this runner can pick jobs without tags %span.light Indicates whether this runner can pick jobs without tags
- unless runner.group_type? - unless runner.group_type?
.form-group.row .form-group.row
= label :locked, 'Lock to current projects', class: 'col-form-label col-sm-2' = label :locked, _('Lock to current projects'), class: 'col-form-label col-sm-2'
.col-sm-10 .col-sm-10
.form-check .form-check
= f.check_box :locked = f.check_box :locked
%span.light When a runner is locked, it cannot be assigned to other projects %span.light= _('When a runner is locked, it cannot be assigned to other projects')
.form-group.row .form-group.row
= label_tag :token, class: 'col-form-label col-sm-2' do = label_tag :token, class: 'col-form-label col-sm-2' do
Token Token
......
...@@ -21,17 +21,17 @@ ...@@ -21,17 +21,17 @@
%th Value %th Value
%tr %tr
%td Active %td Active
%td= @runner.active? ? 'Yes' : 'No' %td= @runner.active? ? _('Yes') : _('No')
%tr %tr
%td Protected %td Protected
%td= @runner.ref_protected? ? 'Yes' : 'No' %td= @runner.ref_protected? ? _('Yes') : _('No')
%tr %tr
%td Can run untagged jobs %td= _('Can run untagged jobs')
%td= @runner.run_untagged? ? 'Yes' : 'No' %td= @runner.run_untagged? ? _('Yes') : _('No')
- unless @runner.group_type? - unless @runner.group_type?
%tr %tr
%td Locked to this project %td= _('Locked to this project')
%td= @runner.locked? ? 'Yes' : 'No' %td= @runner.locked? ? _('Yes') : _('No')
%tr %tr
%td Tags %td Tags
%td %td
...@@ -60,7 +60,7 @@ ...@@ -60,7 +60,7 @@
%td Description %td Description
%td= @runner.description %td= @runner.description
%tr %tr
%td Maximum job timeout %td= _('Maximum job timeout')
%td= @runner.maximum_timeout_human_readable %td= @runner.maximum_timeout_human_readable
%tr %tr
%td Last contact %td Last contact
......
...@@ -9,85 +9,6 @@ module ObjectStorage ...@@ -9,85 +9,6 @@ module ObjectStorage
SanityCheckError = Class.new(StandardError) SanityCheckError = Class.new(StandardError)
class Upload < ActiveRecord::Base
# Upper limit for foreground checksum processing
CHECKSUM_THRESHOLD = 100.megabytes
belongs_to :model, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
validates :size, presence: true
validates :path, presence: true
validates :model, presence: true
validates :uploader, presence: true
before_save :calculate_checksum!, if: :foreground_checksummable?
after_commit :schedule_checksum, if: :checksummable?
scope :stored_locally, -> { where(store: [nil, ObjectStorage::Store::LOCAL]) }
scope :stored_remotely, -> { where(store: ObjectStorage::Store::REMOTE) }
def self.hexdigest(path)
Digest::SHA256.file(path).hexdigest
end
def absolute_path
raise ObjectStorage::RemoteStoreError, "Remote object has no absolute path." unless local?
return path unless relative_path?
uploader_class.absolute_path(self)
end
def calculate_checksum!
self.checksum = nil
return unless checksummable?
self.checksum = self.class.hexdigest(absolute_path)
end
def build_uploader(mounted_as = nil)
uploader_class.new(model, mounted_as).tap do |uploader|
uploader.upload = self
uploader.retrieve_from_store!(identifier)
end
end
def exist?
File.exist?(absolute_path)
end
def local?
return true if store.nil?
store == ObjectStorage::Store::LOCAL
end
private
def checksummable?
checksum.nil? && local? && exist?
end
def foreground_checksummable?
checksummable? && size <= CHECKSUM_THRESHOLD
end
def schedule_checksum
UploadChecksumWorker.perform_async(id)
end
def relative_path?
!path.start_with?('/')
end
def identifier
File.basename(path)
end
def uploader_class
Object.const_get(uploader)
end
end
class MigrationResult class MigrationResult
attr_reader :upload attr_reader :upload
attr_accessor :error attr_accessor :error
......
---
title: Fix print styles for markdown pages
merge_request:
author:
type: fixed
---
title: Updates updated_at on issuable when setting time spent
merge_request: 18757
author: Jacopo Beschi @jacopo-beschi
type: added
---
title: Raise NoRepository error for non-valid repositories when calculating repository
checksum
merge_request: 18594
author:
type: fixed
---
title: 'Replace the `project/deploy_keys.feature` spinach test with an rspec analog'
merge_request: 18796
author: '@blackst0ne'
type: other
---
title: 'Replace the `project/ff_merge_requests.feature` spinach test with an rspec analog'
merge_request: 18800
author: '@blackst0ne'
type: other
---
title: 'Replace the `project/issues/references.feature` spinach test with an rspec analog'
merge_request: 18769
author: '@blackst0ne'
type: other
---
title: Add database foreign key constraint between pipelines and build
merge_request: 18822
author:
type: fixed
---
title: Fixes database inconsistencies between Community and Enterprise Edition on
import state
merge_request: 18811
author:
type: fixed
---
title: Fix finding wiki pages when they have invalidly-encoded content
merge_request: 18856
author:
type: fixed
---
title: Hide merge request option in IDE when disabled
merge_request:
author:
type: changed
---
title: Fix outdated Web IDE welcome copy
merge_request: 18861
author:
type: fixed
---
title: Add support for 'active' setting on Runner Registration API endpoint
merge_request: 18848
author:
type: changed
...@@ -7,6 +7,20 @@ module Gollum ...@@ -7,6 +7,20 @@ module Gollum
end end
require "gollum-lib" require "gollum-lib"
module Gollum
class Page
def text_data(encoding = nil)
data = if raw_data.respond_to?(:encoding)
raw_data.force_encoding(encoding || Encoding::UTF_8)
else
raw_data
end
Gitlab::EncodingHelper.encode!(data)
end
end
end
Rails.application.configure do Rails.application.configure do
config.after_initialize do config.after_initialize do
Gollum::Page.per_page = Kaminari.config.default_per_page Gollum::Page.per_page = Kaminari.config.default_per_page
......
class InitSchema < ActiveRecord::Migration class InitSchema < ActiveRecord::Migration
DOWNTIME = true
def up def up
create_table "broadcast_messages", force: :cascade do |t| create_table "broadcast_messages", force: :cascade do |t|
t.text "message", null: false t.text "message", null: false
......
class AddPipelineBuildForeignKey < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
disable_ddl_transaction!
def up
execute <<~SQL
DELETE FROM ci_builds WHERE project_id IS NULL OR commit_id IS NULL
SQL
execute <<~SQL
DELETE FROM ci_builds WHERE NOT EXISTS
(SELECT true FROM ci_pipelines WHERE ci_pipelines.id = ci_builds.commit_id)
AND stage_id IS NULL
SQL
add_concurrent_foreign_key(:ci_builds, :ci_pipelines, column: :commit_id)
end
def down
return unless foreign_key_exists?(:ci_builds, :ci_pipelines, column: :commit_id)
remove_foreign_key(:ci_builds, column: :commit_id)
end
end
...@@ -2,6 +2,7 @@ class CleanupBuildStageMigration < ActiveRecord::Migration ...@@ -2,6 +2,7 @@ class CleanupBuildStageMigration < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers include Gitlab::Database::MigrationHelpers
DOWNTIME = false DOWNTIME = false
TMP_INDEX = 'tmp_id_stage_partial_null_index'.freeze
disable_ddl_transaction! disable_ddl_transaction!
...@@ -13,16 +14,48 @@ class CleanupBuildStageMigration < ActiveRecord::Migration ...@@ -13,16 +14,48 @@ class CleanupBuildStageMigration < ActiveRecord::Migration
end end
def up def up
disable_statement_timeout
##
# We steal from the background migrations queue to catch up with the
# scheduled migrations set.
#
Gitlab::BackgroundMigration.steal('MigrateBuildStage') Gitlab::BackgroundMigration.steal('MigrateBuildStage')
##
# We add temporary index, to make iteration over batches more performant.
# Conditional here is to avoid the need of doing that in a separate
# migration file to make this operation idempotent.
#
unless index_exists_by_name?(:ci_builds, TMP_INDEX)
add_concurrent_index(:ci_builds, :id, where: 'stage_id IS NULL', name: TMP_INDEX)
end
##
# We check if there are remaining rows that should be migrated (for example
# if Sidekiq / Redis fails / is restarted, what could result in not all
# background migrations being executed correctly.
#
# We migrate remaining rows synchronously in a blocking way, to make sure
# that when this migration is done we are confident that all rows are
# already migrated.
#
Build.where('stage_id IS NULL').each_batch(of: 50) do |batch| Build.where('stage_id IS NULL').each_batch(of: 50) do |batch|
range = batch.pluck('MIN(id)', 'MAX(id)').first range = batch.pluck('MIN(id)', 'MAX(id)').first
Gitlab::BackgroundMigration::MigrateBuildStage.new.perform(*range) Gitlab::BackgroundMigration::MigrateBuildStage.new.perform(*range)
end end
##
# We remove temporary index, because it is not required during standard
# operations and runtime.
#
remove_concurrent_index_by_name(:ci_builds, TMP_INDEX)
end end
def down def down
# noop if index_exists_by_name?(:ci_builds, TMP_INDEX)
remove_concurrent_index_by_name(:ci_builds, TMP_INDEX)
end
end end
end end
class AddNotNullConstraintToProjectMirrorDataForeignKey < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
class ProjectImportState < ActiveRecord::Base
include EachBatch
self.table_name = 'project_mirror_data'
end
def up
ProjectImportState.where(project_id: nil).delete_all
change_column_null :project_mirror_data, :project_id, false
end
def down
change_column_null :project_mirror_data, :project_id, true
end
end
class AddUniqueConstraintToProjectMirrorDataProjectIdIndex < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
disable_ddl_transaction!
def up
add_concurrent_index(:project_mirror_data,
:project_id,
unique: true,
name: 'index_project_mirror_data_on_project_id_unique')
remove_concurrent_index_by_name(:project_mirror_data, 'index_project_mirror_data_on_project_id')
rename_index(:project_mirror_data,
'index_project_mirror_data_on_project_id_unique',
'index_project_mirror_data_on_project_id')
end
def down
rename_index(:project_mirror_data,
'index_project_mirror_data_on_project_id',
'index_project_mirror_data_on_project_id_old')
add_concurrent_index(:project_mirror_data, :project_id)
remove_concurrent_index_by_name(:project_mirror_data,
'index_project_mirror_data_on_project_id_old')
end
end
class SetRunnerTypeNotNull < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
def change
change_column_null(:ci_runners, :runner_type, false)
end
end
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20180508055821) do ActiveRecord::Schema.define(version: 20180508135515) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
...@@ -497,7 +497,7 @@ ActiveRecord::Schema.define(version: 20180508055821) do ...@@ -497,7 +497,7 @@ ActiveRecord::Schema.define(version: 20180508055821) do
t.integer "access_level", default: 0, null: false t.integer "access_level", default: 0, null: false
t.string "ip_address" t.string "ip_address"
t.integer "maximum_timeout" t.integer "maximum_timeout"
t.integer "runner_type", limit: 2 t.integer "runner_type", limit: 2, null: false
end end
add_index "ci_runners", ["contacted_at"], name: "index_ci_runners_on_contacted_at", using: :btree add_index "ci_runners", ["contacted_at"], name: "index_ci_runners_on_contacted_at", using: :btree
...@@ -1529,14 +1529,14 @@ ActiveRecord::Schema.define(version: 20180508055821) do ...@@ -1529,14 +1529,14 @@ ActiveRecord::Schema.define(version: 20180508055821) do
add_index "project_import_data", ["project_id"], name: "index_project_import_data_on_project_id", using: :btree add_index "project_import_data", ["project_id"], name: "index_project_import_data_on_project_id", using: :btree
create_table "project_mirror_data", force: :cascade do |t| create_table "project_mirror_data", force: :cascade do |t|
t.integer "project_id" t.integer "project_id", null: false
t.string "status" t.string "status"
t.string "jid" t.string "jid"
t.text "last_error" t.text "last_error"
end end
add_index "project_mirror_data", ["jid"], name: "index_project_mirror_data_on_jid", using: :btree add_index "project_mirror_data", ["jid"], name: "index_project_mirror_data_on_jid", using: :btree
add_index "project_mirror_data", ["project_id"], name: "index_project_mirror_data_on_project_id", using: :btree add_index "project_mirror_data", ["project_id"], name: "index_project_mirror_data_on_project_id", unique: true, using: :btree
add_index "project_mirror_data", ["status"], name: "index_project_mirror_data_on_status", using: :btree add_index "project_mirror_data", ["status"], name: "index_project_mirror_data_on_status", using: :btree
create_table "project_statistics", force: :cascade do |t| create_table "project_statistics", force: :cascade do |t|
...@@ -2148,6 +2148,7 @@ ActiveRecord::Schema.define(version: 20180508055821) do ...@@ -2148,6 +2148,7 @@ ActiveRecord::Schema.define(version: 20180508055821) do
add_foreign_key "ci_build_trace_sections", "ci_builds", column: "build_id", name: "fk_4ebe41f502", on_delete: :cascade add_foreign_key "ci_build_trace_sections", "ci_builds", column: "build_id", name: "fk_4ebe41f502", on_delete: :cascade
add_foreign_key "ci_build_trace_sections", "projects", on_delete: :cascade add_foreign_key "ci_build_trace_sections", "projects", on_delete: :cascade
add_foreign_key "ci_builds", "ci_pipelines", column: "auto_canceled_by_id", name: "fk_a2141b1522", on_delete: :nullify add_foreign_key "ci_builds", "ci_pipelines", column: "auto_canceled_by_id", name: "fk_a2141b1522", on_delete: :nullify
add_foreign_key "ci_builds", "ci_pipelines", column: "commit_id", name: "fk_d3130c9a7f", on_delete: :cascade
add_foreign_key "ci_builds", "ci_stages", column: "stage_id", name: "fk_3a9eaa254d", on_delete: :cascade add_foreign_key "ci_builds", "ci_stages", column: "stage_id", name: "fk_3a9eaa254d", on_delete: :cascade
add_foreign_key "ci_builds", "projects", name: "fk_befce0568a", on_delete: :cascade add_foreign_key "ci_builds", "projects", name: "fk_befce0568a", on_delete: :cascade
add_foreign_key "ci_builds_metadata", "ci_builds", column: "build_id", on_delete: :cascade add_foreign_key "ci_builds_metadata", "ci_builds", column: "build_id", on_delete: :cascade
......
--- ---
comments: false comments: false
description: 'Learn how to use and administer GitLab, the most scalable Git-based fully integrated platform for software development.'
--- ---
# GitLab Documentation # GitLab Documentation
......
# Configure GitLab using an external PostgreSQL service
If you're hosting GitLab on a cloud provider, you can optionally use a
managed service for PostgreSQL. For example, AWS offers a managed Relational
Database Service (RDS) that runs PostgreSQL.
Alternatively, you may opt to manage your own PostgreSQL instance or cluster
separate from the GitLab Omnibus package.
If you use a cloud-managed service, or provide your own PostgreSQL instance:
1. Setup PostgreSQL according to the
[database requirements document](../install/requirements.md#database).
1. Set up a `gitlab` username with a password of your choice. The `gitlab` user
needs privileges to create the `gitlabhq_production` database.
1. Configure the GitLab application servers with the appropriate details.
This step is covered in [Configuring GitLab for HA](high_availability/gitlab.md).
---
description: 'Learn how to install, configure, update, and maintain your GitLab instance.'
---
# Administrator documentation **[CORE ONLY]** # Administrator documentation **[CORE ONLY]**
Learn how to administer your GitLab instance (Community Edition and Learn how to administer your GitLab instance (Community Edition and
......
---
description: 'Learn how to administer GitLab Pages.'
---
# GitLab Pages administration # GitLab Pages administration
> **Notes:** > **Notes:**
...@@ -8,8 +12,6 @@ ...@@ -8,8 +12,6 @@
GitLab from source, follow the [Pages source installation document](source.md). GitLab from source, follow the [Pages source installation document](source.md).
- To learn how to use GitLab Pages, read the [user documentation][pages-userguide]. - To learn how to use GitLab Pages, read the [user documentation][pages-userguide].
---
This document describes how to set up the _latest_ GitLab Pages feature. Make This document describes how to set up the _latest_ GitLab Pages feature. Make
sure to read the [changelog](#changelog) if you are upgrading to a new GitLab sure to read the [changelog](#changelog) if you are upgrading to a new GitLab
version as it may include new features and changes needed to be made in your version as it may include new features and changes needed to be made in your
...@@ -24,8 +26,6 @@ SNI and exposes pages using HTTP2 by default. ...@@ -24,8 +26,6 @@ SNI and exposes pages using HTTP2 by default.
You are encouraged to read its [README][pages-readme] to fully understand how You are encouraged to read its [README][pages-readme] to fully understand how
it works. it works.
---
In the case of [custom domains](#custom-domains) (but not In the case of [custom domains](#custom-domains) (but not
[wildcard domains](#wildcard-domains)), the Pages daemon needs to listen on [wildcard domains](#wildcard-domains)), the Pages daemon needs to listen on
ports `80` and/or `443`. For that reason, there is some flexibility in the way ports `80` and/or `443`. For that reason, there is some flexibility in the way
......
# Project import/export # Project import/export administration **[CORE ONLY]**
>**Note:** >**Note:**
> >
......
This document was moved to [another location](../../install/openshift_and_gitlab/index.html). ---
redirect_to: '../../install/openshift_and_gitlab/index.html'
---
--- ---
comments: false comments: false
description: "Learn how to use GitLab CI/CD, the GitLab built-in Continuous Integration, Continuous Deployment, and Continuous Delivery toolset to build, test, and deploy your application."
--- ---
# GitLab Continuous Integration (GitLab CI/CD) # GitLab Continuous Integration (GitLab CI/CD)
......
...@@ -23,7 +23,7 @@ sast:container: ...@@ -23,7 +23,7 @@ sast:container:
- docker:stable-dind - docker:stable-dind
script: script:
- docker run -d --name db arminc/clair-db:latest - docker run -d --name db arminc/clair-db:latest
- docker run -p 6060:6060 --link db:postgres -d --name clair arminc/clair-local-scan:v2.0.1 - docker run -p 6060:6060 --link db:postgres -d --name clair --restart on-failure arminc/clair-local-scan:v2.0.1
- apk add -U wget ca-certificates - apk add -U wget ca-certificates
- docker pull ${CI_APPLICATION_REPOSITORY}:${CI_APPLICATION_TAG} - docker pull ${CI_APPLICATION_REPOSITORY}:${CI_APPLICATION_TAG}
- wget https://github.com/arminc/clair-scanner/releases/download/v8/clair-scanner_linux_amd64 - wget https://github.com/arminc/clair-scanner/releases/download/v8/clair-scanner_linux_amd64
......
...@@ -11,7 +11,7 @@ Ideally, the GitLab Runner should not be installed on the same machine as GitLab ...@@ -11,7 +11,7 @@ Ideally, the GitLab Runner should not be installed on the same machine as GitLab
Read the [requirements documentation](../../install/requirements.md#gitlab-runner) Read the [requirements documentation](../../install/requirements.md#gitlab-runner)
for more information. for more information.
## Shared vs specific Runners ## Shared, specific and group Runners
After [installing the Runner][install], you can either register it as shared or After [installing the Runner][install], you can either register it as shared or
specific. You can only register a shared Runner if you have admin access to specific. You can only register a shared Runner if you have admin access to
...@@ -32,6 +32,9 @@ are: ...@@ -32,6 +32,9 @@ are:
Runners. For example, if you want to deploy a certain project, you can setup Runners. For example, if you want to deploy a certain project, you can setup
a specific Runner to have the right credentials for this. The [usage of tags](#using-tags) a specific Runner to have the right credentials for this. The [usage of tags](#using-tags)
may be useful in this case. Specific Runners process jobs using a [FIFO] queue. may be useful in this case. Specific Runners process jobs using a [FIFO] queue.
- **Group Runners** are useful when you have multiple projects under one group
and would like all projects to have access to a set of Runners. Group Runners
process jobs using a [FIFO] queue.
A Runner that is specific only runs for the specified project(s). A shared Runner A Runner that is specific only runs for the specified project(s). A shared Runner
can run jobs for every project that has enabled the option **Allow shared Runners** can run jobs for every project that has enabled the option **Allow shared Runners**
...@@ -66,7 +69,7 @@ Runners to disabled. ...@@ -66,7 +69,7 @@ Runners to disabled.
## Registering a specific Runner ## Registering a specific Runner
Registering a specific can be done in two ways: Registering a specific Runner can be done in two ways:
1. Creating a Runner with the project registration token 1. Creating a Runner with the project registration token
1. Converting a shared Runner into a specific Runner (one-way, admin only) 1. Converting a shared Runner into a specific Runner (one-way, admin only)
...@@ -79,6 +82,14 @@ visit the project you want to make the Runner work for in GitLab: ...@@ -79,6 +82,14 @@ visit the project you want to make the Runner work for in GitLab:
1. Go to **Settings > CI/CD** to obtain the token 1. Go to **Settings > CI/CD** to obtain the token
1. [Register the Runner][register] 1. [Register the Runner][register]
## Registering a group Runner
Creating a group Runner requires Master permissions for the group. To create a
group Runner visit the group you want to make the Runner work for in GitLab:
1. Go to **Settings > CI/CD** to obtain the token
1. [Register the Runner][register]
### Making an existing shared Runner specific ### Making an existing shared Runner specific
If you are an admin on your GitLab instance, you can turn any shared Runner into If you are an admin on your GitLab instance, you can turn any shared Runner into
...@@ -121,7 +132,7 @@ To enable/disable a Runner in your project: ...@@ -121,7 +132,7 @@ To enable/disable a Runner in your project:
> **Note**: > **Note**:
Consider that if you don't lock your specific Runner to a specific project, any Consider that if you don't lock your specific Runner to a specific project, any
user with Master role in you project can assign your runner to another arbitrary user with Master role in you project can assign your Runner to another arbitrary
project without requiring your authorization, so use it with caution. project without requiring your authorization, so use it with caution.
An admin can enable/disable a specific Runner for projects: An admin can enable/disable a specific Runner for projects:
......
--- ---
comments: false redirect_to: 'README.md'
--- ---
# GitLab CI Services
- [Using MySQL](mysql.md)
- [Using PostgreSQL](postgres.md)
- [Using Redis](redis.md)
...@@ -738,10 +738,15 @@ cache: ...@@ -738,10 +738,15 @@ cache:
rspec: rspec:
script: test script: test
cache: cache:
key: rspec
paths: paths:
- binaries/ - binaries/
``` ```
Note that since cache is shared between jobs, if you're using different
paths for different jobs, you should also set a different **cache:key**
otherwise cache content can be overwritten.
### `cache:key` ### `cache:key`
> Introduced in GitLab Runner v1.0.0. > Introduced in GitLab Runner v1.0.0.
...@@ -756,10 +761,9 @@ or any other way that fits your workflow. This way, you can fine tune caching, ...@@ -756,10 +761,9 @@ or any other way that fits your workflow. This way, you can fine tune caching,
allowing you to cache data between different jobs or even different branches. allowing you to cache data between different jobs or even different branches.
The `cache:key` variable can use any of the The `cache:key` variable can use any of the
[predefined variables](../variables/README.md), and the default key, if not set, [predefined variables](../variables/README.md), and the default key, if not
is `$CI_JOB_NAME-$CI_COMMIT_REF_NAME` which translates as "per-job and set, is just literal `default` which means everything is shared between each
per-branch". It is the default across the project, therefore everything is pipelines and jobs by default, starting from GitLab 9.0.
shared between pipelines and jobs running on the same branch by default.
NOTE: **Note:** NOTE: **Note:**
The `cache:key` variable cannot contain the `/` character, or the equivalent The `cache:key` variable cannot contain the `/` character, or the equivalent
...@@ -779,7 +783,7 @@ If you use **Windows Batch** to run your shell scripts you need to replace ...@@ -779,7 +783,7 @@ If you use **Windows Batch** to run your shell scripts you need to replace
```yaml ```yaml
cache: cache:
key: "%CI_JOB_STAGE%-%CI_COMMIT_REF_SLUG%" key: "%CI_COMMIT_REF_SLUG%"
paths: paths:
- binaries/ - binaries/
``` ```
...@@ -789,7 +793,7 @@ If you use **Windows PowerShell** to run your shell scripts you need to replace ...@@ -789,7 +793,7 @@ If you use **Windows PowerShell** to run your shell scripts you need to replace
```yaml ```yaml
cache: cache:
key: "$env:CI_JOB_STAGE-$env:CI_COMMIT_REF_SLUG" key: "$env:CI_COMMIT_REF_SLUG"
paths: paths:
- binaries/ - binaries/
``` ```
...@@ -1572,7 +1576,7 @@ capitalization, the commit will be created but the pipeline will be skipped. ...@@ -1572,7 +1576,7 @@ capitalization, the commit will be created but the pipeline will be skipped.
## Validate the .gitlab-ci.yml ## Validate the .gitlab-ci.yml
Each instance of GitLab CI has an embedded debug tool called Lint, which validates the Each instance of GitLab CI has an embedded debug tool called Lint, which validates the
content of your `.gitlab-ci.yml` files. You can find the Lint under the page `ci/lint` of your content of your `.gitlab-ci.yml` files. You can find the Lint under the page `ci/lint` of your
project namespace (e.g, `http://gitlab-example.com/gitlab-org/project-123/-/ci/lint`) project namespace (e.g, `http://gitlab-example.com/gitlab-org/project-123/-/ci/lint`)
## Using reserved keywords ## Using reserved keywords
......
This document was moved in [user/project/container_registry](../user/project/container_registry.md). This document was moved to [another location](../user/project/container_registry.md).
--- ---
comments: false redirect_to: '../user/project/issues/automatic_issue_closing.md'
--- ---
This document was split into:
- [administration/issue_closing_pattern.md](../administration/issue_closing_pattern.md).
- [user/project/issues/automatic_issue_closing](../user/project/issues/automatic_issue_closing.md).
--- ---
comments: false comments: false
description: 'Learn how to contribute to GitLab.'
--- ---
# GitLab development guides # GitLab development guides
......
---
description: 'Writing styles, markup, formatting, and reusing regular expressions throughout the GitLab Documentation.'
---
# Documentation style guidelines # Documentation style guidelines
The documentation style guide defines the markup structure used in The documentation style guide defines the markup structure used in
...@@ -21,23 +25,39 @@ Check the GitLab handbook for the [writing styles guidelines](https://about.gitl ...@@ -21,23 +25,39 @@ Check the GitLab handbook for the [writing styles guidelines](https://about.gitl
- Use [single spaces][] instead of double spaces - Use [single spaces][] instead of double spaces
- Jump a line between different markups (e.g., after every paragraph, header, list, etc) - Jump a line between different markups (e.g., after every paragraph, header, list, etc)
- Capitalize "G" and "L" in GitLab - Capitalize "G" and "L" in GitLab
- Capitalize feature, products, and methods names. E.g.: GitLab Runner, Geo, - Use sentence case for titles, headings, labels, menu items, and buttons.
Issue Boards, Git, Prometheus, Continuous Integration. - Use title case when referring to [features](https://about.gitlab.com/features/) or [products](https://about.gitlab.com/pricing/), and methods. Note that some features are also objects (e.g. "Merge Requests" and "merge requests"). E.g.: GitLab Runner, Geo, Issue Boards, Git, Prometheus, Continuous Integration.
## Formatting ## Formatting
- Use double asterisks (`**`) to mark a word or text in bold (`**bold**`)
- Use undescore (`_`) for text in italics (`_italic_`)
- Jump a line between different markups, for example:
```md
## Header
Paragraph.
- List item
- List item
```
### Punctuation
For punctuation rules, please refer to the [GitLab UX guide](https://design.gitlab.com/content/punctuation/).
### Ordered and unordered lists
- Use dashes (`-`) for unordered lists instead of asterisks (`*`) - Use dashes (`-`) for unordered lists instead of asterisks (`*`)
- Use the number one (`1`) for ordered lists - Use the number one (`1`) for ordered lists
- Use underscores (`_`) to mark a word or text in italics - For punctuation in bullet lists, please refer to the [GitLab UX guide](https://design.gitlab.com/content/punctuation/)
- Use double asterisks (`**`) to mark a word or text in bold
- When using lists, prefer not to end each item with a period. You can use
them if there are multiple sentences, just keep the last sentence without
a period
## Headings ## Headings
- Add only one H1 title in each document, by adding `#` at the beginning of - Add **only one H1** in each document, by adding `#` at the beginning of
it (when using markdown). For subheadings, use `##`, `###` and so on it (when using markdown). The `h1` will be the document `<title>`.
- For subheadings, use `##`, `###` and so on
- Avoid putting numbers in headings. Numbers shift, hence documentation anchor - Avoid putting numbers in headings. Numbers shift, hence documentation anchor
links shift too, which eventually leads to dead links. If you think it is links shift too, which eventually leads to dead links. If you think it is
compelling to add numbers in headings, make sure to at least discuss it with compelling to add numbers in headings, make sure to at least discuss it with
...@@ -106,21 +126,75 @@ Inside the document: ...@@ -106,21 +126,75 @@ Inside the document:
- If a heading is placed right after an image, always add three dashes (`---`) - If a heading is placed right after an image, always add three dashes (`---`)
between the image and the heading between the image and the heading
## Notes ## Alert boxes
- Notes should be quoted with the word `Note:` being bold. Use this form: Whenever you want to call the attention to a particular sentence,
use the following markup for highlighting.
```md _Note that the alert boxes only work for one paragraph only. Multiple paragraphs,
>**Note:** lists, headers, etc will not render correctly._
This is something to note.
``` ### Note
```md
NOTE: **Note:**
This is something to note.
```
How it renders in docs.gitlab.com:
NOTE: **Note:**
This is something to note.
### Tip
```md
TIP: **Tip:**
This is a tip.
```
How it renders in docs.gitlab.com:
TIP: **Tip:**
This is a tip.
### Caution
```md
CAUTION: **Caution:**
This is something to be cautious about.
```
How it renders in docs.gitlab.com:
CAUTION: **Caution:**
This is something to be cautious about.
### Danger
which renders to: ```md
DANGER: **Danger:**
This is a breaking change, a bug, or something very important to note.
```
How it renders in docs.gitlab.com:
>**Note:** DANGER: **Danger:**
This is something to note. This is a breaking change, a bug, or something very important to note.
If the note spans across multiple lines it's OK to split the line. ## Blockquotes
For highlighting a text within a blue blockquote, use this format:
```md
> This is a blockquote.
```
which renders in docs.gitlab.com to:
> This is a blockquote.
If the text spans across multiple lines it's OK to split the line.
## Specific sections and terms ## Specific sections and terms
...@@ -137,7 +211,7 @@ below. ...@@ -137,7 +211,7 @@ below.
> Introduced in GitLab 8.3. > Introduced in GitLab 8.3.
``` ```
- If possible every feature should have a link to the MR, issue, or epic that introduced it. - Whenever possible, every feature should have a link to the MR, issue, or epic that introduced it.
The above note would be then transformed to: The above note would be then transformed to:
```md ```md
...@@ -152,11 +226,9 @@ below. ...@@ -152,11 +226,9 @@ below.
the feature is available in: the feature is available in:
```md ```md
> [Introduced][ee-1234] in [GitLab Starter](https://about.gitlab.com/products/) 8.3. > [Introduced][ee-1234] in [GitLab Starter](https://about.gitlab.com/pricing/) 8.3.
``` ```
Otherwise, leave this mention out.
### Product badges ### Product badges
When a feature is available in EE-only tiers, add the corresponding tier according to the When a feature is available in EE-only tiers, add the corresponding tier according to the
......
...@@ -230,6 +230,11 @@ describe "#==" do ...@@ -230,6 +230,11 @@ describe "#==" do
end end
``` ```
### Prometheus tests
Prometheus metrics may be preserved from one test run to another. To ensure that metrics are
reset before each example, add the `:prometheus` tag to the Rspec test.
### Matchers ### Matchers
Custom matchers should be created to clarify the intent and/or hide the Custom matchers should be created to clarify the intent and/or hide the
......
---
description: Learn how to contribute to GitLab Documentation.
---
# GitLab Documentation guidelines # GitLab Documentation guidelines
- **General Documentation**: written by the [developers responsible by creating features](#contributing-to-docs). Should be submitted in the same merge request containing code. Feature proposals (by GitLab contributors) should also be accompanied by its respective documentation. They can be later improved by PMs and Technical Writers. - **General Documentation**: written by the [developers responsible by creating features](#contributing-to-docs). Should be submitted in the same merge request containing code. Feature proposals (by GitLab contributors) should also be accompanied by its respective documentation. They can be later improved by PMs and Technical Writers.
...@@ -201,6 +205,19 @@ Things to note: ...@@ -201,6 +205,19 @@ Things to note:
built-in help page, that's why we omit it in `git grep`. built-in help page, that's why we omit it in `git grep`.
- Use the checklist on the documentation MR description template. - Use the checklist on the documentation MR description template.
#### Alternative redirection method
Alternatively to the method described above, you can simply replace the content
of the old file with a frontmatter containing a redirect link:
```yaml
---
redirect_to: '../path/to/file/README.md'
---
```
It supports both full and relative URLs, e.g. `https://docs.gitlab.com/ee/path/to/file.html`, `../path/to/file.html`, `path/to/file.md`. Note that any `*.md` paths will be compiled to `*.html`.
### Redirections for pages with Disqus comments ### Redirections for pages with Disqus comments
If the documentation page being relocated already has any Disqus comments, If the documentation page being relocated already has any Disqus comments,
......
--- ---
comments: false comments: false
description: Read through the GitLab installation methods.
--- ---
# Installation # Installation
......
---
description: 'Learn how to spin up a
pre-configured GitLab VM on Microsoft Azure and have your very own private GitLab instance up and running in around 30 minutes.'
---
# Install GitLab on Microsoft Azure # Install GitLab on Microsoft Azure
> _This article was originally written by Dave Wentzel and [published on the GitLab Blog][Original-Blog-Post]._ > _This article was originally written by Dave Wentzel and [published on the GitLab Blog][Original-Blog-Post]._
......
# GitLab Docker images # Install GitLab with Docker
[Docker](https://www.docker.com) and container technology have been revolutionizing the software world for the past few years. They combine the performance and efficiency of native execution with the abstraction, security, and immutability of virtualization. [Docker](https://www.docker.com) and container technology have been revolutionizing the software world for the past few years. They combine the performance and efficiency of native execution with the abstraction, security, and immutability of virtualization.
......
---
description: 'Learn how to install a GitLab instance on Google Cloud Platform.'
---
# Installing GitLab on Google Cloud Platform # Installing GitLab on Google Cloud Platform
![GCP landing page](img/gcp_landing.png) ![GCP landing page](img/gcp_landing.png)
......
---
description: 'Read through the different methods to deploy GitLab on Kubernetes.'
---
# Installing GitLab on Kubernetes # Installing GitLab on Kubernetes
> **Note**: These charts have been tested on Google Kubernetes Engine and Azure Container Service. Other Kubernetes installations may work as well, if not please [open an issue](https://gitlab.com/charts/charts.gitlab.io/issues). > **Note**: These charts have been tested on Google Kubernetes Engine and Azure Container Service. Other Kubernetes installations may work as well, if not please [open an issue](https://gitlab.com/charts/charts.gitlab.io/issues).
The easiest method to deploy GitLab on [Kubernetes](https://kubernetes.io/) is The easiest method to deploy GitLab on [Kubernetes](https://kubernetes.io/) is
...@@ -16,6 +21,7 @@ should be deployed, upgraded, and configured. ...@@ -16,6 +21,7 @@ should be deployed, upgraded, and configured.
* [Community Contributed Charts](#community-contributed-charts): Community contributed charts, deprecated by the official GitLab chart. * [Community Contributed Charts](#community-contributed-charts): Community contributed charts, deprecated by the official GitLab chart.
## GitLab-Omnibus Chart (Recommended) ## GitLab-Omnibus Chart (Recommended)
> **Note**: This chart is in beta while [additional features](https://gitlab.com/charts/charts.gitlab.io/issues/68) are being added. > **Note**: This chart is in beta while [additional features](https://gitlab.com/charts/charts.gitlab.io/issues/68) are being added.
This chart is the best available way to operate GitLab on Kubernetes. It deploys and configures nearly all features of GitLab, including: a [Runner](https://docs.gitlab.com/runner/), [Container Registry](../../user/project/container_registry.html#gitlab-container-registry), [Mattermost](https://docs.gitlab.com/omnibus/gitlab-mattermost/), [automatic SSL](https://github.com/kubernetes/charts/tree/master/stable/kube-lego), and a [load balancer](https://github.com/kubernetes/ingress/tree/master/controllers/nginx). It is based on our [GitLab Omnibus Docker Images](https://docs.gitlab.com/omnibus/docker/README.html). This chart is the best available way to operate GitLab on Kubernetes. It deploys and configures nearly all features of GitLab, including: a [Runner](https://docs.gitlab.com/runner/), [Container Registry](../../user/project/container_registry.html#gitlab-container-registry), [Mattermost](https://docs.gitlab.com/omnibus/gitlab-mattermost/), [automatic SSL](https://github.com/kubernetes/charts/tree/master/stable/kube-lego), and a [load balancer](https://github.com/kubernetes/ingress/tree/master/controllers/nginx). It is based on our [GitLab Omnibus Docker Images](https://docs.gitlab.com/omnibus/docker/README.html).
......
...@@ -6,7 +6,7 @@ article_type: tutorial ...@@ -6,7 +6,7 @@ article_type: tutorial
date: 2016-06-28 date: 2016-06-28
--- ---
# Getting started with OpenShift Origin 3 and GitLab # How to install GitLab on OpenShift Origin 3
## Introduction ## Introduction
......
...@@ -4,5 +4,4 @@ comments: false ...@@ -4,5 +4,4 @@ comments: false
# Legal # Legal
- [Corporate contributor license agreement](corporate_contributor_license_agreement.md) Please read through the [GitLab License Agreement](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md).
- [Individual contributor license agreement](individual_contributor_license_agreement.md)
This document has been replaced by a Developer Certificate of Origin and License, ---
as described in [Contributing.md](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md). redirect_to: 'README.md'
\ No newline at end of file ---
This document has been replaced by a Developer Certificate of Origin and License, ---
as described in [Contributing.md](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md). redirect_to: 'README.md'
\ No newline at end of file ---
# Features # Namespaces
## Enable usernames and namespaces for user projects ## Enable usernames and namespaces for user projects
......
# Webhooks # Webhooks administration **[CORE ONLY]**
## Add a webhook for **ALL** projects: ## Add a webhook for **ALL** projects:
......
...@@ -4,6 +4,7 @@ author_gitlab: SeanPackham ...@@ -4,6 +4,7 @@ author_gitlab: SeanPackham
level: beginner level: beginner
article_type: user guide article_type: user guide
date: 2017-05-15 date: 2017-05-15
description: 'This article describes how to install Git on macOS, Ubuntu Linux and Windows.'
--- ---
# Installing Git # Installing Git
......
...@@ -2,39 +2,31 @@ ...@@ -2,39 +2,31 @@
comments: false comments: false
--- ---
# GitLab Flow # What is the GitLab Flow
- A simplified branching strategy - A simplified branching strategy
- All features and fixes first go to master - All features and fixes first go to master
- Allows for 'production' or 'stable' branches - Allows for 'production' or 'stable' branches
- Bug fixes/hot fix patches are cherry-picked from master - Bug fixes/hot fix patches are cherry-picked from master
--- ## Feature branches
# Feature branches
- Create a feature/bugfix branch to do all work - Create a feature/bugfix branch to do all work
- Use merge requests to merge to master - Use merge requests to merge to master
![inline](gitlab_flow/feature_branches.png) ![inline](gitlab_flow/feature_branches.png)
--- ## Production branch
# Production branch
- One, long-running production release branch - One, long-running production release branch
as opposed to individual stable branches as opposed to individual stable branches
- Consider creating a tag for each version that gets deployed - Consider creating a tag for each version that gets deployed
--- ## Production branch
# Production branch
![inline](gitlab_flow/production_branch.png) ![inline](gitlab_flow/production_branch.png)
--- ## Release branch
# Release branch
- Useful if you release software to customers - Useful if you release software to customers
- When preparing a new release, create stable branch - When preparing a new release, create stable branch
...@@ -43,15 +35,11 @@ comments: false ...@@ -43,15 +35,11 @@ comments: false
- Cherry-pick critical bug fixes to stable branch for patch release - Cherry-pick critical bug fixes to stable branch for patch release
- Never commit bug fixes directly to stable branch - Never commit bug fixes directly to stable branch
--- ## Release branch
# Release branch
![inline](gitlab_flow/release_branches.png) ![inline](gitlab_flow/release_branches.png)
--- ## More details
# More details
Blog post on 'GitLab Flow' at For more information read through the [GitLab Flow](../../workflow/gitlab_flow.md)
[http://doc.gitlab.com/ee/workflow/gitlab_flow.html](http://doc.gitlab.com/ee/workflow/gitlab_flow.html) documentation.
--- ---
comments: false redirect_to: '../gitlab_flow.md'
--- ---
# GitLab Flow
----------
- A simplified branching strategy
- All features and fixes first go to master
- Allows for 'production' or 'stable' branches
- Bug fixes/hot fix patches are cherry-picked from master
----------
### Feature branches
- Create a feature/bugfix branch to do all work
- Use merge requests to merge to master
![inline](http://gitlab.com/gitlab-org/University/raw/5baea0fe222a915d0500e40747d35eb18681cdc3/training/gitlab_flow/feature_branches.png)
----------
## Production branch
- One, long-running production release branch
as opposed to individual stable branches
- Consider creating a tag for each version that gets deployed
----------
## Production branch
![inline](http://gitlab.com/gitlab-org/University/raw/5baea0fe222a915d0500e40747d35eb18681cdc3/training/gitlab_flow/production_branch.png)
----------
## Release branch
- Useful if you release software to customers
- When preparing a new release, create stable branch
from master
- Consider creating a tag for each version
- Cherry-pick critical bug fixes to stable branch for patch release
- Never commit bug fixes directly to stable branch
----------
![inline](http://gitlab.com/gitlab-org/University/raw/5baea0fe222a915d0500e40747d35eb18681cdc3/training/gitlab_flow/release_branches.png)
----------
## More details
Blog post on 'GitLab Flow' at
[http://doc.gitlab.com/ee/workflow/gitlab_flow.html](http://doc.gitlab.com/ee/workflow/gitlab_flow.html)
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
comments: false comments: false
--- ---
# Merge requests # Code review and collaboration with Merge Requests
---------- ----------
......
# Labels # Labels administration **[CORE ONLY]**
## Default Labels ## Default Labels
......
...@@ -40,20 +40,20 @@ In GitLab, a namespace is a unique name to be used as a user name, a group name, ...@@ -40,20 +40,20 @@ In GitLab, a namespace is a unique name to be used as a user name, a group name,
- `http://gitlab.example.com/groupname` - `http://gitlab.example.com/groupname`
- `http://gitlab.example.com/groupname/subgroup_name` - `http://gitlab.example.com/groupname/subgroup_name`
For example, consider a user called John: For example, consider a user named Alex:
1. John creates his account on GitLab.com with the username `john`; 1. Alex creates an account on GitLab.com with the username `alex`;
his profile will be accessed under `https://gitlab.example.com/john` their profile will be accessed under `https://gitlab.example.com/alex`
1. John creates a group for his team with the groupname `john-team`; 1. Alex creates a group for their team with the groupname `alex-team`;
his group and its projects will be accessed under `https://gitlab.example.com/john-team` the group and its projects will be accessed under `https://gitlab.example.com/alex-team`
1. John creates a subgroup of `john-team` with the subgroup name `marketing`; 1. Alex creates a subgroup of `alex-team` with the subgroup name `marketing`;
his subgroup and its projects will be accessed under `https://gitlab.example.com/john-team/marketing` this subgroup and its projects will be accessed under `https://gitlab.example.com/alex-team/marketing`
By doing so: By doing so:
- Any team member mentions John with `@john` - Any team member mentions Alex with `@alex`
- John mentions everyone from his team with `@john-team` - Alex mentions everyone from their team with `@alex-team`
- John mentions only his marketing team with `@john-team/marketing` - Alex mentions only the marketing team with `@alex-team/marketing`
## Issues and merge requests within a group ## Issues and merge requests within a group
......
---
description: 'Read through the GitLab User documentation to learn how to use, configure, and customize GitLab and GitLab.com to your own needs.'
---
# User documentation # User documentation
Welcome to GitLab! We're glad to have you here! Welcome to GitLab! We're glad to have you here!
......
---
description: 'Understand and explore the user permission levels in GitLab, and what features each of them grants you access to.'
---
# Permissions # Permissions
Users have different abilities depending on the access level they have in a Users have different abilities depending on the access level they have in a
......
---
description: 'Learn how to use GitLab Pages to deploy a static website at no additional cost.'
---
# GitLab Pages # GitLab Pages
With GitLab Pages it's easy to publish your project website. GitLab Pages is a hosting service for static websites, at no additional cost. With GitLab Pages it's easy to publish your project website. GitLab Pages is a hosting service for static websites, at no additional cost.
......
# GitLab Pages # Exploring GitLab Pages
> **Notes:** > **Notes:**
> - This feature was [introduced][ee-80] in GitLab EE 8.3. > - This feature was [introduced][ee-80] in GitLab EE 8.3.
...@@ -14,9 +14,7 @@ deploy static pages for your individual projects, your user or your group. ...@@ -14,9 +14,7 @@ deploy static pages for your individual projects, your user or your group.
Read [GitLab Pages on GitLab.com](#gitlab-pages-on-gitlab-com) for specific Read [GitLab Pages on GitLab.com](#gitlab-pages-on-gitlab-com) for specific
information, if you are using GitLab.com to host your website. information, if you are using GitLab.com to host your website.
Read through [All you Need to Know About GitLab Pages][pages-index-guide] for a list of all learning materials we have prepared for GitLab Pages (webpages, articles, guides, blog posts, video tutorials). ## Getting started with GitLab Pages domains
## Getting started with GitLab Pages
> **Note:** > **Note:**
> In the rest of this document we will assume that the general domain name that > In the rest of this document we will assume that the general domain name that
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
> - [Introduced][ce-3050] in GitLab 8.9. > - [Introduced][ce-3050] in GitLab 8.9.
> - Importing will not be possible if the import instance version differs from > - Importing will not be possible if the import instance version differs from
> that of the exporter. > that of the exporter.
> - For GitLab admins, please read through [Project import/export administration](../../../administration/raketasks/project_import_export.md).
> - For existing installations, the project import option has to be enabled in > - For existing installations, the project import option has to be enabled in
> application settings (`/admin/application_settings`) under 'Import sources'. > application settings (`/admin/application_settings`) under 'Import sources'.
> Ask your administrator if you don't see the **GitLab export** button when > Ask your administrator if you don't see the **GitLab export** button when
......
This document is moved to [user/project/protected_branches.md](../user/project/protected_branches.md) This document was moved to [another location](../user/project/protected_branches.md).
module EE
module Ldap
module OmniauthCallbacksController
extend ::Gitlab::Utils::Override
override :sign_in_and_redirect
def sign_in_and_redirect(user)
# The counter gets incremented in `sign_in_and_redirect`
show_ldap_sync_flash if user.sign_in_count == 0
super
end
private
def show_ldap_sync_flash
flash[:notice] = 'LDAP sync in progress. This could take a few minutes. '\
'Refresh the page to see the changes.'
end
end
end
end
require 'spec_helper'
describe Ldap::OmniauthCallbacksController do
include_context 'Ldap::OmniauthCallbacksController'
it "displays LDAP sync flash on first sign in" do
post provider
expect(flash[:notice]).to match(/LDAP sync in progress*/)
end
it "skips LDAP sync flash on subsequent sign ins" do
user.update!(sign_in_count: 1)
post provider
expect(flash[:notice]).to eq nil
end
context 'access denied' do
let(:valid_login?) { false }
it 'logs a failure event' do
stub_licensed_features(extended_audit_events: true)
expect { post provider }.to change(SecurityEvent, :count).by(1)
end
end
end
Feature: Project Deploy Keys
Background:
Given I sign in as a user
And I own project "Shop"
@javascript
Scenario: I should see deploy keys list
Given project has deploy key
When I visit project deploy keys page
Then I should see project deploy key
@javascript
Scenario: I should see project deploy keys
Given other projects have deploy keys
When I visit project deploy keys page
Then I should see other project deploy key
And I should only see the same deploy key once
@javascript
Scenario: I should see public deploy keys
Given public deploy key exists
When I visit project deploy keys page
Then I should see public deploy key
@javascript
Scenario: I add new deploy key
Given I visit project deploy keys page
And I submit new deploy key
Then I should be on deploy keys page
And I should see newly created deploy key
@javascript
Scenario: I attach other project deploy key to project
Given other projects have deploy keys
And I visit project deploy keys page
When I click attach deploy key
Then I should be on deploy keys page
And I should see newly created deploy key
@javascript
Scenario: I attach public deploy key to project
Given public deploy key exists
And I visit project deploy keys page
When I click attach deploy key
Then I should be on deploy keys page
And I should see newly created deploy key
Feature: Project Ff Merge Requests
Background:
Given I sign in as a user
And I own project "Shop"
And project "Shop" have "Bug NS-05" open merge request with diffs inside
And merge request "Bug NS-05" is mergeable
@javascript
Scenario: I do ff-only merge for rebased branch
Given ff merge enabled
And merge request "Bug NS-05" is rebased
When I visit merge request page "Bug NS-05"
Then I should see ff-only merge button
When I accept this merge request
Then I should see merged request
@javascript
Scenario: I do ff-only merge for merged branch
Given ff merge enabled
And merge request "Bug NS-05" merged target
When I visit merge request page "Bug NS-05"
Then I should see ff-only merge button
When I accept this merge request
Then I should see merged request
@javascript
Scenario: I do rebase before ff-only merge
Given ff merge enabled
And rebase before merge enabled
When I visit merge request page "Bug NS-05"
Then I should see rebase button
When I press rebase button
Then I should see rebase in progress message
@javascript
Scenario: I do rebase before regular merge
Given rebase before merge enabled
When I visit merge request page "Bug NS-05"
Then I should see rebase button
When I press rebase button
Then I should see rebase in progress message
@project_issues
Feature: Project Issues References
Background:
Given I sign in as "John Doe"
And public project "Community"
And "John Doe" owns public project "Community"
And project "Community" has "Community issue" open issue
And I logout
And I sign in as "Mary Jane"
And private project "Enterprise"
And "Mary Jane" owns private project "Enterprise"
And project "Enterprise" has "Enterprise issue" open issue
And project "Enterprise" has "Enterprise fix" open merge request
And I visit issue page "Enterprise issue"
And I leave a comment referencing issue "Community issue"
And I visit merge request page "Enterprise fix"
And I leave a comment referencing issue "Community issue"
And I logout
@javascript
Scenario: Viewing the public issue as a "John Doe"
Given I sign in as "John Doe"
When I visit issue page "Community issue"
Then I should not see any related merge requests
And I should see no notes at all
@javascript
Scenario: Viewing the public issue as "Mary Jane"
Given I sign in as "Mary Jane"
When I visit issue page "Community issue"
Then I should see the "Enterprise fix" related merge request
And I should see a note linking to "Enterprise fix" merge request
And I should see a note linking to "Enterprise issue" issue
class Spinach::Features::ProjectDeployKeys < Spinach::FeatureSteps
include SharedAuthentication
include SharedProject
include SharedPaths
step 'project has deploy key' do
create(:deploy_keys_project, project: @project)
end
step 'I should see project deploy key' do
page.within(find('.deploy-keys')) do
find('.js-deployKeys-tab-enabled_keys').click()
expect(page).to have_content deploy_key.title
end
end
step 'I should see other project deploy key' do
page.within(find('.deploy-keys')) do
find('.js-deployKeys-tab-available_project_keys').click()
expect(page).to have_content other_deploy_key.title
end
end
step 'I should see public deploy key' do
page.within(find('.deploy-keys')) do
find('.js-deployKeys-tab-public_keys').click()
expect(page).to have_content public_deploy_key.title
end
end
step 'I click \'New Deploy Key\'' do
click_link 'New deploy key'
end
step 'I submit new deploy key' do
fill_in "deploy_key_title", with: "laptop"
fill_in "deploy_key_key", with: "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzrEJUIR6Y03TCE9rIJ+GqTBvgb8t1jI9h5UBzCLuK4VawOmkLornPqLDrGbm6tcwM/wBrrLvVOqi2HwmkKEIecVO0a64A4rIYScVsXIniHRS6w5twyn1MD3sIbN+socBDcaldECQa2u1dI3tnNVcs8wi77fiRe7RSxePsJceGoheRQgC8AZ510UdIlO+9rjIHUdVN7LLyz512auAfYsgx1OfablkQ/XJcdEwDNgi9imI6nAXhmoKUm1IPLT2yKajTIC64AjLOnE0YyCh6+7RFMpiMyu1qiOCpdjYwTgBRiciNRZCH8xIedyCoAmiUgkUT40XYHwLuwiPJICpkAzp7Q== user@laptop"
click_button "Add key"
end
step 'I should be on deploy keys page' do
expect(current_path).to eq project_settings_repository_path(@project)
end
step 'I should see newly created deploy key' do
@project.reload
page.within(find('.deploy-keys')) do
find('.js-deployKeys-tab-enabled_keys').click()
expect(page).to have_content(deploy_key.title)
end
end
step 'other projects have deploy keys' do
@second_project = create(:project, namespace: create(:group))
@second_project.add_master(current_user)
create(:deploy_keys_project, project: @second_project)
@third_project = create(:project, namespace: create(:group))
@third_project.add_master(current_user)
create(:deploy_keys_project, project: @third_project, deploy_key: @second_project.deploy_keys.first)
end
step 'I should only see the same deploy key once' do
page.within(find('.deploy-keys')) do
expect(find('.js-deployKeys-tab-available_project_keys .badge')).to have_content('1')
end
end
step 'public deploy key exists' do
create(:deploy_key, public: true)
end
step 'I click attach deploy key' do
page.within(find('.deploy-keys')) do
find('.badge', text: '1').click()
click_button 'Enable'
expect(page).not_to have_selector('.fa-spinner')
end
end
protected
def deploy_key
@project.deploy_keys.last
end
def other_deploy_key
@second_project.deploy_keys.last
end
def public_deploy_key
DeployKey.are_public.last
end
end
class Spinach::Features::ProjectFfMergeRequests < Spinach::FeatureSteps
include SharedAuthentication
include SharedIssuable
include SharedProject
include SharedNote
include SharedPaths
include SharedMarkdown
include SharedDiffNote
include SharedUser
include WaitForRequests
step 'project "Shop" have "Bug NS-05" open merge request with diffs inside' do
create(:merge_request_with_diffs,
title: "Bug NS-05",
source_project: project,
target_project: project,
author: project.users.first)
end
step 'merge request is mergeable' do
expect(page).to have_button 'Merge'
end
step 'I should see ff-only merge button' do
expect(page).to have_content "Fast-forward merge without a merge commit"
expect(page).to have_button 'Merge'
end
step 'merge request "Bug NS-05" is mergeable' do
merge_request.mark_as_mergeable
end
step 'I accept this merge request' do
page.within '.mr-state-widget' do
click_button "Merge"
end
end
step 'I should see merged request' do
page.within '.status-box' do
expect(page).to have_content "Merged"
wait_for_requests
end
end
step 'ff merge enabled' do
project = merge_request.target_project
project.merge_requests_ff_only_enabled = true
project.save!
end
step 'I should see rebase button' do
expect(page).to have_button "Rebase"
end
step 'merge request "Bug NS-05" is rebased' do
merge_request.source_branch = 'flatten-dir'
merge_request.target_branch = 'improve/awesome'
merge_request.reload_diff
merge_request.save!
end
step 'merge request "Bug NS-05" merged target' do
merge_request.source_branch = 'merged-target'
merge_request.target_branch = 'improve/awesome'
merge_request.reload_diff
merge_request.save!
end
step 'rebase before merge enabled' do
project = merge_request.target_project
project.merge_requests_rebase_enabled = true
project.save!
end
step 'I press rebase button' do
click_button "Rebase"
end
step "I should see rebase in progress message" do
expect(page).to have_content("Rebase in progress")
end
def merge_request
@merge_request ||= MergeRequest.find_by!(title: "Bug NS-05")
end
end
...@@ -5,13 +5,6 @@ module SharedIssuable ...@@ -5,13 +5,6 @@ module SharedIssuable
find('.js-issuable-edit', visible: true).click find('.js-issuable-edit', visible: true).click
end end
step 'project "Community" has "Community issue" open issue' do
create_issuable_for_project(
project_name: 'Community',
title: 'Community issue'
)
end
step 'project "Community" has "Community fix" open merge request' do step 'project "Community" has "Community fix" open merge request' do
create_issuable_for_project( create_issuable_for_project(
project_name: 'Community', project_name: 'Community',
...@@ -59,32 +52,11 @@ module SharedIssuable ...@@ -59,32 +52,11 @@ module SharedIssuable
visit project_merge_request_path(mr.target_project, mr) visit project_merge_request_path(mr.target_project, mr)
end end
step 'I visit issue page "Community issue"' do
issue = Issue.find_by(title: 'Community issue')
visit project_issue_path(issue.project, issue)
end
step 'I visit issue page "Community fix"' do step 'I visit issue page "Community fix"' do
mr = MergeRequest.find_by(title: 'Community fix') mr = MergeRequest.find_by(title: 'Community fix')
visit project_merge_request_path(mr.target_project, mr) visit project_merge_request_path(mr.target_project, mr)
end end
step 'I should not see any related merge requests' do
page.within '.issue-details' do
expect(page).not_to have_content('#merge-requests .merge-requests-title')
end
end
step 'I should see the "Enterprise fix" related merge request' do
page.within '#merge-requests .merge-requests-title' do
expect(page).to have_content('1 Related Merge Request')
end
page.within '#merge-requests ul' do
expect(page).to have_content('Enterprise fix')
end
end
step 'I should see a note linking to "Enterprise fix" merge request' do step 'I should see a note linking to "Enterprise fix" merge request' do
visible_note( visible_note(
issuable: MergeRequest.find_by(title: 'Enterprise fix'), issuable: MergeRequest.find_by(title: 'Enterprise fix'),
......
...@@ -240,10 +240,6 @@ module SharedPaths ...@@ -240,10 +240,6 @@ module SharedPaths
visit project_settings_integrations_path(@project) visit project_settings_integrations_path(@project)
end end
step 'I visit project deploy keys page' do
visit project_deploy_keys_path(@project)
end
step 'I visit project find file page' do step 'I visit project find file page' do
visit project_find_file_path(@project, root_ref) visit project_find_file_path(@project, root_ref)
end end
...@@ -336,11 +332,6 @@ module SharedPaths ...@@ -336,11 +332,6 @@ module SharedPaths
wait_for_requests wait_for_requests
end end
step 'I visit merge request page "Bug NS-05"' do
visit merge_request_path("Bug NS-05")
wait_for_requests
end
step 'I visit merge request page "Bug NS-07"' do step 'I visit merge request page "Bug NS-07"' do
visit merge_request_path("Bug NS-07") visit merge_request_path("Bug NS-07")
wait_for_requests wait_for_requests
......
...@@ -11,13 +11,14 @@ module API ...@@ -11,13 +11,14 @@ module API
requires :token, type: String, desc: 'Registration token' requires :token, type: String, desc: 'Registration token'
optional :description, type: String, desc: %q(Runner's description) optional :description, type: String, desc: %q(Runner's description)
optional :info, type: Hash, desc: %q(Runner's metadata) optional :info, type: Hash, desc: %q(Runner's metadata)
optional :active, type: Boolean, desc: 'Should Runner be active'
optional :locked, type: Boolean, desc: 'Should Runner be locked for current project' optional :locked, type: Boolean, desc: 'Should Runner be locked for current project'
optional :run_untagged, type: Boolean, desc: 'Should Runner handle untagged jobs' optional :run_untagged, type: Boolean, desc: 'Should Runner handle untagged jobs'
optional :tag_list, type: Array[String], desc: %q(List of Runner's tags) optional :tag_list, type: Array[String], desc: %q(List of Runner's tags)
optional :maximum_timeout, type: Integer, desc: 'Maximum timeout set when this Runner will handle the job' optional :maximum_timeout, type: Integer, desc: 'Maximum timeout set when this Runner will handle the job'
end end
post '/' do post '/' do
attributes = attributes_for_keys([:description, :locked, :run_untagged, :tag_list, :maximum_timeout]) attributes = attributes_for_keys([:description, :active, :locked, :run_untagged, :tag_list, :maximum_timeout])
.merge(get_runner_details_from_request) .merge(get_runner_details_from_request)
runner = runner =
......
...@@ -14,6 +14,7 @@ module Gitlab ...@@ -14,6 +14,7 @@ module Gitlab
avatar: /\Alogo\.(png|jpg|gif)\z/, avatar: /\Alogo\.(png|jpg|gif)\z/,
issue_template: %r{\A\.gitlab/issue_templates/[^/]+\.md\z}, issue_template: %r{\A\.gitlab/issue_templates/[^/]+\.md\z},
merge_request_template: %r{\A\.gitlab/merge_request_templates/[^/]+\.md\z}, merge_request_template: %r{\A\.gitlab/merge_request_templates/[^/]+\.md\z},
xcode_config: %r{\A[^/]*\.(xcodeproj|xcworkspace)\z},
# Configuration files # Configuration files
gitignore: '.gitignore', gitignore: '.gitignore',
......
...@@ -15,10 +15,7 @@ module Gitlab ...@@ -15,10 +15,7 @@ module Gitlab
def each def each
@blames.each do |blame| @blames.each do |blame|
yield( yield(blame.commit, blame.line)
Gitlab::Git::Commit.new(@repo, blame.commit),
blame.line
)
end end
end end
...@@ -60,9 +57,8 @@ module Gitlab ...@@ -60,9 +57,8 @@ module Gitlab
end end
end end
# load all commits in single call Gitlab::Git::Commit.batch_by_oid(@repo, commits.keys).each do |commit|
commits.keys.each do |key| commits[commit.sha] = commit
commits[key] = @repo.lookup(key)
end end
# get it together # get it together
......
...@@ -62,6 +62,12 @@ module Gitlab ...@@ -62,6 +62,12 @@ module Gitlab
end end
end end
# Returns an array of Blob instances just with the metadata, that means
# the data attribute has no content.
def batch_metadata(repository, blob_references)
batch(repository, blob_references, blob_size_limit: 0)
end
# Find LFS blobs given an array of sha ids # Find LFS blobs given an array of sha ids
# Returns array of Gitlab::Git::Blob # Returns array of Gitlab::Git::Blob
# Does not guarantee blob data will be set # Does not guarantee blob data will be set
......
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.
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