はじめに

Kotlin の更新速度が早いので自動化したいなぁという願望から無理やり書いた Rakefile で管理 実践利用をする前段階

Maven リポジトリと現在のバージョンを比較

desc "build.gradle からバージョン情報を取得する"
def get_version(regex)
  now_version =  ""
  open("build.gradle", "r+") { |f|
    f.flock(File::LOCK_EX)
    body = f.read
    body = body.gsub regex do |tmp|
      now_version = "#{$2}"
    end
  }
  now_version
end

desc "Maven リポジトリにある metadata.xml を取得して XML を返す"
def get_metadata(path, base_url)
  data = path.split(':')
  base_url = "#{base_url}/#{data.first.gsub(/\./, '/')}/#{data[1]}/maven-metadata.xml"
  response = Net::HTTP.get URI.parse(base_url)
  REXML::Document.new(response)
end

desc "現在のバージョン情報が最新かどうかチェックする"
def check_version(xml, now_version)
  latest_version = xml.elements['metadata/versioning/latest'].text
  release_version = xml.elements['metadata/versioning/release'].text

  puts "latest: #{latest_version}, release: #{release_version}, project: #{now_version}"
  exit (now_version == release_version)
end

desc 'Kotlin バージョンチェック'
task :check_kotlin do
  puts "Check Kotlin metadata of maven repository"
  xml = get_metadata("org.jetbrains.kotlin:kotlin-gradle-plugin", "https://jcenter.bintray.com")
  check_version(xml, get_version(/(ext.kotlin_version = ')(.*)(')/))
end

Maven リポジトリの最新バージョンに変更する

def get_latest_version()
  xml = get_metadata("org.jetbrains.kotlin:kotlin-gradle-plugin", "https://jcenter.bintray.com")
  xml.elements['metadata/versioning/latest'].text
end

def set_version()
  version = get_latest_version()
  base_version = version.split('-')
  semantic_version = base_version[0].split('.')
  open("build.gradle", "r+") { |f|
    f.flock(File::LOCK_EX)
    body = f.read
    body = body.gsub /(ext.kotlin_version = ')(.*)(')/ do |tmp|
      "#{$1}#{version}#{$3}"
    end
    f.rewind
    f.puts body
    f.truncate(f.tell)
  }
end

desc 'Kotlin のバージョンを更新する'
task :update_kotlin do
  set_version()
end

おわりに

どのタイミングでこれを実行するのかは結構難しい 仕込むなら CI 中だが1週間に1回 update_kotlin をするとかかな