Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2022-03-04 21:13:10 +00:00
parent 698fe342b9
commit 5c2d8a7cbe
24 changed files with 308 additions and 70 deletions

View File

@ -1,54 +0,0 @@
import $ from 'jquery';
import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
export default class TargetBranchDropdown {
constructor() {
this.$dropdown = $('.js-target-branch-dropdown');
this.$dropdownToggle = this.$dropdown.find('.dropdown-toggle-text');
this.$input = $('#schedule_ref');
this.initDefaultBranch();
this.initDropdown();
}
initDropdown() {
initDeprecatedJQueryDropdown(this.$dropdown, {
data: this.formatBranchesList(),
filterable: true,
selectable: true,
toggleLabel: (item) => item.name,
search: {
fields: ['name'],
},
clicked: (cfg) => this.updateInputValue(cfg),
text: (item) => item.name,
});
this.setDropdownToggle();
}
formatBranchesList() {
return this.$dropdown.data('data').map((val) => ({ name: val }));
}
setDropdownToggle() {
const initialValue = this.$input.val();
this.$dropdownToggle.text(initialValue);
}
initDefaultBranch() {
const initialValue = this.$input.val();
const defaultBranch = this.$dropdown.data('defaultBranch');
if (!initialValue) {
this.$input.val(defaultBranch);
}
}
updateInputValue({ selectedObj, e }) {
e.preventDefault();
this.$input.val(selectedObj.name);
gl.pipelineScheduleFieldErrors.updateFormValidityState();
}
}

View File

