BigW Consortium Gitlab
Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
gitlab-ce
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Forest Godfrey
gitlab-ce
Commits
0f953ac4
Commit
0f953ac4
authored
May 11, 2018
by
Filipa Lacerda
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch '10-8-stable-prepare-rc8' into '10-8-stable'
Prepare 10.8 RC8 release See merge request gitlab-org/gitlab-ce!18883
parents
d66ae2d5
abd24d1c
Hide whitespace changes
Inline
Side-by-side
Showing
26 changed files
with
413 additions
and
210 deletions
+413
-210
GITALY_SERVER_VERSION
GITALY_SERVER_VERSION
+1
-1
ide.vue
app/assets/javascripts/ide/components/ide.vue
+2
-2
repo_editor.vue
app/assets/javascripts/ide/components/repo_editor.vue
+1
-1
utils.js
app/assets/javascripts/ide/stores/utils.js
+1
-0
terms.scss
app/assets/stylesheets/framework/terms.scss
+7
-2
terms_controller.rb
app/controllers/users/terms_controller.rb
+4
-0
runner.rb
app/models/ci/runner.rb
+7
-1
sha_attribute.rb
app/models/concerns/sha_attribute.rb
+2
-1
terms.html.haml
app/views/layouts/terms.html.haml
+2
-2
migrate_uploads_worker.rb
app/workers/object_storage/migrate_uploads_worker.rb
+0
-79
46210-terms-acceptance-dropdown-menu.yml
...elogs/unreleased/46210-terms-acceptance-dropdown-menu.yml
+5
-0
fix-project-mirror-data-schema.yml
changelogs/unreleased/fix-project-mirror-data-schema.yml
+6
-0
fix-wiki-find-page-invalid-encoding.yml
...gelogs/unreleased/fix-wiki-find-page-invalid-encoding.yml
+5
-0
jr-46209-web-ide-copy.yml
changelogs/unreleased/jr-46209-web-ide-copy.yml
+5
-0
gollum.rb
config/initializers/gollum.rb
+14
-0
20180508100222_add_not_null_constraint_to_project_mirror_data_foreign_key.rb
...not_null_constraint_to_project_mirror_data_foreign_key.rb
+21
-0
20180508102840_add_unique_constraint_to_project_mirror_data_project_id_index.rb
...que_constraint_to_project_mirror_data_project_id_index.rb
+31
-0
schema.rb
db/schema.rb
+3
-3
login_spec.rb
spec/features/users/login_spec.rb
+102
-0
repo_editor_spec.js
spec/javascripts/ide/components/repo_editor_spec.js
+25
-1
add_not_null_constraint_to_project_mirror_data_foreign_key_spec.rb
...ull_constraint_to_project_mirror_data_foreign_key_spec.rb
+18
-0
runner_spec.rb
spec/models/ci/runner_spec.rb
+21
-7
sha_attribute_spec.rb
spec/models/concerns/sha_attribute_spec.rb
+6
-4
project_wiki_spec.rb
spec/models/project_wiki_spec.rb
+11
-0
migrate_uploads_worker_spec.rb
...ers/workers/object_storage/migrate_uploads_worker_spec.rb
+95
-70
Auto-DevOps.gitlab-ci.yml
vendor/gitlab-ci-yml/Auto-DevOps.gitlab-ci.yml
+18
-36
No files found.
GITALY_SERVER_VERSION
View file @
0f953ac4
0.
99
.0
0.
100
.0
app/assets/javascripts/ide/components/ide.vue
View file @
0f953ac4
...
@@ -110,8 +110,8 @@ export default {
...
@@ -110,8 +110,8 @@ export default {
Welcome to the GitLab IDE
Welcome to the GitLab IDE
</h4>
</h4>
<p>
<p>
You can select a file in the left sidebar to begin
Select a file from the left sidebar to begin editing.
editing and use the right sidebar
to commit your changes.
Afterwards, you'll be able
to commit your changes.
</p>
</p>
</div>
</div>
</div>
</div>
...
...
app/assets/javascripts/ide/components/repo_editor.vue
View file @
0f953ac4
...
@@ -140,7 +140,7 @@ export default {
...
@@ -140,7 +140,7 @@ export default {
this
.
file
.
staged
&&
this
.
file
.
key
.
indexOf
(
'unstaged-'
)
===
0
?
head
:
null
,
this
.
file
.
staged
&&
this
.
file
.
key
.
indexOf
(
'unstaged-'
)
===
0
?
head
:
null
,
);
);
if
(
this
.
viewer
===
viewerTypes
.
mr
)
{
if
(
this
.
viewer
===
viewerTypes
.
mr
&&
this
.
file
.
mrChange
)
{
this
.
editor
.
attachMergeRequestModel
(
this
.
model
);
this
.
editor
.
attachMergeRequestModel
(
this
.
model
);
}
else
{
}
else
{
this
.
editor
.
attachModel
(
this
.
model
);
this
.
editor
.
attachModel
(
this
.
model
);
...
...
app/assets/javascripts/ide/stores/utils.js
View file @
0f953ac4
...
@@ -44,6 +44,7 @@ export const dataStructure = () => ({
...
@@ -44,6 +44,7 @@ export const dataStructure = () => ({
size
:
0
,
size
:
0
,
parentPath
:
null
,
parentPath
:
null
,
lastOpenedAt
:
0
,
lastOpenedAt
:
0
,
mrChange
:
null
,
});
});
export
const
decorateData
=
entity
=>
{
export
const
decorateData
=
entity
=>
{
...
...
app/assets/stylesheets/framework/terms.scss
View file @
0f953ac4
...
@@ -17,6 +17,7 @@
...
@@ -17,6 +17,7 @@
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
justify-content
:
space-between
;
justify-content
:
space-between
;
line-height
:
$line-height-base
;
.title
{
.title
{
display
:
flex
;
display
:
flex
;
...
@@ -33,10 +34,14 @@
...
@@ -33,10 +34,14 @@
.navbar-collapse
{
.navbar-collapse
{
padding-right
:
0
;
padding-right
:
0
;
.navbar-nav
{
margin
:
0
;
}
}
}
.nav
li
a
{
.nav
li
{
color
:
$theme-gray-700
;
float
:
none
;
}
}
}
}
...
...
app/controllers/users/terms_controller.rb
View file @
0f953ac4
...
@@ -3,6 +3,10 @@ module Users
...
@@ -3,6 +3,10 @@ module Users
include
InternalRedirect
include
InternalRedirect
skip_before_action
:enforce_terms!
skip_before_action
:enforce_terms!
skip_before_action
:check_password_expiration
skip_before_action
:check_two_factor_requirement
skip_before_action
:require_email
before_action
:terms
before_action
:terms
layout
'terms'
layout
'terms'
...
...
app/models/ci/runner.rb
View file @
0f953ac4
...
@@ -107,7 +107,13 @@ module Ci
...
@@ -107,7 +107,13 @@ module Ci
end
end
def
assign_to
(
project
,
current_user
=
nil
)
def
assign_to
(
project
,
current_user
=
nil
)
self
.
is_shared
=
false
if
shared?
if
shared?
self
.
is_shared
=
false
if
shared?
self
.
runner_type
=
:project_type
elsif
group_type?
raise
ArgumentError
,
'Transitioning a group runner to a project runner is not supported'
end
self
.
save
self
.
save
project
.
runner_projects
.
create
(
runner_id:
self
.
id
)
project
.
runner_projects
.
create
(
runner_id:
self
.
id
)
end
end
...
...
app/models/concerns/sha_attribute.rb
View file @
0f953ac4
...
@@ -22,7 +22,8 @@ module ShaAttribute
...
@@ -22,7 +22,8 @@ module ShaAttribute
column
=
columns
.
find
{
|
c
|
c
.
name
==
name
.
to_s
}
column
=
columns
.
find
{
|
c
|
c
.
name
==
name
.
to_s
}
unless
column
unless
column
raise
ArgumentError
.
new
(
"sha_attribute
#{
name
.
inspect
}
is invalid since the column doesn't exist"
)
warn
"WARNING: sha_attribute
#{
name
.
inspect
}
is invalid since the column doesn't exist - you may need to run database migrations"
return
end
end
unless
column
.
type
==
:binary
unless
column
.
type
==
:binary
...
...
app/views/layouts/terms.html.haml
View file @
0f953ac4
...
@@ -20,10 +20,10 @@
...
@@ -20,10 +20,10 @@
=
brand_header_logo
=
brand_header_logo
-
logo_text
=
brand_header_logo_type
-
logo_text
=
brand_header_logo_type
-
if
logo_text
.
present?
-
if
logo_text
.
present?
%span
.logo-text.
hidden-xs.
prepend-left-8
%span
.logo-text.prepend-left-8
=
logo_text
=
logo_text
-
if
header_link?
(
:user_dropdown
)
-
if
header_link?
(
:user_dropdown
)
.navbar-collapse
.collapse
.navbar-collapse
%ul
.nav.navbar-nav
%ul
.nav.navbar-nav
%li
.header-user.dropdown
%li
.header-user.dropdown
=
link_to
current_user
,
class:
user_dropdown_class
,
data:
{
toggle:
"dropdown"
}
do
=
link_to
current_user
,
class:
user_dropdown_class
,
data:
{
toggle:
"dropdown"
}
do
...
...
app/workers/object_storage/migrate_uploads_worker.rb
View file @
0f953ac4
...
@@ -9,85 +9,6 @@ module ObjectStorage
...
@@ -9,85 +9,6 @@ module ObjectStorage
SanityCheckError
=
Class
.
new
(
StandardError
)
SanityCheckError
=
Class
.
new
(
StandardError
)
class
Upload
<
ActiveRecord
::
Base
# Upper limit for foreground checksum processing
CHECKSUM_THRESHOLD
=
100
.
megabytes
belongs_to
:model
,
polymorphic:
true
# rubocop:disable Cop/PolymorphicAssociations
validates
:size
,
presence:
true
validates
:path
,
presence:
true
validates
:model
,
presence:
true
validates
:uploader
,
presence:
true
before_save
:calculate_checksum!
,
if: :foreground_checksummable?
after_commit
:schedule_checksum
,
if: :checksummable?
scope
:stored_locally
,
->
{
where
(
store:
[
nil
,
ObjectStorage
::
Store
::
LOCAL
])
}
scope
:stored_remotely
,
->
{
where
(
store:
ObjectStorage
::
Store
::
REMOTE
)
}
def
self
.
hexdigest
(
path
)
Digest
::
SHA256
.
file
(
path
).
hexdigest
end
def
absolute_path
raise
ObjectStorage
::
RemoteStoreError
,
"Remote object has no absolute path."
unless
local?
return
path
unless
relative_path?
uploader_class
.
absolute_path
(
self
)
end
def
calculate_checksum!
self
.
checksum
=
nil
return
unless
checksummable?
self
.
checksum
=
self
.
class
.
hexdigest
(
absolute_path
)
end
def
build_uploader
(
mounted_as
=
nil
)
uploader_class
.
new
(
model
,
mounted_as
).
tap
do
|
uploader
|
uploader
.
upload
=
self
uploader
.
retrieve_from_store!
(
identifier
)
end
end
def
exist?
File
.
exist?
(
absolute_path
)
end
def
local?
return
true
if
store
.
nil?
store
==
ObjectStorage
::
Store
::
LOCAL
end
private
def
checksummable?
checksum
.
nil?
&&
local?
&&
exist?
end
def
foreground_checksummable?
checksummable?
&&
size
<=
CHECKSUM_THRESHOLD
end
def
schedule_checksum
UploadChecksumWorker
.
perform_async
(
id
)
end
def
relative_path?
!
path
.
start_with?
(
'/'
)
end
def
identifier
File
.
basename
(
path
)
end
def
uploader_class
Object
.
const_get
(
uploader
)
end
end
class
MigrationResult
class
MigrationResult
attr_reader
:upload
attr_reader
:upload
attr_accessor
:error
attr_accessor
:error
...
...
changelogs/unreleased/46210-terms-acceptance-dropdown-menu.yml
0 → 100644
View file @
0f953ac4
---
title
:
46210 Display logo and user dropdown on mobile for terms page and fix styling
merge_request
:
author
:
type
:
fixed
changelogs/unreleased/fix-project-mirror-data-schema.yml
0 → 100644
View file @
0f953ac4
---
title
:
Fixes database inconsistencies between Community and Enterprise Edition on
import state
merge_request
:
18811
author
:
type
:
fixed
changelogs/unreleased/fix-wiki-find-page-invalid-encoding.yml
0 → 100644
View file @
0f953ac4
---
title
:
Fix finding wiki pages when they have invalidly-encoded content
merge_request
:
18856
author
:
type
:
fixed
changelogs/unreleased/jr-46209-web-ide-copy.yml
0 → 100644
View file @
0f953ac4
---
title
:
Fix outdated Web IDE welcome copy
merge_request
:
18861
author
:
type
:
fixed
config/initializers/gollum.rb
View file @
0f953ac4
...
@@ -7,6 +7,20 @@ module Gollum
...
@@ -7,6 +7,20 @@ module Gollum
end
end
require
"gollum-lib"
require
"gollum-lib"
module
Gollum
class
Page
def
text_data
(
encoding
=
nil
)
data
=
if
raw_data
.
respond_to?
(
:encoding
)
raw_data
.
force_encoding
(
encoding
||
Encoding
::
UTF_8
)
else
raw_data
end
Gitlab
::
EncodingHelper
.
encode!
(
data
)
end
end
end
Rails
.
application
.
configure
do
Rails
.
application
.
configure
do
config
.
after_initialize
do
config
.
after_initialize
do
Gollum
::
Page
.
per_page
=
Kaminari
.
config
.
default_per_page
Gollum
::
Page
.
per_page
=
Kaminari
.
config
.
default_per_page
...
...
db/migrate/20180508100222_add_not_null_constraint_to_project_mirror_data_foreign_key.rb
0 → 100644
View file @
0f953ac4
class
AddNotNullConstraintToProjectMirrorDataForeignKey
<
ActiveRecord
::
Migration
include
Gitlab
::
Database
::
MigrationHelpers
DOWNTIME
=
false
class
ProjectImportState
<
ActiveRecord
::
Base
include
EachBatch
self
.
table_name
=
'project_mirror_data'
end
def
up
ProjectImportState
.
where
(
project_id:
nil
).
delete_all
change_column_null
:project_mirror_data
,
:project_id
,
false
end
def
down
change_column_null
:project_mirror_data
,
:project_id
,
true
end
end
db/migrate/20180508102840_add_unique_constraint_to_project_mirror_data_project_id_index.rb
0 → 100644
View file @
0f953ac4
class
AddUniqueConstraintToProjectMirrorDataProjectIdIndex
<
ActiveRecord
::
Migration
include
Gitlab
::
Database
::
MigrationHelpers
DOWNTIME
=
false
disable_ddl_transaction!
def
up
add_concurrent_index
(
:project_mirror_data
,
:project_id
,
unique:
true
,
name:
'index_project_mirror_data_on_project_id_unique'
)
remove_concurrent_index_by_name
(
:project_mirror_data
,
'index_project_mirror_data_on_project_id'
)
rename_index
(
:project_mirror_data
,
'index_project_mirror_data_on_project_id_unique'
,
'index_project_mirror_data_on_project_id'
)
end
def
down
rename_index
(
:project_mirror_data
,
'index_project_mirror_data_on_project_id'
,
'index_project_mirror_data_on_project_id_old'
)
add_concurrent_index
(
:project_mirror_data
,
:project_id
)
remove_concurrent_index_by_name
(
:project_mirror_data
,
'index_project_mirror_data_on_project_id_old'
)
end
end
db/schema.rb
View file @
0f953ac4
...
@@ -11,7 +11,7 @@
...
@@ -11,7 +11,7 @@
#
#
# It's strongly recommended that you check this file into your version control system.
# It's strongly recommended that you check this file into your version control system.
ActiveRecord
::
Schema
.
define
(
version:
20180508
055821
)
do
ActiveRecord
::
Schema
.
define
(
version:
20180508
102840
)
do
# These are extensions that must be enabled in order to support this database
# These are extensions that must be enabled in order to support this database
enable_extension
"plpgsql"
enable_extension
"plpgsql"
...
@@ -1529,14 +1529,14 @@ ActiveRecord::Schema.define(version: 20180508055821) do
...
@@ -1529,14 +1529,14 @@ ActiveRecord::Schema.define(version: 20180508055821) do
add_index
"project_import_data"
,
[
"project_id"
],
name:
"index_project_import_data_on_project_id"
,
using: :btree
add_index
"project_import_data"
,
[
"project_id"
],
name:
"index_project_import_data_on_project_id"
,
using: :btree
create_table
"project_mirror_data"
,
force: :cascade
do
|
t
|
create_table
"project_mirror_data"
,
force: :cascade
do
|
t
|
t
.
integer
"project_id"
t
.
integer
"project_id"
,
null:
false
t
.
string
"status"
t
.
string
"status"
t
.
string
"jid"
t
.
string
"jid"
t
.
text
"last_error"
t
.
text
"last_error"
end
end
add_index
"project_mirror_data"
,
[
"jid"
],
name:
"index_project_mirror_data_on_jid"
,
using: :btree
add_index
"project_mirror_data"
,
[
"jid"
],
name:
"index_project_mirror_data_on_jid"
,
using: :btree
add_index
"project_mirror_data"
,
[
"project_id"
],
name:
"index_project_mirror_data_on_project_id"
,
using: :btree
add_index
"project_mirror_data"
,
[
"project_id"
],
name:
"index_project_mirror_data_on_project_id"
,
u
nique:
true
,
u
sing: :btree
add_index
"project_mirror_data"
,
[
"status"
],
name:
"index_project_mirror_data_on_status"
,
using: :btree
add_index
"project_mirror_data"
,
[
"status"
],
name:
"index_project_mirror_data_on_status"
,
using: :btree
create_table
"project_statistics"
,
force: :cascade
do
|
t
|
create_table
"project_statistics"
,
force: :cascade
do
|
t
|
...
...
spec/features/users/login_spec.rb
View file @
0f953ac4
...
@@ -437,5 +437,107 @@ feature 'Login' do
...
@@ -437,5 +437,107 @@ feature 'Login' do
expect
(
current_path
).
to
eq
(
root_path
)
expect
(
current_path
).
to
eq
(
root_path
)
end
end
context
'when 2FA is required for the user'
do
before
do
group
=
create
(
:group
,
require_two_factor_authentication:
true
)
group
.
add_developer
(
user
)
end
context
'when the user did not enable 2FA'
do
it
'asks to set 2FA before asking to accept the terms'
do
visit
new_user_session_path
fill_in
'user_login'
,
with:
user
.
email
fill_in
'user_password'
,
with:
'12345678'
click_button
'Sign in'
expect_to_be_on_terms_page
click_button
'Accept terms'
expect
(
current_path
).
to
eq
(
profile_two_factor_auth_path
)
fill_in
'pin_code'
,
with:
user
.
reload
.
current_otp
click_button
'Register with two-factor app'
click_link
'Proceed'
expect
(
current_path
).
to
eq
(
profile_account_path
)
end
end
context
'when the user already enabled 2FA'
do
before
do
user
.
update!
(
otp_required_for_login:
true
,
otp_secret:
User
.
generate_otp_secret
(
32
))
end
it
'asks the user to accept the terms'
do
visit
new_user_session_path
fill_in
'user_login'
,
with:
user
.
email
fill_in
'user_password'
,
with:
'12345678'
click_button
'Sign in'
fill_in
'user_otp_attempt'
,
with:
user
.
reload
.
current_otp
click_button
'Verify code'
expect_to_be_on_terms_page
click_button
'Accept terms'
expect
(
current_path
).
to
eq
(
root_path
)
end
end
end
context
'when the users password is expired'
do
before
do
user
.
update!
(
password_expires_at:
Time
.
parse
(
'2018-05-08 11:29:46 UTC'
))
end
it
'asks the user to accept the terms before setting a new password'
do
visit
new_user_session_path
fill_in
'user_login'
,
with:
user
.
email
fill_in
'user_password'
,
with:
'12345678'
click_button
'Sign in'
expect_to_be_on_terms_page
click_button
'Accept terms'
expect
(
current_path
).
to
eq
(
new_profile_password_path
)
fill_in
'user_current_password'
,
with:
'12345678'
fill_in
'user_password'
,
with:
'new password'
fill_in
'user_password_confirmation'
,
with:
'new password'
click_button
'Set new password'
expect
(
page
).
to
have_content
(
'Password successfully changed'
)
end
end
context
'when the user does not have an email configured'
do
let
(
:user
)
{
create
(
:omniauth_user
,
extern_uid:
'my-uid'
,
provider:
'saml'
,
email:
'temp-email-for-oauth-user@gitlab.localhost'
)
}
before
do
stub_omniauth_saml_config
(
enabled:
true
,
auto_link_saml_user:
true
,
allow_single_sign_on:
[
'saml'
],
providers:
[
mock_saml_config
])
end
it
'asks the user to accept the terms before setting an email'
do
gitlab_sign_in_via
(
'saml'
,
user
,
'my-uid'
)
expect_to_be_on_terms_page
click_button
'Accept terms'
expect
(
current_path
).
to
eq
(
profile_path
)
fill_in
'Email'
,
with:
'hello@world.com'
click_button
'Update profile settings'
expect
(
page
).
to
have_content
(
'Profile was successfully updated'
)
end
end
end
end
end
end
spec/javascripts/ide/components/repo_editor_spec.js
View file @
0f953ac4
...
@@ -24,7 +24,7 @@ describe('RepoEditor', () => {
...
@@ -24,7 +24,7 @@ describe('RepoEditor', () => {
f
.
active
=
true
;
f
.
active
=
true
;
f
.
tempFile
=
true
;
f
.
tempFile
=
true
;
vm
.
$store
.
state
.
openFiles
.
push
(
f
);
vm
.
$store
.
state
.
openFiles
.
push
(
f
);
vm
.
$store
.
state
.
entries
[
f
.
path
]
=
f
;
Vue
.
set
(
vm
.
$store
.
state
.
entries
,
f
.
path
,
f
)
;
vm
.
monaco
=
true
;
vm
.
monaco
=
true
;
vm
.
$mount
();
vm
.
$mount
();
...
@@ -215,6 +215,30 @@ describe('RepoEditor', () => {
...
@@ -215,6 +215,30 @@ describe('RepoEditor', () => {
expect
(
vm
.
editor
.
attachModel
).
toHaveBeenCalledWith
(
vm
.
model
);
expect
(
vm
.
editor
.
attachModel
).
toHaveBeenCalledWith
(
vm
.
model
);
});
});
it
(
'attaches model to merge request editor'
,
()
=>
{
vm
.
$store
.
state
.
viewer
=
'mrdiff'
;
vm
.
file
.
mrChange
=
true
;
spyOn
(
vm
.
editor
,
'attachMergeRequestModel'
);
Editor
.
editorInstance
.
modelManager
.
dispose
();
vm
.
setupEditor
();
expect
(
vm
.
editor
.
attachMergeRequestModel
).
toHaveBeenCalledWith
(
vm
.
model
);
});
it
(
'does not attach model to merge request editor when not a MR change'
,
()
=>
{
vm
.
$store
.
state
.
viewer
=
'mrdiff'
;
vm
.
file
.
mrChange
=
false
;
spyOn
(
vm
.
editor
,
'attachMergeRequestModel'
);
Editor
.
editorInstance
.
modelManager
.
dispose
();
vm
.
setupEditor
();
expect
(
vm
.
editor
.
attachMergeRequestModel
).
not
.
toHaveBeenCalledWith
(
vm
.
model
);
});
it
(
'adds callback methods'
,
()
=>
{
it
(
'adds callback methods'
,
()
=>
{
spyOn
(
vm
.
editor
,
'onPositionChange'
).
and
.
callThrough
();
spyOn
(
vm
.
editor
,
'onPositionChange'
).
and
.
callThrough
();
...
...
spec/migrations/add_not_null_constraint_to_project_mirror_data_foreign_key_spec.rb
0 → 100644
View file @
0f953ac4
require
'spec_helper'
require
Rails
.
root
.
join
(
'db'
,
'migrate'
,
'20180508100222_add_not_null_constraint_to_project_mirror_data_foreign_key.rb'
)
describe
AddNotNullConstraintToProjectMirrorDataForeignKey
,
:migration
do
let
(
:namespaces
)
{
table
(
:namespaces
)
}
let
(
:projects
)
{
table
(
:projects
)
}
let
(
:import_state
)
{
table
(
:project_mirror_data
)
}
before
do
import_state
.
create!
(
id:
1
,
project_id:
nil
,
status: :started
)
end
it
'removes every import state without an associated project_id'
do
expect
do
subject
.
up
end
.
to
change
{
import_state
.
count
}.
from
(
1
).
to
(
0
)
end
end
spec/models/ci/runner_spec.rb
View file @
0f953ac4
...
@@ -198,16 +198,30 @@ describe Ci::Runner do
...
@@ -198,16 +198,30 @@ describe Ci::Runner do
end
end
describe
'#assign_to'
do
describe
'#assign_to'
do
let!
(
:project
)
{
FactoryBot
.
create
:project
}
let!
(
:project
)
{
FactoryBot
.
create
(
:project
)
}
let!
(
:shared_runner
)
{
FactoryBot
.
create
(
:ci_runner
,
:shared
)
}
before
do
subject
{
runner
.
assign_to
(
project
)
}
shared_runner
.
assign_to
(
project
)
context
'with shared runner'
do
let!
(
:runner
)
{
FactoryBot
.
create
(
:ci_runner
,
:shared
)
}
it
'transitions shared runner to project runner and assigns project'
do
subject
expect
(
runner
).
to
be_specific
expect
(
runner
).
to
be_project_type
expect
(
runner
.
projects
).
to
eq
([
project
])
expect
(
runner
.
only_for?
(
project
)).
to
be_truthy
end
end
end
it
{
expect
(
shared_runner
).
to
be_specific
}
context
'with group runner'
do
it
{
expect
(
shared_runner
.
projects
).
to
eq
([
project
])
}
let!
(
:runner
)
{
FactoryBot
.
create
(
:ci_runner
,
runner_type: :group_type
)
}
it
{
expect
(
shared_runner
.
only_for?
(
project
)).
to
be_truthy
}
it
'raises an error'
do
expect
{
subject
}
.
to
raise_error
(
ArgumentError
,
'Transitioning a group runner to a project runner is not supported'
)
end
end
end
end
describe
'.online'
do
describe
'.online'
do
...
...
spec/models/concerns/sha_attribute_spec.rb
View file @
0f953ac4
...
@@ -36,24 +36,26 @@ describe ShaAttribute do
...
@@ -36,24 +36,26 @@ describe ShaAttribute do
end
end
context
'when the table does not exist'
do
context
'when the table does not exist'
do
it
'allows the attribute to be added'
do
it
'allows the attribute to be added
and issues a warning
'
do
allow
(
model
).
to
receive
(
:table_exists?
).
and_return
(
false
)
allow
(
model
).
to
receive
(
:table_exists?
).
and_return
(
false
)
expect
(
model
).
not_to
receive
(
:columns
)
expect
(
model
).
not_to
receive
(
:columns
)
expect
(
model
).
to
receive
(
:attribute
)
expect
(
model
).
to
receive
(
:attribute
)
expect
(
model
).
to
receive
(
:warn
)
model
.
sha_attribute
(
:name
)
model
.
sha_attribute
(
:name
)
end
end
end
end
context
'when the column does not exist'
do
context
'when the column does not exist'
do
it
'
raises ArgumentError
'
do
it
'
allows the attribute to be added and issues a warning
'
do
allow
(
model
).
to
receive
(
:table_exists?
).
and_return
(
true
)
allow
(
model
).
to
receive
(
:table_exists?
).
and_return
(
true
)
expect
(
model
).
to
receive
(
:columns
)
expect
(
model
).
to
receive
(
:columns
)
expect
(
model
).
not_to
receive
(
:attribute
)
expect
(
model
).
to
receive
(
:attribute
)
expect
(
model
).
to
receive
(
:warn
)
expect
{
model
.
sha_attribute
(
:no_name
)
}.
to
raise_error
(
ArgumentError
)
model
.
sha_attribute
(
:no_name
)
end
end
end
end
...
...
spec/models/project_wiki_spec.rb
View file @
0f953ac4
...
@@ -159,6 +159,17 @@ describe ProjectWiki do
...
@@ -159,6 +159,17 @@ describe ProjectWiki do
expect
(
page
.
title
).
to
eq
(
"autre pagé"
)
expect
(
page
.
title
).
to
eq
(
"autre pagé"
)
end
end
end
end
context
'pages with invalidly-encoded content'
do
before
do
create_page
(
"encoding is fun"
,
"f
\xFC
r"
.
b
)
end
it
"can find the page"
do
page
=
subject
.
find_page
(
"encoding is fun"
)
expect
(
page
.
content
).
to
eq
(
"fr"
)
end
end
end
end
context
'when Gitaly wiki_find_page is enabled'
do
context
'when Gitaly wiki_find_page is enabled'
do
...
...
spec/uploaders/workers/object_storage/migrate_uploads_worker_spec.rb
View file @
0f953ac4
...
@@ -7,113 +7,138 @@ describe ObjectStorage::MigrateUploadsWorker, :sidekiq do
...
@@ -7,113 +7,138 @@ describe ObjectStorage::MigrateUploadsWorker, :sidekiq do
end
end
end
end
let!
(
:projects
)
{
create_list
(
:project
,
10
,
:with_avatar
)
}
let
(
:uploads
)
{
Upload
.
all
}
let
(
:model_class
)
{
Project
}
let
(
:model_class
)
{
Project
}
let
(
:
mounted_as
)
{
:avatar
}
let
(
:
uploads
)
{
Upload
.
all
}
let
(
:to_store
)
{
ObjectStorage
::
Store
::
REMOTE
}
let
(
:to_store
)
{
ObjectStorage
::
Store
::
REMOTE
}
before
do
shared_examples
"uploads migration worker"
do
stub_uploads_object_storage
(
AvatarUploader
)
describe
'.enqueue!'
do
end
def
enqueue!
described_class
.
enqueue!
(
uploads
,
Project
,
mounted_as
,
to_store
)
describe
'.enqueue!'
do
end
def
enqueue!
described_class
.
enqueue!
(
uploads
,
Project
,
mounted_as
,
to_store
)
end
it
'is guarded by .sanity_check!'
do
it
'is guarded by .sanity_check!'
do
expect
(
described_class
).
to
receive
(
:perform_async
)
expect
(
described_class
).
to
receive
(
:perform_async
)
expect
(
described_class
).
to
receive
(
:sanity_check!
)
expect
(
described_class
).
to
receive
(
:sanity_check!
)
enqueue!
enqueue!
end
end
context
'sanity_check! fails'
do
context
'sanity_check! fails'
do
include_context
'sanity_check! fails'
include_context
'sanity_check! fails'
it
'does not enqueue a job'
do
it
'does not enqueue a job'
do
expect
(
described_class
).
not_to
receive
(
:perform_async
)
expect
(
described_class
).
not_to
receive
(
:perform_async
)
expect
{
enqueue!
}.
to
raise_error
(
described_class
::
SanityCheckError
)
expect
{
enqueue!
}.
to
raise_error
(
described_class
::
SanityCheckError
)
end
end
end
end
end
end
describe
'.sanity_check!'
do
describe
'.sanity_check!'
do
shared_examples
'raises a SanityCheckError'
do
shared_examples
'raises a SanityCheckError'
do
let
(
:mount_point
)
{
nil
}
let
(
:mount_point
)
{
nil
}
it
do
it
do
expect
{
described_class
.
sanity_check!
(
uploads
,
model_class
,
mount_point
)
}
expect
{
described_class
.
sanity_check!
(
uploads
,
model_class
,
mount_point
)
}
.
to
raise_error
(
described_class
::
SanityCheckError
)
.
to
raise_error
(
described_class
::
SanityCheckError
)
end
end
end
end
context
'uploader types mismatch'
do
before
do
let!
(
:outlier
)
{
create
(
:upload
,
uploader:
'FileUploader'
)
}
stub_const
(
"WrongModel"
,
Class
.
new
)
end
include_examples
'raises a SanityCheckError'
context
'uploader types mismatch'
do
end
let!
(
:outlier
)
{
create
(
:upload
,
uploader:
'GitlabUploader'
)
}
context
'model types mismatch'
do
include_examples
'raises a SanityCheckError'
let!
(
:outlier
)
{
create
(
:upload
,
model_type:
'Potato'
)
}
end
include_examples
'raises a SanityCheckError'
context
'model types mismatch'
do
end
let!
(
:outlier
)
{
create
(
:upload
,
model_type:
'WrongModel'
)
}
context
'mount point not found'
do
include_examples
'raises a SanityCheckError'
include_examples
'raises a SanityCheckError'
do
let
(
:mount_point
)
{
:potato
}
end
end
end
end
describe
'#perform
'
do
context
'mount point not found
'
do
def
perform
include_examples
'raises a SanityCheckError'
do
described_class
.
new
.
perform
(
uploads
.
ids
,
model_class
.
to_s
,
mounted_as
,
to_store
)
let
(
:mount_point
)
{
:potato
}
rescue
ObjectStorage
::
MigrateUploadsWorker
::
Report
::
MigrationFailures
end
# swallow
end
end
end
shared_examples
'outputs correctly'
do
|
success:
0
,
failures:
0
|
describe
'#perform'
do
total
=
success
+
failures
def
perform
described_class
.
new
.
perform
(
uploads
.
ids
,
model_class
.
to_s
,
mounted_as
,
to_store
)
rescue
ObjectStorage
::
MigrateUploadsWorker
::
Report
::
MigrationFailures
# swallow
end
shared_examples
'outputs correctly'
do
|
success:
0
,
failures:
0
|
total
=
success
+
failures
if
success
>
0
if
success
>
0
it
'outputs the reports'
do
it
'outputs the reports'
do
expect
(
Rails
.
logger
).
to
receive
(
:info
).
with
(
%r{Migrated
#{
success
}
/
#{
total
}
files}
)
expect
(
Rails
.
logger
).
to
receive
(
:info
).
with
(
%r{Migrated
#{
success
}
/
#{
total
}
files}
)
perform
perform
end
end
end
end
if
failures
>
0
if
failures
>
0
it
'outputs upload failures'
do
it
'outputs upload failures'
do
expect
(
Rails
.
logger
).
to
receive
(
:warn
).
with
(
/Error .* I am a teapot/
)
expect
(
Rails
.
logger
).
to
receive
(
:warn
).
with
(
/Error .* I am a teapot/
)
perform
perform
end
end
end
end
end
end
it_behaves_like
'outputs correctly'
,
success:
10
it_behaves_like
'outputs correctly'
,
success:
10
it
'migrates files'
do
perform
it
'migrates files'
do
expect
(
Upload
.
where
(
store:
ObjectStorage
::
Store
::
LOCAL
).
count
).
to
eq
(
0
)
perform
end
aggregate_failures
do
context
'migration is unsuccessful'
do
projects
.
each
do
|
project
|
before
do
expect
(
project
.
reload
.
avatar
.
upload
.
local?
).
to
be_falsey
allow_any_instance_of
(
ObjectStorage
::
Concern
)
.
to
receive
(
:migrate!
).
and_raise
(
CarrierWave
::
UploadError
,
"I am a teapot."
)
end
end
it_behaves_like
'outputs correctly'
,
failures:
10
end
end
end
end
end
context
'migration is unsuccessful'
do
context
"for AvatarUploader"
do
before
do
let!
(
:projects
)
{
create_list
(
:project
,
10
,
:with_avatar
)
}
allow_any_instance_of
(
ObjectStorage
::
Concern
).
to
receive
(
:migrate!
).
and_raise
(
CarrierWave
::
UploadError
,
"I am a teapot."
)
let
(
:mounted_as
)
{
:avatar
}
end
it_behaves_like
'outputs correctly'
,
failures:
10
before
do
stub_uploads_object_storage
(
AvatarUploader
)
end
it_behaves_like
"uploads migration worker"
end
context
"for FileUploader"
do
let!
(
:projects
)
{
create_list
(
:project
,
10
)
}
let
(
:secret
)
{
SecureRandom
.
hex
}
let
(
:mounted_as
)
{
nil
}
before
do
stub_uploads_object_storage
(
FileUploader
)
projects
.
map
do
|
project
|
uploader
=
FileUploader
.
new
(
project
)
uploader
.
store!
(
fixture_file_upload
(
'spec/fixtures/doc_sample.txt'
))
end
end
end
it_behaves_like
"uploads migration worker"
end
end
end
end
vendor/gitlab-ci-yml/Auto-DevOps.gitlab-ci.yml
View file @
0f953ac4
...
@@ -12,8 +12,10 @@
...
@@ -12,8 +12,10 @@
# AUTO_DEVOPS_DOMAIN must also be set as a variable at the group or project
# AUTO_DEVOPS_DOMAIN must also be set as a variable at the group or project
# level, or manually added below.
# level, or manually added below.
#
#
# If you want to deploy to staging first, or enable canary deploys,
# Continuous deployment to production is enabled by default.
# uncomment the relevant jobs in the pipeline below.
# If you want to deploy to staging first, or enable incremental rollouts,
# set STAGING_ENABLED or INCREMENTAL_ROLLOUT_ENABLED environment variables.
# If you want to use canary deployments, uncomment the canary job.
#
#
# If Auto DevOps fails to detect the proper buildpack, or if you want to
# If Auto DevOps fails to detect the proper buildpack, or if you want to
# specify a custom buildpack, set a project variable `BUILDPACK_URL` to the
# specify a custom buildpack, set a project variable `BUILDPACK_URL` to the
...
@@ -88,14 +90,6 @@ codequality:
...
@@ -88,14 +90,6 @@ codequality:
artifacts
:
artifacts
:
paths
:
[
codeclimate.json
]
paths
:
[
codeclimate.json
]
license_management
:
image
:
registry.gitlab.com/gitlab-org/security-products/license-management:latest
allow_failure
:
true
script
:
-
license_management
artifacts
:
paths
:
[
gl-license-report.json
]
performance
:
performance
:
stage
:
performance
stage
:
performance
image
:
docker:stable
image
:
docker:stable
...
@@ -223,8 +217,8 @@ stop_review:
...
@@ -223,8 +217,8 @@ stop_review:
# Staging deploys are disabled by default since
# Staging deploys are disabled by default since
# continuous deployment to production is enabled by default
# continuous deployment to production is enabled by default
# If you prefer to automatically deploy to staging and
# If you prefer to automatically deploy to staging and
# only manually promote to production, enable this job by
removing the dot (.),
# only manually promote to production, enable this job by
setting
#
and uncomment the `when: manual` line in the `production` job
.
#
STAGING_ENABLED
.
staging
:
staging
:
stage
:
staging
stage
:
staging
...
@@ -245,13 +239,9 @@ staging:
...
@@ -245,13 +239,9 @@ staging:
kubernetes
:
active
kubernetes
:
active
variables
:
variables
:
-
$STAGING_ENABLED
-
$STAGING_ENABLED
except
:
variables
:
-
$INCREMENTAL_ROLLOUT_ENABLED
# Canaries are disabled by default, but if you want them,
# Canaries are disabled by default, but if you want them,
# and know what the downsides are, enable this job by removing the dot (.),
# and know what the downsides are, enable this job by removing the dot (.).
# and uncomment the `when: manual` line in the `production` job.
.canary
:
.canary
:
stage
:
canary
stage
:
canary
...
@@ -272,11 +262,6 @@ staging:
...
@@ -272,11 +262,6 @@ staging:
-
master
-
master
kubernetes
:
active
kubernetes
:
active
# This job continuously deploys to production on every push to `master`.
# To make this a manual process, either because you're enabling `staging`
# or `canary` deploys, or you simply want more control over when you deploy
# to production, uncomment the `when: manual` line in the `production` job.
.production
:
&production_template
.production
:
&production_template
stage
:
production
stage
:
production
script
:
script
:
...
@@ -310,6 +295,7 @@ production:
...
@@ -310,6 +295,7 @@ production:
production_manual
:
production_manual
:
<<
:
*production_template
<<
:
*production_template
when
:
manual
when
:
manual
allow_failure
:
false
only
:
only
:
refs
:
refs
:
-
master
-
master
...
@@ -345,6 +331,7 @@ rollout 10%:
...
@@ -345,6 +331,7 @@ rollout 10%:
<<
:
*rollout_template
<<
:
*rollout_template
variables
:
variables
:
ROLLOUT_PERCENTAGE
:
10
ROLLOUT_PERCENTAGE
:
10
when
:
manual
only
:
only
:
refs
:
refs
:
-
master
-
master
...
@@ -379,6 +366,7 @@ rollout 50%:
...
@@ -379,6 +366,7 @@ rollout 50%:
rollout 100%
:
rollout 100%
:
<<
:
*production_template
<<
:
*production_template
when
:
manual
when
:
manual
allow_failure
:
false
only
:
only
:
refs
:
refs
:
-
master
-
master
...
@@ -428,14 +416,6 @@ rollout 100%:
...
@@ -428,14 +416,6 @@ rollout 100%:
"registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code
"registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code
}
}
function license_management() {
if echo $GITLAB_FEATURES |grep license_management > /dev/null ; then
/run.sh .
else
echo "License management is not available in your subscription"
fi
}
function sast() {
function sast() {
case "$CI_SERVER_VERSION" in
case "$CI_SERVER_VERSION" in
*-ee)
*-ee)
...
@@ -562,12 +542,14 @@ rollout 100%:
...
@@ -562,12 +542,14 @@ rollout 100%:
replicas=$(get_replicas "$track" "$percentage")
replicas=$(get_replicas "$track" "$percentage")
helm upgrade --reuse-values \
if [[ -n "$(helm ls -q "^$name$")" ]]; then
--wait \
helm upgrade --reuse-values \
--set replicaCount="$replicas" \
--wait \
--namespace="$KUBE_NAMESPACE" \
--set replicaCount="$replicas" \
"$name" \
--namespace="$KUBE_NAMESPACE" \
chart/
"$name" \
chart/
fi
}
}
function install_dependencies() {
function install_dependencies() {
...
...
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