Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
4dc620034e
commit
2de2cc6833
|
@ -31,7 +31,8 @@ export default {
|
|||
props: {
|
||||
groupId: {
|
||||
type: Number,
|
||||
required: true,
|
||||
required: false,
|
||||
default: null,
|
||||
},
|
||||
groupNamespace: {
|
||||
type: String,
|
||||
|
@ -57,6 +58,11 @@ export default {
|
|||
required: false,
|
||||
default: () => [],
|
||||
},
|
||||
loadingDefaultProjects: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
@ -111,6 +117,9 @@ export default {
|
|||
searchTerm() {
|
||||
this.search();
|
||||
},
|
||||
defaultProjects(projects) {
|
||||
this.selectedProjects = [...projects];
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.search();
|
||||
|
@ -202,6 +211,7 @@ export default {
|
|||
ref="projectsDropdown"
|
||||
class="dropdown dropdown-projects"
|
||||
toggle-class="gl-shadow-none"
|
||||
:loading="loadingDefaultProjects"
|
||||
:show-clear-all="hasSelectedProjects"
|
||||
show-highlighted-items-title
|
||||
highlighted-items-title-class="gl-p-3"
|
||||
|
@ -209,6 +219,7 @@ export default {
|
|||
@hide="onHide"
|
||||
>
|
||||
<template #button-content>
|
||||
<gl-loading-icon v-if="loadingDefaultProjects" class="gl-mr-2" />
|
||||
<div class="gl-display-flex gl-flex-grow-1">
|
||||
<gl-avatar
|
||||
v-if="isOnlyOneProjectSelected"
|
||||
|
|
|
@ -304,3 +304,10 @@ $gl-line-height-42: px-to-rem(42px);
|
|||
width: 25%;
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Move to @gitlab/ui by https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1671
|
||||
.gl-md-pr-5 {
|
||||
@include gl-media-breakpoint-up(md) {
|
||||
padding-right: $gl-spacing-scale-5;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -38,7 +38,8 @@ module IssuablesDescriptionTemplatesHelper
|
|||
# Only local templates will be listed if licenses for inherited templates are not present
|
||||
all_templates = all_templates.values.flatten.map { |tpl| tpl[:name] }.compact.uniq
|
||||
|
||||
all_templates.find { |tmpl_name| tmpl_name == params[:issuable_template] }
|
||||
template = all_templates.find { |tmpl_name| tmpl_name == params[:issuable_template] }
|
||||
template || all_templates.find { |tmpl_name| tmpl_name.casecmp?('default') }
|
||||
end
|
||||
|
||||
def available_service_desk_templates_for(project)
|
||||
|
|
|
@ -883,9 +883,9 @@ of choice already. Some examples include [HAProxy](https://www.haproxy.org/)
|
|||
Big-IP LTM, and Citrix Net Scaler. This documentation outlines what ports
|
||||
and protocols you need configure.
|
||||
|
||||
WARNING:
|
||||
Long-running background jobs can maintain an idle connection with Praefect for up 6 hours. Set your load balancer timeout to be at least
|
||||
6 hours long.
|
||||
NOTE:
|
||||
We recommend the equivalent of HAProxy `leastconn` load-balancing strategy because long-running operations (for example,
|
||||
clones) keep some connections open for extended periods.
|
||||
|
||||
| LB Port | Backend Port | Protocol |
|
||||
|:--------|:-------------|:---------|
|
||||
|
|
|
@ -16,7 +16,7 @@ When implementing new features, please refer to these existing features to avoid
|
|||
- [CODEOWNERS](../user/project/code_owners.md#set-up-code-owners): `.gitlab/CODEOWNERS`.
|
||||
- [Route Maps](../ci/review_apps/#route-maps): `.gitlab/route-map.yml`.
|
||||
- [Customize Auto DevOps Helm Values](../topics/autodevops/customize.md#customize-values-for-helm-chart): `.gitlab/auto-deploy-values.yaml`.
|
||||
- [GitLab managed apps CI/CD](../user/clusters/applications.md#usage): `.gitlab/managed-apps/config.yaml`.
|
||||
- [GitLab managed apps CI/CD](../user/clusters/applications.md#prerequisites): `.gitlab/managed-apps/config.yaml`.
|
||||
- [Insights](../user/project/insights/index.md#configure-your-insights): `.gitlab/insights.yml`.
|
||||
- [Service Desk Templates](../user/project/service_desk.md#using-customized-email-templates): `.gitlab/service_desk_templates/`.
|
||||
- [Web IDE](../user/project/web_ide/#web-ide-configuration-file): `.gitlab/.gitlab-webide.yml`.
|
||||
|
|
|
@ -54,7 +54,7 @@ Supported applications:
|
|||
- [PostHog](#install-posthog-using-gitlab-cicd)
|
||||
- [Prometheus](#install-prometheus-using-gitlab-cicd)
|
||||
|
||||
### Usage
|
||||
### Prerequisites
|
||||
|
||||
You can find and import all the files referenced below
|
||||
in the [example cluster applications
|
||||
|
@ -95,7 +95,7 @@ applications you have configured. In case of pipeline failure, the
|
|||
output of the [Helm Tiller](https://v2.helm.sh/docs/install/#running-tiller-locally) binary
|
||||
is saved as a [CI job artifact](../../ci/pipelines/job_artifacts.md).
|
||||
|
||||
#### Usage in GitLab versions earlier than 13.5
|
||||
#### Prerequisites in GitLab versions earlier than 13.5
|
||||
|
||||
For GitLab versions 13.5 and earlier, the Ingress, Fluentd, Prometheus, and Sentry
|
||||
apps were fetched from the central Helm stable repository (`https://kubernetes-charts.storage.googleapis.com/`).
|
||||
|
|
|
@ -116,6 +116,8 @@ You might also be interested in templates for various
|
|||
|
||||
### Set a default template for merge requests and issues **(PREMIUM)**
|
||||
|
||||
> The `default.md` template becoming the default [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/76326) in GitLab 14.7.
|
||||
|
||||
In a project, you can choose a default description template for new issues and merge requests.
|
||||
As a result, every time a new merge request or issue is created, it's pre-filled with the text you
|
||||
entered in the template.
|
||||
|
@ -125,17 +127,29 @@ Prerequisites:
|
|||
- On your project's left sidebar, select **Settings > General** and expand **Visibility, project features, permissions**.
|
||||
Ensure issues or merge requests are set to either **Everyone with access** or **Only Project Members**.
|
||||
|
||||
To set a default description template for merge requests:
|
||||
To set a default description template for merge requests, either:
|
||||
|
||||
1. Go to your project's **Settings**.
|
||||
1. Select **Expand** under the **Merge requests** header.
|
||||
1. Fill in the **Default description template for merge requests** text area.
|
||||
1. Select **Save changes**.
|
||||
- [Create a merge request template](#create-a-merge-request-template) named `default.md` and save it in `.gitlab/merge_request_templates/`.
|
||||
**If a `default.md` file exists, it's used as the default template even if you select another one in the project settings.**
|
||||
- Select the default template in project settings:
|
||||
|
||||
To set a default description template for issues:
|
||||
1. On the top bar, select **Menu > Projects** and find your project.
|
||||
1. On the left sidebar, select **Settings**.
|
||||
1. Expand **Merge requests**.
|
||||
1. Fill in the **Default description template for merge requests** text area.
|
||||
1. Select **Save changes**.
|
||||
|
||||
1. Select **Expand** under **Default issue template**.
|
||||
1. Fill in the **Default description template for issues** text area.
|
||||
To set a default description template for issues, either:
|
||||
|
||||
- [Create an issue template](#create-an-issue-template) named `default.md` and save it in `.gitlab/issue_templates/`.
|
||||
**If a `default.md` file exists, it's used as the default template even if you select another one in the project settings.**
|
||||
- Select the default template in project settings:
|
||||
|
||||
1. On the top bar, select **Menu > Projects** and find your project.
|
||||
1. On the left sidebar, select **Settings**.
|
||||
1. Expand **Default issue template**.
|
||||
1. Fill in the **Default description template for issues** text area.
|
||||
1. Select **Save changes**.
|
||||
|
||||
Because GitLab merge request and issues support [Markdown](../markdown.md), you can use it to format
|
||||
headings, lists, and so on.
|
||||
|
|
|
@ -112,7 +112,7 @@ To create a group access token:
|
|||
1. Run the following commands in a [Rails console](../../../administration/operations/rails_console.md):
|
||||
|
||||
```ruby
|
||||
# Set the GitLab administration user to use. If user ID 1 is not available or is not an adinistrator, use 'admin = User.admins.first' instead to select an admininistrator.
|
||||
# Set the GitLab administration user to use. If user ID 1 is not available or is not an administrator, use 'admin = User.admins.first' instead to select an administrator.
|
||||
admin = User.find(1)
|
||||
|
||||
# Set the group group you want to create a token for. For example, group with ID 109.
|
||||
|
|
|
@ -27970,6 +27970,12 @@ msgstr ""
|
|||
msgid "ProjectSettings|Highlight the usage of hidden unicode characters. These have innocent uses for right-to-left languages, but can also be used in potential exploits."
|
||||
msgstr ""
|
||||
|
||||
msgid "ProjectSettings|If a %{code_start}default.md%{code_end} file exists in %{code_start}.gitlab/issue_templates%{code_end} in the repository, it overrides this setting."
|
||||
msgstr ""
|
||||
|
||||
msgid "ProjectSettings|If a %{code_start}default.md%{code_end} file exists in %{code_start}.gitlab/merge_request_templates%{code_end} in the repository, it overrides this setting."
|
||||
msgstr ""
|
||||
|
||||
msgid "ProjectSettings|If merge trains are enabled, merging is only possible if the branch can be rebased without conflicts."
|
||||
msgstr ""
|
||||
|
||||
|
|
|
@ -83,13 +83,6 @@ module QA
|
|||
|
||||
def start_node(name)
|
||||
shell "docker start #{name}"
|
||||
wait_until_shell_command_matches(
|
||||
"docker inspect -f {{.State.Running}} #{name}",
|
||||
/true/,
|
||||
sleep_interval: 3,
|
||||
max_duration: 180,
|
||||
retry_on_exception: true
|
||||
)
|
||||
end
|
||||
|
||||
def stop_node(name)
|
||||
|
@ -180,7 +173,6 @@ module QA
|
|||
start_node(@praefect)
|
||||
|
||||
wait_for_health_check_all_nodes
|
||||
wait_for_reliable_connection
|
||||
end
|
||||
|
||||
def verify_storage_move(source_storage, destination_storage, repo_type: :project)
|
||||
|
@ -192,21 +184,15 @@ module QA
|
|||
end
|
||||
|
||||
def wait_for_praefect
|
||||
wait_until_shell_command_matches(
|
||||
"docker inspect -f {{.State.Running}} #{@praefect}",
|
||||
/true/,
|
||||
sleep_interval: 3,
|
||||
max_duration: 180,
|
||||
retry_on_exception: true
|
||||
)
|
||||
QA::Runtime::Logger.info("Waiting for health check on praefect")
|
||||
Support::Waiter.wait_until(max_duration: 120, sleep_interval: 1, raise_on_failure: true) do
|
||||
# praefect runs a grpc server on port 2305, which will return an error 'Connection refused' until such time it is ready
|
||||
wait_until_shell_command("docker exec #{@gitaly_cluster} bash -c 'curl #{@praefect}:2305'") do |line|
|
||||
break if line.include?('curl: (1) Received HTTP/0.9 when not allowed')
|
||||
|
||||
QA::Runtime::Logger.info('Wait until Praefect starts and is listening')
|
||||
wait_until_shell_command_matches(
|
||||
"docker exec #{@praefect} bash -c 'cat /var/log/gitlab/praefect/current'",
|
||||
/listening at tcp address/
|
||||
)
|
||||
|
||||
wait_for_gitaly_check
|
||||
QA::Runtime::Logger.debug(line.chomp)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def wait_for_sql_ping
|
||||
|
@ -220,72 +206,35 @@ module QA
|
|||
['error when pinging healthcheck', 'failed checking node health'].include?(msg)
|
||||
end
|
||||
|
||||
def wait_for_no_praefect_storage_error
|
||||
# If a healthcheck error was the last message to be logged, we'll keep seeing that message even if it's no longer a problem
|
||||
# That is, there's no message shown in the Praefect logs when the healthcheck succeeds
|
||||
# To work around that we perform the gitaly check rake task, wait a few seconds, and then we confirm that no healthcheck errors appear
|
||||
|
||||
QA::Runtime::Logger.info("Checking that Praefect does not report healthcheck errors with its gitaly nodes")
|
||||
|
||||
Support::Waiter.wait_until(max_duration: 120) do
|
||||
wait_for_gitaly_check
|
||||
|
||||
sleep 5
|
||||
|
||||
shell "docker exec #{@praefect} bash -c 'tail -n 1 /var/log/gitlab/praefect/current'" do |line|
|
||||
QA::Runtime::Logger.debug(line.chomp)
|
||||
log = JSON.parse(line)
|
||||
|
||||
break true unless health_check_failure_message?(log['msg'])
|
||||
rescue JSON::ParserError
|
||||
# Ignore lines that can't be parsed as JSON
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def wait_for_storage_nodes
|
||||
wait_for_no_praefect_storage_error
|
||||
|
||||
Support::Waiter.repeat_until(max_attempts: 3, max_duration: 120, sleep_interval: 1) do
|
||||
nodes_confirmed = {
|
||||
@primary_node => false,
|
||||
@secondary_node => false,
|
||||
@tertiary_node => false
|
||||
}
|
||||
|
||||
wait_until_shell_command("docker exec #{@praefect} bash -c '/opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml dial-nodes'") do |line|
|
||||
QA::Runtime::Logger.debug(line.chomp)
|
||||
|
||||
nodes_confirmed.each_key do |node|
|
||||
nodes_confirmed[node] = true if line =~ /SUCCESS: confirmed Gitaly storage "#{node}" in virtual storages \[#{@virtual_storage}\] is served/
|
||||
end
|
||||
|
||||
nodes_confirmed.values.all?
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def wait_for_health_check_all_nodes
|
||||
wait_for_health_check(@primary_node)
|
||||
wait_for_health_check(@secondary_node)
|
||||
wait_for_health_check(@tertiary_node)
|
||||
wait_for_gitaly_health_check(@primary_node)
|
||||
wait_for_gitaly_health_check(@secondary_node)
|
||||
wait_for_gitaly_health_check(@tertiary_node)
|
||||
end
|
||||
|
||||
def wait_for_health_check(node)
|
||||
def wait_for_gitaly_health_check(node)
|
||||
QA::Runtime::Logger.info("Waiting for health check on #{node}")
|
||||
Support::Waiter.wait_until(max_duration: 120, sleep_interval: 1, raise_on_failure: true) do
|
||||
# gitaly runs a grpc server on port 8075, which will return an error 'Connection refused' until such time it is ready
|
||||
wait_until_shell_command("docker exec #{@praefect} bash -c 'curl #{node}:8075'") do |line|
|
||||
break if line.include?('curl: (1) Received HTTP/0.9 when not allowed')
|
||||
|
||||
QA::Runtime::Logger.debug(line.chomp)
|
||||
end
|
||||
end
|
||||
wait_until_node_is_marked_as_healthy_storage(node)
|
||||
end
|
||||
|
||||
def wait_for_primary_node_health_check
|
||||
wait_for_health_check(@primary_node)
|
||||
wait_for_gitaly_health_check(@primary_node)
|
||||
end
|
||||
|
||||
def wait_for_secondary_node_health_check
|
||||
wait_for_health_check(@secondary_node)
|
||||
wait_for_gitaly_health_check(@secondary_node)
|
||||
end
|
||||
|
||||
def wait_for_tertiary_node_health_check
|
||||
wait_for_health_check(@tertiary_node)
|
||||
wait_for_gitaly_health_check(@tertiary_node)
|
||||
end
|
||||
|
||||
def wait_for_health_check_failure(node)
|
||||
|
@ -311,7 +260,6 @@ module QA
|
|||
shell sql_to_docker_exec_cmd("SELECT count(*) FROM healthy_storages WHERE storage = '#{node}';") do |line|
|
||||
result << line
|
||||
end
|
||||
QA::Runtime::Logger.debug("result is ---#{result}")
|
||||
result[2].to_i == 0
|
||||
end
|
||||
end
|
||||
|
@ -322,21 +270,10 @@ module QA
|
|||
shell sql_to_docker_exec_cmd("SELECT count(*) FROM healthy_storages WHERE storage = '#{node}';") do |line|
|
||||
result << line
|
||||
end
|
||||
|
||||
QA::Runtime::Logger.debug("result is ---#{result}")
|
||||
result[2].to_i == 1
|
||||
end
|
||||
end
|
||||
|
||||
def wait_for_gitaly_check
|
||||
Support::Waiter.wait_until(max_duration: 120, sleep_interval: 1, raise_on_failure: true) do
|
||||
wait_until_shell_command("docker exec #{@gitlab} bash -c 'gitlab-rake gitlab:git:fsck'") do |line|
|
||||
QA::Runtime::Logger.debug(line.chomp)
|
||||
line.include?('Done')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Waits until there is an increase in the number of reads for
|
||||
# any node compared to the number of reads provided. If a node
|
||||
# has no pre-read data, consider it to have had zero reads.
|
||||
|
@ -354,12 +291,6 @@ module QA
|
|||
data.find(-> {{ value: 0 }}) { |item| item[:node] == node }[:value]
|
||||
end
|
||||
|
||||
def wait_for_reliable_connection
|
||||
QA::Runtime::Logger.info('Wait until GitLab and Praefect can communicate reliably')
|
||||
wait_for_sql_ping
|
||||
wait_for_storage_nodes
|
||||
end
|
||||
|
||||
def wait_for_replication(project_id)
|
||||
Support::Waiter.wait_until(sleep_interval: 1) { replication_queue_incomplete_count == 0 && replicated?(project_id) }
|
||||
end
|
||||
|
@ -476,7 +407,7 @@ module QA
|
|||
end
|
||||
|
||||
def repository_replicated_to_disk?(node, relative_path)
|
||||
Support::Waiter.wait_until(max_duration: 300, sleep_interval: 3, raise_on_failure: false) do
|
||||
Support::Waiter.wait_until(max_duration: 300, sleep_interval: 1, raise_on_failure: false) do
|
||||
result = []
|
||||
shell sql_to_docker_exec_cmd("SELECT count(*) FROM storage_repositories where relative_path='#{relative_path}';") do |line|
|
||||
result << line
|
||||
|
|
|
@ -49,7 +49,6 @@ module QA
|
|||
# for Gitaly to be ready for writes again
|
||||
praefect_manager.stop_primary_node
|
||||
praefect_manager.wait_for_primary_node_health_check_failure
|
||||
praefect_manager.wait_for_gitaly_check
|
||||
|
||||
Resource::Repository::Commit.fabricate_via_api! do |commit|
|
||||
commit.project = project
|
||||
|
|
|
@ -72,6 +72,37 @@ RSpec.describe IssuablesDescriptionTemplatesHelper, :clean_gitlab_redis_cache do
|
|||
].to_json
|
||||
expect(helper.available_service_desk_templates_for(@project)).to eq(value)
|
||||
end
|
||||
|
||||
context 'when no issuable_template parameter or default template is present' do
|
||||
it 'does not select a template' do
|
||||
expect(helper.selected_template(project)).to be(nil)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when an issuable_template parameter has been provided' do
|
||||
before do
|
||||
allow(helper).to receive(:params).and_return({ issuable_template: 'another_issue_template' })
|
||||
end
|
||||
|
||||
it 'selects the issuable template' do
|
||||
expect(helper.selected_template(project)).to eq('another_issue_template')
|
||||
end
|
||||
end
|
||||
|
||||
context 'when there is a default template' do
|
||||
let(:templates) do
|
||||
{
|
||||
"" => [
|
||||
{ name: "another_issue_template", id: "another_issue_template", project_id: project.id },
|
||||
{ name: "default", id: "default", project_id: project.id }
|
||||
]
|
||||
}
|
||||
end
|
||||
|
||||
it 'selects the default template' do
|
||||
expect(helper.selected_template(project)).to eq('default')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'when there are not templates in the project' do
|
||||
|
|
|
@ -259,6 +259,16 @@ RSpec.describe Issues::MoveService do
|
|||
|
||||
it_behaves_like 'copy or reset relative position'
|
||||
end
|
||||
|
||||
context 'issue with escalation status' do
|
||||
it 'keeps the escalation status' do
|
||||
escalation_status = create(:incident_management_issuable_escalation_status, issue: old_issue)
|
||||
|
||||
move_service.execute(old_issue, new_project)
|
||||
|
||||
expect(escalation_status.reload.issue).to eq(old_issue)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'move permissions' do
|
||||
|
|
Loading…
Reference in New Issue