yamlease 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (5) hide show
  1. checksums.yaml +7 -0
  2. data/bin/ye +15 -0
  3. data/lib/pipeline.erb +36 -0
  4. data/lib/yamlease.rb +139 -0
  5. metadata +48 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 24000ab0868dfc5d4ff909d95a3b8960f01980e3d376617f0aa7886fb87b4c6d
4
+ data.tar.gz: 873325fb4c005899ab7ac9768d8638967590ed6cfe0ee8370890a9355db0c45c
5
+ SHA512:
6
+ metadata.gz: 2af38f4626df5dfdec0024351849ac70539459cd5ca3a6c5f1882abf7b9ee02e321555a013255ae7c9b2b4004c64eded07296e3ff13b04a28adde636c66af59a
7
+ data.tar.gz: 9990c4f80cd527525735b385b8fecd3a2ff589956d3a5f0022095a655625a916d8586cee8323b6232d5ebd040f192588f1c8a14cff70d98b535c3c7e07350186
data/bin/ye ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ unless require_relative '../lib/yamlease'
4
+ require 'yamlease'
5
+ end
6
+
7
+ require 'erb'
8
+
9
+ rp = ReleasePipeline.new(ARGV.first)
10
+
11
+ stages = rp.stages
12
+
13
+ template = ERB.new(File.read("lib/pipeline.erb"), trim_mode: "-")
14
+ puts template.result(binding)
15
+
data/lib/pipeline.erb ADDED
@@ -0,0 +1,36 @@
1
+ trigger:
2
+ - main
3
+
4
+ variables:
5
+ <% for key, value in rp.variables_to_yaml %>
6
+ <%= key %>: <%= value -%>
7
+ <% end %>
8
+
9
+ pool:
10
+
11
+ vmImage: ubuntu-latest
12
+
13
+ stages:
14
+
15
+ - stage: BuildThings
16
+ jobs:
17
+ - job: Build
18
+ steps:
19
+ - bash: "echo Build your application here"
20
+ <% for stage in stages %>
21
+ - stage: <%= stage.name %>
22
+ jobs:
23
+ <% for job in stage.jobs %>
24
+ - job: <%= job.name %>
25
+ steps:
26
+ <% for task in job.tasks %>
27
+ - task: <%= task.yaml_name %>
28
+ displayName: "<%= task.display_name %>"
29
+ inputs:
30
+ <% for input in task.inputs -%>
31
+ <%= input.join(': ') %>
32
+ <% end %>
33
+ <% end %>
34
+ <% end %>
35
+
36
+ <% end %>
data/lib/yamlease.rb ADDED
@@ -0,0 +1,139 @@
1
+ require 'rspec'
2
+ require 'yaml'
3
+ require "hash_with_dot_access"
4
+
5
+
6
+ class Stage
7
+ attr_reader :name, :url, :yaml
8
+ attr_writer :yaml
9
+
10
+ def initialize(name, url)
11
+ @name = name
12
+ @url = url
13
+ @tasks = []
14
+ end
15
+
16
+ def jobs
17
+ self.yaml["deployPhases"].collect do |job|
18
+ _job = Job.new(job.name, job.badgeUrl)
19
+ _job.yaml = job
20
+ _job
21
+ end
22
+ end
23
+
24
+ end
25
+
26
+ class Job
27
+ attr_reader :url, :yaml
28
+ attr_writer :yaml
29
+
30
+ def initialize(name, url)
31
+ @name = name
32
+ @url = url
33
+ end
34
+
35
+ def tasks
36
+ self.yaml["workflowTasks"].collect do |task|
37
+ Task.new(yaml = task)
38
+ end
39
+ end
40
+
41
+ def name
42
+ parts = @name.split(" ")
43
+ parts.map do |part|
44
+ first_character = part[0]
45
+ part[0] = first_character.upcase
46
+ part
47
+ end.join("")
48
+ end
49
+
50
+ end
51
+
52
+ class Task
53
+ attr_writer :yaml
54
+ attr_reader :display_name, :task_id
55
+
56
+ def initialize(yaml)
57
+ @yaml = yaml
58
+ @display_name = yaml.name
59
+ @task_id = yaml.taskId
60
+ end
61
+
62
+ def yaml_name
63
+ TaskDefinition.yaml_name(task_id)
64
+ end
65
+
66
+ def convert_vars_to_yaml(text)
67
+ text.gsub(/\$\((.+)\)/, '${{\1}}')
68
+ end
69
+
70
+ def inputs
71
+ _inputs = @yaml.inputs
72
+ _inputs.delete_if { |key, value| value == "" }
73
+ _inputs.each do |key, value|
74
+ if value.include?('*')
75
+ _inputs[key] = "'#{value}'"
76
+ end
77
+ value = _inputs[key]
78
+ _inputs[key] = convert_vars_to_yaml(value)
79
+ end
80
+ _inputs
81
+
82
+ end
83
+ end
84
+
85
+ class TaskDefinition
86
+ def initialize
87
+ @file_read = File.read("task_map.txt")
88
+ end
89
+
90
+ def yaml_name(id)
91
+ matches = @file_read.split("\n").select do |line|
92
+ task_id, _task_name = line.split(" ")
93
+ task_id.downcase == id.downcase
94
+ end
95
+
96
+ task_name = matches.length > 0 ? matches[0].split(" ")[1] : "Unknown"
97
+ task_name.sub(/V(\d+)$/, '@\1')
98
+ end
99
+
100
+ def self.yaml_name(id)
101
+ self.new.yaml_name(id)
102
+ end
103
+
104
+ end
105
+
106
+ class ReleasePipeline
107
+ attr_reader :url, :variables
108
+
109
+ def initialize(filename = nil)
110
+ raise ArgumentError.new("I need a YAML file to parse") if filename.nil?
111
+ self.parse(filename)
112
+ end
113
+
114
+ def parse(filename = "show.yml")
115
+ @pipeline = YAML.load(File.read(filename)).with_dot_access
116
+ @url = @pipeline["url"]
117
+ @variables = @pipeline["variables"]
118
+ end
119
+
120
+ def variables_to_yaml
121
+ response = {}
122
+ @variables.each do |key, value|
123
+ response[key] = value.value
124
+ end
125
+ response
126
+ end
127
+
128
+ # stages are environments
129
+ def stages
130
+ @pipeline["environments"].collect do |stage|
131
+ _stage = Stage.new(stage.name, stage.badgeUrl)
132
+ _stage.yaml = stage
133
+ _stage
134
+ end
135
+
136
+ end
137
+
138
+ end
139
+
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: yamlease
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Julian Simpson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-10-08 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: |-
14
+ If you have a release pipeline in Azure DevOps, this gem will convert it to YAML. Export the release
15
+ definition to yaml and pipe it to this tool.
16
+ email: simpsonjulian@gmail.com
17
+ executables:
18
+ - ye
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - bin/ye
23
+ - lib/pipeline.erb
24
+ - lib/yamlease.rb
25
+ homepage: https://rubygems.org/gems/yamlease
26
+ licenses:
27
+ - AGPL-3.0
28
+ metadata: {}
29
+ post_install_message:
30
+ rdoc_options: []
31
+ require_paths:
32
+ - lib
33
+ required_ruby_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ requirements: []
44
+ rubygems_version: 3.2.32
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: Convert Azure DevOps Release Pipelines to YAML
48
+ test_files: []