app/models/release.rb
require "open-uri"
require "google/cloud/storage"
class Release < ApplicationRecord
CHANNEL = [STABLE = "stable", BETA = "beta", ALPHA = "alpha"]
PLATFORMS = [
GENESIS = "rpi3",
EXPRESS = "rpi",
RPI4 = "rpi4",
]
# Version string, as it appears in Github.
VERSION_INPUT_FORMAT = /v\d*\.\d*\.\d*(\-rc\d*)?/
# Version string, as it appears in our database.
VERSION_STORAGE_FORMAT = /\d*\.\d*\.\d*(\-rc\d*)?/
before_update :readonly!
validates_inclusion_of :channel, in: CHANNEL
validates_inclusion_of :platform, in: PLATFORMS
validates :version, presence: true, format: { with: VERSION_STORAGE_FORMAT }
validates :image_url, presence: true
def self.transload(url, gcs = Google::Cloud::Storage.new)
file_name = url.split("/").last
tempdir = "#{Rails.root.join("tmp").to_s}/#{file_name}"
download = URI.parse(url).open
IO.copy_stream(download, tempdir)
bucket = gcs.bucket(ENV.fetch("GCS_BUCKET"))
file = bucket.upload_file tempdir, "releases/#{file_name}"
return file.url
end
def self.maybe_find_latest(query)
Release.order(created_at: :desc).find_by(query)
end
def self.latest_image(platform:)
rel = maybe_find_latest(platform: platform, channel: "stable")
{
"#{platform}_release_url" => rel&.dot_img_url,
"#{platform}_release_tag" => rel&.version,
}
end
end