@ -1,10 +1,12 @@
import $ from 'jquery';
import Vue from 'vue';
import { __ } from '~/locale';
import RefSelector from '~/ref/components/ref_selector.vue';
import { REF_TYPE_BRANCHES, REF_TYPE_TAGS } from '~/ref/constants';
import setupNativeFormVariableList from '../../../../ci_variable_list/native_form_variable_list';
import GlFieldErrors from '../../../../gl_field_errors';
import Translate from '../../../../vue_shared/translate';
import intervalPatternInput from './components/interval_pattern_input.vue';
import TargetBranchDropdown from './components/target_branch_dropdown';
import TimezoneDropdown from './components/timezone_dropdown';
Vue.use(Translate);
@ -30,6 +32,52 @@ function initIntervalPatternInput() {
});
}
function getEnabledRefTypes() {
const refTypes = [REF_TYPE_BRANCHES];
if (gon.features.pipelineSchedulesWithTags) {
refTypes.push(REF_TYPE_TAGS);
}
return refTypes;
}
function initTargetRefDropdown() {
const $refField = document.getElementById('schedule_ref');
const el = document.querySelector('.js-target-ref-dropdown');
const { projectId, defaultBranch } = el.dataset;
if (!$refField.value) {
$refField.value = defaultBranch;
}
const refDropdown = new Vue({
el,
render(h) {
return h(RefSelector, {
props: {
enabledRefTypes: getEnabledRefTypes(),
projectId,
value: $refField.value,
useSymbolicRefNames: true,
translations: {
dropdownHeader: gon.features.pipelineSchedulesWithTags
? __('Select target branch or tag')
: __('Select target branch'),
},
},
class: 'gl-w-full',
});
},
});
refDropdown.$children[0].$on('input', (newRef) => {
$refField.value = newRef;
});
return refDropdown;
}
export default () => {
/* Most of the form is written in haml, but for fields with more complex behaviors,
* you should mount individual Vue components here. If at some point components need
@ -48,9 +96,10 @@ export default () => {
gl.pipelineScheduleFieldErrors.updateFormValidityState();
},
});
gl.targetBranchDropdown = new TargetBranchDropdown();
gl.pipelineScheduleFieldErrors = new GlFieldErrors(formElement);
initTargetRefDropdown();
setupNativeFormVariableList({
container: $('.js-ci-variable-list-section'),
formField: 'schedule',

View File

@ -58,6 +58,11 @@ export default {
required: false,
default: () => ({}),
},
useSymbolicRefNames: {
type: Boolean,
required: false,
default: false,
},
/** The validation state of this component. */
state: {
@ -121,8 +126,15 @@ export default {
query: this.lastQuery,
};
},
selectedRefForDisplay() {
if (this.useSymbolicRefNames && this.selectedRef) {
return this.selectedRef.replace(/^refs\/(tags|heads)\//, '');
}
return this.selectedRef;
},
buttonText() {
return this.selectedRef || this.i18n.noRefSelected;
return this.selectedRefForDisplay || this.i18n.noRefSelected;
},
},
watch: {
@ -164,9 +176,20 @@ export default {
},
{ immediate: true },
);
this.$watch(
'useSymbolicRefNames',
() => this.setUseSymbolicRefNames(this.useSymbolicRefNames),
{ immediate: true },
);
},
methods: {
...mapActions(['setEnabledRefTypes', 'setProjectId', 'setSelectedRef']),
...mapActions([
'setEnabledRefTypes',
'setUseSymbolicRefNames',
'setProjectId',
'setSelectedRef',
]),
...mapActions({ storeSearch: 'search' }),
focusSearchBox() {
this.$refs.searchBox.$el.querySelector('input').focus();

View File

@ -5,6 +5,9 @@ import * as types from './mutation_types';
export const setEnabledRefTypes = ({ commit }, refTypes) =>
commit(types.SET_ENABLED_REF_TYPES, refTypes);
export const setUseSymbolicRefNames = ({ commit }, useSymbolicRefNames) =>
commit(types.SET_USE_SYMBOLIC_REF_NAMES, useSymbolicRefNames);
export const setProjectId = ({ commit }, projectId) => commit(types.SET_PROJECT_ID, projectId);
export const setSelectedRef = ({ commit }, selectedRef) =>

View File

@ -1,4 +1,5 @@
export const SET_ENABLED_REF_TYPES = 'SET_ENABLED_REF_TYPES';
export const SET_USE_SYMBOLIC_REF_NAMES = 'SET_USE_SYMBOLIC_REF_NAMES';
export const SET_PROJECT_ID = 'SET_PROJECT_ID';
export const SET_SELECTED_REF = 'SET_SELECTED_REF';

View File

@ -7,6 +7,9 @@ export default {
[types.SET_ENABLED_REF_TYPES](state, refTypes) {
state.enabledRefTypes = refTypes;
},
[types.SET_USE_SYMBOLIC_REF_NAMES](state, useSymbolicRefNames) {
state.useSymbolicRefNames = useSymbolicRefNames;
},
[types.SET_PROJECT_ID](state, projectId) {
state.projectId = projectId;
},
@ -28,6 +31,7 @@ export default {
state.matches.branches = {
list: convertObjectPropsToCamelCase(response.data).map((b) => ({
name: b.name,
value: state.useSymbolicRefNames ? `refs/heads/${b.name}` : undefined,
default: b.default,
})),
totalCount: parseInt(response.headers[X_TOTAL_HEADER], 10),
@ -46,6 +50,7 @@ export default {
state.matches.tags = {
list: convertObjectPropsToCamelCase(response.data).map((b) => ({
name: b.name,
value: state.useSymbolicRefNames ? `refs/tags/${b.name}` : undefined,
})),
totalCount: parseInt(response.headers[X_TOTAL_HEADER], 10),
error: null,

View File

@ -10,6 +10,10 @@ class Projects::PipelineSchedulesController < Projects::ApplicationController
before_action :authorize_update_pipeline_schedule!, except: [:index, :new, :create, :play]
before_action :authorize_admin_pipeline_schedule!, only: [:destroy]
before_action do
push_frontend_feature_flag(:pipeline_schedules_with_tags, @project, default_enabled: :yaml)
end
feature_category :continuous_integration
# rubocop: disable CodeReuse/ActiveRecord

View File

@ -66,6 +66,18 @@ module Ci
project.actual_limits.limit_for(:ci_daily_pipeline_schedule_triggers)
end
def ref_for_display
return unless ref.present?
ref.gsub(%r{^refs/(heads|tags)/}, '')
end
def for_tag?
return false unless ref.present?
ref.start_with? 'refs/tags/'
end
private
def worker_cron_expression

View File

@ -15,8 +15,9 @@
= f.text_field :cron_timezone, value: @schedule.cron_timezone, id: 'schedule_cron_timezone', class: 'hidden', name: 'schedule[cron_timezone]', required: true
.form-group.row
.col-md-9
= f.label :ref, _('Target Branch'), class: 'label-bold'
= dropdown_tag(_("Select target branch"), options: { toggle_class: 'gl-button btn btn-default js-target-branch-dropdown w-100', dropdown_class: 'git-revision-dropdown w-100', title: _("Select target branch"), filter: true, placeholder: s_("OfSearchInADropdown|Filter"), data: { data: @project.repository.branch_names, default_branch: @project.default_branch } } )
= f.label :ref, Feature.enabled?(:pipeline_schedules_with_tags) ? _('Target branch or tag') : _('Target branch'), class: 'label-bold'
%div{ data: { testid: 'schedule-target-ref' } }
.js-target-ref-dropdown{ data: { project_id: @project.id, default_branch: @project.default_branch } }
= f.text_field :ref, value: @schedule.ref, id: 'schedule_ref', class: 'hidden', name: 'schedule[ref]', required: true
.form-group.row.js-ci-variable-list-section
.col-md-9

View File

@ -3,9 +3,12 @@
%td
= pipeline_schedule.description
%td.branch-name-cell
= sprite_icon('fork', size: 12)
- if pipeline_schedule.for_tag?
= sprite_icon('tag', size: 12)
- else
= sprite_icon('fork', size: 12)
- if pipeline_schedule.ref.present?
= link_to pipeline_schedule.ref, project_ref_path(@project, pipeline_schedule.ref), class: "ref-name"
= link_to pipeline_schedule.ref_for_display, project_ref_path(@project, pipeline_schedule.ref_for_display), class: "ref-name"
%td
- if pipeline_schedule.last_pipeline
.status-icon-container{ class: "ci-status-icon-#{pipeline_schedule.last_pipeline.status}" }

View File

@ -6,7 +6,7 @@
milestone_issue_count: @milestone.issues.count,
milestone_merge_request_count: @milestone.merge_requests.count },
disabled: true }
= gl_loading_icon(inline: true, css_class: "gl-mr-2 js-loading-icon hidden")
= _('Delete')
.gl-spinner.js-loading-icon.hidden
#js-delete-milestone-modal

View File

@ -0,0 +1,8 @@
---
name: pipeline_schedules_with_tags
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81476
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/354421
milestone: '14.9'
type: development
group: group::pipeline execution
default_enabled: false

View File

@ -0,0 +1,14 @@
- name: "GitLab self-monitoring" # The name of the feature to be deprecated
announcement_milestone: "14.9" # The milestone when this feature was first announced as deprecated.
announcement_date: "2022-03-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "15.0" # The milestone when this feature is planned to be removed
removal_date: "2022-05-22" # The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # If this deprecation is a breaking change, set this value to true
reporter: abellucci # GitLab username of the person reporting the deprecation
body: | # Do not modify this line, instead modify the lines below.
GitLab self-monitoring gives administrators of self-hosted GitLab instances the tools to monitor the health of their instances. This feature is deprecated in GitLab 14.9, and is scheduled for removal in 15.0.
# The following items are not published on the docs page, but may be used in the future.
stage: Monitor # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
tiers: [Core, Premium, Ultimate] # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/348909 # (optional) This is a link to the deprecation issue in GitLab
documentation_url: https://docs.gitlab.com/ee/administration/monitoring/gitlab_self_monitoring_project/ # (optional) This is a link to the current documentation page

View File

@ -4,10 +4,15 @@ group: Respond
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
# Self-monitoring project **(FREE SELF)**
# Self-monitoring project (DEPRECATED) **(FREE SELF)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32351) in GitLab 12.7 [with a flag](../../feature_flags.md) named `self_monitoring_project`. Disabled by default.
> - Generally available in GitLab 12.8. [Feature flag `self_monitoring_project`](https://gitlab.com/gitlab-org/gitlab/-/issues/198511) removed.
> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/348909) in GitLab 14.9. Planned for removal in GitLab 15.0.
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/348909)
for use in GitLab 14.9, and is planned for removal in GitLab 15.0.
GitLab provides administrators insights into the health of their GitLab instance.

View File

@ -98,6 +98,7 @@ are very appreciative of the work done by translators and proofreaders!
- Paulo George Gomes Bezerra - [GitLab](https://gitlab.com/paulobezerra), [Crowdin](https://crowdin.com/profile/paulogomes.rep)
- André Gama - [GitLab](https://gitlab.com/andregamma), [Crowdin](https://crowdin.com/profile/ToeOficial)
- Eduardo Addad de Oliveira - [GitLab](https://gitlab.com/eduardoaddad), [Crowdin](https://crowdin.com/profile/eduardoaddad)
- Horberlan Brito - [GitLab](https://gitlab.com/horberlan), [Crowdin](https://crowdin.com/profile/horberlan)
- Romanian
- Mircea Pop - [GitLab](https://gitlab.com/eeex), [Crowdin](https://crowdin.com/profile/eex)
- Rareș Pița - [GitLab](https://gitlab.com/dlphin), [Crowdin](https://crowdin.com/profile/dlphin)
@ -110,6 +111,8 @@ are very appreciative of the work done by translators and proofreaders!
- Iaroslav Postovalov - [GitLab](https://gitlab.com/CMDR_Tvis), [Crowdin](https://crowdin.com/profile/CMDR_Tvis)
- Serbian (Latin and Cyrillic)
- Proofreaders needed.
- Sinhalese/Sinhala සිංහල
- හෙළබස (HelaBasa) - [GitLab](https://gitlab.com/helabasa), [Crowdin](https://crowdin.com/profile/helabasa)
- Slovak
- Proofreaders needed.
- Spanish

View File

@ -36,6 +36,20 @@ For deprecation reviewers (Technical Writers only):
https://about.gitlab.com/handbook/marketing/blog/release-posts/#update-the-deprecations-doc
-->
## 14.9
### GitLab self-monitoring
WARNING:
This feature will be changed or removed in 15.0
as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
Before updating GitLab, review the details carefully to determine if you need to make any
changes to your code, settings, or workflow.
GitLab self-monitoring gives administrators of self-hosted GitLab instances the tools to monitor the health of their instances. This feature is deprecated in GitLab 14.9, and is scheduled for removal in 15.0.
**Planned removal milestone: 15.0 (2022-05-22)**
## 14.8
### Changes to the `CI_JOB_JWT`

View File

@ -132,3 +132,25 @@ migrated:
- image URL
- Boards
- Board Lists
## Troubleshooting Group Migration
In a [rails console session](../../../administration/operations/rails_console.md#starting-a-rails-console-session),
you can find the failure or error messages for the group import attempt using:
```shell
# Get relevant import records
import = BulkImports::Entity.where(namespace_id: Group.id).bulk_import
# Alternative lookup by user
import = BulkImport.where(user_id: User.find(...)).last
# Get list of import entities. Each entity represents either a group or a project
entities = import.entities
# Get a list of entity failures
entities.map(&:failures).flatten
# Alternative failure lookup by status
entities.where(status: [-1]).pluck(:destination_name, :destination_namespace, :status)
```

View File

@ -163,6 +163,11 @@ namespace :gitlab do
end
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
# We'll temporarily skip this enhancement for geo, since in some situations we
# wish to setup the geo database before the other databases have been setup,
# and partition management attempts to connect to the main database.
next if name == 'geo'
Rake::Task["db:migrate:#{name}"].enhance do
Rake::Task['gitlab:db:create_dynamic_partitions'].invoke
end
@ -181,6 +186,11 @@ namespace :gitlab do
end
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
# We'll temporarily skip this enhancement for geo, since in some situations we
# wish to setup the geo database before the other databases have been setup,
# and partition management attempts to connect to the main database.
next if name == 'geo'
Rake::Task["db:schema:load:#{name}"].enhance do
Rake::Task['gitlab:db:create_dynamic_partitions'].invoke
end

View File

@ -6840,6 +6840,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
msgid "Changed"
msgstr ""
msgid "Changed assignee(s)."
msgstr ""
@ -30901,6 +30904,9 @@ msgstr ""
msgid "Reports|Identifier"
msgstr ""
msgid "Reports|Metrics report scanning detected no new changes"
msgstr ""
msgid "Reports|Metrics reports are loading"
msgstr ""
@ -30913,6 +30919,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
msgid "Reports|Metrics reports failed to load results"
msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
msgid "Reports|Scanner"
msgstr ""
@ -33289,6 +33301,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
msgid "Select target branch or tag"
msgstr ""
msgid "Select timezone"
msgstr ""
@ -36041,6 +36056,9 @@ msgstr ""
msgid "Target branch"
msgstr ""
msgid "Target branch or tag"
msgstr ""
msgid "Target-Branch"
msgstr ""
@ -43009,6 +43027,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
msgid "change"
msgid_plural "changes"
msgstr[0] ""
msgstr[1] ""
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""

View File

@ -135,8 +135,8 @@ RSpec.describe 'Pipeline Schedules', :js do
end
it 'shows the pipeline schedule with default ref' do
page.within('.js-target-branch-dropdown') do
expect(first('.dropdown-toggle-text').text).to eq('master')
page.within('[data-testid="schedule-target-ref"]') do
expect(first('.gl-new-dropdown-button-text').text).to eq('master')
end
end
end
@ -148,8 +148,8 @@ RSpec.describe 'Pipeline Schedules', :js do
end
it 'shows the pipeline schedule with default ref' do
page.within('.js-target-branch-dropdown') do
expect(first('.dropdown-toggle-text').text).to eq('master')
page.within('[data-testid="schedule-target-ref"]') do
expect(first('.gl-new-dropdown-button-text').text).to eq('master')
end
end
end
@ -293,8 +293,8 @@ RSpec.describe 'Pipeline Schedules', :js do
end
def select_target_branch
find('.js-target-branch-dropdown').click
click_link 'master'
find('[data-testid="schedule-target-ref"] .dropdown-toggle').click
click_button 'master'
end
def save_pipeline_schedule

View File

@ -10,30 +10,37 @@ Object {
Object {
"default": false,
"name": "add_images_and_changes",
"value": undefined,
},
Object {
"default": false,
"name": "conflict-contains-conflict-markers",
"value": undefined,
},
Object {
"default": false,
"name": "deleted-image-test",
"value": undefined,
},
Object {
"default": false,
"name": "diff-files-image-to-symlink",
"value": undefined,
},
Object {
"default": false,
"name": "diff-files-symlink-to-image",
"value": undefined,
},
Object {
"default": false,
"name": "markdown",
"value": undefined,
},
Object {
"default": true,
"name": "master",
"value": undefined,
},
],
"totalCount": 123,
@ -54,12 +61,15 @@ Object {
"list": Array [
Object {
"name": "v1.1.1",
"value": undefined,
},
Object {
"name": "v1.1.0",
"value": undefined,
},
Object {
"name": "v1.0.0",
"value": undefined,
},
],
"totalCount": 456,

View File

@ -48,6 +48,14 @@ describe('Ref selector Vuex store mutations', () => {
});
});
describe(`${types.SET_USE_SYMBOLIC_REF_NAMES}`, () => {
it('sets useSymbolicRefNames on the state', () => {
mutations[types.SET_USE_SYMBOLIC_REF_NAMES](state, true);
expect(state.useSymbolicRefNames).toBe(true);
});
});
describe(`${types.SET_PROJECT_ID}`, () => {
it('updates the project ID', () => {
const newProjectId = '4';

View File

@ -228,6 +228,66 @@ RSpec.describe Ci::PipelineSchedule do
end
end
describe '#for_tag?' do
context 'when the target is a tag' do
before do
subject.ref = 'refs/tags/v1.0'
end
it { expect(subject.for_tag?).to eq(true) }
end
context 'when the target is a branch' do
before do
subject.ref = 'refs/heads/main'
end
it { expect(subject.for_tag?).to eq(false) }
end
context 'when there is no ref' do
before do
subject.ref = nil
end
it { expect(subject.for_tag?).to eq(false) }
end
end
describe '#ref_for_display' do
context 'when the target is a tag' do
before do
subject.ref = 'refs/tags/v1.0'
end
it { expect(subject.ref_for_display).to eq('v1.0') }
end
context 'when the target is a branch' do
before do
subject.ref = 'refs/heads/main'
end
it { expect(subject.ref_for_display).to eq('main') }
end
context 'when the ref is ambiguous' do
before do
subject.ref = 'release-2.8'
end
it { expect(subject.ref_for_display).to eq('release-2.8') }
end
context 'when there is no ref' do
before do
subject.ref = nil
end
it { expect(subject.ref_for_display).to eq(nil) }
end
end
context 'loose foreign key on ci_pipeline_schedules.project_id' do
it_behaves_like 'cleanup by a loose foreign key' do
let!(:parent) { create(:project) }

View File

@ -489,6 +489,20 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
expect { run_rake_task('db:migrate:main') }.not_to raise_error
end
end
describe 'db:migrate:geo' do
it 'does not invoke gitlab:db:create_dynamic_partitions' do
skip 'Skipping because geo database is not setup' unless geo_configured?
expect(Rake::Task['gitlab:db:create_dynamic_partitions']).not_to receive(:invoke)
expect { run_rake_task('db:migrate:geo') }.not_to raise_error
end
def geo_configured?
!!ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: 'geo')
end
end
end
describe 'gitlab:db:reset_as_non_superuser' do