Contains a Metabase task which periodically checks for the availability of new Metabase versions.

(ns metabase.task.upgrade-checks
  (:require
   [clj-http.client :as http]
   [clojure.string :as str]
   [clojurewerkz.quartzite.jobs :as jobs]
   [clojurewerkz.quartzite.schedule.cron :as cron]
   [clojurewerkz.quartzite.triggers :as triggers]
   [java-time.api :as t]
   [medley.core :as m]
   [metabase.config :as config]
   [metabase.public-settings :as public-settings]
   [metabase.task :as task]
   [metabase.util.json :as json]
   [metabase.util.log :as log]))
(set! *warn-on-reflection* true)
(defn- get-version-info []
  (let [version-info-url-key  (if config/ee-available? :mb-version-info-ee-url :mb-version-info-url)
        version-info-url      (config/config-str version-info-url-key)
        {:keys [status body]} (http/get version-info-url (merge
                                                          {:content-type "application/json"}
                                                          (when config/is-prod?
                                                            {:query-params (m/remove-vals
                                                                            str/blank?
                                                                            {"instance" (public-settings/site-uuid-for-version-info-fetching)
                                                                             "current-version" (:tag config/mb-version-info)
                                                                             "channel" (public-settings/update-channel)})})))]
    (when (not= status 200)
      (throw (Exception. (format "[%d]: %s" status body))))
    (json/decode+kw body)))

Simple job which looks up all databases and runs a sync on them

(jobs/defjob  CheckForNewVersions [_]
  (when (public-settings/check-for-updates)
    (log/debug "Checking for new Metabase version info.")
    (try
      ;; TODO: add in additional request params if anonymous tracking is enabled
      (public-settings/version-info-last-checked! (t/zoned-date-time))
      (when-let [version-info (get-version-info)]
        (public-settings/version-info! version-info))
      (catch Throwable e
        (log/error e "Error fetching version info; setting version-info value to nil")
        (public-settings/version-info! nil)))))
(def ^:private job-key     "metabase.task.upgrade-checks.job")
(def ^:private trigger-key "metabase.task.upgrade-checks.trigger")
(defmethod task/init! ::CheckForNewVersions [_]
  (let [job     (jobs/build
                 (jobs/of-type CheckForNewVersions)
                 (jobs/with-identity (jobs/key job-key)))
        trigger (triggers/build
                 (triggers/with-identity (triggers/key trigger-key))
                 (triggers/start-now)
                 (triggers/with-schedule
                   ;; run twice a day
                  (cron/cron-schedule "0 15 6,18 * * ? *")))]
    (task/schedule-task! job trigger)))