1
0
Fork 0
mirror of https://github.com/maybe-finance/maybe.git synced 2025-07-19 21:29:38 +02:00
Maybe/app/models/upgrader.rb
Zach Gollwitzer 5aca2ff9b6
Add zero-config self hosting on Render (#612)
* v1 of backend implementation for self hosting

* Add docs

* Add upgrades controller

* Add global helpers for self hosting mode

* Add self host settings controller

* Conditionally show self hosting settings

* Environment and config updates

* Complete upgrade prompting flow

* Update config for forked repo

* Move configuration of github provider within class

* Add upgrades cron

* Update deploy button

* Update guides

* Fix render deployer

* Typo

* Enable auto upgrades

* Fix cron

* Make upgrade modes more clear and consistent

* Trigger new available version

* Fix logic for displaying upgrade prompts

* Finish implementation

* Fix regression

* Trigger new version

* Add i18n translations

* trigger new version

* reduce caching time for testing

* Decrease cache for testing

* trigger upgrade

* trigger upgrade

* Only trigger deploy once

* trigger upgrade

* If target is commit, always upgrade if any upgrade is available

* trigger upgrade

* trigger upgrade

* Test release

* Change back to maybe repo for defaults

* Fix lint errors

* Clearer naming

* Fix relative link

* Add abs path

* Relative link

* Update docs
2024-04-13 09:28:45 -04:00

57 lines
1.6 KiB
Ruby

class Upgrader
include Provided
class << self
attr_writer :config
def config
@config ||= Config.new
end
def upgrade_to(commit_or_upgrade)
upgrade = commit_or_upgrade.is_a?(String) ? find_upgrade(commit_or_upgrade) : commit_or_upgrade
config.deployer.deploy(upgrade)
end
def find_upgrade(commit)
upgrade_candidates.find { |candidate| candidate.commit_sha == commit }
end
def available_upgrade
available_upgrades.first
end
# Default to showing releases first, then commits
def completed_upgrade
completed_upgrades.find { |upgrade| upgrade.type == "release" } || completed_upgrades.first
end
def available_upgrade_by_type(type)
if type == "commit"
commit_upgrade = available_upgrades.find { |upgrade| upgrade.type == "commit" }
commit_upgrade || available_upgrades.first
elsif type == "release"
available_upgrades.find { |upgrade| upgrade.type == "release" }
end
end
private
def available_upgrades
upgrade_candidates.select(&:available?)
end
def completed_upgrades
upgrade_candidates.select(&:complete?)
end
def upgrade_candidates
latest_candidates = fetch_latest_upgrade_candidates_from_provider
return [] unless latest_candidates
commit_candidate = Upgrade.new("commit", latest_candidates[:commit])
release_candidate = latest_candidates[:release] && Upgrade.new("release", latest_candidates[:release])
[ release_candidate, commit_candidate ].compact.uniq { |candidate| candidate.commit_sha }
end
end
end