Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
93f2849ea5
commit
6d3c75444a
Binary file not shown.
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.5 KiB |
Binary file not shown.
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.6 KiB |
|
@ -157,6 +157,7 @@ export default {
|
|||
symbol: '%',
|
||||
token: MilestoneToken,
|
||||
unique: true,
|
||||
shouldSkipSort: true,
|
||||
fetchMilestones: this.fetchMilestones,
|
||||
},
|
||||
{
|
||||
|
|
|
@ -57,7 +57,12 @@ export default {
|
|||
.fetchMilestones(searchTerm)
|
||||
.then((response) => {
|
||||
const data = Array.isArray(response) ? response : response.data;
|
||||
this.milestones = data.slice().sort(sortMilestonesByDueDate);
|
||||
|
||||
if (this.config.shouldSkipSort) {
|
||||
this.milestones = data;
|
||||
} else {
|
||||
this.milestones = data.slice().sort(sortMilestonesByDueDate);
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
createFlash({ message: __('There was a problem fetching milestones.') });
|
||||
|
|
|
@ -108,7 +108,7 @@ module Blobs
|
|||
def limit(lines)
|
||||
return lines if full?
|
||||
|
||||
lines[since - 1..to - 1]
|
||||
lines[since - 1..to - 1] || []
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -5,4 +5,4 @@ rollout_issue_url:
|
|||
milestone: '13.3'
|
||||
type: development
|
||||
group: group::source code
|
||||
default_enabled: false
|
||||
default_enabled: true
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
---
|
||||
name: security_finding_build_disable_joins
|
||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/72738
|
||||
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/342380
|
||||
milestone: '14.4'
|
||||
type: development
|
||||
group: group::threat insights
|
||||
default_enabled: true
|
|
@ -23,7 +23,7 @@ GET /projects/:id/deployments
|
|||
| `updated_after` | datetime | no | Return deployments updated after the specified date. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`). |
|
||||
| `updated_before` | datetime | no | Return deployments updated before the specified date. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`). |
|
||||
| `environment` | string | no | The [name of the environment](../ci/environments/index.md) to filter deployments by. |
|
||||
| `status` | string | no | The status to filter deployments by. One of `created`, `running`, `success`, `failed`, `canceled`.
|
||||
| `status` | string | no | The status to filter deployments by. One of `created`, `running`, `success`, `failed`, `canceled`, `blocked`.
|
||||
|
||||
```shell
|
||||
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/deployments"
|
||||
|
@ -201,6 +201,7 @@ Example response:
|
|||
"sha": "a91957a858320c0e17f3a0eca7cfacbff50ea29a",
|
||||
"created_at": "2016-08-11T11:32:35.444Z",
|
||||
"updated_at": "2016-08-11T11:34:01.123Z",
|
||||
"status": "success",
|
||||
"user": {
|
||||
"name": "Administrator",
|
||||
"username": "root",
|
||||
|
@ -264,6 +265,29 @@ Example response:
|
|||
}
|
||||
```
|
||||
|
||||
Deployments created by users on GitLab Premium or higher include the `approvals` and `pending_approval_count` properties:
|
||||
|
||||
```json
|
||||
{
|
||||
"status": "created",
|
||||
"pending_approval_count": 0,
|
||||
"approvals": [
|
||||
{
|
||||
"user": {
|
||||
"id": 49,
|
||||
"username": "project_6_bot",
|
||||
"name": "****",
|
||||
"state": "active",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/e83ac685f68ea07553ad3054c738c709?s=80&d=identicon",
|
||||
"web_url": "http://localhost:3000/project_6_bot"
|
||||
},
|
||||
"status": "approved"
|
||||
}
|
||||
],
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
## Create a deployment
|
||||
|
||||
```plaintext
|
||||
|
@ -311,6 +335,29 @@ Example response:
|
|||
}
|
||||
```
|
||||
|
||||
Deployments created by users on GitLab Premium or higher include the `approvals` and `pending_approval_count` properties:
|
||||
|
||||
```json
|
||||
{
|
||||
"status": "created",
|
||||
"pending_approval_count": 0,
|
||||
"approvals": [
|
||||
{
|
||||
"user": {
|
||||
"id": 49,
|
||||
"username": "project_6_bot",
|
||||
"name": "****",
|
||||
"state": "active",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/e83ac685f68ea07553ad3054c738c709?s=80&d=identicon",
|
||||
"web_url": "http://localhost:3000/project_6_bot"
|
||||
},
|
||||
"status": "approved"
|
||||
}
|
||||
],
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
## Update a deployment
|
||||
|
||||
```plaintext
|
||||
|
@ -354,6 +401,29 @@ Example response:
|
|||
}
|
||||
```
|
||||
|
||||
Deployments created by users on GitLab Premium or higher include the `approvals` and `pending_approval_count` properties:
|
||||
|
||||
```json
|
||||
{
|
||||
"status": "created",
|
||||
"pending_approval_count": 0,
|
||||
"approvals": [
|
||||
{
|
||||
"user": {
|
||||
"id": 49,
|
||||
"username": "project_6_bot",
|
||||
"name": "****",
|
||||
"state": "active",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/e83ac685f68ea07553ad3054c738c709?s=80&d=identicon",
|
||||
"web_url": "http://localhost:3000/project_6_bot"
|
||||
},
|
||||
"status": "approved"
|
||||
}
|
||||
],
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
## List of merge requests associated with a deployment
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/35739) in GitLab 12.7.
|
||||
|
|
|
@ -95,7 +95,11 @@ curl --data "status=approved" \
|
|||
|
||||
#### Using the API
|
||||
|
||||
Use the [Deployments API](../../api/deployments.md) to see deployments. The `status` field indicates if a deployment is blocked.
|
||||
Use the [Deployments API](../../api/deployments.md) to see deployments.
|
||||
|
||||
- The `status` field indicates if a deployment is blocked.
|
||||
- The `pending_approval_count` field indicates how many approvals are remaining to run a deployment.
|
||||
- The `approvals` field contains the deployment's approvals.
|
||||
|
||||
## Related features
|
||||
|
||||
|
|
|
@ -211,15 +211,25 @@ averaged.
|
|||
|
||||
To define a coverage-parsing regular expression:
|
||||
|
||||
- In the GitLab UI:
|
||||
|
||||
1. On the top bar, select **Menu > Projects** and find your project.
|
||||
1. On the left sidebar, select **Settings > CI/CD**.
|
||||
1. Expand **General pipelines**.
|
||||
1. In the **Test coverage parsing** field, enter a regular expression. Leave blank to disable this feature.
|
||||
|
||||
- Using the project's `.gitlab-ci.yml`, provide a regular expression using the [`coverage`](../yaml/index.md#coverage)
|
||||
keyword.
|
||||
keyword. Setting the regular expression this way takes precedence over the project's CI/CD settings.
|
||||
|
||||
- Using the Project's CI/CD settings:
|
||||
- Set using the GitLab UI:
|
||||
|
||||
1. On the top bar, select **Menu > Projects** and find your project.
|
||||
1. On the left sidebar, select **Settings > CI/CD**.
|
||||
1. Expand **General pipelines**.
|
||||
1. In the **Test coverage parsing** field, enter a regular expression. Leave blank to disable this feature.
|
||||
|
||||
- Set when [editing a project](../../api/projects.md#edit-project) or [creating a project](../../api/projects.md#create-project)
|
||||
using the GitLab API with the `build_coverage_regex` attribute:
|
||||
|
||||
```shell
|
||||
curl --request PUT --header "PRIVATE-TOKEN: <your-token>" \
|
||||
--url 'https://gitlab.com/api/v4/projects/<your-project-ID>' \
|
||||
--data "build_coverage_regex=<your-regular-expression>"
|
||||
```
|
||||
|
||||
You can use <https://rubular.com> to test your regular expression. The regular expression returns the **last**
|
||||
match found in the output.
|
||||
|
|
|
@ -1348,6 +1348,8 @@ In this example:
|
|||
|
||||
**Additional details**:
|
||||
|
||||
- Coverage regular expressions set in `gitlab-ci.yml` take precedence over coverage regular expression set in the
|
||||
[GitLab UI](../pipelines/settings.md#add-test-coverage-results-to-a-merge-request).
|
||||
- If there is more than one matched line in the job output, the last line is used
|
||||
(the first result of reverse search).
|
||||
- If there are multiple matches in a single line, the last match is searched
|
||||
|
|
|
@ -47,7 +47,7 @@ module API
|
|||
|
||||
desc 'Gets a specific deployment' do
|
||||
detail 'This feature was introduced in GitLab 8.11.'
|
||||
success Entities::Deployment
|
||||
success Entities::DeploymentExtended
|
||||
end
|
||||
params do
|
||||
requires :deployment_id, type: Integer, desc: 'The deployment ID'
|
||||
|
@ -57,12 +57,12 @@ module API
|
|||
|
||||
deployment = user_project.deployments.find(params[:deployment_id])
|
||||
|
||||
present deployment, with: Entities::Deployment
|
||||
present deployment, with: Entities::DeploymentExtended
|
||||
end
|
||||
|
||||
desc 'Creates a new deployment' do
|
||||
detail 'This feature was introduced in GitLab 12.4'
|
||||
success Entities::Deployment
|
||||
success Entities::DeploymentExtended
|
||||
end
|
||||
params do
|
||||
requires :environment,
|
||||
|
@ -106,7 +106,7 @@ module API
|
|||
deployment = service.execute
|
||||
|
||||
if deployment.persisted?
|
||||
present(deployment, with: Entities::Deployment, current_user: current_user)
|
||||
present(deployment, with: Entities::DeploymentExtended, current_user: current_user)
|
||||
else
|
||||
render_validation_error!(deployment)
|
||||
end
|
||||
|
@ -114,7 +114,7 @@ module API
|
|||
|
||||
desc 'Updates an existing deployment' do
|
||||
detail 'This feature was introduced in GitLab 12.4'
|
||||
success Entities::Deployment
|
||||
success Entities::DeploymentExtended
|
||||
end
|
||||
params do
|
||||
requires :status,
|
||||
|
@ -136,7 +136,7 @@ module API
|
|||
service = ::Deployments::UpdateService.new(deployment, declared_params)
|
||||
|
||||
if service.execute
|
||||
present(deployment, with: Entities::Deployment, current_user: current_user)
|
||||
present(deployment, with: Entities::DeploymentExtended, current_user: current_user)
|
||||
else
|
||||
render_validation_error!(deployment)
|
||||
end
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module API
|
||||
module Entities
|
||||
class DeploymentExtended < Deployment
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
API::Entities::DeploymentExtended.prepend_mod
|
|
@ -248,7 +248,7 @@ module Gitlab
|
|||
# @return [String]
|
||||
# @raise [LimitExceeded] if the resulting json string is bigger than the specified limit
|
||||
def self.encode(object, limit: 25.megabytes)
|
||||
return ::Gitlab::Json.dump(object) unless Feature.enabled?(:json_limited_encoder)
|
||||
return ::Gitlab::Json.dump(object) unless Feature.enabled?(:json_limited_encoder, default_enabled: :yaml)
|
||||
|
||||
buffer = StringIO.new
|
||||
buffer_size = 0
|
||||
|
|
|
@ -8,7 +8,8 @@
|
|||
"created_at",
|
||||
"updated_at",
|
||||
"user",
|
||||
"deployable"
|
||||
"deployable",
|
||||
"status"
|
||||
],
|
||||
"properties": {
|
||||
"id": { "type": "integer" },
|
||||
|
@ -30,6 +31,5 @@
|
|||
]
|
||||
},
|
||||
"status": { "type": "string" }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
|
|
|
@ -612,6 +612,7 @@ export const mockTokens = (fetchLabels, fetchAuthors, fetchMilestones, isSignedI
|
|||
title: __('Milestone'),
|
||||
symbol: '%',
|
||||
type: 'milestone',
|
||||
shouldSkipSort: true,
|
||||
token: MilestoneToken,
|
||||
unique: true,
|
||||
fetchMilestones,
|
||||
|
|
|
@ -32,7 +32,7 @@ const defaultStubs = {
|
|||
|
||||
function createComponent(options = {}) {
|
||||
const {
|
||||
config = mockMilestoneToken,
|
||||
config = { ...mockMilestoneToken, shouldSkipSort: true },
|
||||
value = { data: '' },
|
||||
active = false,
|
||||
stubs = defaultStubs,
|
||||
|
@ -68,6 +68,27 @@ describe('MilestoneToken', () => {
|
|||
|
||||
describe('methods', () => {
|
||||
describe('fetchMilestones', () => {
|
||||
describe('when config.shouldSkipSort is true', () => {
|
||||
beforeEach(() => {
|
||||
wrapper.vm.config.shouldSkipSort = true;
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
wrapper.vm.config.shouldSkipSort = false;
|
||||
});
|
||||
it('does not call sortMilestonesByDueDate', async () => {
|
||||
jest.spyOn(wrapper.vm.config, 'fetchMilestones').mockResolvedValue({
|
||||
data: mockMilestones,
|
||||
});
|
||||
|
||||
wrapper.vm.fetchMilestones();
|
||||
|
||||
await waitForPromises();
|
||||
|
||||
expect(sortMilestonesByDueDate).toHaveBeenCalledTimes(0);
|
||||
});
|
||||
});
|
||||
|
||||
it('calls `config.fetchMilestones` with provided searchTerm param', () => {
|
||||
jest.spyOn(wrapper.vm.config, 'fetchMilestones');
|
||||
|
||||
|
@ -77,10 +98,11 @@ describe('MilestoneToken', () => {
|
|||
});
|
||||
|
||||
it('sets response to `milestones` when request is successful', () => {
|
||||
wrapper.vm.config.shouldSkipSort = false;
|
||||
|
||||
jest.spyOn(wrapper.vm.config, 'fetchMilestones').mockResolvedValue({
|
||||
data: mockMilestones,
|
||||
});
|
||||
|
||||
wrapper.vm.fetchMilestones();
|
||||
|
||||
return waitForPromises().then(() => {
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe API::Entities::DeploymentExtended do
|
||||
describe '#as_json' do
|
||||
subject { described_class.new(deployment).as_json }
|
||||
|
||||
let(:deployment) { create(:deployment) }
|
||||
|
||||
it 'includes fields from deployment entity' do
|
||||
is_expected.to include(:id, :iid, :ref, :sha, :created_at, :updated_at, :user, :environment, :deployable, :status)
|
||||
end
|
||||
end
|
||||
end
|
|
@ -206,6 +206,14 @@ RSpec.describe Blobs::UnfoldPresenter do
|
|||
end
|
||||
end
|
||||
|
||||
context 'when since exceeds number of lines' do
|
||||
let(:params) { { since: 2 } }
|
||||
|
||||
it 'returns an empty list' do
|
||||
expect(subject.lines.size).to eq(0)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when full is true' do
|
||||
let(:params) { { full: true } }
|
||||
|
||||
|
|
Loading…
Reference in New Issue