diff --git a/packer/rpc/builder.go b/packer/rpc/builder.go index 697727344..a9a685b07 100644 --- a/packer/rpc/builder.go +++ b/packer/rpc/builder.go @@ -84,7 +84,12 @@ func (b *builder) Run(ui packer.Ui, hook packer.Hook) packer.Artifact { panic(err) } - client, err := rpc.Dial("tcp", <-artifactAddress) + address := <-artifactAddress + if address == "" { + return nil + } + + client, err := rpc.Dial("tcp", address) if err != nil { panic(err) } @@ -127,12 +132,16 @@ func (b *BuilderServer) Run(args *BuilderRunArgs, reply *interface{}) error { hook := Hook(client) ui := &Ui{client} artifact := b.builder.Run(ui, hook) + responseAddress := "" - // Wrap the artifact - server := rpc.NewServer() - RegisterArtifact(server, artifact) + if artifact != nil { + // Wrap the artifact + server := rpc.NewServer() + RegisterArtifact(server, artifact) + responseAddress = serveSingleConn(server) + } - responseWriter.Encode(&BuilderRunResponse{serveSingleConn(server)}) + responseWriter.Encode(&BuilderRunResponse{responseAddress}) }() return nil diff --git a/packer/rpc/builder_test.go b/packer/rpc/builder_test.go index a17f0c229..678d70f75 100644 --- a/packer/rpc/builder_test.go +++ b/packer/rpc/builder_test.go @@ -16,6 +16,8 @@ type testBuilder struct { runHook packer.Hook runUi packer.Ui cancelCalled bool + + nilRunResult bool } func (b *testBuilder) Prepare(config interface{}) error { @@ -28,7 +30,12 @@ func (b *testBuilder) Run(ui packer.Ui, hook packer.Hook) packer.Artifact { b.runCalled = true b.runHook = hook b.runUi = ui - return testBuilderArtifact + + if !b.nilRunResult { + return testBuilderArtifact + } else { + return nil + } } func (b *testBuilder) Cancel() { @@ -74,6 +81,11 @@ func TestBuilderRPC(t *testing.T) { assert.Equal(artifact.Id(), testBuilderArtifact.Id(), "should have artifact Id") } + // Test run with nil result + b.nilRunResult = true + artifact = bClient.Run(ui, hook) + assert.Nil(artifact, "should be nil") + // Test Cancel bClient.Cancel() assert.True(b.cancelCalled, "cancel should be called")