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
Boxiang Sun
gitlab-ce
Commits
ec33016b
Commit
ec33016b
authored
Sep 19, 2018
by
Yorick Peterse
Browse files
Options
Browse Files
Download
Plain Diff
Include post migrations when loading the schema
See merge request gitlab-org/gitlab-ce!21689
parents
c2f82fd0
019d8055
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
57 additions
and
11 deletions
+57
-11
changelogs/unreleased/force-post-migration-dir-schema-load.yml
...elogs/unreleased/force-post-migration-dir-schema-load.yml
+5
-0
config/initializers/0_post_deployment_migrations.rb
config/initializers/0_post_deployment_migrations.rb
+1
-11
lib/gitlab/database.rb
lib/gitlab/database.rb
+16
-0
lib/tasks/gitlab/db.rake
lib/tasks/gitlab/db.rake
+2
-0
spec/tasks/gitlab/db_rake_spec.rb
spec/tasks/gitlab/db_rake_spec.rb
+33
-0
No files found.
changelogs/unreleased/force-post-migration-dir-schema-load.yml
0 → 100644
View file @
ec33016b
---
title
:
Ensure the schema is loaded with post_migrations included
merge_request
:
21689
author
:
type
:
changed
config/initializers/0_post_deployment_migrations.rb
View file @
ec33016b
# Post deployment migrations are included by default. This file must be loaded
# Post deployment migrations are included by default. This file must be loaded
# before other initializers as Rails may otherwise memoize a list of migrations
# before other initializers as Rails may otherwise memoize a list of migrations
# excluding the post deployment migrations.
# excluding the post deployment migrations.
unless
ENV
[
'SKIP_POST_DEPLOYMENT_MIGRATIONS'
]
Gitlab
::
Database
.
add_post_migrate_path_to_rails
Rails
.
application
.
config
.
paths
[
'db'
].
each
do
|
db_path
|
path
=
Rails
.
root
.
join
(
db_path
,
'post_migrate'
).
to_s
Rails
.
application
.
config
.
paths
[
'db/migrate'
]
<<
path
# Rails memoizes migrations at certain points where it won't read the above
# path just yet. As such we must also update the following list of paths.
ActiveRecord
::
Migrator
.
migrations_paths
<<
path
end
end
lib/gitlab/database.rb
View file @
ec33016b
...
@@ -249,5 +249,21 @@ module Gitlab
...
@@ -249,5 +249,21 @@ module Gitlab
end
end
private_class_method
:database_version
private_class_method
:database_version
def
self
.
add_post_migrate_path_to_rails
(
force:
false
)
return
if
ENV
[
'SKIP_POST_DEPLOYMENT_MIGRATIONS'
]
&&
!
force
Rails
.
application
.
config
.
paths
[
'db'
].
each
do
|
db_path
|
path
=
Rails
.
root
.
join
(
db_path
,
'post_migrate'
).
to_s
unless
Rails
.
application
.
config
.
paths
[
'db/migrate'
].
include?
path
Rails
.
application
.
config
.
paths
[
'db/migrate'
]
<<
path
# Rails memoizes migrations at certain points where it won't read the above
# path just yet. As such we must also update the following list of paths.
ActiveRecord
::
Migrator
.
migrations_paths
<<
path
end
end
end
end
end
end
end
lib/tasks/gitlab/db.rake
View file @
ec33016b
...
@@ -51,6 +51,8 @@ namespace :gitlab do
...
@@ -51,6 +51,8 @@ namespace :gitlab do
if
ActiveRecord
::
Base
.
connection
.
tables
.
count
>
1
if
ActiveRecord
::
Base
.
connection
.
tables
.
count
>
1
Rake
::
Task
[
'db:migrate'
].
invoke
Rake
::
Task
[
'db:migrate'
].
invoke
else
else
# Add post-migrate paths to ensure we mark all migrations as up
Gitlab
::
Database
.
add_post_migrate_path_to_rails
(
force:
true
)
Rake
::
Task
[
'db:schema:load'
].
invoke
Rake
::
Task
[
'db:schema:load'
].
invoke
Rake
::
Task
[
'db:seed_fu'
].
invoke
Rake
::
Task
[
'db:seed_fu'
].
invoke
end
end
...
...
spec/tasks/gitlab/db_rake_spec.rb
View file @
ec33016b
...
@@ -61,6 +61,39 @@ describe 'gitlab:db namespace rake task' do
...
@@ -61,6 +61,39 @@ describe 'gitlab:db namespace rake task' do
expect
(
Rake
::
Task
[
'db:migrate'
]).
not_to
receive
(
:invoke
)
expect
(
Rake
::
Task
[
'db:migrate'
]).
not_to
receive
(
:invoke
)
expect
{
run_rake_task
(
'gitlab:db:configure'
)
}.
to
raise_error
(
RuntimeError
,
'error'
)
expect
{
run_rake_task
(
'gitlab:db:configure'
)
}.
to
raise_error
(
RuntimeError
,
'error'
)
end
end
context
'SKIP_POST_DEPLOYMENT_MIGRATIONS environment variable set'
do
let
(
:rails_paths
)
{
{
'db'
=>
[
'db'
],
'db/migrate'
=>
[
'db/migrate'
]
}
}
before
do
allow
(
ENV
).
to
receive
(
:[]
).
and_call_original
allow
(
ENV
).
to
receive
(
:[]
).
with
(
'SKIP_POST_DEPLOYMENT_MIGRATIONS'
).
and_return
true
# Our environment has already been loaded, so we need to pretend like post_migrations were not
allow
(
Rails
.
application
.
config
).
to
receive
(
:paths
).
and_return
(
rails_paths
)
allow
(
ActiveRecord
::
Migrator
).
to
receive
(
:migrations_paths
).
and_return
(
rails_paths
[
'db/migrate'
].
dup
)
end
it
'adds post deployment migrations before schema load if the schema is not already loaded'
do
allow
(
ActiveRecord
::
Base
.
connection
).
to
receive
(
:tables
).
and_return
([])
expect
(
Gitlab
::
Database
).
to
receive
(
:add_post_migrate_path_to_rails
).
and_call_original
expect
(
Rake
::
Task
[
'db:schema:load'
]).
to
receive
(
:invoke
)
expect
(
Rake
::
Task
[
'db:seed_fu'
]).
to
receive
(
:invoke
)
expect
(
Rake
::
Task
[
'db:migrate'
]).
not_to
receive
(
:invoke
)
expect
{
run_rake_task
(
'gitlab:db:configure'
)
}.
not_to
raise_error
expect
(
rails_paths
[
'db/migrate'
].
include?
(
File
.
join
(
Rails
.
root
,
'db'
,
'post_migrate'
))).
to
be
(
true
)
end
it
'ignores post deployment migrations when schema has already been loaded'
do
allow
(
ActiveRecord
::
Base
.
connection
).
to
receive
(
:tables
).
and_return
(
%w[table1 table2]
)
expect
(
Rake
::
Task
[
'db:migrate'
]).
to
receive
(
:invoke
)
expect
(
Gitlab
::
Database
).
not_to
receive
(
:add_post_migrate_path_to_rails
)
expect
(
Rake
::
Task
[
'db:schema:load'
]).
not_to
receive
(
:invoke
)
expect
(
Rake
::
Task
[
'db:seed_fu'
]).
not_to
receive
(
:invoke
)
expect
{
run_rake_task
(
'gitlab:db:configure'
)
}.
not_to
raise_error
expect
(
rails_paths
[
'db/migrate'
].
include?
(
File
.
join
(
Rails
.
root
,
'db'
,
'post_migrate'
))).
to
be
(
false
)
end
end
end
end
def
run_rake_task
(
task_name
)
def
run_rake_task
(
task_name
)
...
...
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