Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion pkg/cmd/release/create/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -355,9 +355,13 @@ func createRun(cmd *cobra.Command, f factory.Factory, flags *CreateFlags) error

// the API response doesn't tell us what channel it selected, so we need to go look that up to tell the end user
newlyCreatedRelease, lookupErr := octopus.Releases.GetByID(options.Response.ReleaseID)
if lookupErr == nil && newlyCreatedRelease == nil {
lookupErr = fmt.Errorf("the server did not return release %s", options.Response.ReleaseID)
}
if lookupErr != nil {
// the lookup returns a nil release on failure, so there are no details to print alongside the version
cmd.PrintErrf("Warning: cannot fetch release details: %v\n", lookupErr)
printReleaseVersion(options.Response.ReleaseVersion, newlyCreatedRelease.Assembled, newlyCreatedRelease.ReleaseNotes, nil)
printReleaseVersion(options.Response.ReleaseVersion, time.Time{}, "", nil)
} else {
releaseChan, lookupErr := octopus.Channels.GetByID(newlyCreatedRelease.ChannelID)
if lookupErr != nil {
Expand Down
32 changes: 32 additions & 0 deletions pkg/cmd/release/create/create_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1287,6 +1287,38 @@ func TestReleaseCreate_AutomationMode(t *testing.T) {
assert.Equal(t, "", stdErr.String())
}},

// the post-create lookup returns a nil release on failure, so reading details off it panicked
{"release creation warns, rather than panicking, when the post-create lookup fails", func(t *testing.T, api *testutil.MockHttpServer, rootCmd *cobra.Command, stdOut *bytes.Buffer, stdErr *bytes.Buffer) {
cmdReceiver := testutil.GoBegin2(func() (*cobra.Command, error) {
defer api.Close()
rootCmd.SetArgs([]string{"release", "create", "--project", cacProject.Name})
return rootCmd.ExecuteC()
})

api.ExpectRequest(t, "GET", "/api/").RespondWith(rootResource)
api.ExpectRequest(t, "GET", "/api/Spaces-1").RespondWith(rootResource)
api.ExpectRequest(t, "GET", "/api/Spaces-1/projects/CaC Project").RespondWith(cacProject)

api.ExpectRequest(t, "POST", "/api/Spaces-1/releases/create/v1").RespondWith(&releases.CreateReleaseResponseV1{
ReleaseID: "Releases-999",
ReleaseVersion: "1.2.3",
})

// the release was created, but the server fails when we go back to ask which channel it picked
api.ExpectRequest(t, "GET", "/api/Spaces-1/releases/Releases-999").RespondWithStatus(500, "Internal Server Error", nil)

_, err := testutil.ReceivePair(cmdReceiver)
assert.Nil(t, err)

// the release exists, so we must still report the version we created
assert.Equal(t, heredoc.Doc(`
Successfully created release version 1.2.3

View this release on Octopus Deploy: http://server/app#/Spaces-1/releases/Releases-999
`), stdOut.String())
assert.Contains(t, stdErr.String(), "Warning: cannot fetch release details:")
}},

{"release creation specifying custom field", func(t *testing.T, api *testutil.MockHttpServer, rootCmd *cobra.Command, stdOut *bytes.Buffer, stdErr *bytes.Buffer) {
cmdReceiver := testutil.GoBegin2(func() (*cobra.Command, error) {
defer api.Close()
Expand Down