shipit-engine 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +41 -37
- data/app/assets/javascripts/task/tty.js.coffee +40 -22
- data/app/assets/stylesheets/_pages/_deploy.scss +1 -0
- data/app/controllers/shipit/api/locks_controller.rb +3 -3
- data/app/controllers/shipit/api/stacks_controller.rb +14 -1
- data/app/controllers/shipit/commit_checks_controller.rb +9 -2
- data/app/controllers/shipit/shipit_controller.rb +1 -1
- data/app/controllers/shipit/stacks_controller.rb +11 -5
- data/app/controllers/shipit/status_controller.rb +1 -1
- data/app/controllers/shipit/webhooks_controller.rb +15 -5
- data/app/helpers/shipit/deploys_helper.rb +1 -1
- data/app/helpers/shipit/shipit_helper.rb +2 -0
- data/app/jobs/shipit/perform_commit_checks_job.rb +2 -0
- data/app/jobs/shipit/perform_task_job.rb +18 -8
- data/app/models/shipit/commit.rb +22 -12
- data/app/models/shipit/commit_checks.rb +20 -53
- data/app/models/shipit/deploy.rb +1 -1
- data/app/models/shipit/ephemeral_commit_checks.rb +76 -0
- data/app/models/shipit/stack.rb +40 -10
- data/app/models/shipit/status.rb +14 -8
- data/app/models/shipit/status_group.rb +1 -1
- data/app/models/shipit/task.rb +2 -0
- data/app/models/shipit/unknown_status.rb +4 -0
- data/app/models/shipit/user.rb +9 -1
- data/app/serializers/shipit/stack_serializer.rb +6 -1
- data/app/views/shipit/commit_checks/_checks.html.erb +13 -0
- data/app/views/shipit/commit_checks/show.html.erb +5 -0
- data/app/views/shipit/stacks/_header.html.erb +1 -1
- data/app/views/shipit/stacks/show.html.erb +15 -0
- data/config/routes.rb +2 -1
- data/db/migrate/20140226233935_create_baseline.rb +10 -10
- data/db/migrate/20160802092812_add_continuous_delivery_delayed_since_to_stacks.rb +5 -0
- data/db/migrate/20160822131405_add_locked_since_to_stacks.rb +5 -0
- data/lib/shipit.rb +4 -0
- data/lib/shipit/command.rb +1 -1
- data/lib/shipit/commands.rb +10 -7
- data/lib/shipit/csv_serializer.rb +1 -1
- data/lib/shipit/stack_commands.rb +17 -5
- data/lib/shipit/task_commands.rb +2 -2
- data/lib/shipit/version.rb +1 -1
- data/lib/snippets/push-to-heroku +20 -16
- data/test/controllers/api/deploys_controller_test.rb +8 -8
- data/test/controllers/api/hooks_controller_test.rb +11 -9
- data/test/controllers/api/locks_controller_test.rb +16 -6
- data/test/controllers/api/outputs_controller_test.rb +1 -1
- data/test/controllers/api/stacks_controller_test.rb +48 -3
- data/test/controllers/api/tasks_controller_test.rb +6 -6
- data/test/controllers/commit_checks_controller_test.rb +3 -3
- data/test/controllers/deploys_controller_test.rb +13 -13
- data/test/controllers/rollbacks_controller_test.rb +7 -7
- data/test/controllers/stacks_controller_test.rb +36 -29
- data/test/controllers/tasks_controller_test.rb +14 -14
- data/test/controllers/webhooks_controller_test.rb +16 -25
- data/test/dummy/config/application.rb +0 -3
- data/test/dummy/config/environments/test.rb +2 -2
- data/test/dummy/data/stacks/byroot/junk/production/git/bar.txt +2 -0
- data/test/dummy/data/stacks/byroot/junk/production/git/bin/slow +7 -0
- data/test/dummy/data/stacks/byroot/junk/production/git/bin/timeout +10 -0
- data/test/dummy/data/stacks/byroot/junk/production/git/dkfdsf +0 -0
- data/test/dummy/data/stacks/byroot/junk/production/git/dskjfsd +0 -0
- data/test/dummy/data/stacks/byroot/junk/production/git/dslkjfjsdf +0 -0
- data/test/dummy/data/stacks/byroot/junk/production/git/plopfizz +0 -0
- data/test/dummy/data/stacks/byroot/junk/production/git/sd +0 -0
- data/test/dummy/data/stacks/byroot/junk/production/git/sdkfjsdf +1 -0
- data/test/dummy/data/stacks/byroot/junk/production/git/sdlfjsdfdsfj +0 -0
- data/test/dummy/data/stacks/byroot/junk/production/git/sdlkfjsdlkfjsdlkfjdsfsdfksdfjsldkfjsdlkfjsdf +0 -0
- data/test/dummy/data/stacks/byroot/junk/production/git/shipit.yml +21 -0
- data/test/dummy/data/stacks/byroot/junk/production/git/toto.txt +2 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/schema.rb +15 -13
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/fixtures/shipit/commit_deployments.yml +8 -8
- data/test/fixtures/shipit/output_chunks.yml +12 -12
- data/test/fixtures/shipit/tasks.yml +9 -1
- data/test/fixtures/shipit/users.yml +9 -2
- data/test/jobs/perform_task_job_test.rb +14 -11
- data/test/models/commits_test.rb +33 -14
- data/test/models/stacks_test.rb +78 -4
- data/test/models/users_test.rb +16 -0
- data/test/unit/commands_test.rb +4 -0
- data/test/unit/deploy_commands_test.rb +1 -1
- metadata +133 -34
- data/app/jobs/shipit/git_mirror_update_job.rb +0 -14
- data/app/views/shipit/deploys/_checks.html.erb +0 -11
data/app/models/shipit/status.rb
CHANGED
@@ -13,18 +13,24 @@ module Shipit
|
|
13
13
|
|
14
14
|
delegate :broadcast_update, to: :commit
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
16
|
+
class << self
|
17
|
+
def replicate_from_github!(github_status)
|
18
|
+
find_or_create_by!(
|
19
|
+
state: github_status.state,
|
20
|
+
description: github_status.description,
|
21
|
+
target_url: github_status.target_url,
|
22
|
+
context: github_status.context,
|
23
|
+
created_at: github_status.created_at,
|
24
|
+
)
|
25
|
+
end
|
24
26
|
end
|
25
27
|
|
26
28
|
delegate :stack, to: :commit
|
27
29
|
|
30
|
+
def unknown?
|
31
|
+
false
|
32
|
+
end
|
33
|
+
|
28
34
|
def ignored?
|
29
35
|
stack.soft_failing_statuses.include?(context)
|
30
36
|
end
|
@@ -9,7 +9,7 @@ module Shipit
|
|
9
9
|
@statuses = visible_statuses
|
10
10
|
end
|
11
11
|
|
12
|
-
delegate :pending?, :success?, :error?, :failure?, :state, to: :significant_status
|
12
|
+
delegate :pending?, :success?, :error?, :failure?, :unknown?, :state, to: :significant_status
|
13
13
|
|
14
14
|
def description
|
15
15
|
"#{success_count} / #{statuses.count} checks OK"
|
data/app/models/shipit/task.rb
CHANGED
@@ -3,6 +3,7 @@ module Shipit
|
|
3
3
|
PRESENCE_CHECK_TIMEOUT = 15
|
4
4
|
ACTIVE_STATUSES = %w(pending running aborting).freeze
|
5
5
|
COMPLETED_STATUSES = %w(success error failed flapping aborted).freeze
|
6
|
+
UNSUCCESSFUL_STATUSES = %w(error failed aborted flapping).freeze
|
6
7
|
|
7
8
|
attr_accessor :pid
|
8
9
|
|
@@ -22,6 +23,7 @@ module Shipit
|
|
22
23
|
scope :completed, -> { where(status: COMPLETED_STATUSES) }
|
23
24
|
scope :active, -> { where(status: ACTIVE_STATUSES) }
|
24
25
|
scope :exclusive, -> { where(allow_concurrency: false) }
|
26
|
+
scope :unsuccessful, -> { where(status: UNSUCCESSFUL_STATUSES) }
|
25
27
|
|
26
28
|
scope :due_for_rollup, -> { completed.where(rolled_up: false).where('created_at <= ?', 1.hour.ago) }
|
27
29
|
|
data/app/models/shipit/user.rb
CHANGED
@@ -35,6 +35,14 @@ module Shipit
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
+
alias_method :original_github_access_token, :github_access_token
|
39
|
+
def github_access_token
|
40
|
+
original_github_access_token
|
41
|
+
rescue OpenSSL::Cipher::CipherError
|
42
|
+
update_columns(encrypted_github_access_token: nil, encrypted_github_access_token_iv: nil)
|
43
|
+
nil
|
44
|
+
end
|
45
|
+
|
38
46
|
def github_api
|
39
47
|
return Shipit.github_api unless github_access_token
|
40
48
|
|
@@ -55,7 +63,7 @@ module Shipit
|
|
55
63
|
|
56
64
|
def stacks_contributed_to
|
57
65
|
return [] unless id
|
58
|
-
Commit.where('author_id = :id or committer_id = :id', id: id).
|
66
|
+
Commit.where('author_id = :id or committer_id = :id', id: id).distinct.pluck(:stack_id)
|
59
67
|
end
|
60
68
|
|
61
69
|
def refresh_from_github!
|
@@ -4,7 +4,8 @@ module Shipit
|
|
4
4
|
|
5
5
|
has_one :lock_author
|
6
6
|
attributes :id, :repo_owner, :repo_name, :environment, :html_url, :url, :tasks_url, :deploy_url, :deploy_spec,
|
7
|
-
:undeployed_commits_count, :is_locked, :lock_reason, :continuous_deployment, :created_at,
|
7
|
+
:undeployed_commits_count, :is_locked, :lock_reason, :continuous_deployment, :created_at,
|
8
|
+
:updated_at, :locked_since
|
8
9
|
|
9
10
|
def url
|
10
11
|
api_stack_url(object)
|
@@ -30,6 +31,10 @@ module Shipit
|
|
30
31
|
object.locked?
|
31
32
|
end
|
32
33
|
|
34
|
+
def include_locked_since?
|
35
|
+
object.locked?
|
36
|
+
end
|
37
|
+
|
33
38
|
def deploy_spec
|
34
39
|
object.cached_deploy_spec.cacheable.config
|
35
40
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<%= javascript_include_tag 'task' %>
|
2
|
+
|
3
|
+
<section>
|
4
|
+
<header class="section-header">
|
5
|
+
<h2>Checks</h2>
|
6
|
+
</header>
|
7
|
+
|
8
|
+
<%- url = stack_tail_commit_checks_path(commit.stack, sha: commit.sha, since: 0) -%>
|
9
|
+
|
10
|
+
<div class="task-output-container">
|
11
|
+
<pre class="commit-checks" data-status="<%= commit.checks.status %>"><code data-next-chunks-url="<%= url %>"></code></pre>
|
12
|
+
</div>
|
13
|
+
</section>
|
@@ -36,7 +36,7 @@
|
|
36
36
|
</li>
|
37
37
|
<% if stack.deploy_url.present? %>
|
38
38
|
<li class="nav__list__item">
|
39
|
-
<%= link_to 'View website', stack.deploy_url, :target => '_blank', :class => 'deploy-url' %>
|
39
|
+
<%= sanitize link_to 'View website', stack.deploy_url, :target => '_blank', :class => 'deploy-url' %>
|
40
40
|
</li>
|
41
41
|
<% end %>
|
42
42
|
</ul>
|
@@ -49,6 +49,21 @@
|
|
49
49
|
</div>
|
50
50
|
<% end %>
|
51
51
|
|
52
|
+
<% if @stack.continuous_delivery_delayed? %>
|
53
|
+
<div class="banner">
|
54
|
+
<div class="banner__inner wrapper">
|
55
|
+
<div class="banner__content">
|
56
|
+
<h2 class="banner__title">Continuous Delivery Delayed!</h2>
|
57
|
+
<p class="banner__text">
|
58
|
+
Continuous Delivery for this stack is currently paused because
|
59
|
+
<%= link_to 'the pre-deploy checks failed', stack_commit_checks_path(@stack, sha: @stack.next_commit_to_deploy.sha) %>.
|
60
|
+
You can either wait for them to pass, or trigger a deploy manually.
|
61
|
+
</p>
|
62
|
+
</div>
|
63
|
+
</div>
|
64
|
+
</div>
|
65
|
+
<% end %>
|
66
|
+
|
52
67
|
<div class="wrapper" data-event-stream="<%= events_path(channels: ["stack.#{@stack.id}"]) %>">
|
53
68
|
|
54
69
|
<section>
|
data/config/routes.rb
CHANGED
@@ -24,7 +24,7 @@ Shipit::Engine.routes.draw do
|
|
24
24
|
# API
|
25
25
|
namespace :api do
|
26
26
|
root to: 'base#index'
|
27
|
-
resources :stacks, only:
|
27
|
+
resources :stacks, only: %i(index create)
|
28
28
|
scope '/stacks/*id', id: stack_id_format, as: :stack do
|
29
29
|
get '/' => 'stacks#show'
|
30
30
|
end
|
@@ -62,6 +62,7 @@ Shipit::Engine.routes.draw do
|
|
62
62
|
end
|
63
63
|
|
64
64
|
scope '/*stack_id', stack_id: stack_id_format, as: :stack do
|
65
|
+
get '/commit/:sha/checks' => 'commit_checks#show', as: :commit_checks
|
65
66
|
get '/commit/:sha/checks/tail' => 'commit_checks#tail', as: :tail_commit_checks, defaults: {format: :json}
|
66
67
|
|
67
68
|
resources :rollbacks, only: %i(create)
|
@@ -49,13 +49,13 @@ class CreateBaseline < ActiveRecord::Migration
|
|
49
49
|
create_table "github_hooks", force: :cascade do |t|
|
50
50
|
t.integer "stack_id", limit: 4
|
51
51
|
t.integer "github_id", limit: 4
|
52
|
-
t.string "event", limit:
|
52
|
+
t.string "event", limit: 50
|
53
53
|
t.datetime "created_at"
|
54
54
|
t.datetime "updated_at"
|
55
55
|
t.string "secret", limit: 255
|
56
56
|
t.string "api_url", limit: 255
|
57
57
|
t.string "type", limit: 255
|
58
|
-
t.string "organization", limit:
|
58
|
+
t.string "organization", limit: 39
|
59
59
|
end
|
60
60
|
|
61
61
|
add_index "github_hooks", ["organization", "event"], name: "index_github_hooks_on_organization_and_event", unique: true, using: :btree
|
@@ -94,9 +94,9 @@ class CreateBaseline < ActiveRecord::Migration
|
|
94
94
|
add_index "output_chunks", ["task_id"], name: "index_output_chunks_on_task_id", using: :btree
|
95
95
|
|
96
96
|
create_table "stacks", force: :cascade do |t|
|
97
|
-
t.string "repo_name", limit:
|
98
|
-
t.string "repo_owner", limit:
|
99
|
-
t.string "environment", limit:
|
97
|
+
t.string "repo_name", limit: 100, null: false
|
98
|
+
t.string "repo_owner", limit: 39, null: false
|
99
|
+
t.string "environment", limit: 50, default: "production", null: false
|
100
100
|
t.datetime "created_at"
|
101
101
|
t.datetime "updated_at"
|
102
102
|
t.string "branch", limit: 255, default: "master", null: false
|
@@ -127,12 +127,12 @@ class CreateBaseline < ActiveRecord::Migration
|
|
127
127
|
t.integer "stack_id", limit: 4, null: false
|
128
128
|
t.integer "since_commit_id", limit: 4, null: false
|
129
129
|
t.integer "until_commit_id", limit: 4, null: false
|
130
|
-
t.string "status", limit:
|
130
|
+
t.string "status", limit: 10, default: "pending", null: false
|
131
131
|
t.datetime "created_at"
|
132
132
|
t.datetime "updated_at"
|
133
133
|
t.integer "user_id", limit: 4
|
134
134
|
t.boolean "rolled_up", default: false, null: false
|
135
|
-
t.string "type", limit:
|
135
|
+
t.string "type", limit: 20
|
136
136
|
t.integer "parent_id", limit: 4
|
137
137
|
t.integer "additions", limit: 4, default: 0
|
138
138
|
t.integer "deletions", limit: 4, default: 0
|
@@ -148,9 +148,9 @@ class CreateBaseline < ActiveRecord::Migration
|
|
148
148
|
create_table "teams", force: :cascade do |t|
|
149
149
|
t.integer "github_id", limit: 4
|
150
150
|
t.string "api_url", limit: 255
|
151
|
-
t.string "slug", limit:
|
151
|
+
t.string "slug", limit: 50
|
152
152
|
t.string "name", limit: 255
|
153
|
-
t.string "organization", limit:
|
153
|
+
t.string "organization", limit: 39
|
154
154
|
t.datetime "created_at", null: false
|
155
155
|
t.datetime "updated_at", null: false
|
156
156
|
end
|
@@ -161,7 +161,7 @@ class CreateBaseline < ActiveRecord::Migration
|
|
161
161
|
t.integer "github_id", limit: 4
|
162
162
|
t.string "name", limit: 255, null: false
|
163
163
|
t.string "email", limit: 255
|
164
|
-
t.string "login", limit:
|
164
|
+
t.string "login", limit: 39
|
165
165
|
t.string "api_url", limit: 255
|
166
166
|
t.datetime "created_at"
|
167
167
|
t.datetime "updated_at"
|
data/lib/shipit.rb
CHANGED
data/lib/shipit/command.rb
CHANGED
data/lib/shipit/commands.rb
CHANGED
@@ -1,17 +1,20 @@
|
|
1
1
|
module Shipit
|
2
2
|
class Commands
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
class << self
|
4
|
+
def for(model)
|
5
|
+
"#{model.class.name}Commands".constantize.new(model)
|
6
|
+
end
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
def git_version
|
9
|
+
@git_version ||= parse_git_version(`git --version`)
|
10
|
+
end
|
11
|
+
|
12
|
+
def parse_git_version(raw_git_version)
|
13
|
+
raw_git_version =~ /(\d+\.\d+\.\d+)/
|
10
14
|
raise 'git command not found' unless $1
|
11
15
|
Gem::Version.new($1)
|
12
16
|
end
|
13
17
|
end
|
14
|
-
|
15
18
|
delegate :git_version, to: :class
|
16
19
|
|
17
20
|
def env
|
@@ -16,6 +16,15 @@ module Shipit
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
+
def fetched?(commit)
|
20
|
+
git_dir = File.join(@stack.git_path, '.git')
|
21
|
+
if Dir.exist?(git_dir)
|
22
|
+
git('rev-parse', '--quiet', '--verify', "#{commit.sha}^{commit}", env: env, chdir: @stack.git_path)
|
23
|
+
else
|
24
|
+
Command.new('test', '-d', git_dir, env: env, chdir: @stack.deploys_path)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
19
28
|
def fetch_deployed_revision
|
20
29
|
with_temporary_working_directory do |dir|
|
21
30
|
spec = DeploySpec::FileSystem.new(dir, @stack.environment)
|
@@ -33,14 +42,17 @@ module Shipit
|
|
33
42
|
end
|
34
43
|
|
35
44
|
def with_temporary_working_directory(commit: nil)
|
36
|
-
|
37
|
-
|
38
|
-
|
45
|
+
if commit
|
46
|
+
@stack.acquire_git_cache_lock do
|
47
|
+
fetch.run! unless fetched?(commit).tap(&:run).success?
|
48
|
+
end
|
39
49
|
end
|
50
|
+
|
40
51
|
Dir.mktmpdir do |dir|
|
41
52
|
git('clone', @stack.git_path, @stack.repo_name, chdir: dir).run!
|
42
|
-
|
43
|
-
|
53
|
+
git_dir = File.join(dir, @stack.repo_name)
|
54
|
+
git('checkout', commit.sha, chdir: git_dir).run! if commit
|
55
|
+
yield Pathname.new(git_dir)
|
44
56
|
end
|
45
57
|
end
|
46
58
|
|
data/lib/shipit/task_commands.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Shipit
|
2
2
|
class TaskCommands < Commands
|
3
|
-
delegate :fetch, to: :stack_commands
|
3
|
+
delegate :fetch, :fetched?, to: :stack_commands
|
4
4
|
|
5
5
|
def initialize(task)
|
6
6
|
@task = task
|
@@ -32,7 +32,7 @@ module Shipit
|
|
32
32
|
super.merge(
|
33
33
|
'ENVIRONMENT' => @stack.environment,
|
34
34
|
'BRANCH' => @stack.branch,
|
35
|
-
'
|
35
|
+
'SHIPIT_USER' => "#{@task.author.login} (#{normalized_name}) via Shipit",
|
36
36
|
'EMAIL' => @task.author.email,
|
37
37
|
'BUNDLE_PATH' => Rails.root.join('data', 'bundler').to_s,
|
38
38
|
'SHIPIT_LINK' => permalink,
|
data/lib/shipit/version.rb
CHANGED
data/lib/snippets/push-to-heroku
CHANGED
@@ -13,8 +13,9 @@ function yellow() {
|
|
13
13
|
HEROKU_APP=$1
|
14
14
|
HEROKU_RELEASES=`heroku releases --app $HEROKU_APP 2>&1`
|
15
15
|
GIT_COMMAND=${GIT_COMMAND:="git push git@heroku.com:$HEROKU_APP.git $SHA:master $GIT_FLAGS"}
|
16
|
+
POST_MIGRATION_DEPLOY=${POST_MIGRATION_DEPLOY:="true"}
|
16
17
|
|
17
|
-
if [ -z $HEROKU_APP ]; then
|
18
|
+
if [[ -z "${HEROKU_APP}" ]]; then
|
18
19
|
red "Usage: $0 <app-name>"
|
19
20
|
red "Supported environment variables:"
|
20
21
|
red " - GIT_COMMAND: override the entire 'git push' command."
|
@@ -24,49 +25,52 @@ fi
|
|
24
25
|
|
25
26
|
echo "$HEROKU_RELEASES" | head -n2 | tail -n1 | grep '^\(v[0-9]\+\)' >/dev/null
|
26
27
|
|
27
|
-
if [ $? -ne 0 ]; then
|
28
|
+
if [[ $? -ne 0 ]]; then
|
28
29
|
red "Error detecting current heroku release. Message from 'heroku releases':"
|
29
|
-
echo "$HEROKU_RELEASES"
|
30
|
-
red "Please contact a heroku collaborator for $HEROKU_APP:"
|
30
|
+
echo "${HEROKU_RELEASES}"
|
31
|
+
red "Please contact a heroku collaborator for ${HEROKU_APP}:"
|
31
32
|
heroku sharing --app $HEROKU_APP
|
32
33
|
exit 1;
|
33
34
|
fi
|
34
35
|
|
35
36
|
HEROKU_LAST_GOOD_RELEASE=`echo "$HEROKU_RELEASES" | head -n2 | tail -n1 | sed -e 's/^\(v[0-9]\+\).*/\1/'`
|
36
|
-
green "Current heroku release: $HEROKU_LAST_GOOD_RELEASE"
|
37
|
+
green "Current heroku release: ${HEROKU_LAST_GOOD_RELEASE}"
|
37
38
|
|
38
39
|
green "Pushing to heroku."
|
39
40
|
$GIT_COMMAND
|
40
|
-
if [ $? -ne 0 ]; then
|
41
|
+
if [[ $? -ne 0 ]]; then
|
41
42
|
red "Heroku push rejected. See message above."
|
42
|
-
red "Please contact a heroku collaborator for $HEROKU_APP:"
|
43
|
+
red "Please contact a heroku collaborator for ${HEROKU_APP}:"
|
43
44
|
heroku sharing --app $HEROKU_APP
|
44
45
|
exit 1;
|
45
46
|
fi
|
46
47
|
|
47
|
-
|
48
|
+
MIGRATION_STATUS=`heroku run rake db:migrate:status --app $HEROKU_APP | grep -e '^\s*down'`
|
48
49
|
|
49
|
-
if [ "$
|
50
|
+
if [[ "${MIGRATION_STATUS}" != "" ]]; then
|
50
51
|
green "There are pending migrations to apply:"
|
51
|
-
echo $
|
52
|
+
echo $MIGRATION_STATUS
|
52
53
|
|
53
54
|
green "Migrating database."
|
54
55
|
heroku run rake db:migrate --app $HEROKU_APP
|
55
|
-
|
56
|
+
|
57
|
+
POST_MIGRATION_STATUS=`heroku run rake db:migrate:status --app $HEROKU_APP | grep -e '^\s*down'`
|
58
|
+
if [[ "${POST_MIGRATION_STATUS}" != "" ]]; then
|
56
59
|
red "Migration failed! This is bad."
|
57
|
-
red "Please contact a heroku collaborator for $HEROKU_APP:"
|
60
|
+
red "Please contact a heroku collaborator for ${HEROKU_APP}:"
|
58
61
|
heroku sharing --app $HEROKU_APP
|
59
|
-
red "The app $HEROKU_APP will now be reverted to its last working version $HEROKU_LAST_GOOD_RELEASE."
|
62
|
+
red "The app ${HEROKU_APP} will now be reverted to its last working version ${HEROKU_LAST_GOOD_RELEASE}."
|
60
63
|
heroku releases:rollback $HEROKU_LAST_GOOD_RELEASE --app $HEROKU_APP
|
61
64
|
red "Abort."
|
62
65
|
exit 1
|
63
66
|
fi
|
64
67
|
|
65
|
-
|
66
|
-
|
68
|
+
if [[ "${POST_MIGRATION_DEPLOY}" == "true" ]]; then
|
69
|
+
green "Post-migration dyno restart."
|
70
|
+
heroku restart --app $HEROKU_APP
|
71
|
+
fi
|
67
72
|
else
|
68
73
|
green "There are no pending migrations."
|
69
74
|
fi
|
70
75
|
|
71
76
|
green "All done."
|
72
|
-
|