Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@jsvd
Last active August 17, 2017 14:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jsvd/44d14932fc4aa645252b29e4520b6d2a to your computer and use it in GitHub Desktop.
Save jsvd/44d14932fc4aa645252b29e4520b6d2a to your computer and use it in GitHub Desktop.
Identify plugins with new major versions but locked in previous one in a Logstash release
/tmp/logstash-5.5.1 % GITHUB_TOKEN=XXXXXX bin/ruby script.rb
Results written to "/tmp/results.md"
require_relative "./lib/bootstrap/environment"
LogStash::Bundler.setup!({:without => [:build, :development]})
require "logstash-core"
require "logstash/environment"
require "logstash/settings"
require 'json'
require 'manticore'
manticore_client = Manticore::Client.new
github_token = ENV["GITHUB_TOKEN"]
locked_plugins = Bundler.environment.specs.select {|spec| spec.metadata["logstash_plugin"] == "true" }.map {|spec| ([spec.name] + spec.version.segments) }
result = {}
locked_plugins.each do |plugin_name, major, minor, patch|
locked_version = Gem::Version.new("#{major}.#{minor}.#{patch}")
locked_major = major.to_i
locked_requirement = Gem::Requirement.new(locked_version.approximate_recommendation)
versions_obj_json = manticore_client.get("https://rubygems.org/api/v1/versions/#{plugin_name}.json").body
versions_obj = JSON.parse(versions_obj_json)
versions_list = versions_obj.map {|version_obj| Gem::Version.new(version_obj["number"]) }.sort.reverse
newer_versions = versions_list.select {|released_version| locked_version < released_version }
new_majors = newer_versions.map {|newer_version| newer_version.segments[0] }.select {|released_major| locked_major < released_major }.uniq
latest_compatible = newer_versions.find {|newer_version| locked_requirement.satisfied_by?(newer_version) }
url = "https://api.github.com/repos/logstash-plugins/#{plugin_name}/tags"
headers = {"Authorization" => "token #{github_token}" }
github_tags_json = manticore_client.get(url, :headers => headers).body
github_tags = JSON.parse(github_tags_json)
github_tag_version_list = github_tags.map {|tag| Gem::Version.new(tag["name"].gsub("v", "")) }.sort.reverse
newer_tag_versions = github_tag_version_list.select {|released_version| locked_version < released_version }
latest_compatible_tag = newer_tag_versions.find {|newer_version| locked_requirement.satisfied_by?(newer_version) }
if new_majors.any?
result[plugin_name] = {
"locked_version" => locked_version.to_s,
"locked_requirement" => locked_requirement.to_s,
"newer_versions" => newer_versions.map {|v| v.to_s},
"new_majors" => new_majors,
"newer_compatible_gem" => (latest_compatible || "-").to_s,
"has_new_majors" => (new_majors.empty? ? false : true),
"newer_tag_versions" => newer_tag_versions.map(&:to_s),
"newer_compatible_tag" => latest_compatible_tag.nil? ? "-" : "v#{latest_compatible_tag.to_s}"
}
end
end
File.open("/tmp/results.md", "w") do |file|
file.puts "| plugin | locked_version | latest_published_major | newer_compatible_gem | newer_compatible_tag |"
file.puts "| -- | -- | -- | -- | -- |"
result.each do |plugin, info|
row = [
plugin,
info["locked_version"],
info["new_majors"].first,
info["newer_compatible_gem"],
info["newer_compatible_tag"],
]
file.puts "| #{row.join(" | ")} |"
end
end
puts "Results written to \"/tmp/results.md\""
plugin locked_version latest_published_major newer_compatible_gem newer_compatible_tag
logstash-codec-cef 4.1.3 5 - -
logstash-filter-geoip 4.2.1 5 4.3.0 v4.3.0
logstash-input-beats 3.1.23 5 - -
logstash-input-tcp 4.1.2 5 4.2.2 v4.2.2
logstash-input-http_poller 3.3.1 4 - -
logstash-input-kafka 5.1.8 8 - -
logstash-input-rabbitmq 5.2.4 6 - -
logstash-output-elasticsearch 7.3.7 8 7.3.8 v7.3.8
logstash-output-http 4.3.2 5 - -
logstash-output-kafka 5.1.7 7 - -
logstash-output-rabbitmq 4.0.9 5 - -
logstash-output-redis 3.0.4 4 - -
logstash-output-sqs 4.0.2 5 - -
logstash-output-tcp 4.0.1 5 - -
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment