Module: Rakit::Azure::DevOps

Defined in:
lib/rakit/azure/dev_ops.rb

Defined Under Namespace

Classes: Issue, Job, PipelineResult, PipelineRun, PipelineStatusFallback, Stage

Constant Summary collapse

Generated =

Use generated proto PipelineStatus when available; otherwise fallback with same interface (success, errors, warnings).

defined?(Rakit::Azure::Generated) ? Rakit::Azure::Generated : nil
API_VERSION =
"7.1"
BASE_URL =
"https://dev.azure.com"

Class Method Summary collapse

Class Method Details

.get_pipeline_result(pipeline: nil) ⇒ PipelineResult

Returns a PipelineResult (proto: only runs) for the given pipeline. For success/errors/warnings summary use get_pipeline_status. When pipeline is given, uses its org, project, pipeline_id, token (token may be an ENV var name). When pipeline is nil, uses ENV.

Parameters:

  • pipeline (Object, nil) (defaults to: nil)

    Pipeline message value (org, project, pipeline_id, token) or nil for ENV

Returns:



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/rakit/azure/dev_ops.rb', line 91

def get_pipeline_result(pipeline: nil)
  org, project, pipeline_id, token = _resolve_pipeline_config(pipeline)

  if [org, project, pipeline_id, token].any?(&:nil?) || [org, project, pipeline_id, token].any?(&:empty?)
    return PipelineResult.new(runs: [], warnings: [_token_not_set_message(pipeline)])
  end

  if _token_unresolved?(pipeline, token)
    return PipelineResult.new(runs: [], warnings: [_token_not_set_message(pipeline)])
  end

  run = _list_runs(org, project, pipeline_id, token).first
  unless run
    return PipelineResult.new(runs: [], warnings: [])
  end

  timeline = _get_timeline_for_run(org, project, pipeline_id, token, run)
  runs = [_run_to_pipeline_run(run, timeline)]
  PipelineResult.new(runs: runs, warnings: [])
rescue StandardError => _e
  PipelineResult.new(runs: [], warnings: [])
end

.get_pipeline_status(pipeline: nil) ⇒ PipelineStatus

Returns the latest pipeline status (proto message PipelineStatus: success, errors, warnings). When pipeline is given, uses its org, project, pipeline_id, token (token may be an ENV var name). When pipeline is nil, uses ENV: AZURE_DEVOPS_ORG, AZURE_DEVOPS_PROJECT, AZURE_DEVOPS_PIPELINE_ID, AZURE_DEVOPS_TOKEN.

Examples:

status = Rakit::Azure::DevOps.get_pipeline_status(pipeline: my_pipeline)
if status.success
  puts "Pipeline passed"
else
  warn "Pipeline failed: #{status.errors.join("\n")}"
end

Parameters:

  • pipeline (Object, nil) (defaults to: nil)

    Pipeline message value (org, project, pipeline_id, token) or nil for ENV

Returns:

  • (PipelineStatus)

    success (bool), errors (repeated string), warnings (repeated string)



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/rakit/azure/dev_ops.rb', line 50

def get_pipeline_status(pipeline: nil)
  org, project, pipeline_id, token = _resolve_pipeline_config(pipeline)

  if [org, project, pipeline_id, token].any?(&:nil?) || [org, project, pipeline_id, token].any?(&:empty?)
    return _pipeline_status_new(
             success: false,
             errors: [],
             warnings: [_token_not_set_message(pipeline)],
           )
  end

  if _token_unresolved?(pipeline, token)
    return _pipeline_status_new(success: false, errors: [], warnings: [_token_not_set_message(pipeline)])
  end

  run = _list_runs(org, project, pipeline_id.to_s, token).first
  unless run
    return _pipeline_status_new(success: false, errors: ["No pipeline run found"], warnings: [])
  end

  timeline = _get_timeline_for_run(org, project, pipeline_id.to_s, token, run)
  success = _run_passed?(run)
  errors_str = _format_failed_steps(_failed_steps_details(timeline))
  errors_str = _run_result_summary(run) if errors_str.to_s.strip.empty? && !success
  warnings_str = _format_warnings(_warning_details(timeline))
  errors_list = errors_str.to_s.strip.empty? ? [] : errors_str.to_s.split("\n").map(&:strip).reject(&:empty?)
  errors_list = ["(no details)"] if errors_list.empty? && !success
  warnings_list = warnings_str.to_s.strip.empty? ? [] : warnings_str.to_s.split("\n").map(&:strip).reject(&:empty?)

  _pipeline_status_new(success: success, errors: errors_list, warnings: warnings_list)
rescue StandardError => e
  _pipeline_status_new(success: false, errors: ["Pipeline status error: #{e.message}"], warnings: [])
end

.pipeline_result_pretty_json(result) ⇒ String

Returns pretty-printed JSON for a PipelineResult.

Parameters:

Returns:

  • (String)


124
125
126
# File 'lib/rakit/azure/dev_ops.rb', line 124

def pipeline_result_pretty_json(result)
  JSON.pretty_generate(pipeline_result_to_h(result))
end

.pipeline_result_to_h(result) ⇒ Hash

Converts a PipelineResult (Struct or proto) to a hash recursively for JSON.

Parameters:

Returns:

  • (Hash)


117
118
119
# File 'lib/rakit/azure/dev_ops.rb', line 117

def pipeline_result_to_h(result)
  _to_h_deep(result)
end

.pipeline_status_pretty_json(status) ⇒ String

Returns pretty-printed JSON for a PipelineStatus.

Parameters:

Returns:

  • (String)


138
139
140
# File 'lib/rakit/azure/dev_ops.rb', line 138

def pipeline_status_pretty_json(status)
  JSON.pretty_generate(pipeline_status_to_h(status))
end

.pipeline_status_to_h(status) ⇒ Hash

Converts a PipelineStatus (Struct or proto) to a hash for JSON.

Parameters:

Returns:

  • (Hash)


131
132
133
# File 'lib/rakit/azure/dev_ops.rb', line 131

def pipeline_status_to_h(status)
  _to_h_deep(status)
end