1
0
Fork 0
mirror of https://github.com/capistrano/capistrano synced 2023-03-27 23:21:18 -04:00
capistrano/features/step_definitions/assertions.rb
David Michael Nelson f79a386aad Prevents last good release from being deleted on cleanup (#1922)
* Prevents last good release from being deleted on cleanup

Issue: 1907

If there are many failed deployments the relese folders will
still be left there and eventually if deploy:cleanup is
executed it will delete the release that is referenced by the
"current" symlink, potentially causing downtime.

That change will prevent the "current release" from ever being
removed during cleanup.

* Link PR on CHANGELOG

* Verify if current dir exists

Check if current release directory exists instead of relying on
exceptions being raised.
2017-10-12 12:40:57 -07:00

152 lines
4.6 KiB
Ruby

require "shellwords"
Then(/^references in the remote repo are listed$/) do
expect(@output).to include("refs/heads/master")
end
Then(/^git wrapper permissions are 0700$/) do
permissions_test = %Q([ $(stat -c "%a" #{TestApp.git_wrapper_path.shellescape}) == "700" ])
_stdout, _stderr, status = vagrant_cli_command("ssh -c #{permissions_test.shellescape}")
expect(status).to be_success
end
Then(/^the shared path is created$/) do
run_vagrant_command(test_dir_exists(TestApp.shared_path))
end
Then(/^the releases path is created$/) do
run_vagrant_command(test_dir_exists(TestApp.releases_path))
end
Then(/^(\d+) valid releases are kept/) do |num|
test = %Q([ $(ls -g #{TestApp.releases_path} | grep -E '[0-9]{14}' | wc -l) == "#{num}" ])
_, _, status = vagrant_cli_command("ssh -c #{test.shellescape}")
expect(status).to be_success
end
Then(/^the invalid (.+) release is ignored$/) do |filename|
test = "ls -g #{TestApp.releases_path} | grep #{filename}"
_, _, status = vagrant_cli_command("ssh -c #{test.shellescape}")
expect(status).to be_success
end
Then(/^directories in :linked_dirs are created in shared$/) do
TestApp.linked_dirs.each do |dir|
run_vagrant_command(test_dir_exists(TestApp.shared_path.join(dir)))
end
end
Then(/^directories referenced in :linked_files are created in shared$/) do
dirs = TestApp.linked_files.map { |path| TestApp.shared_path.join(path).dirname }
dirs.each do |dir|
run_vagrant_command(test_dir_exists(dir))
end
end
Then(/^the repo is cloned$/) do
run_vagrant_command(test_dir_exists(TestApp.repo_path))
end
Then(/^the release is created$/) do
run_vagrant_command("ls -g #{TestApp.releases_path}")
end
Then(/^file symlinks are created in the new release$/) do
TestApp.linked_files.each do |file|
run_vagrant_command(test_symlink_exists(TestApp.current_path.join(file)))
end
end
Then(/^directory symlinks are created in the new release$/) do
pending
TestApp.linked_dirs.each do |dir|
run_vagrant_command(test_symlink_exists(TestApp.release_path.join(dir)))
end
end
Then(/^the current directory will be a symlink to the release$/) do
run_vagrant_command(exists?("e", TestApp.current_path))
end
Then(/^the deploy\.rb file is created$/) do
file = TestApp.test_app_path.join("config/deploy.rb")
expect(File.exist?(file)).to be true
end
Then(/^the default stage files are created$/) do
staging = TestApp.test_app_path.join("config/deploy/staging.rb")
production = TestApp.test_app_path.join("config/deploy/production.rb")
expect(File.exist?(staging)).to be true
expect(File.exist?(production)).to be true
end
Then(/^the tasks folder is created$/) do
path = TestApp.test_app_path.join("lib/capistrano/tasks")
expect(Dir.exist?(path)).to be true
end
Then(/^the specified stage files are created$/) do
qa = TestApp.test_app_path.join("config/deploy/qa.rb")
production = TestApp.test_app_path.join("config/deploy/production.rb")
expect(File.exist?(qa)).to be true
expect(File.exist?(production)).to be true
end
Then(/^it creates the file with the remote_task prerequisite$/) do
TestApp.linked_files.each do |file|
run_vagrant_command(test_file_exists(TestApp.shared_path.join(file)))
end
end
Then(/^it will not recreate the file$/) do
#
end
Then(/^the task is successful$/) do
expect(@success).to be true
end
Then(/^the task fails$/) do
expect(@success).to be_falsey
end
Then(/^the failure task will run$/) do
failed = TestApp.shared_path.join("failed")
run_vagrant_command(test_file_exists(failed))
end
Then(/^the failure task will not run$/) do
failed = TestApp.shared_path.join("failed")
expect { run_vagrant_command(test_file_exists(failed)) }
.to raise_error(VagrantHelpers::VagrantSSHCommandError)
end
When(/^an error is raised$/) do
error = TestApp.shared_path.join("fail")
run_vagrant_command(test_file_exists(error))
end
Then(/contains "([^"]*)" in the output/) do |expected|
expect(@output).to include(expected)
end
Then(/the output matches "([^"]*)" followed by "([^"]*)"/) do |expected, followedby|
expect(@output).to match(/#{expected}.*#{followedby}/m)
end
Then(/doesn't contain "([^"]*)" in the output/) do |expected|
expect(@output).not_to include(expected)
end
Then(/the current symlink points to the previous release/) do
previous_release_path = @release_paths[-2]
run_vagrant_command(symlinked?(TestApp.current_path, previous_release_path))
end
Then(/^the current symlink points to that specific release$/) do
specific_release_path = TestApp.releases_path.join(@rollback_release)
run_vagrant_command(symlinked?(TestApp.current_path, specific_release_path))
end