Improve `sh' task action error handling:

Handle exit status code in Remote#execute.
This commit is contained in:
Thibault Jouan 2013-08-05 21:03:18 +00:00
parent f10914c7d7
commit 825bdec74d
4 changed files with 39 additions and 6 deletions

View File

@ -24,3 +24,16 @@ Feature: sh task action
"""
When I execute the recipe
Then the output must contain "from remote"
Scenario: aborts on failed command execution
Given a recipe with:
"""
target 'some_host.test'
task :some_task do
sh '\false'
sh '\echo after_fail'
end
"""
When I execute the recipe
Then the output must not contain "after_fail"

View File

@ -1,8 +1,9 @@
module Producer
module Core
Error = Class.new(StandardError)
ConditionNotMetError = Class.new(Error)
RecipeEvaluationError = Class.new(StandardError)
TaskEvaluationError = Class.new(RecipeEvaluationError)
Error = Class.new(StandardError)
ConditionNotMetError = Class.new(Error)
RecipeEvaluationError = Class.new(StandardError)
TaskEvaluationError = Class.new(RecipeEvaluationError)
RemoteCommandExecutionError = Class.new(Error)
end
end

View File

@ -16,8 +16,17 @@ module Producer
def execute(command)
output = ''
session.exec command do |ch, stream, data|
output << data
session.open_channel do |channel|
channel.exec command do |ch, success|
ch.on_data do |c, data|
output << data
end
ch.on_request('exit-status') do |c, data|
exit_status = data.read_long
raise RemoteCommandExecutionError if exit_status != 0
end
end
end
session.loop
output

View File

@ -49,6 +49,16 @@ module Producer::Core
end
expect(remote.execute(command)).to eq arguments
end
it 'raises an exception when the exit status code is not 0' do
story_with_new_channel do |ch|
ch.sends_exec command
ch.gets_data arguments
ch.gets_exit_status 1
end
expect { remote.execute(command) }
.to raise_error(RemoteCommandExecutionError)
end
end
end
end