+
{{ $options.i18n.labelText }}
-
+
{{ content }}
-
+
diff --git a/app/assets/javascripts/pipelines/components/graph/utils.js b/app/assets/javascripts/pipelines/components/graph/utils.js
index d36f18f0903..373aa6bf9a1 100644
--- a/app/assets/javascripts/pipelines/components/graph/utils.js
+++ b/app/assets/javascripts/pipelines/components/graph/utils.js
@@ -1,6 +1,6 @@
import Visibility from 'visibilityjs';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import { unwrapStagesWithNeeds } from '../unwrapping_utils';
+import { unwrapStagesWithNeedsAndLookup } from '../unwrapping_utils';
const addMulti = (mainPipelineProjectPath, linkedPipeline) => {
return {
@@ -86,12 +86,13 @@ const unwrapPipelineData = (mainPipelineProjectPath, data) => {
stages: { nodes: stages },
} = pipeline;
- const nodes = unwrapStagesWithNeeds(stages);
+ const { stages: updatedStages, lookup } = unwrapStagesWithNeedsAndLookup(stages);
return {
...pipeline,
id: getIdFromGraphQLId(pipeline.id),
- stages: nodes,
+ stages: updatedStages,
+ stagesLookup: lookup,
upstream: upstream
? [upstream].map(addMulti.bind(null, mainPipelineProjectPath)).map(transformId)
: [],
diff --git a/app/assets/javascripts/pipelines/components/graph_shared/links_inner.vue b/app/assets/javascripts/pipelines/components/graph_shared/links_inner.vue
index 382127285ba..0ed5b8a5f09 100644
--- a/app/assets/javascripts/pipelines/components/graph_shared/links_inner.vue
+++ b/app/assets/javascripts/pipelines/components/graph_shared/links_inner.vue
@@ -11,6 +11,7 @@ import {
import { performanceMarkAndMeasure } from '~/performance/utils';
import { DRAW_FAILURE } from '../../constants';
import { createJobsHash, generateJobNeedsDict, reportToSentry } from '../../utils';
+import { STAGE_VIEW } from '../graph/constants';
import { parseData } from '../parsing_utils';
import { reportPerformance } from './api';
import { generateLinksData } from './drawing_utils';
@@ -54,11 +55,17 @@ export default {
required: false,
default: '',
},
+ viewType: {
+ type: String,
+ required: false,
+ default: STAGE_VIEW,
+ },
},
data() {
return {
links: [],
needsObject: null,
+ parsedData: {},
};
},
computed: {
@@ -108,6 +115,15 @@ export default {
highlightedJobs(jobs) {
this.$emit('highlightedJobsChange', jobs);
},
+ viewType() {
+ /*
+ We need to wait a tick so that the layout reflows
+ before the links refresh.
+ */
+ this.$nextTick(() => {
+ this.refreshLinks();
+ });
+ },
},
errorCaptured(err, _vm, info) {
reportToSentry(this.$options.name, `error: ${err}, info: ${info}`);
@@ -166,14 +182,17 @@ export default {
this.beginPerfMeasure();
try {
const arrayOfJobs = this.pipelineData.flatMap(({ groups }) => groups);
- const parsedData = parseData(arrayOfJobs);
- this.links = generateLinksData(parsedData, this.containerId, `-${this.pipelineId}`);
+ this.parsedData = parseData(arrayOfJobs);
+ this.refreshLinks();
} catch (err) {
this.$emit('error', { type: DRAW_FAILURE, reportToSentry: false });
reportToSentry(this.$options.name, err);
}
this.finishPerfMeasureAndSend();
},
+ refreshLinks() {
+ this.links = generateLinksData(this.parsedData, this.containerId, `-${this.pipelineId}`);
+ },
getLinkClasses(link) {
return [
this.isLinkHighlighted(link.ref) ? 'gl-stroke-blue-400' : this.defaultLinkColor,
diff --git a/app/assets/javascripts/pipelines/components/parsing_utils.js b/app/assets/javascripts/pipelines/components/parsing_utils.js
index 9c97fa832d0..f5ab869633b 100644
--- a/app/assets/javascripts/pipelines/components/parsing_utils.js
+++ b/app/assets/javascripts/pipelines/components/parsing_utils.js
@@ -1,4 +1,5 @@
import { uniqWith, isEqual } from 'lodash';
+import { createSankey } from './dag/drawing_utils';
/*
The following functions are the main engine in transforming the data as
@@ -144,3 +145,28 @@ export const getMaxNodes = (nodes) => {
export const removeOrphanNodes = (sankeyfiedNodes) => {
return sankeyfiedNodes.filter((node) => node.sourceLinks.length || node.targetLinks.length);
};
+
+/*
+ This utility accepts unwrapped pipeline data in the format returned from
+ our standard pipeline GraphQL query and returns a list of names by layer
+ for the layer view. It can be combined with the stageLookup on the pipeline
+ to generate columns by layer.
+*/
+
+export const listByLayers = ({ stages }) => {
+ const arrayOfJobs = stages.flatMap(({ groups }) => groups);
+ const parsedData = parseData(arrayOfJobs);
+ const dataWithLayers = createSankey()(parsedData);
+
+ return dataWithLayers.nodes.reduce((acc, { layer, name }) => {
+ /* sort groups by layer */
+
+ if (!acc[layer]) {
+ acc[layer] = [];
+ }
+
+ acc[layer].push(name);
+
+ return acc;
+ }, []);
+};
diff --git a/app/assets/javascripts/pipelines/components/unwrapping_utils.js b/app/assets/javascripts/pipelines/components/unwrapping_utils.js
index 7a3b28ed7dd..15316fe3279 100644
--- a/app/assets/javascripts/pipelines/components/unwrapping_utils.js
+++ b/app/assets/javascripts/pipelines/components/unwrapping_utils.js
@@ -1,11 +1,11 @@
import { reportToSentry } from '../utils';
const unwrapGroups = (stages) => {
- return stages.map((stage) => {
+ return stages.map((stage, idx) => {
const {
groups: { nodes: groups },
} = stage;
- return { ...stage, groups };
+ return { node: { ...stage, groups }, lookup: { stageIdx: idx } };
});
};
@@ -23,20 +23,34 @@ const unwrapJobWithNeeds = (denodedJobArray) => {
return unwrapNodesWithName(denodedJobArray, 'needs');
};
-const unwrapStagesWithNeeds = (denodedStages) => {
+const unwrapStagesWithNeedsAndLookup = (denodedStages) => {
const unwrappedNestedGroups = unwrapGroups(denodedStages);
- const nodes = unwrappedNestedGroups.map((node) => {
+ const lookupMap = {};
+
+ const nodes = unwrappedNestedGroups.map(({ node, lookup }) => {
const { groups } = node;
- const groupsWithJobs = groups.map((group) => {
+ const groupsWithJobs = groups.map((group, idx) => {
const jobs = unwrapJobWithNeeds(group.jobs.nodes);
+
+ lookupMap[group.name] = { ...lookup, groupIdx: idx };
return { ...group, jobs };
});
return { ...node, groups: groupsWithJobs };
});
- return nodes;
+ return { stages: nodes, lookup: lookupMap };
};
-export { unwrapGroups, unwrapNodesWithName, unwrapJobWithNeeds, unwrapStagesWithNeeds };
+const unwrapStagesWithNeeds = (denodedStages) => {
+ return unwrapStagesWithNeedsAndLookup(denodedStages).stages;
+};
+
+export {
+ unwrapGroups,
+ unwrapJobWithNeeds,
+ unwrapNodesWithName,
+ unwrapStagesWithNeeds,
+ unwrapStagesWithNeedsAndLookup,
+};
diff --git a/app/assets/stylesheets/pages/runners.scss b/app/assets/stylesheets/pages/runners.scss
index 856e49bd144..f684cb090e2 100644
--- a/app/assets/stylesheets/pages/runners.scss
+++ b/app/assets/stylesheets/pages/runners.scss
@@ -25,32 +25,3 @@
background-color: $red-500;
}
}
-
-.runner {
- .btn {
- padding: 1px 6px;
- }
-
- h4 {
- font-weight: $gl-font-weight-normal;
- }
-}
-
-.admin-runner-btn-group-cell {
- min-width: 150px;
-
- .btn-sm {
- padding: 4px 9px;
- }
-
- .btn-default {
- color: $gl-text-color-secondary;
- }
-}
-
-@include media-breakpoint-down(md) {
- .runners-content {
- width: 100%;
- overflow: auto;
- }
-}
diff --git a/app/models/project_services/jira_service.rb b/app/models/project_services/jira_service.rb
index b4ef0be8076..3e14bf44c12 100644
--- a/app/models/project_services/jira_service.rb
+++ b/app/models/project_services/jira_service.rb
@@ -116,7 +116,7 @@ class JiraService < IssueTrackerService
end
def description
- s_('JiraService|Jira issue tracker')
+ s_('JiraService|Track issues in Jira')
end
def self.to_param
@@ -130,19 +130,20 @@ class JiraService < IssueTrackerService
name: 'url',
title: s_('JiraService|Web URL'),
placeholder: 'https://jira.example.com',
+ help: s_('JiraService|Base URL of the Jira instance.'),
required: true
},
{
type: 'text',
name: 'api_url',
title: s_('JiraService|Jira API URL'),
- placeholder: s_('JiraService|If different from Web URL')
+ help: s_('JiraService|If different from Web URL.')
},
{
type: 'text',
name: 'username',
title: s_('JiraService|Username or Email'),
- placeholder: s_('JiraService|Use a username for server version and an email for cloud version'),
+ help: s_('JiraService|Use a username for server version and an email for cloud version.'),
required: true
},
{
@@ -150,8 +151,8 @@ class JiraService < IssueTrackerService
name: 'password',
title: s_('JiraService|Password or API token'),
non_empty_password_title: s_('JiraService|Enter new password or API token'),
- non_empty_password_help: s_('JiraService|Leave blank to use your current password or API token'),
- placeholder: s_('JiraService|Use a password for server version and an API token for cloud version'),
+ non_empty_password_help: s_('JiraService|Leave blank to use your current password or API token.'),
+ help: s_('JiraService|Use a password for server version and an API token for cloud version.'),
required: true
}
]
diff --git a/app/views/admin/application_settings/_performance.html.haml b/app/views/admin/application_settings/_performance.html.haml
index 5ee68e8fd16..50fc11ec7f3 100644
--- a/app/views/admin/application_settings/_performance.html.haml
+++ b/app/views/admin/application_settings/_performance.html.haml
@@ -6,7 +6,7 @@
.form-check
= f.check_box :authorized_keys_enabled, class: 'form-check-input'
= f.label :authorized_keys_enabled, class: 'form-check-label' do
- Write to "authorized_keys" file
+ = _('Write to "authorized_keys" file')
.form-text.text-muted
By default, we write to the "authorized_keys" file to support Git
over SSH without additional configuration. GitLab can be optimized
@@ -31,4 +31,4 @@
.form-text.text-muted
= _('Number of changes (branches or tags) in a single push to determine whether individual push events or bulk push event will be created. Bulk push event will be created if it surpasses that value.')
- = f.submit 'Save changes', class: "gl-button btn btn-confirm"
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/runners/index.html.haml b/app/views/admin/runners/index.html.haml
index 8e62dae6c4d..b5a869aa91c 100644
--- a/app/views/admin/runners/index.html.haml
+++ b/app/views/admin/runners/index.html.haml
@@ -118,7 +118,7 @@
= _('Runners currently online: %{active_runners_count}') % { active_runners_count: @active_runners_count }
- if @runners.any?
- .runners-content.content-list
+ .content-list{ data: { testid: 'runners-table' } }
.table-holder
.gl-responsive-table-row.table-row-header{ role: 'row' }
.table-section.section-10{ role: 'rowheader' }= _('Type/State')
diff --git a/app/views/groups/runners/_index.html.haml b/app/views/groups/runners/_index.html.haml
index 7cbc709ecf8..2c6ded7327f 100644
--- a/app/views/groups/runners/_index.html.haml
+++ b/app/views/groups/runners/_index.html.haml
@@ -82,7 +82,7 @@
- if @group_runners.any?
- .runners-content.content-list
+ .content-list{ data: { testid: 'runners-table' } }
.table-holder
.gl-responsive-table-row.table-row-header{ role: 'row' }
.table-section.section-10{ role: 'rowheader' }= _('Type/State')
diff --git a/app/views/projects/blob/viewers/_empty.html.haml b/app/views/projects/blob/viewers/_empty.html.haml
index a293a8de231..c15dabc9111 100644
--- a/app/views/projects/blob/viewers/_empty.html.haml
+++ b/app/views/projects/blob/viewers/_empty.html.haml
@@ -1,3 +1,3 @@
.file-content.code
.nothing-here-block
- Empty file
+ = _("Empty file")
diff --git a/app/views/projects/runners/_runner.html.haml b/app/views/projects/runners/_runner.html.haml
index c003a76728b..0d67deb34cf 100644
--- a/app/views/projects/runners/_runner.html.haml
+++ b/app/views/projects/runners/_runner.html.haml
@@ -1,5 +1,5 @@
%li.runner{ id: dom_id(runner) }
- %h4
+ %h4.gl-font-weight-normal
= runner_status_icon(runner)
- if @project_runners.include?(runner)
@@ -9,9 +9,9 @@
%span.has-tooltip{ title: _('Locked to current projects') }
= sprite_icon('lock')
- %small.edit-runner
- = link_to edit_project_runner_path(@project, runner), class: 'btn gl-button btn-edit' do
- = sprite_icon('pencil', css_class: 'gl-my-2')
+ = link_to edit_project_runner_path(@project, runner), class: 'btn gl-button btn-sm btn-icon', data: { testid: 'edit-runner-link' } do
+ = sprite_icon('pencil')
+
- else
%span.commit-sha
= runner.short_sha
diff --git a/changelogs/unreleased/Externalise-strings-in-_performance-html-haml.yml b/changelogs/unreleased/Externalise-strings-in-_performance-html-haml.yml
new file mode 100644
index 00000000000..f34e55ffce9
--- /dev/null
+++ b/changelogs/unreleased/Externalise-strings-in-_performance-html-haml.yml
@@ -0,0 +1,5 @@
+---
+title: Externalize strings in _performance.html.haml
+merge_request: 58016
+author: nuwe1
+type: other
diff --git a/changelogs/unreleased/Externalize-strings-in-viewers-_empty-html-haml.yml b/changelogs/unreleased/Externalize-strings-in-viewers-_empty-html-haml.yml
new file mode 100644
index 00000000000..6793e6c07f8
--- /dev/null
+++ b/changelogs/unreleased/Externalize-strings-in-viewers-_empty-html-haml.yml
@@ -0,0 +1,5 @@
+---
+title: Externalizes strings in viewers/_empty.html.haml
+merge_request: 58451
+author: nuwe1
+type: other
diff --git a/changelogs/unreleased/issue-325836-fix-empty-line-after-let-it-be-gitlab-checks.yml b/changelogs/unreleased/issue-325836-fix-empty-line-after-let-it-be-gitlab-checks.yml
new file mode 100644
index 00000000000..cc8258f21a8
--- /dev/null
+++ b/changelogs/unreleased/issue-325836-fix-empty-line-after-let-it-be-gitlab-checks.yml
@@ -0,0 +1,5 @@
+---
+title: Fix EmptyLineAfterFinalLetItBe offenses in spec/lib/gitlab/checks
+merge_request: 58248
+author: Huzaifa Iftikhar @huzaifaiftikhar
+type: fixed
diff --git a/changelogs/unreleased/issue-325836-fix-empty-line-after-let-it-be-gitlab-graphql.yml b/changelogs/unreleased/issue-325836-fix-empty-line-after-let-it-be-gitlab-graphql.yml
new file mode 100644
index 00000000000..ae66f876a4e
--- /dev/null
+++ b/changelogs/unreleased/issue-325836-fix-empty-line-after-let-it-be-gitlab-graphql.yml
@@ -0,0 +1,5 @@
+---
+title: Fix EmptyLineAfterFinalLetItBe offenses in spec/lib/gitlab/graphql
+merge_request: 58261
+author: Huzaifa Iftikhar @huzaifaiftikhar
+type: fixed
diff --git a/changelogs/unreleased/russell-improve-jira-service-help-text-2.yml b/changelogs/unreleased/russell-improve-jira-service-help-text-2.yml
new file mode 100644
index 00000000000..aa56b0608ad
--- /dev/null
+++ b/changelogs/unreleased/russell-improve-jira-service-help-text-2.yml
@@ -0,0 +1,5 @@
+---
+title: Update Jira plugin UI copy
+merge_request: 57793
+author: Russell Dickenson rdickenson@gitlab.com
+type: other
diff --git a/changelogs/unreleased/tor-defect-overview-placeholder-message-overview-file-source.yml b/changelogs/unreleased/tor-defect-overview-placeholder-message-overview-file-source.yml
new file mode 100644
index 00000000000..8ceb2067a4b
--- /dev/null
+++ b/changelogs/unreleased/tor-defect-overview-placeholder-message-overview-file-source.yml
@@ -0,0 +1,6 @@
+---
+title: Fill in all placeholder values in the apply suggestion commit message placeholder
+ text
+merge_request: 58136
+author:
+type: other
diff --git a/doc/ci/chatops/index.md b/doc/ci/chatops/index.md
index 48f8e595df6..5f661731660 100644
--- a/doc/ci/chatops/index.md
+++ b/doc/ci/chatops/index.md
@@ -57,7 +57,7 @@ functions available. Consider these best practices when creating ChatOps jobs:
in the project, the job runs. The job itself can use existing
[CI/CD variables](../variables/README.md#predefined-cicd-variables) like
`GITLAB_USER_ID` to perform additional rights validation, but
- these variables can be [overridden](../variables/README.md#priority-of-cicd-variables).
+ these variables can be [overridden](../variables/README.md#cicd-variable-precedence).
### Controlling the ChatOps reply
diff --git a/doc/ci/environments/index.md b/doc/ci/environments/index.md
index 76d44715e8a..cb45486368b 100644
--- a/doc/ci/environments/index.md
+++ b/doc/ci/environments/index.md
@@ -690,7 +690,7 @@ with `review/` would have that variable available.
Some GitLab features can behave differently for each environment.
For example, you can
-[create a secret variable to be injected only into a production environment](../variables/README.md#limit-the-environment-scopes-of-cicd-variables).
+[create a project CI/CD variable to be injected only into a production environment](../variables/README.md#limit-the-environment-scope-of-a-cicd-variable).
In most cases, these features use the _environment specs_ mechanism, which offers
an efficient way to implement scoping in each environment group.
diff --git a/doc/ci/multi_project_pipelines.md b/doc/ci/multi_project_pipelines.md
index 6b570326a47..335a077a23c 100644
--- a/doc/ci/multi_project_pipelines.md
+++ b/doc/ci/multi_project_pipelines.md
@@ -220,7 +220,7 @@ the ones defined in the upstream project take precedence.
#### With variable inheritance
-You can pass variables to a downstream pipeline with [`dotenv` variable inheritance](variables/README.md#inherit-cicd-variables) and [cross project artifact downloads](yaml/README.md#cross-project-artifact-downloads-with-needs).
+You can pass variables to a downstream pipeline with [`dotenv` variable inheritance](variables/README.md#pass-an-environment-variable-to-another-job) and [cross project artifact downloads](yaml/README.md#cross-project-artifact-downloads-with-needs).
In the upstream pipeline:
diff --git a/doc/ci/triggers/README.md b/doc/ci/triggers/README.md
index e3e498277b2..3cdf45a8cbc 100644
--- a/doc/ci/triggers/README.md
+++ b/doc/ci/triggers/README.md
@@ -255,7 +255,7 @@ curl --request POST \
"https://gitlab.example.com/api/v4/projects/9/trigger/pipeline"
```
-Trigger variables have the [highest priority](../variables/README.md#priority-of-cicd-variables)
+Trigger variables have the [highest priority](../variables/README.md#cicd-variable-precedence)
of all types of variables.
## Using cron to trigger nightly pipelines
diff --git a/doc/ci/variables/README.md b/doc/ci/variables/README.md
index c366c032a4e..72881508d09 100644
--- a/doc/ci/variables/README.md
+++ b/doc/ci/variables/README.md
@@ -66,6 +66,11 @@ or have them [prefilled in manual pipelines](../pipelines/index.md#prefill-varia
There are two types of variables: [`File` or `Variable`](#cicd-variable-types).
+Variable names are limited by the [shell the runner uses](https://docs.gitlab.com/runner/shells/index.html)
+to execute scripts. Each shell has its own set of reserved variable names.
+
+Make sure each variable is defined for the [scope you want to use it in](where_variables_can_be_used.md).
+
### Create a custom CI/CD variable in the `.gitlab-ci.yml` file
To create a custom variable in the [`.gitlab-ci.yml`](../yaml/README.md#variables) file,
@@ -467,16 +472,23 @@ export GITLAB_USER_ID="42"
...
```
-## Inherit CI/CD variables
+## Pass an environment variable to another job
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22638) in GitLab 13.0 behind a disabled [feature flag](../../administration/feature_flags.md): `ci_dependency_variables`.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22638) in GitLab 13.0.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/217834) in GitLab 13.1.
-You can inherit CI/CD variables from dependent jobs.
+You can pass environment variables from one job to another job in a later stage.
+These variables cannot be used as CI/CD variables to configure a pipeline, but
+they can be used in job scripts.
-This feature makes use of the [`artifacts:reports:dotenv`](../pipelines/job_artifacts.md#artifactsreportsdotenv) report feature.
+1. In the job script, save the variable as a `.env` file.
+1. Save the `.env` file as an [`artifacts:reports:dotenv`](../pipelines/job_artifacts.md#artifactsreportsdotenv)
+artifact.
+1. Set a job in a later stage to receive the artifact by using the [`dependencies`](../yaml/README.md#dependencies)
+ or the [`needs`](../yaml/README.md#artifact-downloads-with-needs) keywords.
+1. The later job can then [use the variable in scripts](#use-cicd-variables-in-job-scripts).
-Example with [`dependencies`](../yaml/README.md#dependencies) keyword.
+For example, with the [`dependencies`](../yaml/README.md#dependencies) keyword:
```yaml
build:
@@ -490,12 +502,12 @@ build:
deploy:
stage: deploy
script:
- - echo $BUILD_VERSION # => hello
+ - echo $BUILD_VERSION # Output is: 'hello'
dependencies:
- build
```
-Example with the [`needs`](../yaml/README.md#artifact-downloads-with-needs) keyword:
+For example, with the [`needs`](../yaml/README.md#artifact-downloads-with-needs) keyword:
```yaml
build:
@@ -509,131 +521,113 @@ build:
deploy:
stage: deploy
script:
- - echo $BUILD_VERSION # => hello
+ - echo $BUILD_VERSION # Output is: 'hello'
needs:
- job: build
artifacts: true
```
-## Priority of CI/CD variables
+## CI/CD variable precedence
-Variables of different types can take precedence over other
-variables, depending on where they are defined.
+You can use CI/CD variables with the same name in different places, but the values
+can overwrite each other. The type of variable and where they are defined determines
+which variables take precedence.
The order of precedence for variables is (from highest to lowest):
-1. [Trigger variables](../triggers/README.md#making-use-of-trigger-variables), [scheduled pipeline variables](../pipelines/schedules.md#using-variables),
- and [manual pipeline run variables](#override-a-variable-by-manually-running-a-pipeline).
-1. Project-level [variables](#custom-cicd-variables) or [protected variables](#protect-a-cicd-variable).
-1. Group-level [variables](#group-cicd-variables) or [protected variables](#protect-a-cicd-variable).
-1. Instance-level [variables](#instance-cicd-variables) or [protected variables](#protect-a-cicd-variable).
-1. [Inherited CI/CD variables](#inherit-cicd-variables).
-1. YAML-defined [job-level variables](../yaml/README.md#variables).
-1. YAML-defined [global variables](../yaml/README.md#variables).
+1. [Trigger variables](../triggers/README.md#making-use-of-trigger-variables),
+ [scheduled pipeline variables](../pipelines/schedules.md#using-variables),
+ and [manual pipeline run variables](#override-a-variable-when-running-a-pipeline-manually).
+1. Project [variables](#custom-cicd-variables).
+1. Group [variables](#group-cicd-variables).
+1. Instance [variables](#instance-cicd-variables).
+1. [Inherited variables](#pass-an-environment-variable-to-another-job).
+1. Variables defined in jobs in the `.gitlab-ci.yml` file.
+1. Variables defined outside of jobs (globally) in the `.gitlab-ci.yml` file.
1. [Deployment variables](#deployment-variables).
-1. [Predefined CI/CD variables](predefined_variables.md).
+1. [Predefined variables](predefined_variables.md).
-For example, if you define:
+In the following example, when the script in `job1` executes, the value of `API_TOKEN` is `secure`.
+Variables defined in jobs have a higher precedence than variables defined globally.
-- `API_TOKEN=secure` as a project variable.
-- `API_TOKEN=yaml` in your `.gitlab-ci.yml`.
+```yaml
+variables:
+ API_TOKEN: "default"
-`API_TOKEN` takes the value `secure` as the project
-variables take precedence over those defined in `.gitlab-ci.yml`.
+job1:
+ variables:
+ API_TOKEN: "secure"
+ script:
+ - echo "The variable value is $API_TOKEN"
+```
-## Unsupported variables
+## Override a defined CI/CD variable
-Variable names are limited by the underlying shell used to execute scripts (see [available shells](https://docs.gitlab.com/runner/shells/index.html).
-Each shell has its own unique set of reserved variable names.
-Keep in mind the [scope of CI/CD variables](where_variables_can_be_used.md) to ensure a variable is defined in the scope in which you wish to use it.
+You can override the value of a variable when you:
-## Where variables can be used
+1. [Run a pipeline manually](#override-a-variable-when-running-a-pipeline-manually) in the UI.
+1. Create a pipeline by using [the API](../../api/pipelines.md#create-a-new-pipeline).
+1. Run a job manually in the UI.
+1. Use [push options](../../user/project/push_options.md#push-options-for-gitlab-cicd).
+1. Trigger a pipeline by using [the API](../triggers/README.md#making-use-of-trigger-variables).
+1. Pass variables to a [downstream pipeline](../multi_project_pipelines.md#passing-cicd-variables-to-a-downstream-pipeline).
-[This section](where_variables_can_be_used.md) describes where and how the different types of variables can be used.
+The pipeline variables declared in these events take [priority over other variables](#cicd-variable-precedence).
-## Advanced use
+### Override a variable when running a pipeline manually
-### Limit the environment scopes of CI/CD variables
+You can override the value of a CI/CD variable when you
+[run a pipeline manually](../pipelines/index.md#run-a-pipeline-manually).
+
+1. Go to your project's **CI/CD > Pipelines** and select **Run pipeline**.
+1. Choose the branch you want to run the pipeline for.
+1. Input the variable and its value in the UI.
+
+### Restrict who can override variables
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/295234) in GitLab 13.8.
+
+You can grant permission to override variables to [maintainers](../../user/permissions.md#project-features) only. When other users try to run a pipeline
+with overridden variables, they receive the `Insufficient permissions to set pipeline variables`
+error message.
+
+If you [store your CI/CD configurations in a different repository](../../ci/pipelines/settings.md#custom-cicd-configuration-path),
+use this setting for control over the environment the pipeline runs in.
+
+You can enable this feature by using [the projects API](../../api/projects.md#edit-project)
+to enable the `restrict_user_defined_variables` setting. The setting is `disabled` by default.
+
+## Limit the environment scope of a CI/CD variable
You can limit the environment scope of a variable by
[defining which environments](../environments/index.md) it can be available for.
To learn more about scoping environments, see [Scoping environments with specs](../environments/index.md#scoping-environments-with-specs).
-### Deployment variables
+## Deployment variables
-[Integrations](../../user/project/integrations/overview.md) that are
-responsible for deployment configuration may define their own variables that
-are set in the build environment. These variables are only defined for
-[deployment jobs](../environments/index.md). Please consult the documentation of
-the integrations that you are using to learn which variables they define.
+Integrations that are responsible for deployment configuration can define their own
+variables that are set in the build environment. These variables are only defined
+for [deployment jobs](../environments/index.md).
-An example integration that defines deployment variables is the
-[Kubernetes integration](../../user/project/clusters/index.md#deployment-variables).
+For example, the [Kubernetes integration](../../user/project/clusters/index.md#deployment-variables)
+defines deployment variables that you can use with the integration.
-### Auto DevOps environment variables
+The [documentation for each integration](../../user/project/integrations/overview.md)
+explains if the integration has any deployment variables available.
+
+## Auto DevOps environment variables
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/49056) in GitLab 11.7.
-You can configure [Auto DevOps](../../topics/autodevops/index.md) to
-pass CI/CD variables to the running application by prefixing the key of the
-variable with `K8S_SECRET_`.
+You can configure [Auto DevOps](../../topics/autodevops/index.md) to pass CI/CD variables
+to a running application.
-These [prefixed variables](../../topics/autodevops/customize.md#application-secret-variables) are
-then available as environment variables on the running application
-container.
+To make a CI/CD variable available as an environment variable in the running application's container,
+[prefix the variable key](../../topics/autodevops/customize.md#application-secret-variables)
+with `K8S_SECRET_`.
-WARNING:
-Variables with multi-line values are not supported due to
-limitations with the Auto DevOps scripting environment.
-
-### When you can override variables
-
-You can override the value of a variable when:
-
-1. [Manually running](#override-a-variable-by-manually-running-a-pipeline) pipelines in the UI.
-1. Manually creating pipelines [via API](../../api/pipelines.md#create-a-new-pipeline).
-1. Manually playing a job via the UI.
-1. Using [push options](../../user/project/push_options.md#push-options-for-gitlab-cicd).
-1. Manually triggering pipelines with [the API](../triggers/README.md#making-use-of-trigger-variables).
-1. Passing variables to a [downstream pipeline](../multi_project_pipelines.md#passing-cicd-variables-to-a-downstream-pipeline).
-
-These pipeline variables declared in these events take [priority over other variables](#priority-of-cicd-variables).
-
-#### Restrict who can override variables
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/295234) in GitLab 13.8.
-
-To allow only users with Maintainer role to set these variables, you can use
-[the API](../../api/projects.md#edit-project) to enable the project setting `restrict_user_defined_variables`.
-When a user without Maintainer role tries to run a pipeline with overridden
-variables, an `Insufficient permissions to set pipeline variables` error occurs.
-
-The setting is `disabled` by default.
-
-If you [store your CI/CD configurations in a different repository](../../ci/pipelines/settings.md#custom-cicd-configuration-path),
-use this setting for strict control over all aspects of the environment
-the pipeline runs in.
-
-#### Override a variable by manually running a pipeline
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/44059) in GitLab 10.8.
-
-You can override the value of a current variable by
-[running a pipeline manually](../pipelines/index.md#run-a-pipeline-manually).
-
-For instance, suppose you added a custom variable named `$TEST`
-and you want to override it in a manual pipeline.
-
-Go to your project's **CI/CD > Pipelines** and select **Run pipeline**.
-Choose the branch you want to run the pipeline for, then add a variable and its value in the UI:
-
-![Override variable value](img/override_variable_manual_pipeline.png)
-
-The runner overrides the value previously set and uses the custom
-value for this specific pipeline.
-
-![Manually overridden variable output](img/override_value_via_manual_pipeline_output.png)
+CI/CD variables with multi-line values are not supported.
## CI/CD variable expressions
@@ -828,44 +822,22 @@ testvariable:
> Introduced in GitLab Runner 1.7.
WARNING:
-Enabling debug tracing can have severe security implications. The
-output **will** contain the content of all your variables and any other
-secrets! The output **will** be uploaded to the GitLab server and made visible
-in job logs!
+Debug logging can be a serious security risk. The output contains the content of
+all variables and other secrets available to the job. The output is uploaded to the
+GitLab server and visible in job logs.
-By default, the runner hides most of the details of what it is doing when
-processing a job. This behavior keeps job logs short, and prevents secrets
-from being leaked into the log unless your script writes them to the screen.
+You can use debug logging to help troubleshoot problems with pipeline configuration
+or job scripts. Debug logging exposes job execution details that are usually hidden
+by the runner and makes job logs more verbose. It also exposes all variables and secrets
+available to the job.
-If a job isn't working as expected, this can make the problem difficult to
-investigate; in these cases, you can enable debug tracing in `.gitlab-ci.yml`.
-Available on GitLab Runner v1.7+, this feature enables the shell's execution log. This results in a verbose job log listing all commands that were run, variables that were set, and so on.
-
-Before enabling this, you should ensure jobs are visible to
-[team members only](../../user/permissions.md#project-features). You should
-also [erase](../jobs/index.md#view-jobs-in-a-pipeline) all generated job logs
-before making them visible again.
-
-### Restricted access to debug logging
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/213159) in GitLab 13.7.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/292661) in GitLab 13.8.
-
-With restricted access to debug logging, only users with
-[developer or higher permissions](../../user/permissions.md#project-members-permissions)
-can view job logs when debug logging is enabled with a variable in:
-
-- The [`.gitlab-ci.yml` file](#create-a-custom-cicd-variable-in-the-gitlab-ciyml-file).
-- The CI/CD variables set in the GitLab UI.
-
-WARNING:
-If you add `CI_DEBUG_TRACE` as a local variable to your runners, debug logs are visible
-to all users with access to job logs. The permission levels are not checked by Runner,
-so you should make use of the variable in GitLab only.
+Before you enable debug logging, make sure only [team members](../../user/permissions.md#project-features)
+can view job logs. You should also [delete job logs](../jobs/index.md#view-jobs-in-a-pipeline)
+with debug output before you make logs public again.
### Enable Debug logging
-To enable debug logs (traces), set the `CI_DEBUG_TRACE` variable to `true`:
+To enable debug logging (tracing), set the `CI_DEBUG_TRACE` variable to `true`:
```yaml
job_name:
@@ -873,11 +845,10 @@ job_name:
CI_DEBUG_TRACE: "true"
```
-Example truncated output with `CI_DEBUG_TRACE` set to `true`:
+Example output (truncated):
```shell
...
-
export CI_SERVER_TLS_CA_FILE="/builds/gitlab-examples/ci-debug-trace.tmp/CI_SERVER_TLS_CA_FILE"
if [[ -d "/builds/gitlab-examples/ci-debug-trace/.git" ]]; then
echo $'\''\x1b[32;1mFetching changes...\x1b[0;m'\''
@@ -982,10 +953,26 @@ if [[ -d "/builds/gitlab-examples/ci-debug-trace/.git" ]]; then
++ CI_COMMIT_REF_NAME=master
++ export CI_COMMIT_REF_SLUG=master
++ CI_COMMIT_REF_SLUG=master
-
...
```
+### Restrict access to debug logging
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/213159) in GitLab 13.7.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/292661) in GitLab 13.8.
+
+You can restrict access to debug logging. When restricted, only users with
+[developer or higher permissions](../../user/permissions.md#project-members-permissions)
+can view job logs when debug logging is enabled with a variable in:
+
+- The [`.gitlab-ci.yml` file](#create-a-custom-cicd-variable-in-the-gitlab-ciyml-file).
+- The CI/CD variables set in the GitLab UI.
+
+WARNING:
+If you add `CI_DEBUG_TRACE` as a local variable to runners, debug logs generate and are visible
+to all users with access to job logs. The permission levels are not checked by the runner,
+so you should only use the variable in GitLab itself.
+
## Video walkthrough of a working example
The [Managing the Complex Configuration Data Management Monster Using GitLab](https://www.youtube.com/watch?v=v4ZOJ96hAck)
diff --git a/doc/ci/variables/img/override_value_via_manual_pipeline_output.png b/doc/ci/variables/img/override_value_via_manual_pipeline_output.png
deleted file mode 100644
index 2d4c4d24520..00000000000
Binary files a/doc/ci/variables/img/override_value_via_manual_pipeline_output.png and /dev/null differ
diff --git a/doc/ci/variables/img/override_variable_manual_pipeline.png b/doc/ci/variables/img/override_variable_manual_pipeline.png
deleted file mode 100644
index 2b242466297..00000000000
Binary files a/doc/ci/variables/img/override_variable_manual_pipeline.png and /dev/null differ
diff --git a/doc/ci/yaml/README.md b/doc/ci/yaml/README.md
index 23f93fd6219..4873385d808 100644
--- a/doc/ci/yaml/README.md
+++ b/doc/ci/yaml/README.md
@@ -4636,7 +4636,7 @@ meaning it applies to all jobs. If you define a variable in a job, it's availabl
to that job only.
If a variable of the same name is defined globally and for a specific job, the
-[job-specific variable overrides the global variable](../variables/README.md#priority-of-cicd-variables).
+[job-specific variable overrides the global variable](../variables/README.md#cicd-variable-precedence).
All YAML-defined variables are also set to any linked
[Docker service containers](../services/index.md).
diff --git a/doc/development/code_review.md b/doc/development/code_review.md
index 9a6840fefe0..7f730a23776 100644
--- a/doc/development/code_review.md
+++ b/doc/development/code_review.md
@@ -408,8 +408,19 @@ When ready to merge:
circling back with the author about that. Otherwise, if the MR only has a few commits, we'll
be respecting the author's setting by not squashing them.
-- **Start a new merge request pipeline with the `Run Pipeline` button in the merge
- request's "Pipelines" tab, and enable "Merge When Pipeline Succeeds" (MWPS).** Note that:
+WARNING:
+**If the merge request is from a fork, review all changes thoroughly for malicious code before
+starting a [Pipeline for Merged Results](../ci/merge_request_pipelines/index.md#run-pipelines-in-the-parent-project-for-merge-requests-from-a-forked-project).**
+Pay particular attention to new dependencies and dependency updates, such as Ruby gems and Node packages.
+While changes to files like `Gemfile.lock` or `yarn.lock` might appear trivial, they could lead to the
+fetching of malicious packages.
+If the MR source branch is more than 100 commits behind the target branch, ask the author to rebase it.
+Review links and images, especially in documentation MRs.
+When in doubt, ask someone from `@gitlab-com/gl-security/appsec` to review the merge request **before starting any merge request pipeline**.
+
+- Start a new merge request pipeline with the `Run Pipeline` button in the merge
+ request's "Pipelines" tab, and enable "Merge When Pipeline Succeeds" (MWPS).
+ Note that:
- If **[master is broken](https://about.gitlab.com/handbook/engineering/workflow/#broken-master),
do not merge the merge request** except for
[very specific cases](https://about.gitlab.com/handbook/engineering/workflow/#criteria-for-merging-during-broken-master).
@@ -417,10 +428,6 @@ When ready to merge:
- If the **latest [Pipeline for Merged Results](../ci/merge_request_pipelines/pipelines_for_merged_results/#pipelines-for-merged-results)** finished less than 2 hours ago, you
might merge without starting a new pipeline as the merge request is close
enough to `master`.
- - If the **merge request is from a fork**, we can use [Pipelines for Merged Results from a forked project](../ci/merge_request_pipelines/index.md#run-pipelines-in-the-parent-project-for-merge-requests-from-a-forked-project) with caution.
- Before triggering the pipeline, review all changes for **malicious code**.
- If you cannot trigger the pipeline, review the status of the fork relative to `master`.
- If it's more than 100 commits behind, ask the author to rebase it before merging.
- When you set the MR to "Merge When Pipeline Succeeds", you should take over
subsequent revisions for anything that would be spotted after that.
diff --git a/doc/topics/autodevops/customize.md b/doc/topics/autodevops/customize.md
index 7dcecb9af1e..ae6e57cd38e 100644
--- a/doc/topics/autodevops/customize.md
+++ b/doc/topics/autodevops/customize.md
@@ -171,7 +171,7 @@ list of options.
## Custom Helm chart per environment
You can specify the use of a custom Helm chart per environment by scoping the CI/CD variable
-to the desired environment. See [Limiting environment scopes of variables](../../ci/variables/README.md#limit-the-environment-scopes-of-cicd-variables).
+to the desired environment. See [Limit environment scope of CI/CD variables](../../ci/variables/README.md#limit-the-environment-scope-of-a-cicd-variable).
## Customizing `.gitlab-ci.yml`
diff --git a/doc/topics/autodevops/index.md b/doc/topics/autodevops/index.md
index dbb63275a06..03454649c7e 100644
--- a/doc/topics/autodevops/index.md
+++ b/doc/topics/autodevops/index.md
@@ -231,7 +231,7 @@ any of the following places:
**Continuous Integration and Delivery** section
The base domain variable `KUBE_INGRESS_BASE_DOMAIN` follows the same order of precedence
-as other environment [variables](../../ci/variables/README.md#priority-of-cicd-variables).
+as other environment [variables](../../ci/variables/README.md#cicd-variable-precedence).
If the CI/CD variable is not set and the cluster setting is left blank, the instance-wide **Auto DevOps domain**
setting is used if set.
@@ -274,7 +274,7 @@ used by Auto DevOps currently defines 3 environment names:
Those environments are tied to jobs using [Auto Deploy](stages.md#auto-deploy), so
except for the environment scope, they must have a different deployment domain.
You must define a separate `KUBE_INGRESS_BASE_DOMAIN` variable for each of the above
-[based on the environment](../../ci/variables/README.md#limit-the-environment-scopes-of-cicd-variables).
+[based on the environment](../../ci/variables/README.md#limit-the-environment-scope-of-a-cicd-variable).
The following table is an example of how to configure the three different clusters:
diff --git a/doc/user/group/clusters/index.md b/doc/user/group/clusters/index.md
index 5ace05ce281..87b259df9d8 100644
--- a/doc/user/group/clusters/index.md
+++ b/doc/user/group/clusters/index.md
@@ -107,7 +107,7 @@ The domain should have a wildcard DNS configured to the Ingress IP address.
When adding more than one Kubernetes cluster to your project, you need to differentiate
them with an environment scope. The environment scope associates clusters with
[environments](../../../ci/environments/index.md) similar to how the
-[environment-specific variables](../../../ci/variables/README.md#limit-the-environment-scopes-of-cicd-variables)
+[environment-specific CI/CD variables](../../../ci/variables/README.md#limit-the-environment-scope-of-a-cicd-variable)
work.
While evaluating which environment matches the environment scope of a
diff --git a/doc/user/project/clusters/index.md b/doc/user/project/clusters/index.md
index 6b144556e05..c2d06e0a22c 100644
--- a/doc/user/project/clusters/index.md
+++ b/doc/user/project/clusters/index.md
@@ -86,7 +86,7 @@ differentiates the new cluster from the rest.
When adding more than one Kubernetes cluster to your project, you need to differentiate
them with an environment scope. The environment scope associates clusters with [environments](../../../ci/environments/index.md) similar to how the
-[environment-specific CI/CD variables](../../../ci/variables/README.md#limit-the-environment-scopes-of-cicd-variables) work.
+[environment-specific CI/CD variables](../../../ci/variables/README.md#limit-the-environment-scope-of-a-cicd-variable) work.
The default environment scope is `*`, which means all jobs, regardless of their
environment, use that cluster. Each scope can be used only by a single cluster
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 2e777566b62..84de7d3bc1e 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -16961,7 +16961,7 @@ msgstr ""
msgid "Integrations|Use the GitLab Slack application"
msgstr ""
-msgid "Integrations|When a Jira issue is mentioned in a commit or merge request a remote link and comment (if enabled) will be created."
+msgid "Integrations|When a Jira issue is mentioned in a commit or merge request a remote link and comment (if enabled) is created."
msgstr ""
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
@@ -17678,6 +17678,9 @@ msgstr ""
msgid "JiraService|Automatically transitions Jira issues to the \"Done\" category. %{linkStart}Learn more%{linkEnd}"
msgstr ""
+msgid "JiraService|Base URL of the Jira instance."
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -17708,10 +17711,13 @@ msgstr ""
msgid "JiraService|For example, 12, 24"
msgstr ""
+msgid "JiraService|For example, AB"
+msgstr ""
+
msgid "JiraService|GitLab for Jira Configuration"
msgstr ""
-msgid "JiraService|If different from Web URL"
+msgid "JiraService|If different from Web URL."
msgstr ""
msgid "JiraService|Issue List"
@@ -17732,16 +17738,13 @@ msgstr ""
msgid "JiraService|Jira comments will be created when an issue gets referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue tracker"
-msgstr ""
-
msgid "JiraService|Jira issue type"
msgstr ""
msgid "JiraService|Jira project key"
msgstr ""
-msgid "JiraService|Leave blank to use your current password or API token"
+msgid "JiraService|Leave blank to use your current password or API token."
msgstr ""
msgid "JiraService|Move to Done"
@@ -17777,13 +17780,16 @@ msgstr ""
msgid "JiraService|This issue is synchronized with Jira"
msgstr ""
+msgid "JiraService|Track issues in Jira"
+msgstr ""
+
msgid "JiraService|Transition Jira issues to their final state:"
msgstr ""
-msgid "JiraService|Use a password for server version and an API token for cloud version"
+msgid "JiraService|Use a password for server version and an API token for cloud version."
msgstr ""
-msgid "JiraService|Use a username for server version and an email for cloud version"
+msgid "JiraService|Use a username for server version and an email for cloud version."
msgstr ""
msgid "JiraService|Use custom transitions"
@@ -17798,7 +17804,7 @@ msgstr ""
msgid "JiraService|View Jira issues in GitLab"
msgstr ""
-msgid "JiraService|Warning: All GitLab users that have access to this GitLab project will be able to view all issues from the Jira project specified below."
+msgid "JiraService|Warning: All GitLab users that have access to this GitLab project are able to view all issues from the Jira project specified below."
msgstr ""
msgid "JiraService|Web URL"
@@ -17807,9 +17813,6 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Adds a Jira menu to access your list of Jira issues and view any issue as read-only."
msgstr ""
-msgid "JiraService|e.g. AB"
-msgstr ""
-
msgid "JiraService|transition ids can have only numbers which can be split with , or ;"
msgstr ""
@@ -18975,9 +18978,6 @@ msgstr ""
msgid "Manage projects."
msgstr ""
-msgid "Manage storage usage"
-msgstr ""
-
msgid "Manage two-factor authentication"
msgstr ""
@@ -20535,17 +20535,15 @@ msgstr ""
msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
msgstr ""
-msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on %{locked_project_count} project. To unlock it, please purchase additional storage"
-msgid_plural "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on %{locked_project_count} projects. To unlock them, please purchase additional storage"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To learn more about reducing storage capacity please visit our docs."
+msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines. To learn more about reducing storage capacity please visit our docs."
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -34201,6 +34199,9 @@ msgstr ""
msgid "View the performance dashboard at"
msgstr ""
+msgid "View usage details"
+msgstr ""
+
msgid "View users statistics"
msgstr ""
@@ -35115,6 +35116,9 @@ msgstr ""
msgid "Write milestone description..."
msgstr ""
+msgid "Write to \"authorized_keys\" file"
+msgstr ""
+
msgid "Write your release notes or drag your files hereā¦"
msgstr ""
diff --git a/package.json b/package.json
index ff04e86675e..ae330d9925e 100644
--- a/package.json
+++ b/package.json
@@ -51,7 +51,7 @@
"@gitlab/favicon-overlay": "2.0.0",
"@gitlab/svgs": "1.188.0",
"@gitlab/tributejs": "1.0.0",
- "@gitlab/ui": "29.1.0",
+ "@gitlab/ui": "29.2.1",
"@gitlab/visual-review-tools": "1.6.1",
"@rails/actioncable": "^6.0.3-4",
"@rails/ujs": "^6.0.3-4",
diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb
index 6ce70f7734a..4e0dcbdf075 100644
--- a/spec/features/admin/admin_runners_spec.rb
+++ b/spec/features/admin/admin_runners_spec.rb
@@ -201,21 +201,21 @@ RSpec.describe "Admin Runners" do
visit admin_runners_path
- within '.runners-content .gl-responsive-table-row:nth-child(2)' do
+ within '[data-testid="runners-table"] .gl-responsive-table-row:nth-child(2)' do
expect(page).to have_content 'runner-2'
end
- within '.runners-content .gl-responsive-table-row:nth-child(3)' do
+ within '[data-testid="runners-table"] .gl-responsive-table-row:nth-child(3)' do
expect(page).to have_content 'runner-1'
end
sorting_by 'Last Contact'
- within '.runners-content .gl-responsive-table-row:nth-child(2)' do
+ within '[data-testid="runners-table"] .gl-responsive-table-row:nth-child(2)' do
expect(page).to have_content 'runner-1'
end
- within '.runners-content .gl-responsive-table-row:nth-child(3)' do
+ within '[data-testid="runners-table"] .gl-responsive-table-row:nth-child(3)' do
expect(page).to have_content 'runner-2'
end
end
diff --git a/spec/features/runners_spec.rb b/spec/features/runners_spec.rb
index 21eef64e345..85c4aecfdc0 100644
--- a/spec/features/runners_spec.rb
+++ b/spec/features/runners_spec.rb
@@ -79,7 +79,7 @@ RSpec.describe 'Runners' do
visit project_runners_path(project)
within '.activated-specific-runners' do
- first('.edit-runner > a').click
+ first('[data-testid="edit-runner-link"]').click
end
expect(page.find_field('runner[access_level]')).not_to be_checked
@@ -99,7 +99,7 @@ RSpec.describe 'Runners' do
visit project_runners_path(project)
within '.activated-specific-runners' do
- first('.edit-runner > a').click
+ first('[data-testid="edit-runner-link"]').click
end
expect(page.find_field('runner[run_untagged]')).to be_checked
diff --git a/spec/frontend/notes/components/noteable_note_spec.js b/spec/frontend/notes/components/noteable_note_spec.js
index 112983f3ac2..7444c441e06 100644
--- a/spec/frontend/notes/components/noteable_note_spec.js
+++ b/spec/frontend/notes/components/noteable_note_spec.js
@@ -1,32 +1,65 @@
-import { mount, createLocalVue } from '@vue/test-utils';
+import { mount } from '@vue/test-utils';
import { escape } from 'lodash';
+import Vue from 'vue';
+import Vuex from 'vuex';
+
import waitForPromises from 'helpers/wait_for_promises';
+
+import DiffsModule from '~/diffs/store/modules';
+
import NoteActions from '~/notes/components/note_actions.vue';
import NoteBody from '~/notes/components/note_body.vue';
import NoteHeader from '~/notes/components/note_header.vue';
import issueNote from '~/notes/components/noteable_note.vue';
-import createStore from '~/notes/stores';
+import NotesModule from '~/notes/stores/modules';
+
import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
+
import { noteableDataMock, notesDataMock, note } from '../mock_data';
+Vue.use(Vuex);
+
+const singleLineNotePosition = {
+ line_range: {
+ start: {
+ line_code: 'abc_1_1',
+ type: null,
+ old_line: '1',
+ new_line: '1',
+ },
+ end: {
+ line_code: 'abc_1_1',
+ type: null,
+ old_line: '1',
+ new_line: '1',
+ },
+ },
+};
+
describe('issue_note', () => {
let store;
let wrapper;
const findMultilineComment = () => wrapper.find('[data-testid="multiline-comment"]');
- const createWrapper = (props = {}) => {
- store = createStore();
+ const createWrapper = (props = {}, storeUpdater = (s) => s) => {
+ store = new Vuex.Store(
+ storeUpdater({
+ modules: {
+ notes: NotesModule(),
+ diffs: DiffsModule(),
+ },
+ }),
+ );
+
store.dispatch('setNoteableData', noteableDataMock);
store.dispatch('setNotesData', notesDataMock);
- const localVue = createLocalVue();
- wrapper = mount(localVue.extend(issueNote), {
+ wrapper = mount(issueNote, {
store,
propsData: {
note,
...props,
},
- localVue,
stubs: [
'note-header',
'user-avatar-link',
@@ -216,9 +249,13 @@ describe('issue_note', () => {
const noteBodyComponent = wrapper.findComponent(NoteBody);
store.hotUpdate({
- actions: {
- updateNote() {},
- setSelectedCommentPositionHover() {},
+ modules: {
+ notes: {
+ actions: {
+ updateNote() {},
+ setSelectedCommentPositionHover() {},
+ },
+ },
},
});
@@ -238,8 +275,12 @@ describe('issue_note', () => {
it('restores content of updated note', async () => {
const updatedText = 'updated note text';
store.hotUpdate({
- actions: {
- updateNote() {},
+ modules: {
+ notes: {
+ actions: {
+ updateNote() {},
+ },
+ },
},
});
const noteBody = wrapper.findComponent(NoteBody);
@@ -267,9 +308,13 @@ describe('issue_note', () => {
const updateActions = () => {
store.hotUpdate({
- actions: {
- updateNote,
- setSelectedCommentPositionHover() {},
+ modules: {
+ notes: {
+ actions: {
+ updateNote,
+ setSelectedCommentPositionHover() {},
+ },
+ },
},
});
};
@@ -299,4 +344,62 @@ describe('issue_note', () => {
expect(updateNote.mock.calls[0][1].note.note.position).toBe(expectation);
});
});
+
+ describe('diffFile', () => {
+ it.each`
+ scenario | files | noteDef
+ ${'the note has no position'} | ${undefined} | ${note}
+ ${'the Diffs store has no data'} | ${[]} | ${{ ...note, position: singleLineNotePosition }}
+ `(
+ 'returns `null` when $scenario and no diff file is provided as a prop',
+ ({ noteDef, diffs }) => {
+ const storeUpdater = (rawStore) => {
+ const updatedStore = { ...rawStore };
+
+ if (diffs) {
+ updatedStore.modules.diffs.state.diffFiles = diffs;
+ }
+
+ return updatedStore;
+ };
+
+ createWrapper({ note: noteDef, discussionFile: null }, storeUpdater);
+
+ expect(wrapper.vm.diffFile).toBe(null);
+ },
+ );
+
+ it("returns the correct diff file from the Diffs store if it's available", () => {
+ createWrapper(
+ {
+ note: { ...note, position: singleLineNotePosition },
+ },
+ (rawStore) => {
+ const updatedStore = { ...rawStore };
+ updatedStore.modules.diffs.state.diffFiles = [
+ { file_hash: 'abc', testId: 'diffFileTest' },
+ ];
+ return updatedStore;
+ },
+ );
+
+ expect(wrapper.vm.diffFile.testId).toBe('diffFileTest');
+ });
+
+ it('returns the provided diff file if the more robust getters fail', () => {
+ createWrapper(
+ {
+ note: { ...note, position: singleLineNotePosition },
+ discussionFile: { testId: 'diffFileTest' },
+ },
+ (rawStore) => {
+ const updatedStore = { ...rawStore };
+ updatedStore.modules.diffs.state.diffFiles = [];
+ return updatedStore;
+ },
+ );
+
+ expect(wrapper.vm.diffFile.testId).toBe('diffFileTest');
+ });
+ });
});
diff --git a/spec/frontend/pipelines/graph/graph_component_spec.js b/spec/frontend/pipelines/graph/graph_component_spec.js
index 6c3f848333c..8a2c7ac246f 100644
--- a/spec/frontend/pipelines/graph/graph_component_spec.js
+++ b/spec/frontend/pipelines/graph/graph_component_spec.js
@@ -1,5 +1,5 @@
import { mount, shallowMount } from '@vue/test-utils';
-import { GRAPHQL } from '~/pipelines/components/graph/constants';
+import { GRAPHQL, STAGE_VIEW } from '~/pipelines/components/graph/constants';
import PipelineGraph from '~/pipelines/components/graph/graph_component.vue';
import JobItem from '~/pipelines/components/graph/job_item.vue';
import LinkedPipelinesColumn from '~/pipelines/components/graph/linked_pipelines_column.vue';
@@ -20,6 +20,7 @@ describe('graph component', () => {
const defaultProps = {
pipeline: generateResponse(mockPipelineResponse, 'root/fungi-xoxo'),
+ viewType: STAGE_VIEW,
configPaths: {
metricsPath: '',
graphqlResourceEtag: 'this/is/a/path',
diff --git a/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js b/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
index ce78ee3bc51..37fb617ef1a 100644
--- a/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
+++ b/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
@@ -1,13 +1,15 @@
import { GlAlert, GlLoadingIcon } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
+import { mount, shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
import getPipelineDetails from 'shared_queries/pipelines/get_pipeline_details.query.graphql';
-import { IID_FAILURE } from '~/pipelines/components/graph/constants';
+import { IID_FAILURE, LAYER_VIEW, STAGE_VIEW } from '~/pipelines/components/graph/constants';
import PipelineGraph from '~/pipelines/components/graph/graph_component.vue';
import PipelineGraphWrapper from '~/pipelines/components/graph/graph_component_wrapper.vue';
import GraphViewSelector from '~/pipelines/components/graph/graph_view_selector.vue';
+import StageColumnComponent from '~/pipelines/components/graph/stage_column_component.vue';
+import * as parsingUtils from '~/pipelines/components/parsing_utils';
import { mockPipelineResponse } from './mock_data';
const defaultProvide = {
@@ -24,6 +26,9 @@ describe('Pipeline graph wrapper', () => {
const getAlert = () => wrapper.find(GlAlert);
const getLoadingIcon = () => wrapper.find(GlLoadingIcon);
const getGraph = () => wrapper.find(PipelineGraph);
+ const getStageColumnTitle = () => wrapper.find('[data-testid="stage-column-title"]');
+ const getAllStageColumnGroupsInColumn = () =>
+ wrapper.find(StageColumnComponent).findAll('[data-testid="stage-column-group"]');
const getViewSelector = () => wrapper.find(GraphViewSelector);
const createComponent = ({
@@ -48,12 +53,13 @@ describe('Pipeline graph wrapper', () => {
const createComponentWithApollo = ({
getPipelineDetailsHandler = jest.fn().mockResolvedValue(mockPipelineResponse),
+ mountFn = shallowMount,
provide = {},
} = {}) => {
const requestHandlers = [[getPipelineDetails, getPipelineDetailsHandler]];
const apolloProvider = createMockApollo(requestHandlers);
- createComponent({ apolloProvider, provide });
+ createComponent({ apolloProvider, provide, mountFn });
};
afterEach(() => {
@@ -223,13 +229,16 @@ describe('Pipeline graph wrapper', () => {
});
describe('when feature flag is on', () => {
+ let layersFn;
beforeEach(async () => {
+ layersFn = jest.spyOn(parsingUtils, 'listByLayers');
createComponentWithApollo({
provide: {
glFeatures: {
pipelineGraphLayersView: true,
},
},
+ mountFn: mount,
});
jest.runOnlyPendingTimers();
@@ -239,6 +248,26 @@ describe('Pipeline graph wrapper', () => {
it('appears', () => {
expect(getViewSelector().exists()).toBe(true);
});
+
+ it('switches between views', async () => {
+ const groupsInFirstColumn =
+ mockPipelineResponse.data.project.pipeline.stages.nodes[0].groups.nodes.length;
+ expect(getAllStageColumnGroupsInColumn()).toHaveLength(groupsInFirstColumn);
+ expect(getStageColumnTitle().text()).toBe('Build');
+ await getViewSelector().vm.$emit('updateViewType', LAYER_VIEW);
+ expect(getAllStageColumnGroupsInColumn()).toHaveLength(groupsInFirstColumn + 1);
+ expect(getStageColumnTitle().text()).toBe('');
+ });
+
+ it('calls listByLayers only once no matter how many times view is switched', async () => {
+ expect(layersFn).not.toHaveBeenCalled();
+ await getViewSelector().vm.$emit('updateViewType', LAYER_VIEW);
+ expect(layersFn).toHaveBeenCalledTimes(1);
+ await getViewSelector().vm.$emit('updateViewType', STAGE_VIEW);
+ await getViewSelector().vm.$emit('updateViewType', LAYER_VIEW);
+ await getViewSelector().vm.$emit('updateViewType', STAGE_VIEW);
+ expect(layersFn).toHaveBeenCalledTimes(1);
+ });
});
});
});
diff --git a/spec/frontend/pipelines/graph/linked_pipelines_column_spec.js b/spec/frontend/pipelines/graph/linked_pipelines_column_spec.js
index 4c72dad735e..8aecfc1b649 100644
--- a/spec/frontend/pipelines/graph/linked_pipelines_column_spec.js
+++ b/spec/frontend/pipelines/graph/linked_pipelines_column_spec.js
@@ -2,10 +2,17 @@ import { mount, shallowMount, createLocalVue } from '@vue/test-utils';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
import getPipelineDetails from 'shared_queries/pipelines/get_pipeline_details.query.graphql';
-import { DOWNSTREAM, GRAPHQL, UPSTREAM } from '~/pipelines/components/graph/constants';
+import {
+ DOWNSTREAM,
+ GRAPHQL,
+ UPSTREAM,
+ LAYER_VIEW,
+ STAGE_VIEW,
+} from '~/pipelines/components/graph/constants';
import PipelineGraph from '~/pipelines/components/graph/graph_component.vue';
import LinkedPipeline from '~/pipelines/components/graph/linked_pipeline.vue';
import LinkedPipelinesColumn from '~/pipelines/components/graph/linked_pipelines_column.vue';
+import * as parsingUtils from '~/pipelines/components/parsing_utils';
import { LOAD_FAILURE } from '~/pipelines/constants';
import {
mockPipelineResponse,
@@ -20,6 +27,7 @@ describe('Linked Pipelines Column', () => {
columnTitle: 'Downstream',
linkedPipelines: processedPipeline.downstream,
type: DOWNSTREAM,
+ viewType: STAGE_VIEW,
configPaths: {
metricsPath: '',
graphqlResourceEtag: 'this/is/a/path',
@@ -67,7 +75,7 @@ describe('Linked Pipelines Column', () => {
describe('it renders correctly', () => {
beforeEach(() => {
- createComponent();
+ createComponentWithApollo();
});
it('renders the pipeline title', () => {
@@ -91,6 +99,27 @@ describe('Linked Pipelines Column', () => {
await wrapper.vm.$nextTick();
};
+ describe('layer type rendering', () => {
+ let layersFn;
+
+ beforeEach(() => {
+ layersFn = jest.spyOn(parsingUtils, 'listByLayers');
+ createComponentWithApollo({ mountFn: mount });
+ });
+
+ it('calls listByLayers only once no matter how many times view is switched', async () => {
+ expect(layersFn).not.toHaveBeenCalled();
+ await clickExpandButtonAndAwaitTimers();
+ await wrapper.setProps({ viewType: LAYER_VIEW });
+ await wrapper.vm.$nextTick();
+ expect(layersFn).toHaveBeenCalledTimes(1);
+ await wrapper.setProps({ viewType: STAGE_VIEW });
+ await wrapper.setProps({ viewType: LAYER_VIEW });
+ await wrapper.setProps({ viewType: STAGE_VIEW });
+ expect(layersFn).toHaveBeenCalledTimes(1);
+ });
+ });
+
describe('downstream', () => {
describe('when successful', () => {
beforeEach(() => {
diff --git a/spec/frontend/pipelines/graph/mock_data.js b/spec/frontend/pipelines/graph/mock_data.js
index 7650cbd2d5c..e2d94055205 100644
--- a/spec/frontend/pipelines/graph/mock_data.js
+++ b/spec/frontend/pipelines/graph/mock_data.js
@@ -434,21 +434,7 @@ export const mockPipelineResponse = {
},
needs: {
__typename: 'CiBuildNeedConnection',
- nodes: [
- {
- __typename: 'CiBuildNeed',
- name: 'build_c',
- },
- {
- __typename: 'CiBuildNeed',
- name: 'build_b',
- },
- {
- __typename: 'CiBuildNeed',
- name:
- 'build_a_nlfjkdnlvskfnksvjknlfdjvlvnjdkjdf_nvjkenjkrlngjeknjkl',
- },
- ],
+ nodes: [],
},
},
],
diff --git a/spec/frontend/pipelines/unwrapping_utils_spec.js b/spec/frontend/pipelines/unwrapping_utils_spec.js
index cd16ed7262e..a6ce7d4049f 100644
--- a/spec/frontend/pipelines/unwrapping_utils_spec.js
+++ b/spec/frontend/pipelines/unwrapping_utils_spec.js
@@ -96,11 +96,11 @@ const completeMock = [
describe('Shared pipeline unwrapping utils', () => {
describe('unwrapGroups', () => {
it('takes stages without nodes and returns the unwrapped groups', () => {
- expect(unwrapGroups(stagesAndGroups)[0].groups).toEqual(groupsArray);
+ expect(unwrapGroups(stagesAndGroups)[0].node.groups).toEqual(groupsArray);
});
it('keeps other stage properties intact', () => {
- expect(unwrapGroups(stagesAndGroups)[0]).toMatchObject(basicStageInfo);
+ expect(unwrapGroups(stagesAndGroups)[0].node).toMatchObject(basicStageInfo);
});
});
diff --git a/spec/lib/gitlab/checks/project_created_spec.rb b/spec/lib/gitlab/checks/project_created_spec.rb
index f099f19b061..74e43b04b6b 100644
--- a/spec/lib/gitlab/checks/project_created_spec.rb
+++ b/spec/lib/gitlab/checks/project_created_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe Gitlab::Checks::ProjectCreated, :clean_gitlab_redis_shared_state do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :repository, namespace: user.namespace) }
+
let(:protocol) { 'http' }
let(:git_user) { user }
let(:repository) { project.repository }
diff --git a/spec/lib/gitlab/checks/project_moved_spec.rb b/spec/lib/gitlab/checks/project_moved_spec.rb
index c7dad0a91d4..469aea8d093 100644
--- a/spec/lib/gitlab/checks/project_moved_spec.rb
+++ b/spec/lib/gitlab/checks/project_moved_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe Gitlab::Checks::ProjectMoved, :clean_gitlab_redis_shared_state do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :repository, :wiki_repo, namespace: user.namespace) }
+
let(:repository) { project.repository }
let(:protocol) { 'http' }
let(:git_user) { user }
@@ -101,6 +102,7 @@ RSpec.describe Gitlab::Checks::ProjectMoved, :clean_gitlab_redis_shared_state do
context 'with project snippet' do
let_it_be(:snippet) { create(:project_snippet, :repository, project: project, author: user) }
+
let(:repository) { snippet.repository }
it_behaves_like 'errors per protocol' do
@@ -111,6 +113,7 @@ RSpec.describe Gitlab::Checks::ProjectMoved, :clean_gitlab_redis_shared_state do
context 'with personal snippet' do
let_it_be(:snippet) { create(:personal_snippet, :repository, author: user) }
+
let(:repository) { snippet.repository }
it 'returns nil' do
diff --git a/spec/lib/gitlab/graphql/batch_key_spec.rb b/spec/lib/gitlab/graphql/batch_key_spec.rb
index 881fba5c1be..7b73b27f24b 100644
--- a/spec/lib/gitlab/graphql/batch_key_spec.rb
+++ b/spec/lib/gitlab/graphql/batch_key_spec.rb
@@ -6,6 +6,7 @@ require 'test_prof/recipes/rspec/let_it_be'
RSpec.describe ::Gitlab::Graphql::BatchKey do
let_it_be(:rect) { Struct.new(:len, :width) }
let_it_be(:circle) { Struct.new(:radius) }
+
let(:lookahead) { nil }
let(:object) { rect.new(2, 3) }
diff --git a/spec/lib/gitlab/graphql/loaders/batch_lfs_oid_loader_spec.rb b/spec/lib/gitlab/graphql/loaders/batch_lfs_oid_loader_spec.rb
index ae5d9686c54..35750a87fb5 100644
--- a/spec/lib/gitlab/graphql/loaders/batch_lfs_oid_loader_spec.rb
+++ b/spec/lib/gitlab/graphql/loaders/batch_lfs_oid_loader_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Gitlab::Graphql::Loaders::BatchLfsOidLoader do
include GraphqlHelpers
let_it_be(:project) { create(:project, :repository) }
+
let(:repository) { project.repository }
let(:blob) { Gitlab::Graphql::Representation::TreeEntry.new(repository.blob_at('master', 'files/lfs/lfs_object.iso'), repository) }
let(:otherblob) { Gitlab::Graphql::Representation::TreeEntry.new(repository.blob_at('master', 'README'), repository) }
diff --git a/spec/lib/gitlab/graphql/markdown_field_spec.rb b/spec/lib/gitlab/graphql/markdown_field_spec.rb
index 0e36ea14ac3..44ca23f547c 100644
--- a/spec/lib/gitlab/graphql/markdown_field_spec.rb
+++ b/spec/lib/gitlab/graphql/markdown_field_spec.rb
@@ -57,6 +57,7 @@ RSpec.describe Gitlab::Graphql::MarkdownField do
describe 'basic verification that references work' do
let_it_be(:project) { create(:project, :public) }
+
let(:issue) { create(:issue, project: project) }
let(:note) { build(:note, note: "Referencing #{issue.to_reference(full: true)}") }
diff --git a/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb b/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb
index 02e67488d3f..839ad9110cc 100644
--- a/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb
+++ b/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb
@@ -337,6 +337,7 @@ RSpec.describe Gitlab::Graphql::Pagination::Keyset::Connection do
describe '#nodes' do
let_it_be(:all_nodes) { create_list(:project, 5) }
+
let(:paged_nodes) { subject.nodes }
it_behaves_like 'connection with paged nodes' do
diff --git a/spec/lib/gitlab/graphql/pagination/keyset/last_items_spec.rb b/spec/lib/gitlab/graphql/pagination/keyset/last_items_spec.rb
index ec2ec4bf50d..792cb03e8c7 100644
--- a/spec/lib/gitlab/graphql/pagination/keyset/last_items_spec.rb
+++ b/spec/lib/gitlab/graphql/pagination/keyset/last_items_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Gitlab::Graphql::Pagination::Keyset::LastItems do
let_it_be(:merge_request) { create(:merge_request) }
+
let(:scope) { MergeRequest.order_merged_at_asc }
subject { described_class.take_items(*args) }
diff --git a/spec/serializers/service_field_entity_spec.rb b/spec/serializers/service_field_entity_spec.rb
index 7e879cc2e87..007042e1087 100644
--- a/spec/serializers/service_field_entity_spec.rb
+++ b/spec/serializers/service_field_entity_spec.rb
@@ -23,10 +23,10 @@ RSpec.describe ServiceFieldEntity do
type: 'text',
name: 'username',
title: 'Username or Email',
- placeholder: 'Use a username for server version and an email for cloud version',
+ placeholder: nil,
+ help: 'Use a username for server version and an email for cloud version.',
required: true,
choices: nil,
- help: nil,
value: 'jira_username'
}
@@ -42,10 +42,10 @@ RSpec.describe ServiceFieldEntity do
type: 'password',
name: 'password',
title: 'Enter new password or API token',
- placeholder: 'Use a password for server version and an API token for cloud version',
+ placeholder: nil,
+ help: 'Leave blank to use your current password or API token.',
required: true,
choices: nil,
- help: 'Leave blank to use your current password or API token',
value: 'true'
}
diff --git a/yarn.lock b/yarn.lock
index ecc8a449a2c..ea9840c8c58 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -907,10 +907,10 @@
resolved "https://registry.yarnpkg.com/@gitlab/tributejs/-/tributejs-1.0.0.tgz#672befa222aeffc83e7d799b0500a7a4418e59b8"
integrity sha512-nmKw1+hB6MHvlmPz63yPwVs1qQkycHwsKgxpEbzmky16Y6mL4EJMk3w1b8QlOAF/AIAzjCERPhe/R4MJiohbZw==
-"@gitlab/ui@29.1.0":
- version "29.1.0"
- resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-29.1.0.tgz#0db1c12ca1ee9882613a73ddc964a81db2697c2f"
- integrity sha512-jmsh67gmucdLxP7MBYt+SkLCXa62nYZy9/iRLZk4B+QdyEOzbpqj0ydAmPjMjFNfOV18KHKC6Lvpw4kUDE/GRA==
+"@gitlab/ui@29.2.1":
+ version "29.2.1"
+ resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-29.2.1.tgz#e6377131f3a22eebe07903198ec874ca5d26884c"
+ integrity sha512-vLzCMQsppGLpzWRaNxXpx86y6JjSOEnQXQxtLudnSJktWl0uHfglED2xe7vJQJo+qmzQf6T5m3gbVupj/pG4+A==
dependencies:
"@babel/standalone" "^7.0.0"
"@gitlab/vue-toasted" "^1.3.0"