doc/user/img/markdown_copy_from_spreadsheet_v12_7.png

363 KiB

doc/user/img/markdown_paste_table_v12_7.png

150 KiB

---
redirect_to: '../instance_statistics/dev_ops_score.md'
---
This document was moved to [another location](../instance_statistics/dev_ops_score.md).
# DevOps Score # DevOps Score
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/issues/30469) in GitLab 9.3.
> [Renamed from Conversational Development Index](https://gitlab.com/gitlab-org/gitlab/issues/20976) in GitLab 12.6. > [Renamed from Conversational Development Index](https://gitlab.com/gitlab-org/gitlab/issues/20976) in GitLab 12.6.
NOTE: **Note:** NOTE: **Note:**
... ...
......
...@@ -1375,6 +1375,22 @@ to the sides of the "dash" lines in the second row. This will affect every cell ...@@ -1375,6 +1375,22 @@ to the sides of the "dash" lines in the second row. This will affect every cell
| Cell 1 | Cell 2 | Cell 3 | Cell 4 | Cell 5 | Cell 6 | | Cell 1 | Cell 2 | Cell 3 | Cell 4 | Cell 5 | Cell 6 |
| Cell 7 | Cell 8 | Cell 9 | Cell 10 | Cell 11 | Cell 12 | | Cell 7 | Cell 8 | Cell 9 | Cell 10 | Cell 11 | Cell 12 |
#### Copy from spreadsheet and paste in Markdown
[Introduced](https://gitlab.com/gitlab-org/gitlab/issues/27205) in GitLab 12.7.
If you're working in spreadsheet software (e.g. Microsoft Excel, Google
Sheets, Apple Numbers), you can copy from a spreadsheet, and GitLab will
paste it as a Markdown table. For example, suppose you have the
following spreadsheet:
![Copy from spreadsheet](img/markdown_copy_from_spreadsheet_v12_7.png)
Select the cells and copy them to your clipboard. Open a GitLab Markdown
entry and paste the spreadsheet:
![Paste to Markdown table](img/markdown_paste_table_v12_7.png)
## References ## References
- This document leveraged heavily from the [Markdown-Cheatsheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet). - This document leveraged heavily from the [Markdown-Cheatsheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet).
... ...
......
...@@ -266,6 +266,8 @@ The GitLab Conan repository supports the following Conan CLI commands: ...@@ -266,6 +266,8 @@ The GitLab Conan repository supports the following Conan CLI commands:
## Using GitLab CI with Conan packages ## Using GitLab CI with Conan packages
> [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/11678) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.7.
To work with Conan commands within [GitLab CI](./../../../ci/README.md), you can use To work with Conan commands within [GitLab CI](./../../../ci/README.md), you can use
`CI_JOB_TOKEN` in place of the personal access token in your commands. `CI_JOB_TOKEN` in place of the personal access token in your commands.
... ...
......
...@@ -151,21 +151,24 @@ There are 2 methods to specify a variable in a query or dashboard: ...@@ -151,21 +151,24 @@ There are 2 methods to specify a variable in a query or dashboard:
By default, all projects include a GitLab-defined Prometheus dashboard, which By default, all projects include a GitLab-defined Prometheus dashboard, which
includes a few key metrics, but you can also define your own custom dashboards. includes a few key metrics, but you can also define your own custom dashboards.
You may create a new file from scratch or duplicate a GitLab-defined Prometheus
dashboard.
NOTE: **Note:** NOTE: **Note:**
The custom metrics as defined below do not support alerts, unlike The custom metrics as defined below do not support alerts, unlike
[additional metrics](#adding-additional-metrics-premium). [additional metrics](#adding-additional-metrics-premium).
#### Adding a new dashboard to your project #### Adding a new dashboard to your project
You can configure a custom dashboard by adding a new `.yml` file into a project's repository. Only `.yml` files present in the projects **default** branch are displayed on the project's **Operations > Metrics** section. You can configure a custom dashboard by adding a new YAML file into your project's
`.gitlab/dashboards/` directory. In order for the dashboards to be displayed on
You may create a new file from scratch or duplicate a GitLab-defined dashboard. the project's **Operations > Metrics** page, the files must have a `.yml`
extension and should be present in the project's **default** branch.
**Add a `.yml` file manually** For example:
1. Create a YAML file with the `.yml` extension under your repository's root 1. Create `.gitlab/dashboards/prom_alerts.yml` under your repository's root
directory inside `.gitlab/dashboards/`. For example, create directory with the following contents:
`.gitlab/dashboards/prom_alerts.yml` with the following contents:
```yaml ```yaml
dashboard: 'Dashboard Title' dashboard: 'Dashboard Title'
...@@ -194,7 +197,7 @@ NOTE: **Note:** ...@@ -194,7 +197,7 @@ NOTE: **Note:**
Configuration files nested under subdirectories of `.gitlab/dashboards` are not Configuration files nested under subdirectories of `.gitlab/dashboards` are not
supported and will not be available in the UI. supported and will not be available in the UI.
**Duplicate a GitLab-defined dashboard as a new `.yml` file** #### Duplicating a GitLab-defined dashboard
> [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/37238) in GitLab 12.7. > [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/37238) in GitLab 12.7.
... ...
......
...@@ -54,8 +54,8 @@ Design Management requires that projects are using ...@@ -54,8 +54,8 @@ Design Management requires that projects are using
- Design Management data [won't be moved](https://gitlab.com/gitlab-org/gitlab/issues/13426) - Design Management data [won't be moved](https://gitlab.com/gitlab-org/gitlab/issues/13426)
when an issue is moved, nor [deleted](https://gitlab.com/gitlab-org/gitlab/issues/13427) when an issue is moved, nor [deleted](https://gitlab.com/gitlab-org/gitlab/issues/13427)
when an issue is deleted. when an issue is deleted.
- Design Management - From GitLab 12.7, Design Management data [can be replicated](../../../administration/geo/replication/datatypes.md#limitations-on-replicationverification)
[isn't supported by Geo](https://gitlab.com/groups/gitlab-org/-/epics/1633) yet. by Geo but [not verified](https://gitlab.com/gitlab-org/gitlab/issues/32467).
- Only the latest version of the designs can be deleted. - Only the latest version of the designs can be deleted.
- Deleted designs cannot be recovered but you can see them on previous designs versions. - Deleted designs cannot be recovered but you can see them on previous designs versions.
... ...
......
...@@ -55,6 +55,7 @@ This page has: ...@@ -55,6 +55,7 @@ This page has:
- A link to the Sentry issue. - A link to the Sentry issue.
- A link to the GitLab commit if the Sentry [release id/version](https://docs.sentry.io/workflow/releases/?platform=javascript#configure-sdk) on the Sentry Issue's first release matches a commit SHA in your GitLab hosted project. - A link to the GitLab commit if the Sentry [release id/version](https://docs.sentry.io/workflow/releases/?platform=javascript#configure-sdk) on the Sentry Issue's first release matches a commit SHA in your GitLab hosted project.
- Other details about the issue, including a full stack trace. - Other details about the issue, including a full stack trace.
- In [GitLab 12.7 and newer](https://gitlab.com/gitlab-org/gitlab/issues/36246), language and urgency are displayed.
By default, a **Create issue** button is displayed. Once you have used it to create an issue, the button is hidden. By default, a **Create issue** button is displayed. Once you have used it to create an issue, the button is hidden.
...@@ -78,6 +79,10 @@ Ignoring an error will prevent it from appearing in the [Error Tracking List](#e ...@@ -78,6 +79,10 @@ Ignoring an error will prevent it from appearing in the [Error Tracking List](#e
### Resolving errors ### Resolving errors
From within the [Error Details](#error-details) page you can resolve a Sentry error by simply clicking the **Resolve** button near the top of the page. > [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/39825) in GitLab 12.7.
Marking an error as resolved indicates that the error has stopped firing events. If another event occurs, the error reverts to unresolved. From within the [Error Details](#error-details) page you can resolve a Sentry error by
clicking the **Resolve** button near the top of the page.
Marking an error as resolved indicates that the error has stopped firing events. If another event
occurs, the error reverts to unresolved.
...@@ -23,10 +23,14 @@ noted information: ...@@ -23,10 +23,14 @@ noted information:
If you hover over a commit in the UI, you'll see a precise date and time If you hover over a commit in the UI, you'll see a precise date and time
for that commit. for that commit.
![Blame previous commit](img/file_blame_previous_commit_v12_7.png "Blame previous commit") ## Blame previous commit
> [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/19299) in GitLab 12.7.
To see earlier revisions of a specific line, click **View blame prior to this change** To see earlier revisions of a specific line, click **View blame prior to this change**
until you've found the changes you're interested in viewing. until you've found the changes you're interested in viewing:
![Blame previous commit](img/file_blame_previous_commit_v12_7.png "Blame previous commit")
## Associated `git` command ## Associated `git` command
... ...
......
...@@ -69,7 +69,7 @@ Follow these steps to do so: ...@@ -69,7 +69,7 @@ Follow these steps to do so:
have access to your GitLab instance. We recommend **putting this behind an alias** so it can be have access to your GitLab instance. We recommend **putting this behind an alias** so it can be
changed if needed, and **[enabling Akismet](../../integration/akismet.md)** on your GitLab changed if needed, and **[enabling Akismet](../../integration/akismet.md)** on your GitLab
instance to add spam checking to this service. Unblocked email spam would result in many spam instance to add spam checking to this service. Unblocked email spam would result in many spam
issues being created, and may disrupt your GitLab service. issues being created.
If you have [templates](description_templates.md) in your repository, you can optionally select If you have [templates](description_templates.md) in your repository, you can optionally select
one from the selector menu to append it to all Service Desk issues. one from the selector menu to append it to all Service Desk issues.
... ...
......
...@@ -34,7 +34,7 @@ module Gitlab ...@@ -34,7 +34,7 @@ module Gitlab
end end
def password def password
@password ||= Gitlab::Utils.force_utf8(Devise.friendly_token[0, 8].downcase) @password ||= Gitlab::Utils.force_utf8(::User.random_password.downcase)
end end
def location def location
... ...
......
...@@ -172,6 +172,7 @@ module Gitlab ...@@ -172,6 +172,7 @@ module Gitlab
stage: 'import_pull_requests', iid: pull_request.iid, error: e.message stage: 'import_pull_requests', iid: pull_request.iid, error: e.message
) )
backtrace = Gitlab::BacktraceCleaner.clean_backtrace(e.backtrace)
errors << { type: :pull_request, iid: pull_request.iid, errors: e.message, backtrace: backtrace.join("\n"), raw_response: pull_request.raw } errors << { type: :pull_request, iid: pull_request.iid, errors: e.message, backtrace: backtrace.join("\n"), raw_response: pull_request.raw }
end end
end end
... ...
......
...@@ -24,6 +24,10 @@ module Gitlab ...@@ -24,6 +24,10 @@ module Gitlab
'projects/compare' => %w{create} 'projects/compare' => %w{create}
}.freeze }.freeze
WHITELISTED_LOGOUT_ROUTES = {
'sessions' => %w{destroy}
}.freeze
GRAPHQL_URL = '/api/graphql' GRAPHQL_URL = '/api/graphql'
def initialize(app, env) def initialize(app, env)
...@@ -85,7 +89,7 @@ module Gitlab ...@@ -85,7 +89,7 @@ module Gitlab
# Overridden in EE module # Overridden in EE module
def whitelisted_routes def whitelisted_routes
grack_route? || internal_route? || lfs_route? || compare_git_revisions_route? || sidekiq_route? || graphql_query? grack_route? || internal_route? || lfs_route? || compare_git_revisions_route? || sidekiq_route? || logout_route? || graphql_query?
end end
def grack_route? def grack_route?
...@@ -118,6 +122,13 @@ module Gitlab ...@@ -118,6 +122,13 @@ module Gitlab
WHITELISTED_GIT_LFS_ROUTES[route_hash[:controller]]&.include?(route_hash[:action]) WHITELISTED_GIT_LFS_ROUTES[route_hash[:controller]]&.include?(route_hash[:action])
end end
def logout_route?
# Calling route_hash may be expensive. Only do it if we think there's a possible match
return false unless request.post? && request.path.end_with?('/users/sign_out')
WHITELISTED_LOGOUT_ROUTES[route_hash[:controller]]&.include?(route_hash[:action])
end
def sidekiq_route? def sidekiq_route?
request.path.start_with?("#{relative_url}/admin/sidekiq") request.path.start_with?("#{relative_url}/admin/sidekiq")
end end
... ...
......
...@@ -6295,15 +6295,9 @@ msgstr "" ...@@ -6295,15 +6295,9 @@ msgstr ""
msgid "Deselect all" msgid "Deselect all"
msgstr "" msgstr ""
msgid "Design Management"
msgstr ""
msgid "Design Management files and data" msgid "Design Management files and data"
msgstr "" msgstr ""
msgid "Design Sync Not Enabled"
msgstr ""
msgid "DesignManagement|%{current_design} of %{designs_count}" msgid "DesignManagement|%{current_design} of %{designs_count}"
msgstr "" msgstr ""
...@@ -8065,6 +8059,11 @@ msgstr "" ...@@ -8065,6 +8059,11 @@ msgstr ""
msgid "Fetching licenses failed. You are not permitted to perform this action." msgid "Fetching licenses failed. You are not permitted to perform this action."
msgstr "" msgstr ""
msgid "File"
msgid_plural "Files"
msgstr[0] ""
msgstr[1] ""
msgid "File Hooks" msgid "File Hooks"
msgstr "" msgstr ""
...@@ -8407,9 +8406,6 @@ msgstr "" ...@@ -8407,9 +8406,6 @@ msgstr ""
msgid "Geo Settings" msgid "Geo Settings"
msgstr "" msgstr ""
msgid "Geo Troubleshooting"
msgstr ""
msgid "Geo allows you to replicate your GitLab instance to other geographical locations." msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
msgstr "" msgstr ""
...@@ -9879,9 +9875,6 @@ msgstr "" ...@@ -9879,9 +9875,6 @@ msgstr ""
msgid "If you believe this may be an error, please refer to the %{linkStart}Geo Troubleshooting%{linkEnd} documentation for more information." msgid "If you believe this may be an error, please refer to the %{linkStart}Geo Troubleshooting%{linkEnd} documentation for more information."
msgstr "" msgstr ""
msgid "If you believe this page to be an error, check out the links below for more information."
msgstr ""
msgid "If you lose your recovery codes you can generate new ones, invalidating all previous codes." msgid "If you lose your recovery codes you can generate new ones, invalidating all previous codes."
msgstr "" msgstr ""
...@@ -11639,10 +11632,10 @@ msgstr "" ...@@ -11639,10 +11632,10 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again." msgid "MergeRequest|Error loading full diff. Please try again."
msgstr "" msgstr ""
msgid "MergeRequest|No files found" msgid "MergeRequest|Filter files or search with %{modifier_key}+p"
msgstr "" msgstr ""
msgid "MergeRequest|Search files (%{modifier_key}P)" msgid "MergeRequest|No files found"
msgstr "" msgstr ""
msgid "Merged" msgid "Merged"
...@@ -21719,9 +21712,6 @@ msgstr "" ...@@ -21719,9 +21712,6 @@ msgstr ""
msgid "among other things" msgid "among other things"
msgstr "" msgstr ""
msgid "and"
msgstr ""
msgid "archived" msgid "archived"
msgstr "" msgstr ""
...@@ -22149,11 +22139,6 @@ msgstr "" ...@@ -22149,11 +22139,6 @@ msgstr ""
msgid "failed to dismiss associated finding(id=%{finding_id}): %{message}" msgid "failed to dismiss associated finding(id=%{finding_id}): %{message}"
msgstr "" msgstr ""
msgid "file"
msgid_plural "files"
msgstr[0] ""
msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability" msgid "finding is not found or is already attached to a vulnerability"
msgstr "" msgstr ""
...@@ -22738,6 +22723,9 @@ msgstr[1] "" ...@@ -22738,6 +22723,9 @@ msgstr[1] ""
msgid "reset it." msgid "reset it."
msgstr "" msgstr ""
msgid "resolved the corresponding error and closed the issue."
msgstr ""
msgid "score" msgid "score"
msgstr "" msgstr ""
... ...
......
...@@ -301,7 +301,7 @@ describe Projects::ErrorTrackingController do ...@@ -301,7 +301,7 @@ describe Projects::ErrorTrackingController do
context 'update result is successful' do context 'update result is successful' do
before do before do
expect(issue_update_service).to receive(:execute) expect(issue_update_service).to receive(:execute)
.and_return(status: :success, updated: true) .and_return(status: :success, updated: true, closed_issue_iid: 1234)
update_issue update_issue
end end
... ...
......
...@@ -50,7 +50,7 @@ describe 'Merge request > User sees versions', :js do ...@@ -50,7 +50,7 @@ describe 'Merge request > User sees versions', :js do
expect(page).to have_content 'latest version' expect(page).to have_content 'latest version'
end end
expect(page).to have_content '8 files' expect(page).to have_content '8 Files'
end end
it_behaves_like 'allows commenting', it_behaves_like 'allows commenting',
...@@ -84,7 +84,7 @@ describe 'Merge request > User sees versions', :js do ...@@ -84,7 +84,7 @@ describe 'Merge request > User sees versions', :js do
end end
it 'shows comments that were last relevant at that version' do it 'shows comments that were last relevant at that version' do
expect(page).to have_content '5 files' expect(page).to have_content '5 Files'
position = Gitlab::Diff::Position.new( position = Gitlab::Diff::Position.new(
old_path: ".gitmodules", old_path: ".gitmodules",
...@@ -128,10 +128,12 @@ describe 'Merge request > User sees versions', :js do ...@@ -128,10 +128,12 @@ describe 'Merge request > User sees versions', :js do
diff_id: merge_request_diff3.id, diff_id: merge_request_diff3.id,
start_sha: '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9' start_sha: '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9'
) )
expect(page).to have_content '4 files' expect(page).to have_content '4 Files'
additions_content = page.find('.diff-stats.is-compare-versions-header .diff-stats-group .js-file-addition-line').text additions_content = page.find('.diff-stats.is-compare-versions-header .diff-stats-group svg.ic-file-addition')
deletions_content = page.find('.diff-stats.is-compare-versions-header .diff-stats-group .js-file-deletion-line').text .ancestor('.diff-stats-group').text
deletions_content = page.find('.diff-stats.is-compare-versions-header .diff-stats-group svg.ic-file-deletion')
.ancestor('.diff-stats-group').text
expect(additions_content).to eq '15' expect(additions_content).to eq '15'
expect(deletions_content).to eq '6' expect(deletions_content).to eq '6'
...@@ -154,10 +156,12 @@ describe 'Merge request > User sees versions', :js do ...@@ -154,10 +156,12 @@ describe 'Merge request > User sees versions', :js do
end end
it 'show diff between new and old version' do it 'show diff between new and old version' do
additions_content = page.find('.diff-stats.is-compare-versions-header .diff-stats-group .js-file-addition-line').text additions_content = page.find('.diff-stats.is-compare-versions-header .diff-stats-group svg.ic-file-addition')
deletions_content = page.find('.diff-stats.is-compare-versions-header .diff-stats-group .js-file-deletion-line').text .ancestor('.diff-stats-group').text
deletions_content = page.find('.diff-stats.is-compare-versions-header .diff-stats-group svg.ic-file-deletion')
.ancestor('.diff-stats-group').text
expect(page).to have_content '4 files' expect(page).to have_content '4 Files'
expect(additions_content).to eq '15' expect(additions_content).to eq '15'
expect(deletions_content).to eq '6' expect(deletions_content).to eq '6'
end end
...@@ -167,7 +171,7 @@ describe 'Merge request > User sees versions', :js do ...@@ -167,7 +171,7 @@ describe 'Merge request > User sees versions', :js do
page.within '.mr-version-dropdown' do page.within '.mr-version-dropdown' do
expect(page).to have_content 'latest version' expect(page).to have_content 'latest version'
end end
expect(page).to have_content '8 files' expect(page).to have_content '8 Files'
end end
it_behaves_like 'allows commenting', it_behaves_like 'allows commenting',
...@@ -193,7 +197,7 @@ describe 'Merge request > User sees versions', :js do ...@@ -193,7 +197,7 @@ describe 'Merge request > User sees versions', :js do
find('.btn-default').click find('.btn-default').click
click_link 'version 1' click_link 'version 1'
end end
expect(page).to have_content '0 files' expect(page).to have_content '0 Files'
end end
end end
...@@ -219,7 +223,7 @@ describe 'Merge request > User sees versions', :js do ...@@ -219,7 +223,7 @@ describe 'Merge request > User sees versions', :js do
expect(page).to have_content 'version 1' expect(page).to have_content 'version 1'
end end
expect(page).to have_content '0 files' expect(page).to have_content '0 Files'
end end
end end
... ...
......
...@@ -21,4 +21,16 @@ describe 'Logout/Sign out', :js do ...@@ -21,4 +21,16 @@ describe 'Logout/Sign out', :js do
expect(page).not_to have_selector('.flash-notice') expect(page).not_to have_selector('.flash-notice')
end end
context 'on a read-only instance' do
before do
allow(Gitlab::Database).to receive(:read_only?).and_return(true)
end
it 'sign out redirects to sign in page' do
gitlab_sign_out
expect(current_path).to eq new_user_session_path
end
end
end end
...@@ -6,9 +6,15 @@ ...@@ -6,9 +6,15 @@
"properties" : { "properties" : {
"result": { "result": {
"type": "object", "type": "object",
"required" : [
"status",
"updated",
"closed_issue_iid"
],
"properties": { "properties": {
"status": { "type": "string" }, "status": { "type": "string" },
"updated": { "type": "boolean" } "updated": { "type": "boolean" },
"closed_issue_iid": { "type": ["integer", "null"] }
} }
} }
}, },
... ...
......
...@@ -49,7 +49,8 @@ describe('CompareVersions', () => { ...@@ -49,7 +49,8 @@ describe('CompareVersions', () => {
expect(treeListBtn.exists()).toBe(true); expect(treeListBtn.exists()).toBe(true);
expect(treeListBtn.attributes('title')).toBe('Hide file browser'); expect(treeListBtn.attributes('title')).toBe('Hide file browser');
expect(treeListBtn.find(Icon).props('name')).toBe('file-tree'); expect(treeListBtn.findAll(Icon).length).not.toBe(0);
expect(treeListBtn.find(Icon).props('name')).toBe('collapse-left');
}); });
it('should render comparison dropdowns with correct values', () => { it('should render comparison dropdowns with correct values', () => {
... ...
......