Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Jérome Perrin
gitlab-ce
Commits
57d4a172
Commit
57d4a172
authored
Jul 18, 2016
by
Rémy Coutable
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/master' into 8-10-stable
parents
7ce5bb18
240a4aa6
Changes
44
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
44 changed files
with
1150 additions
and
98 deletions
+1150
-98
CHANGELOG
CHANGELOG
+8
-0
app/assets/stylesheets/pages/pipelines.scss
app/assets/stylesheets/pages/pipelines.scss
+2
-0
app/models/ability.rb
app/models/ability.rb
+2
-1
app/models/ci/build.rb
app/models/ci/build.rb
+1
-0
app/models/ci/pipeline.rb
app/models/ci/pipeline.rb
+2
-0
app/models/concerns/awardable.rb
app/models/concerns/awardable.rb
+7
-2
app/models/note.rb
app/models/note.rb
+1
-2
app/models/project.rb
app/models/project.rb
+4
-4
app/models/user.rb
app/models/user.rb
+1
-0
app/services/ci/create_pipeline_service.rb
app/services/ci/create_pipeline_service.rb
+1
-0
app/services/create_commit_builds_service.rb
app/services/create_commit_builds_service.rb
+7
-1
app/services/notes/create_service.rb
app/services/notes/create_service.rb
+0
-1
app/views/projects/ci/pipelines/_pipeline.html.haml
app/views/projects/ci/pipelines/_pipeline.html.haml
+3
-12
app/workers/project_export_worker.rb
app/workers/project_export_worker.rb
+1
-1
db/migrate/20160715132507_add_user_id_to_pipeline.rb
db/migrate/20160715132507_add_user_id_to_pipeline.rb
+7
-0
db/migrate/20160715134306_add_index_for_pipeline_user_id.rb
db/migrate/20160715134306_add_index_for_pipeline_user_id.rb
+7
-0
db/schema.rb
db/schema.rb
+3
-1
doc/api/issues.md
doc/api/issues.md
+20
-9
doc/ci/yaml/README.md
doc/ci/yaml/README.md
+2
-2
lib/api/award_emoji.rb
lib/api/award_emoji.rb
+2
-2
lib/api/commit_statuses.rb
lib/api/commit_statuses.rb
+1
-1
lib/api/entities.rb
lib/api/entities.rb
+1
-0
lib/api/internal.rb
lib/api/internal.rb
+6
-1
lib/api/issues.rb
lib/api/issues.rb
+6
-4
lib/banzai/filter/syntax_highlight_filter.rb
lib/banzai/filter/syntax_highlight_filter.rb
+8
-7
lib/gitlab/backend/grack_auth.rb
lib/gitlab/backend/grack_auth.rb
+1
-1
lib/gitlab/lfs/response.rb
lib/gitlab/lfs/response.rb
+2
-0
lib/gitlab/lfs/router.rb
lib/gitlab/lfs/router.rb
+0
-2
spec/features/security/project/internal_access_spec.rb
spec/features/security/project/internal_access_spec.rb
+19
-0
spec/features/security/project/private_access_spec.rb
spec/features/security/project/private_access_spec.rb
+19
-0
spec/features/security/project/public_access_spec.rb
spec/features/security/project/public_access_spec.rb
+19
-0
spec/lib/banzai/filter/syntax_highlight_filter_spec.rb
spec/lib/banzai/filter/syntax_highlight_filter_spec.rb
+27
-7
spec/lib/gitlab/bitbucket_import/client_spec.rb
spec/lib/gitlab/bitbucket_import/client_spec.rb
+1
-1
spec/models/ci/pipeline_spec.rb
spec/models/ci/pipeline_spec.rb
+3
-0
spec/models/commit_status_spec.rb
spec/models/commit_status_spec.rb
+19
-5
spec/models/project_spec.rb
spec/models/project_spec.rb
+2
-2
spec/models/user_spec.rb
spec/models/user_spec.rb
+2
-0
spec/requests/api/award_emoji_spec.rb
spec/requests/api/award_emoji_spec.rb
+32
-0
spec/requests/api/internal_spec.rb
spec/requests/api/internal_spec.rb
+11
-3
spec/requests/api/issues_spec.rb
spec/requests/api/issues_spec.rb
+25
-0
spec/requests/lfs_http_spec.rb
spec/requests/lfs_http_spec.rb
+768
-0
spec/services/auth/container_registry_authentication_service_spec.rb
...es/auth/container_registry_authentication_service_spec.rb
+79
-25
spec/services/create_commit_builds_service_spec.rb
spec/services/create_commit_builds_service_spec.rb
+2
-1
spec/services/create_deployment_service_spec.rb
spec/services/create_deployment_service_spec.rb
+16
-0
No files found.
CHANGELOG
View file @
57d4a172
...
...
@@ -31,6 +31,7 @@ v 8.10.0 (unreleased)
- Support U2F devices in Firefox. !5177
- Fix issue, preventing users w/o push access to sort tags !5105 (redetection)
- Add Spring EmojiOne updates.
- Fix fetching LFS objects for private CI projects
- Add syntax for multiline blockquote using `>>>` fence !3954
- Fix viewing notification settings when a project is pending deletion
- Updated compare dropdown menus to use GL dropdown
...
...
@@ -47,6 +48,7 @@ v 8.10.0 (unreleased)
- Render inline diffs for multiple changed lines following eachother
- Wildcards for protected branches. !4665
- Allow importing from Github using Personal Access Tokens. (Eric K Idema)
- API: Expose `due_date` for issues (Robert Schilling)
- API: Todos !3188 (Robert Schilling)
- API: Expose shared groups for projects and shared projects for groups !5050 (Robert Schilling)
- Add "Enabled Git access protocols" to Application Settings
...
...
@@ -55,13 +57,16 @@ v 8.10.0 (unreleased)
- Fix user creation with stronger minimum password requirements !4054 (nathan-pmt)
- Only show New Snippet button to users that can create snippets.
- PipelinesFinder uses git cache data
- Track a user who created a pipeline
- Actually render old and new sections of parallel diff next to each other
- Throttle the update of `project.pushes_since_gc` to 1 minute.
- Allow expanding and collapsing files in diff view (!4990)
- Collapse large diffs by default (!4990)
- Fix mentioned users list on diff notes
- Fix creation of deployment on build that is retried, redeployed or rollback
- Check for conflicts with existing Project's wiki path when creating a new project.
- Show last push widget in upstream after push to fork
- Fix stage status shown for pipelines
- Cache todos pending/done dashboard query counts.
- Don't instantiate a git tree on Projects show default view
- Bump Rinku to 2.0.0
...
...
@@ -82,7 +87,9 @@ v 8.10.0 (unreleased)
- Add basic system information like memory and disk usage to the admin panel
- Don't garbage collect commits that have related DB records like comments
- More descriptive message for git hooks and file locks
- Aliases of award emoji should be stored as original name. !5060 (dixpac)
- Handle custom Git hook result in GitLab UI
- Allow to access Container Registry for Public and Internal projects
- Allow '?', or '&' for label names
- Fix importer for GitHub Pull Requests when a branch was reused across Pull Requests
- Add date when user joined the team on the member page
...
...
@@ -103,6 +110,7 @@ v 8.10.0 (unreleased)
- Fix issues importing projects from EE to CE
- Fix creating group with space in group path
- Create Todos for Issue author when assign or mention himself (Katarzyna Kobierska)
- Limit the number of retries on error to 3 for exporting projects
v 8.9.6
- Fix importing of events under notes for GitLab projects. !5154
...
...
app/assets/stylesheets/pages/pipelines.scss
View file @
57d4a172
...
...
@@ -129,6 +129,8 @@
}
.cancel-retry-btns
{
vertical-align
:
middle
;
.btn
:not
(
:first-child
)
{
margin-left
:
8px
;
}
...
...
app/models/ability.rb
View file @
57d4a172
...
...
@@ -204,7 +204,8 @@ class Ability
:download_code
,
:fork_project
,
:read_commit_status
,
:read_pipeline
:read_pipeline
,
:read_container_image
]
end
...
...
app/models/ci/build.rb
View file @
57d4a172
...
...
@@ -53,6 +53,7 @@ module Ci
new_build
.
stage_idx
=
build
.
stage_idx
new_build
.
trigger_request
=
build
.
trigger_request
new_build
.
user
=
user
new_build
.
environment
=
build
.
environment
new_build
.
save
MergeRequests
::
AddTodoWhenBuildFailsService
.
new
(
build
.
project
,
nil
).
close
(
new_build
)
new_build
...
...
app/models/ci/pipeline.rb
View file @
57d4a172
...
...
@@ -6,6 +6,8 @@ module Ci
self
.
table_name
=
'ci_commits'
belongs_to
:project
,
class_name:
'::Project'
,
foreign_key: :gl_project_id
belongs_to
:user
has_many
:statuses
,
class_name:
'CommitStatus'
,
foreign_key: :commit_id
has_many
:builds
,
class_name:
'Ci::Build'
,
foreign_key: :commit_id
has_many
:trigger_requests
,
dependent: :destroy
,
class_name:
'Ci::TriggerRequest'
,
foreign_key: :commit_id
...
...
app/models/concerns/awardable.rb
View file @
57d4a172
...
...
@@ -65,8 +65,7 @@ module Awardable
def
create_award_emoji
(
name
,
current_user
)
return
unless
emoji_awardable?
award_emoji
.
create
(
name:
name
,
user:
current_user
)
award_emoji
.
create
(
name:
normalize_name
(
name
),
user:
current_user
)
end
def
remove_award_emoji
(
name
,
current_user
)
...
...
@@ -80,4 +79,10 @@ module Awardable
create_award_emoji
(
emoji_name
,
current_user
)
end
end
private
def
normalize_name
(
name
)
Gitlab
::
AwardEmoji
.
normalize_emoji_name
(
name
)
end
end
app/models/note.rb
View file @
57d4a172
...
...
@@ -229,8 +229,7 @@ class Note < ActiveRecord::Base
end
def
award_emoji_name
original_name
=
note
.
match
(
Banzai
::
Filter
::
EmojiFilter
.
emoji_pattern
)[
1
]
Gitlab
::
AwardEmoji
.
normalize_emoji_name
(
original_name
)
note
.
match
(
Banzai
::
Filter
::
EmojiFilter
.
emoji_pattern
)[
1
]
end
private
...
...
app/models/project.rb
View file @
57d4a172
...
...
@@ -162,7 +162,7 @@ class Project < ActiveRecord::Base
validates
:namespace
,
presence:
true
validates_uniqueness_of
:name
,
scope: :namespace_id
validates_uniqueness_of
:path
,
scope: :namespace_id
validates
:import_url
,
addressable_url:
true
,
if: :
import_url
validates
:import_url
,
addressable_url:
true
,
if: :
external_import?
validates
:star_count
,
numericality:
{
greater_than_or_equal_to:
0
}
validate
:check_limit
,
on: :create
validate
:avatar_type
,
...
...
@@ -482,7 +482,7 @@ class Project < ActiveRecord::Base
end
def
create_or_update_import_data
(
data:
nil
,
credentials:
nil
)
return
unless
valid_import_url?
return
unless
import_url
.
present?
&&
valid_import_url?
project_import_data
=
import_data
||
build_import_data
if
data
...
...
@@ -1038,8 +1038,8 @@ class Project < ActiveRecord::Base
pipelines
.
order
(
id: :desc
).
find_by
(
sha:
sha
,
ref:
ref
)
end
def
ensure_pipeline
(
sha
,
ref
)
pipeline
(
sha
,
ref
)
||
pipelines
.
create
(
sha:
sha
,
ref:
ref
)
def
ensure_pipeline
(
sha
,
ref
,
current_user
=
nil
)
pipeline
(
sha
,
ref
)
||
pipelines
.
create
(
sha:
sha
,
ref:
ref
,
user:
current_user
)
end
def
enable_ci
...
...
app/models/user.rb
View file @
57d4a172
...
...
@@ -85,6 +85,7 @@ class User < ActiveRecord::Base
has_one
:abuse_report
,
dependent: :destroy
has_many
:spam_logs
,
dependent: :destroy
has_many
:builds
,
dependent: :nullify
,
class_name:
'Ci::Build'
has_many
:pipelines
,
dependent: :nullify
,
class_name:
'Ci::Pipeline'
has_many
:todos
,
dependent: :destroy
has_many
:notification_settings
,
dependent: :destroy
has_many
:award_emoji
,
dependent: :destroy
...
...
app/services/ci/create_pipeline_service.rb
View file @
57d4a172
...
...
@@ -2,6 +2,7 @@ module Ci
class
CreatePipelineService
<
BaseService
def
execute
pipeline
=
project
.
pipelines
.
new
(
params
)
pipeline
.
user
=
current_user
unless
ref_names
.
include?
(
params
[
:ref
])
pipeline
.
errors
.
add
(
:base
,
'Reference not found'
)
...
...
app/services/create_commit_builds_service.rb
View file @
57d4a172
...
...
@@ -14,7 +14,13 @@ class CreateCommitBuildsService
return
false
end
@pipeline
=
Ci
::
Pipeline
.
new
(
project:
project
,
sha:
sha
,
ref:
ref
,
before_sha:
before_sha
,
tag:
tag
)
@pipeline
=
Ci
::
Pipeline
.
new
(
project:
project
,
sha:
sha
,
ref:
ref
,
before_sha:
before_sha
,
tag:
tag
,
user:
user
)
##
# Skip creating pipeline if no gitlab-ci.yml is found
...
...
app/services/notes/create_service.rb
View file @
57d4a172
...
...
@@ -8,7 +8,6 @@ module Notes
if
note
.
award_emoji?
noteable
=
note
.
noteable
todo_service
.
new_award_emoji
(
noteable
,
current_user
)
return
noteable
.
create_award_emoji
(
note
.
award_emoji_name
,
current_user
)
end
...
...
app/views/projects/ci/pipelines/_pipeline.html.haml
View file @
57d4a172
...
...
@@ -32,7 +32,7 @@
Cant find HEAD commit for this branch
-
stages_status
=
pipeline
.
statuses
.
stages_status
-
stages_status
=
pipeline
.
statuses
.
latest
.
stages_status
-
stages
.
each
do
|
stage
|
%td
-
status
=
stages_status
[
stage
]
...
...
@@ -58,16 +58,7 @@
.controls.hidden-xs.pull-right
-
artifacts
=
pipeline
.
builds
.
latest
.
select
{
|
b
|
b
.
artifacts?
}
-
if
artifacts
.
present?
.btn-group.inline
.btn-group
%a
.dropdown-toggle.btn.btn-default
{
type:
'button'
,
'data-toggle'
=>
'dropdown'
}
=
icon
(
"play"
)
%b
.caret
%ul
.dropdown-menu.dropdown-menu-align-right
%li
=
link_to
'#'
do
=
icon
(
"play"
)
%span
Deploy to production
.inline
.btn-group
%a
.dropdown-toggle.btn.btn-default.build-artifacts
{
type:
'button'
,
'data-toggle'
=>
'dropdown'
}
=
icon
(
"download"
)
...
...
@@ -80,7 +71,7 @@
%span
Download '
#{
build
.
name
}
' artifacts
-
if
can?
(
current_user
,
:update_pipeline
,
@project
)
.cancel-retry-btns
.cancel-retry-btns
.inline
-
if
pipeline
.
retryable?
=
link_to
retry_namespace_project_pipeline_path
(
@project
.
namespace
,
@project
,
pipeline
.
id
),
class:
'btn has-tooltip'
,
title:
"Retry"
,
method: :post
do
=
icon
(
"repeat"
)
...
...
app/workers/project_export_worker.rb
View file @
57d4a172
class
ProjectExportWorker
include
Sidekiq
::
Worker
sidekiq_options
queue: :gitlab_shell
,
retry:
true
sidekiq_options
queue: :gitlab_shell
,
retry:
3
def
perform
(
current_user_id
,
project_id
)
current_user
=
User
.
find
(
current_user_id
)
...
...
db/migrate/20160715132507_add_user_id_to_pipeline.rb
0 → 100644
View file @
57d4a172
class
AddUserIdToPipeline
<
ActiveRecord
::
Migration
include
Gitlab
::
Database
::
MigrationHelpers
def
change
add_column
:ci_commits
,
:user_id
,
:integer
end
end
db/migrate/20160715134306_add_index_for_pipeline_user_id.rb
0 → 100644
View file @
57d4a172
class
AddIndexForPipelineUserId
<
ActiveRecord
::
Migration
include
Gitlab
::
Database
::
MigrationHelpers
def
change
add_concurrent_index
:ci_commits
,
:user_id
end
end
db/schema.rb
View file @
57d4a172
...
...
@@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord
::
Schema
.
define
(
version:
2016071
2171823
)
do
ActiveRecord
::
Schema
.
define
(
version:
2016071
5134306
)
do
# These are extensions that must be enabled in order to support this database
enable_extension
"plpgsql"
...
...
@@ -199,6 +199,7 @@ ActiveRecord::Schema.define(version: 20160712171823) do
t
.
datetime
"started_at"
t
.
datetime
"finished_at"
t
.
integer
"duration"
t
.
integer
"user_id"
end
add_index
"ci_commits"
,
[
"gl_project_id"
,
"sha"
],
name:
"index_ci_commits_on_gl_project_id_and_sha"
,
using: :btree
...
...
@@ -210,6 +211,7 @@ ActiveRecord::Schema.define(version: 20160712171823) do
add_index
"ci_commits"
,
[
"project_id"
],
name:
"index_ci_commits_on_project_id"
,
using: :btree
add_index
"ci_commits"
,
[
"sha"
],
name:
"index_ci_commits_on_sha"
,
using: :btree
add_index
"ci_commits"
,
[
"status"
],
name:
"index_ci_commits_on_status"
,
using: :btree
add_index
"ci_commits"
,
[
"user_id"
],
name:
"index_ci_commits_on_user_id"
,
using: :btree
create_table
"ci_events"
,
force: :cascade
do
|
t
|
t
.
integer
"project_id"
...
...
doc/api/issues.md
View file @
57d4a172
...
...
@@ -78,7 +78,8 @@ Example response:
"iid"
:
6
,
"labels"
:
[],
"subscribed"
:
false
,
"user_notes_count"
:
1
"user_notes_count"
:
1
,
"due_date"
:
"2016-07-22"
}
]
```
...
...
@@ -154,7 +155,8 @@ Example response:
"updated_at"
:
"2016-01-04T15:31:46.176Z"
,
"created_at"
:
"2016-01-04T15:31:46.176Z"
,
"subscribed"
:
false
,
"user_notes_count"
:
1
"user_notes_count"
:
1
,
"due_date"
:
null
}
]
```
...
...
@@ -232,7 +234,8 @@ Example response:
"updated_at"
:
"2016-01-04T15:31:46.176Z"
,
"created_at"
:
"2016-01-04T15:31:46.176Z"
,
"subscribed"
:
false
,
"user_notes_count"
:
1
"user_notes_count"
:
1
,
"due_date"
:
"2016-07-22"
}
]
```
...
...
@@ -295,7 +298,8 @@ Example response:
"updated_at"
:
"2016-01-04T15:31:46.176Z"
,
"created_at"
:
"2016-01-04T15:31:46.176Z"
,
"subscribed"
:
false
,
"user_notes_count"
:
1
"user_notes_count"
:
1
,
"due_date"
:
null
}
```
...
...
@@ -320,6 +324,7 @@ POST /projects/:id/issues
|
`milestone_id`
| integer | no | The ID of a milestone to assign issue |
|
`labels`
| string | no | Comma-separated label names for an issue |
|
`created_at`
| string | no | Date time string, ISO 8601 formatted, e.g.
`2016-03-11T03:45:40Z`
|
|
`due_date`
| string | no | Date time string in the format YEAR-MONTH-DAY, e.g.
`2016-03-11`
|
```
bash
curl
-X
POST
-H
"PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK"
https://gitlab.example.com/api/v3/projects/4/issues?title
=
Issues%20with%20auth&labels
=
bug
...
...
@@ -351,7 +356,8 @@ Example response:
"updated_at"
:
"2016-01-07T12:44:33.959Z"
,
"milestone"
:
null
,
"subscribed"
:
true
,
"user_notes_count"
:
0
"user_notes_count"
:
0
,
"due_date"
:
null
}
```
...
...
@@ -379,6 +385,7 @@ PUT /projects/:id/issues/:issue_id
|
`labels`
| string | no | Comma-separated label names for an issue |
|
`state_event`
| string | no | The state event of an issue. Set
`close`
to close the issue and
`reopen`
to reopen it |
|
`updated_at`
| string | no | Date time string, ISO 8601 formatted, e.g.
`2016-03-11T03:45:40Z`
|
|
`due_date`
| string | no | Date time string in the format YEAR-MONTH-DAY, e.g.
`2016-03-11`
|
```
bash
curl
-X
PUT
-H
"PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK"
https://gitlab.example.com/api/v3/projects/4/issues/85?state_event
=
close
...
...
@@ -410,7 +417,8 @@ Example response:
"assignee"
:
null
,
"milestone"
:
null
,
"subscribed"
:
true
,
"user_notes_count"
:
0
"user_notes_count"
:
0
,
"due_date"
:
"2016-07-22"
}
```
...
...
@@ -487,7 +495,8 @@ Example response:
"state"
:
"active"
,
"avatar_url"
:
"http://www.gravatar.com/avatar/7a190fecbaa68212a4b68aeb6e3acd10?s=80&d=identicon"
,
"web_url"
:
"https://gitlab.example.com/u/solon.cremin"
}
},
"due_date"
:
null
}
```
...
...
@@ -541,7 +550,8 @@ Example response:
"state"
:
"active"
,
"avatar_url"
:
"http://www.gravatar.com/avatar/7a190fecbaa68212a4b68aeb6e3acd10?s=80&d=identicon"
,
"web_url"
:
"https://gitlab.example.com/u/solon.cremin"
}
},
"due_date"
:
null
}
```
...
...
@@ -596,7 +606,8 @@ Example response:
"avatar_url"
:
"http://www.gravatar.com/avatar/5224fd70153710e92fb8bcf79ac29d67?s=80&d=identicon"
,
"web_url"
:
"https://gitlab.example.com/u/orville"
},
"subscribed"
:
false
"subscribed"
:
false
,
"due_date"
:
null
}
```
...
...
doc/ci/yaml/README.md
View file @
57d4a172
...
...
@@ -985,11 +985,11 @@ directive defined in `.postgres_services` and `.mysql_services` respectively:
-
ruby
test:postgres:
<< *job_definition
<<
:
*job_definition
services
:
*postgres_definition
test:mysql:
<< *job_definition
<<
:
*job_definition
services
:
*mysql_definition
```
...
...
lib/api/award_emoji.rb
View file @
57d4a172
...
...
@@ -56,9 +56,9 @@ module API
not_found!
(
'Award Emoji'
)
unless
can_read_awardable?
award
=
awardable
.
award_emoji
.
new
(
name:
params
[
:name
],
user:
current_user
)
award
=
awardable
.
create_award_emoji
(
params
[
:name
],
current_user
)
if
award
.
save
if
award
.
persisted?
present
award
,
with:
Entities
::
AwardEmoji
else
not_found!
(
"Award Emoji
#{
award
.
errors
.
messages
}
"
)
...
...
lib/api/commit_statuses.rb
View file @
57d4a172
...
...
@@ -64,7 +64,7 @@ module API
ref
=
branches
.
first
end
pipeline
=
@project
.
ensure_pipeline
(
commit
.
sha
,
ref
)
pipeline
=
@project
.
ensure_pipeline
(
commit
.
sha
,
ref
,
current_user
)
name
=
params
[
:name
]
||
params
[
:context
]
status
=
GenericCommitStatus
.
running_or_pending
.
find_by
(
pipeline:
pipeline
,
name:
name
,
ref:
params
[
:ref
])
...
...
lib/api/entities.rb
View file @
57d4a172
...
...
@@ -187,6 +187,7 @@ module API
end
expose
:user_notes_count
expose
:upvotes
,
:downvotes
expose
:due_date
end
class
ExternalIssue
<
Grape
::
Entity
...
...
lib/api/internal.rb
View file @
57d4a172
...
...
@@ -63,7 +63,12 @@ module API
if
access_status
.
status
# Return the repository full path so that gitlab-shell has it when
# handling ssh commands
response
[
:repository_path
]
=
project
.
repository
.
path_to_repo
response
[
:repository_path
]
=
if
wiki?
project
.
wiki
.
repository
.
path_to_repo
else
project
.
repository
.
path_to_repo
end
end
response
...
...
lib/api/issues.rb
View file @
57d4a172
...
...
@@ -152,12 +152,13 @@ module API
# milestone_id (optional) - The ID of a milestone to assign issue
# labels (optional) - The labels of an issue
# created_at (optional) - Date time string, ISO 8601 formatted
# due_date (optional) - Date time string in the format YEAR-MONTH-DAY
# Example Request:
# POST /projects/:id/issues
post
":id/issues"
do
post
':id/issues'
do
required_attributes!
[
:title
]
keys
=
[
:title
,
:description
,
:assignee_id
,
:milestone_id
]
keys
=
[
:title
,
:description
,
:assignee_id
,
:milestone_id
,
:due_date
]
keys
<<
:created_at
if
current_user
.
admin?
||
user_project
.
owner
==
current_user
attrs
=
attributes_for_keys
(
keys
)
...
...
@@ -201,12 +202,13 @@ module API
# labels (optional) - The labels of an issue
# state_event (optional) - The state event of an issue (close|reopen)
# updated_at (optional) - Date time string, ISO 8601 formatted
# due_date (optional) - Date time string in the format YEAR-MONTH-DAY
# Example Request:
# PUT /projects/:id/issues/:issue_id
put
":id/issues/:issue_id"
do
put
':id/issues/:issue_id'
do
issue
=
user_project
.
issues
.
find
(
params
[
:issue_id
])
authorize!
:update_issue
,
issue
keys
=
[
:title
,
:description
,
:assignee_id
,
:milestone_id
,
:state_event
]
keys
=
[
:title
,
:description
,
:assignee_id
,
:milestone_id
,
:state_event
,
:due_date
]
keys
<<
:updated_at
if
current_user
.
admin?
||
user_project
.
owner
==
current_user
attrs
=
attributes_for_keys
(
keys
)
...
...
lib/banzai/filter/syntax_highlight_filter.rb
View file @
57d4a172
...
...
@@ -19,21 +19,22 @@ module Banzai
language
=
node
.
attr
(
'class'
)
code
=
node
.
text
lexer
=
Rouge
::
Lexer
.
find_fancy
(
language
)
css_classes
=
"code highlight"
lexer
=
Rouge
::
Lexer
.
find_fancy
(
language
)
||
Rouge
::
Lexers
::
PlainText
formatter
=
Rouge
::
Formatters
::
HTML
.
new
css_classes
=
"code highlight js-syntax-highlight
#{
lexer
.
tag
}
"
begin
highlighted
=
''
highlighted
<<
%(<pre class="#{css_classes}"><code>)
highlighted
<<
formatter
.
format
(
lexer
.
lex
(
code
))
highlighted
<<
%(</code></pre>)
code
=
formatter
.
format
(
lexer
.
lex
(
code
))
css_classes
<<
" js-syntax-highlight
#{
lexer
.
tag
}
"
rescue
# Gracefully handle syntax highlighter bugs/errors to ensure
# users can still access an issue/comment/etc.
highlighted
=
"<pre>
#{
code
}
</pre>"
end
highlighted
=
%(<pre class="#{css_classes}"><code>#{code}</code></pre>)
# Extracted to a method to measure it
replace_parent_pre_element
(
node
,
highlighted
)
end
...
...
lib/gitlab/backend/grack_auth.rb
View file @
57d4a172
...
...
@@ -63,7 +63,7 @@ module Grack
def
ci_request?
(
login
,
password
)
matched_login
=
/(?<s>^[a-zA-Z]*-ci)-token$/
.
match
(
login
)
if
project
&&
matched_login
.
present?
&&
git_cmd
==
'git-upload-pack'
if
project
&&
matched_login
.
present?
underscored_service
=
matched_login
[
's'
].
underscore
if
underscored_service
==
'gitlab_ci'
...
...
lib/gitlab/lfs/response.rb
View file @
57d4a172
...
...
@@ -47,6 +47,8 @@ module Gitlab
end
def
render_storage_upload_store_response
(
oid
,
size
,
tmp_file_name
)
return
render_forbidden
unless
tmp_file_name
render_response_to_push
do
render_lfs_upload_ok
(
oid
,
size
,
tmp_file_name
)
end
...
...
lib/gitlab/lfs/router.rb
View file @
57d4a172
...
...
@@ -74,8 +74,6 @@ module Gitlab
lfs
.
render_storage_upload_authorize_response
(
oid
,
size
)
else
tmp_file_name
=
sanitize_tmp_filename
(
@request
.
env
[
'HTTP_X_GITLAB_LFS_TMP'
])
return
nil
unless
tmp_file_name
lfs
.
render_storage_upload_store_response
(
oid
,
size
,
tmp_file_name
)
end
end
...
...
spec/features/security/project/internal_access_spec.rb
View file @
57d4a172
...
...
@@ -426,4 +426,23 @@ describe "Internal Project Access", feature: true do
it
{
is_expected
.
to
be_denied_for
:external
}
it
{
is_expected
.
to
be_denied_for
:visitor
}
end
describe
"GET /:project_path/container_registry"
do
before
do
stub_container_registry_tags
(
'latest'
)
stub_container_registry_config
(
enabled:
true
)
end
subject
{
namespace_project_container_registry_index_path
(
project
.
namespace
,
project
)
}
it
{
is_expected
.
to
be_allowed_for
:admin
}
it
{
is_expected
.
to
be_allowed_for
owner
}
it
{
is_expected
.
to
be_allowed_for
master
}
it
{
is_expected
.
to
be_allowed_for
developer
}
it
{
is_expected
.
to
be_allowed_for
reporter
}
it
{
is_expected
.
to
be_allowed_for
guest
}
it
{
is_expected
.
to
be_allowed_for
:user
}
it
{
is_expected
.
to
be_denied_for
:external
}
it
{
is_expected
.
to
be_denied_for
:visitor
}
end
end
spec/features/security/project/private_access_spec.rb
View file @
57d4a172
...
...
@@ -362,4 +362,23 @@ describe "Private Project Access", feature: true do
it
{
is_expected
.
to
be_denied_for
:external
}
it
{
is_expected
.
to
be_denied_for
:visitor
}
end
describe
"GET /:project_path/container_registry"
do
before
do
stub_container_registry_tags
(
'latest'
)
stub_container_registry_config
(
enabled:
true
)
end
subject
{
namespace_project_container_registry_index_path
(
project
.
namespace
,
project
)
}
it
{
is_expected
.
to
be_allowed_for
:admin
}
it
{
is_expected
.
to
be_allowed_for
owner
}
it
{
is_expected
.
to
be_allowed_for
master
}
it
{
is_expected
.
to
be_allowed_for
developer
}
it
{
is_expected
.
to
be_allowed_for
reporter
}
it
{
is_expected
.
to
be_denied_for
guest
}
it
{
is_expected
.
to
be_denied_for
:user
}
it
{
is_expected
.
to
be_denied_for
:external
}
it
{
is_expected
.
to
be_denied_for
:visitor
}
end
end
spec/features/security/project/public_access_spec.rb
View file @
57d4a172
...
...
@@ -426,4 +426,23 @@ describe "Public Project Access", feature: true do
it
{
is_expected
.
to
be_denied_for
:external
}
it
{
is_expected
.
to
be_denied_for
:visitor
}
end
describe
"GET /:project_path/container_registry"
do
before
do
stub_container_registry_tags
(
'latest'
)
stub_container_registry_config
(
enabled:
true
)
end
subject
{
namespace_project_container_registry_index_path
(
project
.
namespace
,
project
)
}
it
{
is_expected
.
to
be_allowed_for
:admin
}
it
{
is_expected
.
to
be_allowed_for
owner
}
it
{
is_expected
.
to
be_allowed_for
master
}
it
{
is_expected
.
to
be_allowed_for
developer
}
it
{
is_expected
.
to
be_allowed_for
reporter
}
it
{
is_expected
.
to
be_allowed_for
guest
}
it
{
is_expected
.
to
be_allowed_for
:user
}
it
{
is_expected
.
to
be_allowed_for
:external
}
it
{
is_expected
.
to
be_allowed_for
:visitor
}
end
end
spec/lib/banzai/filter/syntax_highlight_filter_spec.rb
View file @
57d4a172
...
...
@@ -3,15 +3,35 @@ require 'spec_helper'
describe
Banzai
::
Filter
::
SyntaxHighlightFilter
,
lib:
true
do
include
FilterSpecHelper
it
'highlights valid code blocks'
do
result
=
filter
(
'<pre><code>def fun end</code>'
)
expect
(
result
.
to_html
).
to
eq
(
"<pre class=
\"
code highlight js-syntax-highlight plaintext
\"
><code>def fun end</code></pre>"
)
context
"when no language is specified"
do
it
"highlights as plaintext"
do
result
=
filter
(
'<pre><code>def fun end</code></pre>'
)
expect
(
result
.
to_html
).
to
eq
(
'<pre class="code highlight js-syntax-highlight plaintext"><code>def fun end</code></pre>'
)
end
end
it
'passes through invalid code blocks'
do
context
"when a valid language is specified"
do
it
"highlights as that language"
do
result
=
filter
(
'<pre><code class="ruby">def fun end</code></pre>'
)
expect
(
result
.
to_html
).
to
eq
(
'<pre class="code highlight js-syntax-highlight ruby"><code><span class="k">def</span> <span class="nf">fun</span> <span class="k">end</span></code></pre>'
)
end
end
context
"when an invalid language is specified"
do
it
"highlights as plaintext"
do
result
=
filter
(
'<pre><code class="gnuplot">This is a test</code></pre>'
)
expect
(
result
.
to_html
).
to
eq
(
'<pre class="code highlight js-syntax-highlight plaintext"><code>This is a test</code></pre>'
)
end
end
context
"when Rouge formatting fails"
do
before
do
allow_any_instance_of
(
Rouge
::
Formatter
).
to
receive
(
:format
).
and_raise
(
StandardError
)
end
result
=
filter
(
'<pre><code>This is a test</code></pre>'
)
expect
(
result
.
to_html
).
to
eq
(
'<pre>This is a test</pre>'
)
it
"highlights as plaintext"
do
result
=
filter
(
'<pre><code class="ruby">This is a test</code></pre>'
)
expect
(
result
.
to_html
).
to
eq
(
'<pre class="code highlight"><code>This is a test</code></pre>'
)
end
end
end
spec/lib/gitlab/bitbucket_import/client_spec.rb
View file @
57d4a172
...
...
@@ -54,12 +54,12 @@ describe Gitlab::BitbucketImport::Client, lib: true do
context
'project import'
do
it
'calls .from_project with no errors'
do
project
=
create
(
:empty_project
)
project
.
import_url
=
"ssh://git@bitbucket.org/test/test.git"
project
.
create_or_update_import_data
(
credentials:
{
user:
"git"
,
password:
nil
,
bb_session:
{
bitbucket_access_token:
"test"
,
bitbucket_access_token_secret:
"test"
}
})
project
.
import_url
=
"ssh://git@bitbucket.org/test/test.git"
expect
{
described_class
.
from_project
(
project
)
}.
not_to
raise_error
end
...
...
spec/models/ci/pipeline_spec.rb
View file @
57d4a172
...
...
@@ -5,9 +5,12 @@ describe Ci::Pipeline, models: true do
let
(
:pipeline
)
{
FactoryGirl
.
create
:ci_pipeline
,
project:
project
}
it
{
is_expected
.
to
belong_to
(
:project
)
}
it
{
is_expected
.
to
belong_to
(
:user
)
}
it
{
is_expected
.
to
have_many
(
:statuses
)
}
it
{
is_expected
.
to
have_many
(
:trigger_requests
)
}
it
{
is_expected
.
to
have_many
(
:builds
)
}
it
{
is_expected
.
to
validate_presence_of
:sha
}
it
{
is_expected
.
to
validate_presence_of
:status
}
...
...
spec/models/commit_status_spec.rb
View file @
57d4a172
...
...
@@ -177,10 +177,10 @@ describe CommitStatus, models: true do
describe
'#stages'
do
before
do
FactoryGirl
.
create
:commit_status
,
pipeline:
pipeline
,
stage:
'build
'
,
stage_idx:
0
,
status:
'success'
FactoryGirl
.
create
:commit_status
,
pipeline:
pipeline
,
stage:
'build
'
,
stage_idx:
0
,
status:
'failed'
FactoryGirl
.
create
:commit_status
,
pipeline:
pipeline
,
stage:
'deploy
'
,
stage_idx:
2
,
status:
'running'
FactoryGirl
.
create
:commit_status
,
pipeline:
pipeline
,
stage:
'test
'
,
stage_idx:
1
,
status:
'success'
create
:commit_status
,
pipeline:
pipeline
,
stage:
'build'
,
name:
'linux
'
,
stage_idx:
0
,
status:
'success'
create
:commit_status
,
pipeline:
pipeline
,
stage:
'build'
,
name:
'mac
'
,
stage_idx:
0
,
status:
'failed'
create
:commit_status
,
pipeline:
pipeline
,
stage:
'deploy'
,
name:
'staging
'
,
stage_idx:
2
,
status:
'running'
create
:commit_status
,
pipeline:
pipeline
,
stage:
'test'
,
name:
'rspec
'
,
stage_idx:
1
,
status:
'success'
end
context
'stages list'
do
...
...
@@ -192,7 +192,7 @@ describe CommitStatus, models: true do
end
context
'stages with statuses'
do
subject
{
CommitStatus
.
where
(
pipeline:
pipeline
).
stages_status
}
subject
{
CommitStatus
.
where
(
pipeline:
pipeline
).
latest
.
stages_status
}
it
'return list of stages with statuses'
do
is_expected
.
to
eq
({
...
...
@@ -201,6 +201,20 @@ describe CommitStatus, models: true do
'deploy'
=>
'running'
})
end
context
'when build is retried'
do
before
do
create
:commit_status
,
pipeline:
pipeline
,
stage:
'build'
,
name:
'mac'
,
stage_idx:
0
,
status:
'success'
end
it
'ignores a previous state'
do
is_expected
.
to
eq
({
'build'
=>
'success'
,
'test'
=>
'success'
,
'deploy'
=>
'running'
})
end
end
end
end
...
...
spec/models/project_spec.rb
View file @
57d4a172
...
...
@@ -142,10 +142,10 @@ describe Project, models: true do
expect
(
project2
).
to
be_valid
end
it
'
does not allow to introduce
an empty URI'
do
it
'
allows
an empty URI'
do
project2
=
build
(
:project
,
import_url:
''
)
expect
(
project2
).
not_
to
be_valid
expect
(
project2
).
to
be_valid
end
it
'does not produce import data on an empty URI'
do
...
...
spec/models/user_spec.rb
View file @
57d4a172
...
...
@@ -31,6 +31,8 @@ describe User, models: true do
it
{
is_expected
.
to
have_many
(
:spam_logs
).
dependent
(
:destroy
)
}
it
{
is_expected
.
to
have_many
(
:todos
).
dependent
(
:destroy
)
}
it
{
is_expected
.
to
have_many
(
:award_emoji
).
dependent
(
:destroy
)
}
it
{
is_expected
.
to
have_many
(
:builds
).
dependent
(
:nullify
)
}
it
{
is_expected
.
to
have_many
(
:pipelines
).
dependent
(
:nullify
)
}
describe
'#group_members'
do
it
'does not include group memberships for which user is a requester'
do
...
...
spec/requests/api/award_emoji_spec.rb
View file @
57d4a172
...
...
@@ -135,6 +135,22 @@ describe API::API, api: true do
expect
(
response
).
to
have_http_status
(
401
)
end
it
"normalizes +1 as thumbsup award"
do
post
api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
id
}
/award_emoji"
,
user
),
name:
'+1'
expect
(
issue
.
award_emoji
.
last
.
name
).
to
eq
(
"thumbsup"
)
end
context
'when the emoji already has been awarded'
do
it
'returns a 404 status code'
do
post
api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
id
}
/award_emoji"
,
user
),
name:
'thumbsup'
post
api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
id
}
/award_emoji"
,
user
),
name:
'thumbsup'
expect
(
response
).
to
have_http_status
(
404
)
expect
(
json_response
[
"message"
]).
to
match
(
"has already been taken"
)
end
end
end
end
...
...
@@ -147,6 +163,22 @@ describe API::API, api: true do
expect
(
response
).
to
have_http_status
(
201
)
expect
(
json_response
[
'user'
][
'username'
]).
to
eq
(
user
.
username
)
end
it
"normalizes +1 as thumbsup award"
do
post
api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
id
}
/notes/
#{
note
.
id
}
/award_emoji"
,
user
),
name:
'+1'
expect
(
note
.
award_emoji
.
last
.
name
).
to
eq
(
"thumbsup"
)
end
context
'when the emoji already has been awarded'
do
it
'returns a 404 status code'
do
post
api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
id
}
/notes/
#{
note
.
id
}
/award_emoji"
,
user
),
name:
'rocket'
post
api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
id
}
/notes/
#{
note
.
id
}
/award_emoji"
,
user
),
name:
'rocket'
expect
(
response
).
to
have_http_status
(
404
)
expect
(
json_response
[
"message"
]).
to
match
(
"has already been taken"
)
end
end
end
describe
'DELETE /projects/:id/awardable/:awardable_id/award_emoji/:award_id'
do
...
...
spec/requests/api/internal_spec.rb
View file @
57d4a172
...
...
@@ -56,13 +56,21 @@ describe API::API, api: true do
context
"git push with project.wiki"
do
it
'responds with success'
do
project_wiki
=
create
(
:project
,
name:
'my.wiki'
,
path:
'my.wiki'
)
project_wiki
.
team
<<
[
user
,
:developer
]
push
(
key
,
project
.
wiki
)
push
(
key
,
project_wiki
)
expect
(
response
).
to
have_http_status
(
200
)
expect
(
json_response
[
"status"
]).
to
be_truthy
expect
(
json_response
[
"repository_path"
]).
to
eq
(
project
.
wiki
.
repository
.
path_to_repo
)
end
end
context
"git pull with project.wiki"
do
it
'responds with success'
do
pull
(
key
,
project
.
wiki
)
expect
(
response
).
to
have_http_status
(
200
)
expect
(
json_response
[
"status"
]).
to
be_truthy
expect
(
json_response
[
"repository_path"
]).
to
eq
(
project
.
wiki
.
repository
.
path_to_repo
)
end
end
...
...
spec/requests/api/issues_spec.rb
View file @
57d4a172
...
...
@@ -503,6 +503,20 @@ describe API::API, api: true do
])
end
context
'with due date'
do
it
'creates a new project issue'
do
due_date
=
2
.
weeks
.
from_now
.
strftime
(
'%Y-%m-%d'
)
post
api
(
"/projects/
#{
project
.
id
}
/issues"
,
user
),
title:
'new issue'
,
due_date:
due_date
expect
(
response
).
to
have_http_status
(
201
)
expect
(
json_response
[
'title'
]).
to
eq
(
'new issue'
)
expect
(
json_response
[
'description'
]).
to
be_nil
expect
(
json_response
[
'due_date'
]).
to
eq
(
due_date
)
end
end
context
'when an admin or owner makes the request'
do
it
'accepts the creation date to be set'
do
creation_time
=
2
.
weeks
.
ago
...
...
@@ -683,6 +697,17 @@ describe API::API, api: true do
end
end
describe
'PUT /projects/:id/issues/:issue_id to update due date'
do
it
'creates a new project issue'
do
due_date
=
2
.
weeks
.
from_now
.
strftime
(
'%Y-%m-%d'
)
put
api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
id
}
"
,
user
),
due_date:
due_date
expect
(
response
).
to
have_http_status
(
200
)
expect
(
json_response
[
'due_date'
]).
to
eq
(
due_date
)
end
end
describe
"DELETE /projects/:id/issues/:issue_id"
do
it
"rejects a non member from deleting an issue"
do
delete
api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
id
}
"
,
non_member
)
...
...
spec/
lib/gitlab/lfs/lfs_router
_spec.rb
→
spec/
requests/lfs_http
_spec.rb
View file @
57d4a172
This diff is collapsed.
Click to expand it.
spec/services/auth/container_registry_authentication_service_spec.rb
View file @
57d4a172
...
...
@@ -87,9 +87,11 @@ describe Auth::ContainerRegistryAuthenticationService, services: true do
end
context
'user authorization'
do
let
(
:project
)
{
create
(
:project
)
}
let
(
:current_user
)
{
create
(
:user
)
}
context
'for private project'
do
let
(
:project
)
{
create
(
:empty_project
)
}
context
'allow to use scope-less authentication'
do
it_behaves_like
'a valid token'
end
...
...
@@ -135,6 +137,58 @@ describe Auth::ContainerRegistryAuthenticationService, services: true do
end
end
context
'for public project'
do
let
(
:project
)
{
create
(
:empty_project
,
:public
)
}
context
'allow anyone to pull images'
do
let
(
:current_params
)
do
{
scope:
"repository:
#{
project
.
path_with_namespace
}
:pull"
}
end
it_behaves_like
'a pullable'
end
context
'disallow anyone to push images'
do
let
(
:current_params
)
do
{
scope:
"repository:
#{
project
.
path_with_namespace
}
:push"
}
end
it_behaves_like
'an inaccessible'
end
end
context
'for internal project'
do
let
(
:project
)
{
create
(
:empty_project
,
:internal
)
}
context
'for internal user'
do
context
'allow anyone to pull images'
do
let
(
:current_params
)
do
{
scope:
"repository:
#{
project
.
path_with_namespace
}
:pull"
}
end
it_behaves_like
'a pullable'
end
context
'disallow anyone to push images'
do
let
(
:current_params
)
do
{
scope:
"repository:
#{
project
.
path_with_namespace
}
:push"
}
end
it_behaves_like
'an inaccessible'
end
end
context
'for external user'
do
let
(
:current_user
)
{
create
(
:user
,
external:
true
)
}
let
(
:current_params
)
do
{
scope:
"repository:
#{
project
.
path_with_namespace
}
:pull,push"
}
end
it_behaves_like
'an inaccessible'
end
end
end
context
'project authorization'
do
let
(
:current_project
)
{
create
(
:empty_project
)
}
...
...
spec/services/create_commit_builds_service_spec.rb
View file @
57d4a172
...
...
@@ -3,7 +3,7 @@ require 'spec_helper'
describe
CreateCommitBuildsService
,
services:
true
do
let
(
:service
)
{
CreateCommitBuildsService
.
new
}
let
(
:project
)
{
FactoryGirl
.
create
(
:empty_project
)
}
let
(
:user
)
{
nil
}
let
(
:user
)
{
create
(
:user
)
}
before
do
stub_ci_pipeline_to_return_yaml_file
...
...
@@ -24,6 +24,7 @@ describe CreateCommitBuildsService, services: true do
it
{
expect
(
pipeline
).
to
be_valid
}
it
{
expect
(
pipeline
).
to
be_persisted
}
it
{
expect
(
pipeline
).
to
eq
(
project
.
pipelines
.
last
)
}
it
{
expect
(
pipeline
).
to
have_attributes
(
user:
user
)
}
it
{
expect
(
pipeline
.
builds
.
first
).
to
be_kind_of
(
Ci
::
Build
)
}
end
...
...
spec/services/create_deployment_service_spec.rb
View file @
57d4a172
...
...
@@ -89,6 +89,12 @@ describe CreateDeploymentService, services: true do
expect_any_instance_of
(
described_class
).
to
receive
(
:execute
)
subject
end
it
'is set as deployable'
do
subject
expect
(
Deployment
.
last
.
deployable
).
to
eq
(
deployable
)
end
end
context
'without environment specified'
do
...
...
@@ -105,6 +111,8 @@ describe CreateDeploymentService, services: true do
context
'when build succeeds'
do
it_behaves_like
'does create environment and deployment'
do
let
(
:deployable
)
{
build
}
subject
{
build
.
success
}
end
end
...
...
@@ -114,6 +122,14 @@ describe CreateDeploymentService, services: true do
subject
{
build
.
drop
}
end
end
context
'when build is retried'
do
it_behaves_like
'does create environment and deployment'
do
let
(
:deployable
)
{
Ci
::
Build
.
retry
(
build
)
}
subject
{
deployable
.
success
}
end
end
end
end
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment