diff --git a/.gitlab/ci/rails.gitlab-ci.yml b/.gitlab/ci/rails.gitlab-ci.yml
index 4f6180e2aa3..dce5b72344d 100644
--- a/.gitlab/ci/rails.gitlab-ci.yml
+++ b/.gitlab/ci/rails.gitlab-ci.yml
@@ -519,10 +519,26 @@ rspec:coverage:
paths:
- coverage/index.html
- coverage/assets/
+ - coverage/lcov/
- tmp/memory_test/
reports:
cobertura: coverage/coverage.xml
+rspec:undercoverage:
+ extends:
+ - .coverage-base
+ - .rails:rules:rspec-undercoverage
+ stage: post-test
+ needs: ["rspec:coverage"]
+ script:
+ - if [ -n "$CI_MERGE_REQUEST_SOURCE_BRANCH_SHA" ]; then
+ echo "Checking out \$CI_MERGE_REQUEST_SOURCE_BRANCH_SHA ($CI_MERGE_REQUEST_SOURCE_BRANCH_SHA) instead of \$CI_COMMIT_SHA (merge result commit $CI_COMMIT_SHA) so we can use $CI_MERGE_REQUEST_DIFF_BASE_SHA for undercoverage in this merged result pipeline";
+ git checkout -f ${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA};
+ else
+ echo "Using \$CI_COMMIT_SHA ($CI_COMMIT_SHA) for this non-merge result pipeline.";
+ fi;
+ - run_timed_command "scripts/undercoverage"
+
rspec:feature-flags:
extends:
- .coverage-base
diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml
index aaa486fce68..c9854fad2b6 100644
--- a/.gitlab/ci/rules.gitlab-ci.yml
+++ b/.gitlab/ci/rules.gitlab-ci.yml
@@ -67,6 +67,9 @@
.if-merge-request-labels-run-review-app: &if-merge-request-labels-run-review-app
if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-review-app/'
+.if-merge-request-labels-skip-undercoverage: &if-merge-request-labels-skip-undercoverage
+ if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:skip-undercoverage/'
+
.if-security-merge-request: &if-security-merge-request
if: '$CI_PROJECT_NAMESPACE == "gitlab-org/security" && $CI_MERGE_REQUEST_IID'
@@ -1359,6 +1362,17 @@
- <<: *if-merge-request-labels-run-all-rspec
when: always
+.rails:rules:rspec-undercoverage:
+ rules:
+ - <<: *if-not-ee
+ when: never
+ - <<: *if-merge-request-labels-skip-undercoverage
+ allow_failure: true
+ - <<: *if-merge-request-labels-run-all-rspec
+ - <<: *if-merge-request-approved
+ - <<: *if-merge-request
+ changes: *backend-patterns
+
.rails:rules:default-branch-schedule-nightly--code-backstage:
rules:
- <<: *if-default-branch-schedule-nightly
diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION
index 8e2779fa0a1..8dbc2c2803b 100644
--- a/GITALY_SERVER_VERSION
+++ b/GITALY_SERVER_VERSION
@@ -1 +1 @@
-4dd8bfe1307ffcc5a2a3f4eb70da7977a7c1d915
+a191a5d10f0772ae2ed6ec869001ddde6d277827
diff --git a/Gemfile b/Gemfile
index 4a6ad99a76a..1d379042099 100644
--- a/Gemfile
+++ b/Gemfile
@@ -405,7 +405,9 @@ end
group :development, :test, :coverage do
gem 'simplecov', '~> 0.18.5', require: false
+ gem 'simplecov-lcov', '~> 0.8.0', require: false
gem 'simplecov-cobertura', '~> 1.3.1', require: false
+ gem 'undercover', '~> 0.4.4', require: false
end
# Gems required in omnibus-gitlab pipeline
diff --git a/Gemfile.lock b/Gemfile.lock
index f508dab2d8e..8a1a1a65757 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -645,6 +645,8 @@ GEM
concurrent-ruby (~> 1.0)
i18n_data (0.8.0)
icalendar (2.4.1)
+ imagen (0.1.8)
+ parser (>= 2.5, != 2.5.1.1)
invisible_captcha (1.1.0)
rails (>= 4.2)
ipaddress (0.8.3)
@@ -1197,6 +1199,7 @@ GEM
simplecov-cobertura (1.3.1)
simplecov (~> 0.8)
simplecov-html (0.12.3)
+ simplecov-lcov (0.8.0)
sixarm_ruby_unaccent (1.2.0)
slack-messenger (2.3.4)
snowplow-tracker (0.6.1)
@@ -1312,6 +1315,10 @@ GEM
concurrent-ruby (~> 1.0)
u2f (0.2.1)
uber (0.1.0)
+ undercover (0.4.4)
+ imagen (>= 0.1.8)
+ rainbow (>= 2.1, < 4.0)
+ rugged (>= 0.27, < 1.3)
unf (0.1.4)
unf_ext
unf_ext (0.0.7.7)
@@ -1626,6 +1633,7 @@ DEPENDENCIES
simple_po_parser (~> 1.1.2)
simplecov (~> 0.18.5)
simplecov-cobertura (~> 1.3.1)
+ simplecov-lcov (~> 0.8.0)
slack-messenger (~> 2.3.4)
snowplow-tracker (~> 0.6.1)
solargraph (~> 0.43)
@@ -1648,6 +1656,7 @@ DEPENDENCIES
toml-rb (~> 2.0)
truncato (~> 0.7.11)
u2f (~> 0.2.1)
+ undercover (~> 0.4.4)
unf (~> 0.1.4)
unleash (~> 3.2.2)
valid_email (~> 0.1)
diff --git a/app/assets/javascripts/content_editor/extensions/footnote_definition.js b/app/assets/javascripts/content_editor/extensions/footnote_definition.js
new file mode 100644
index 00000000000..dbab0de3421
--- /dev/null
+++ b/app/assets/javascripts/content_editor/extensions/footnote_definition.js
@@ -0,0 +1,21 @@
+import { mergeAttributes, Node } from '@tiptap/core';
+import { PARSE_HTML_PRIORITY_HIGHEST } from '../constants';
+
+export default Node.create({
+ name: 'footnoteDefinition',
+
+ content: 'paragraph',
+
+ group: 'block',
+
+ parseHTML() {
+ return [
+ { tag: 'section.footnotes li' },
+ { tag: '.footnote-backref', priority: PARSE_HTML_PRIORITY_HIGHEST, ignore: true },
+ ];
+ },
+
+ renderHTML({ HTMLAttributes }) {
+ return ['li', mergeAttributes(HTMLAttributes), 0];
+ },
+});
diff --git a/app/assets/javascripts/content_editor/extensions/footnote_reference.js b/app/assets/javascripts/content_editor/extensions/footnote_reference.js
new file mode 100644
index 00000000000..1ac8016f774
--- /dev/null
+++ b/app/assets/javascripts/content_editor/extensions/footnote_reference.js
@@ -0,0 +1,37 @@
+import { Node, mergeAttributes } from '@tiptap/core';
+import { PARSE_HTML_PRIORITY_HIGHEST } from '../constants';
+
+export default Node.create({
+ name: 'footnoteReference',
+
+ inline: true,
+
+ group: 'inline',
+
+ atom: true,
+
+ draggable: true,
+
+ selectable: true,
+
+ addAttributes() {
+ return {
+ footnoteId: {
+ default: null,
+ parseHTML: (element) => element.querySelector('a').getAttribute('id'),
+ },
+ footnoteNumber: {
+ default: null,
+ parseHTML: (element) => element.textContent,
+ },
+ };
+ },
+
+ parseHTML() {
+ return [{ tag: 'sup.footnote-ref', priority: PARSE_HTML_PRIORITY_HIGHEST }];
+ },
+
+ renderHTML({ HTMLAttributes: { footnoteNumber, footnoteId, ...HTMLAttributes } }) {
+ return ['sup', mergeAttributes(HTMLAttributes), footnoteNumber];
+ },
+});
diff --git a/app/assets/javascripts/content_editor/extensions/footnotes_section.js b/app/assets/javascripts/content_editor/extensions/footnotes_section.js
new file mode 100644
index 00000000000..914a8934734
--- /dev/null
+++ b/app/assets/javascripts/content_editor/extensions/footnotes_section.js
@@ -0,0 +1,19 @@
+import { mergeAttributes, Node } from '@tiptap/core';
+
+export default Node.create({
+ name: 'footnotesSection',
+
+ content: 'footnoteDefinition+',
+
+ group: 'block',
+
+ isolating: true,
+
+ parseHTML() {
+ return [{ tag: 'section.footnotes > ol' }];
+ },
+
+ renderHTML({ HTMLAttributes }) {
+ return ['ol', mergeAttributes(HTMLAttributes, { class: 'footnotes gl-font-sm' }), 0];
+ },
+});
diff --git a/app/assets/javascripts/content_editor/services/create_content_editor.js b/app/assets/javascripts/content_editor/services/create_content_editor.js
index 385f1c63801..f451357e211 100644
--- a/app/assets/javascripts/content_editor/services/create_content_editor.js
+++ b/app/assets/javascripts/content_editor/services/create_content_editor.js
@@ -19,6 +19,9 @@ import Dropcursor from '../extensions/dropcursor';
import Emoji from '../extensions/emoji';
import Figure from '../extensions/figure';
import FigureCaption from '../extensions/figure_caption';
+import FootnoteDefinition from '../extensions/footnote_definition';
+import FootnoteReference from '../extensions/footnote_reference';
+import FootnotesSection from '../extensions/footnotes_section';
import Frontmatter from '../extensions/frontmatter';
import Gapcursor from '../extensions/gapcursor';
import HardBreak from '../extensions/hard_break';
@@ -94,6 +97,9 @@ export const createContentEditor = ({
Emoji,
Figure,
FigureCaption,
+ FootnoteDefinition,
+ FootnoteReference,
+ FootnotesSection,
Frontmatter,
Gapcursor,
HardBreak,
diff --git a/app/assets/javascripts/content_editor/services/markdown_serializer.js b/app/assets/javascripts/content_editor/services/markdown_serializer.js
index 0dd3cb5b73f..38b0438fa3a 100644
--- a/app/assets/javascripts/content_editor/services/markdown_serializer.js
+++ b/app/assets/javascripts/content_editor/services/markdown_serializer.js
@@ -17,6 +17,9 @@ import Division from '../extensions/division';
import Emoji from '../extensions/emoji';
import Figure from '../extensions/figure';
import FigureCaption from '../extensions/figure_caption';
+import FootnotesSection from '../extensions/footnotes_section';
+import FootnoteDefinition from '../extensions/footnote_definition';
+import FootnoteReference from '../extensions/footnote_reference';
import Frontmatter from '../extensions/frontmatter';
import HardBreak from '../extensions/hard_break';
import Heading from '../extensions/heading';
@@ -156,6 +159,15 @@ const defaultSerializerConfig = {
state.write(`:${name}:`);
},
+ [FootnoteDefinition.name]: (state, node) => {
+ state.renderInline(node);
+ },
+ [FootnoteReference.name]: (state, node) => {
+ state.write(`[^${node.attrs.footnoteNumber}]`);
+ },
+ [FootnotesSection.name]: (state, node) => {
+ state.renderList(node, '', (index) => `[^${index + 1}]: `);
+ },
[Frontmatter.name]: (state, node) => {
const { language } = node.attrs;
const syntax = {
diff --git a/app/assets/javascripts/ide/components/activity_bar.vue b/app/assets/javascripts/ide/components/activity_bar.vue
index c71d911adfb..846b4d92724 100644
--- a/app/assets/javascripts/ide/components/activity_bar.vue
+++ b/app/assets/javascripts/ide/components/activity_bar.vue
@@ -63,7 +63,7 @@ export default {
class="ide-sidebar-link js-ide-review-mode"
@click.prevent="changedActivityView($event, $options.leftSidebarViews.review.name)"
>
-
+
diff --git a/app/assets/javascripts/vue_shared/components/form/input_copy_toggle_visibility.stories.js b/app/assets/javascripts/vue_shared/components/form/input_copy_toggle_visibility.stories.js
new file mode 100644
index 00000000000..cdd7a074f34
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/form/input_copy_toggle_visibility.stories.js
@@ -0,0 +1,27 @@
+import InputCopyToggleVisibility from './input_copy_toggle_visibility.vue';
+
+export default {
+ component: InputCopyToggleVisibility,
+ title: 'vue_shared/components/form/input_copy_toggle_visibility',
+};
+
+const defaultProps = {
+ value: 'hR8x1fuJbzwu5uFKLf9e',
+ formInputGroupProps: { class: 'gl-form-input-xl' },
+};
+
+const Template = (args, { argTypes }) => ({
+ components: { InputCopyToggleVisibility },
+ props: Object.keys(argTypes),
+ template: ``,
+});
+
+export const Default = Template.bind({});
+Default.args = defaultProps;
diff --git a/app/assets/javascripts/vue_shared/components/form/input_copy_toggle_visibility.vue b/app/assets/javascripts/vue_shared/components/form/input_copy_toggle_visibility.vue
new file mode 100644
index 00000000000..36e3b46a43c
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/form/input_copy_toggle_visibility.vue
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb
index 277e0ccbf23..e0126373864 100644
--- a/app/models/ci/build.rb
+++ b/app/models/ci/build.rb
@@ -1084,16 +1084,6 @@ module Ci
runner&.instance_type?
end
- def job_variables_attributes
- strong_memoize(:job_variables_attributes) do
- job_variables.map do |variable|
- variable.attributes.except('id', 'job_id', 'encrypted_value', 'encrypted_value_iv').tap do |attrs|
- attrs[:value] = variable.value
- end
- end
- end
- end
-
protected
def run_status_commit_hooks!
diff --git a/app/services/ci/retry_build_service.rb b/app/services/ci/retry_build_service.rb
index 4b592bbbb40..ebb07de9d29 100644
--- a/app/services/ci/retry_build_service.rb
+++ b/app/services/ci/retry_build_service.rb
@@ -7,7 +7,7 @@ module Ci
allow_failure stage stage_id stage_idx trigger_request
yaml_variables when environment coverage_regex
description tag_list protected needs_attributes
- resource_group scheduling_type job_variables_attributes].freeze
+ resource_group scheduling_type].freeze
end
def self.extra_accessors
diff --git a/config/feature_flags/development/drop_detached_partitions.yml b/config/feature_flags/development/drop_detached_partitions.yml
deleted file mode 100644
index b49cf78d28c..00000000000
--- a/config/feature_flags/development/drop_detached_partitions.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: drop_detached_partitions
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67056
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/337155
-milestone: '14.2'
-type: development
-group: group::database
-default_enabled: false
diff --git a/config/feature_flags/development/partition_pruning.yml b/config/feature_flags/development/partition_pruning.yml
deleted file mode 100644
index 02f5dc968a4..00000000000
--- a/config/feature_flags/development/partition_pruning.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: partition_pruning
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67056
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/337153
-milestone: '14.2'
-type: development
-group: group::database
-default_enabled: false
diff --git a/doc/.vale/gitlab/ElementDescriptors.yml b/doc/.vale/gitlab/ElementDescriptors.yml
index 254da16d00c..36f1202aef1 100644
--- a/doc/.vale/gitlab/ElementDescriptors.yml
+++ b/doc/.vale/gitlab/ElementDescriptors.yml
@@ -10,5 +10,4 @@ link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html
level: suggestion
ignorecase: true
swap:
- button: 'if possible, rewrite to not use'
- area: 'use "section" instead of'
+ button: 'if possible, rewrite to remove'
diff --git a/doc/api/job_artifacts.md b/doc/api/job_artifacts.md
index 6d8c256d5aa..7c7847bf368 100644
--- a/doc/api/job_artifacts.md
+++ b/doc/api/job_artifacts.md
@@ -252,6 +252,7 @@ Example response:
"finished_at": "2016-01-11T10:15:10.506Z",
"duration": 97.0,
"status": "failed",
+ "failure_reason": "script_failure",
"tag": false,
"web_url": "https://example.com/foo/bar/-/jobs/42",
"user": null
diff --git a/doc/api/jobs.md b/doc/api/jobs.md
index 2a07e2d92c5..f3971fb5732 100644
--- a/doc/api/jobs.md
+++ b/doc/api/jobs.md
@@ -71,6 +71,7 @@ Example of response
"runner": null,
"stage": "test",
"status": "failed",
+ "failure_reason": "script_failure",
"tag": false,
"web_url": "https://example.com/foo/bar/-/jobs/7",
"user": {
@@ -126,6 +127,7 @@ Example of response
"runner": null,
"stage": "test",
"status": "failed",
+ "failure_reason": "stuck_or_timeout_failure",
"tag": false,
"web_url": "https://example.com/foo/bar/-/jobs/6",
"user": {
@@ -207,6 +209,7 @@ Example of response
"runner": null,
"stage": "test",
"status": "failed",
+ "failure_reason": "stuck_or_timeout_failure",
"tag": false,
"web_url": "https://example.com/foo/bar/-/jobs/6",
"user": {
@@ -271,6 +274,7 @@ Example of response
"runner": null,
"stage": "test",
"status": "failed",
+ "failure_reason": "script_failure",
"tag": false,
"web_url": "https://example.com/foo/bar/-/jobs/7",
"user": {
@@ -443,6 +447,7 @@ Example of response
"runner": null,
"stage": "test",
"status": "failed",
+ "failure_reason": "script_failure",
"tag": false,
"web_url": "https://example.com/foo/bar/-/jobs/8",
"user": {
diff --git a/doc/api/status_checks.md b/doc/api/status_checks.md
index 0c72ee37348..c0dba71bdc5 100644
--- a/doc/api/status_checks.md
+++ b/doc/api/status_checks.md
@@ -145,6 +145,6 @@ PUT /projects/:id/external_status_checks/:check_id
| `external_url` | string | no | URL of external status check resource |
| `protected_branch_ids` | `array` | no | IDs of protected branches to scope the rule by |
-## Related links
+## Related topics
- [External status checks](../user/project/merge_requests/status_checks.md).
diff --git a/doc/api/v3_to_v4.md b/doc/api/v3_to_v4.md
index 3fba95c1fb3..da269073905 100644
--- a/doc/api/v3_to_v4.md
+++ b/doc/api/v3_to_v4.md
@@ -11,7 +11,7 @@ The GitLab API v3 was [removed](https://gitlab.com/gitlab-org/gitlab-foss/-/issu
For information about the current version of the GitLab API, read the [API documentation](index.md).
-## Related links
+## Related topics
- [GitLab v3 API documentation](https://gitlab.com/gitlab-org/gitlab-foss/-/blob/8-16-stable/doc/api/index.md)
- [Migration guide](https://gitlab.com/gitlab-org/gitlab-foss/-/blob/11-0-stable/doc/api/v3_to_v4.md) from
diff --git a/doc/ci/yaml/index.md b/doc/ci/yaml/index.md
index 83b627e08f7..704ae1b6ef4 100644
--- a/doc/ci/yaml/index.md
+++ b/doc/ci/yaml/index.md
@@ -199,8 +199,10 @@ use `include:file`. You can use `include:file` in combination with `include:proj
**Keyword type**: Global keyword.
-**Possible inputs**: A full path, relative to the root directory (`/`).
-The YAML file must have the extension `.yml` or `.yaml`.
+**Possible inputs**:
+
+- A full path, relative to the root directory (`/`). The YAML file must have the
+ extension `.yml` or `.yaml`.
**Example of `include:file`**:
@@ -255,10 +257,10 @@ Use `include:remote` with a full URL to include a file from a different location
**Keyword type**: Global keyword.
-**Possible inputs**: A public URL accessible by an HTTP/HTTPS `GET` request.
-Authentication with the remote URL is not supported.
+**Possible inputs**:
-The YAML file must have the extension `.yml` or `.yaml`.
+- A public URL accessible by an HTTP/HTTPS `GET` request. Authentication with the
+ remote URL is not supported. The YAML file must have the extension `.yml` or `.yaml`.
**Example of `include:remote`**:
@@ -281,7 +283,9 @@ Use `include:template` to include [`.gitlab-ci.yml` templates](https://gitlab.co
**Keyword type**: Global keyword.
-**Possible inputs**: [`.gitlab-ci.yml` templates](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates).
+**Possible inputs**:
+
+- [`.gitlab-ci.yml` templates](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates).
**Example of `include:template`**:
@@ -556,7 +560,9 @@ The default value for `allow_failure` is:
**Keyword type**: Job keyword. You can use it only as part of a job.
-**Possible inputs**: `true` or `false`.
+**Possible inputs**:
+
+- `true` or `false`.
**Example of `allow_failure`**:
@@ -894,7 +900,9 @@ included templates in jobs.
**Keyword type**: Job keyword. You can use it only as part of a job or in the
[`default` section](#default).
-**Possible inputs**: See list of available [artifacts reports types](artifacts_reports.md).
+**Possible inputs**:
+
+- See list of available [artifacts reports types](artifacts_reports.md).
**Example of `artifacts:reports`**:
@@ -1024,14 +1032,15 @@ Use the `cache:paths` keyword to choose which files or directories to cache.
**Keyword type**: Job keyword. You can use it only as part of a job or in the
[`default` section](#default).
-**Possible inputs**: An array of paths relative to the project directory (`$CI_PROJECT_DIR`).
-You can use wildcards that use [glob](https://en.wikipedia.org/wiki/Glob_(programming))
-patterns:
+**Possible inputs**:
-- In [GitLab Runner 13.0 and later](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/2620),
-[`doublestar.Glob`](https://pkg.go.dev/github.com/bmatcuk/doublestar@v1.2.2?tab=doc#Match).
-- In GitLab Runner 12.10 and earlier,
-[`filepath.Match`](https://pkg.go.dev/path/filepath#Match).
+- An array of paths relative to the project directory (`$CI_PROJECT_DIR`).
+ You can use wildcards that use [glob](https://en.wikipedia.org/wiki/Glob_(programming))
+ patterns:
+ - In [GitLab Runner 13.0 and later](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/2620),
+ [`doublestar.Glob`](https://pkg.go.dev/github.com/bmatcuk/doublestar@v1.2.2?tab=doc#Match).
+ - In GitLab Runner 12.10 and earlier,
+ [`filepath.Match`](https://pkg.go.dev/path/filepath#Match).
**Example of `cache:paths`**:
@@ -1114,7 +1123,9 @@ which speeds up subsequent pipeline runs.
**Keyword type**: Job keyword. You can use it only as part of a job or in the
[`default` section](#default).
-**Possible inputs**: An array of one or two file paths.
+**Possible inputs**:
+
+- An array of one or two file paths.
**Example of `cache:key:files`**:
@@ -1190,7 +1201,9 @@ Use `untracked: true` to cache all files that are untracked in your Git reposito
**Keyword type**: Job keyword. You can use it only as part of a job or in the
[`default` section](#default).
-**Possible inputs**: `true` or `false` (default).
+**Possible inputs**:
+
+- `true` or `false` (default).
**Example of `cache:untracked`**:
@@ -1303,7 +1316,9 @@ line in the job output matches the regular expression.
To extract the code coverage value in the matching line, GitLab uses this
regular expression: `\d+(\.\d+)?`.
-**Possible inputs**: A regular expression. Must start and end with `/`.
+**Possible inputs**:
+
+- A regular expression. Must start and end with `/`.
**Example of `coverage`**:
@@ -1811,7 +1826,9 @@ where each shell token is a separate string in the array.
**Keyword type**: Job keyword. You can use it only as part of a job or in the
[`default` section](#default).
-**Possible inputs**: A string.
+**Possible inputs**:
+
+- A string.
**Example of `image:entrypoint`**:
@@ -1918,7 +1935,9 @@ You can't cancel subsequent jobs after a job with `interruptible: false` starts.
**Keyword type**: Job keyword. You can use it only as part of a job or in the
[`default` section](#default).
-**Possible inputs**: `true` or `false` (default).
+**Possible inputs**:
+
+- `true` or `false` (default).
**Example of `interruptible`**:
@@ -2411,7 +2430,9 @@ to a pipeline, based on the status of [CI/CD variables](../variables/index.md).
**Keyword type**: Job keyword. You can use it only as part of a job.
-**Possible inputs**: An array of [CI/CD variable expressions](../jobs/job_control.md#cicd-variable-expressions).
+**Possible inputs**:
+
+- An array of [CI/CD variable expressions](../jobs/job_control.md#cicd-variable-expressions).
**Example of `only:variables`**:
@@ -2490,7 +2511,9 @@ when the Kubernetes service is active in the project.
**Keyword type**: Job-specific. You can use it only as part of a job.
-**Possible inputs**: The `kubernetes` strategy accepts only the `active` keyword.
+**Possible inputs**:
+
+- The `kubernetes` strategy accepts only the `active` keyword.
**Example of `only:kubernetes`**:
@@ -2546,7 +2569,9 @@ Parallel jobs are named sequentially from `job_name 1/N` to `job_name N/N`.
**Keyword type**: Job keyword. You can use it only as part of a job.
-**Possible inputs**: A numeric value from `2` to `50`.
+**Possible inputs**:
+
+- A numeric value from `2` to `50`.
**Example of `parallel`**:
@@ -2579,7 +2604,9 @@ Multiple runners must exist, or a single runner must be configured to run multip
**Keyword type**: Job keyword. You can use it only as part of a job.
-**Possible inputs**: A numeric value from `2` to `50`.
+**Possible inputs**:
+
+- A numeric value from `2` to `50`.
**Example of `parallel:matrix`**:
@@ -2699,7 +2726,9 @@ New tags use the SHA associated with the pipeline.
**Keyword type**: Job keyword. You can use it only as part of a job.
-**Possible inputs**: A tag name. Can use [CI/CD variables](../variables/index.md).
+**Possible inputs**:
+
+- A tag name. Can use [CI/CD variables](../variables/index.md).
**Example of `release:tag_name`**:
@@ -2738,7 +2767,9 @@ The release name. If omitted, it is populated with the value of `release: tag_na
**Keyword type**: Job keyword. You can use it only as part of a job.
-**Possible inputs**: A text string.
+**Possible inputs**:
+
+- A text string.
**Example of `release:name`**:
@@ -2843,8 +2874,10 @@ can be deployed to, but only one deployment can occur per device at any given ti
**Keyword type**: Job keyword. You can use it only as part of a job.
-**Possible inputs**: Only letters, digits, `-`, `_`, `/`, `$`, `{`, `}`, `.`, and spaces.
-It can't start or end with `/`.
+**Possible inputs**:
+
+- Only letters, digits, `-`, `_`, `/`, `$`, `{`, `}`, `.`, and spaces.
+ It can't start or end with `/`.
**Example of `resource_group`**:
@@ -2875,7 +2908,9 @@ to select which failures to retry on.
**Keyword type**: Job keyword. You can use it only as part of a job or in the
[`default` section](#default).
-**Possible inputs**: `0` (default), `1`, or `2`.
+**Possible inputs**:
+
+- `0` (default), `1`, or `2`.
**Example of `retry`**:
@@ -2894,7 +2929,9 @@ Use `retry:when` with `retry:max` to retry jobs for only specific failure cases.
**Keyword type**: Job keyword. You can use it only as part of a job or in the
[`default` section](#default).
-**Possible inputs**: A single failure type, or an array of one or more failure types:
+**Possible inputs**:
+
+- A single failure type, or an array of one or more failure types: