Skip to content

octopus task wait cli command does not return if shelled out to from ruby #526

@ohTHATaaronbrown

Description

@ohTHATaaronbrown

The bug

Shelling out to octopus task wait in ruby with Open3.popen3 never returns. Even when specifying --no-prompt and/or --output-format json. Even when the task has completed on the server. The calling ruby code will just flat-out never continue past the point where the call to octopus task wait was made.

Note that the same code block below works fine with a call to octopus runbook run.

The lack of ability to successfully wait on the outcome of a runbook invocation's task makes the octopus cli useless in my process. I had to fall back to the deprecated octo cli that was discontinued in 2022 to get a working wait-on-outcome workflow.

What I'm after is the equivalent behavior to this call to the deprecated cli:

octo run-runbook --runbook="my_deployment_runbook" --progress --logLevel="information" --waitForRun --runCheckSleepCycle="00:00:05" --runTimeout="30" --project="my_ops_project" --environment="my_test_environment"

Command to reproduce

require 'open3'
result = {messages: [], errors: [] }
command_name = 'task wait'

command_line = '/usr/local/bin/octopus task wait "ServerTasks-358388" --space "Spaces-1" --timeout 60 --no-prompt --output-format json'

Open3.popen3(command_line) do |stdin, stdout, stderr, wait_thr|
  stdout.each do |line|
    line.chomp!
    if line.length.positive?
      trimmed_line = line.strip.squeeze("\t", ' ')
      result[:messages] << trimmed_line
    end
  end
  
  stderr.each do |line|
    line.chomp!
    if line.length.positive?
      trimmed_line = line.strip.squeeze("\t", ' ')
      result[:errors] << trimmed_line
      logger.error "#{trimmed_line}"
    end
  end
  
  exit_status = wait_thr.value
  exit_message = ''
  if exit_status.success?
    exit_message = "#{command_name} result: succeeded"
    result[:messages] << exit_message
    result[:overall_result] = :succeeded
    logger.info exit_message
  else
    exit_message = "#{command_name} returned a failure code: #{exit_status.exitstatus}."
    result[:messages] << exit_message
    result[:overall_result] = :failed_unexpected_exit_code
    logger.warn exit_message
  end
end

Outcome

### crickets...

Versions

cli: 1.8.0

Octopus Server: 2025.1.10012

cli running on: macOS Sequoia 15.5 (24F74) on m4 max macbook pro, ruby 3.4.1

Links

Probably related to #290 and #379

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions