diff --git a/docker/Dockerfile b/docker/Dockerfile index 6245f2b03caf..b3c7ba974b50 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -52,6 +52,9 @@ ENV VITE_DISPATCH_COMMIT_HASH="Unknown" ARG VITE_DISPATCH_COMMIT_MESSAGE ENV VITE_DISPATCH_COMMIT_MESSAGE="Unknown" +ARG VITE_DISPATCH_COMMIT_DATE +ENV VITE_DISPATCH_COMMIT_DATE="Unknown" + COPY . /usr/src/dispatch/ RUN YARN_CACHE_FOLDER="$(mktemp -d)" \ && export YARN_CACHE_FOLDER \ diff --git a/src/dispatch/cli.py b/src/dispatch/cli.py index 1129f79164e8..44cd993c8dcd 100644 --- a/src/dispatch/cli.py +++ b/src/dispatch/cli.py @@ -820,11 +820,40 @@ def run_server(log_level): os.environ["LOG_LEVEL"] = log_level.upper() if not os.path.isdir(config.STATIC_DIR): import atexit + import subprocess from subprocess import Popen # take our frontend vars and export them for the frontend to consume envvars = os.environ.copy() envvars.update({x: getattr(config, x) for x in dir(config) if x.startswith("VITE_")}) + + # Add git commit information for development + try: + commit_hash = subprocess.check_output( + ["git", "rev-parse", "HEAD"], cwd=".", stderr=subprocess.DEVNULL + ).decode("utf-8").strip() + envvars["VITE_DISPATCH_COMMIT_HASH"] = commit_hash + except (subprocess.CalledProcessError, FileNotFoundError): + # If git is not available or not in a git repo, use a default value + envvars["VITE_DISPATCH_COMMIT_HASH"] = "dev-local" + + try: + commit_message = subprocess.check_output( + ["git", "log", "-1", "--pretty=%B"], cwd=".", stderr=subprocess.DEVNULL + ).decode("utf-8").strip() + envvars["VITE_DISPATCH_COMMIT_MESSAGE"] = commit_message + except (subprocess.CalledProcessError, FileNotFoundError): + # If git is not available or not in a git repo, use a default value + envvars["VITE_DISPATCH_COMMIT_MESSAGE"] = "Development build" + + try: + commit_date = subprocess.check_output( + ["git", "log", "-1", "--pretty=%cd", "--date=short"], cwd=".", stderr=subprocess.DEVNULL + ).decode("utf-8").strip() + envvars["VITE_DISPATCH_COMMIT_DATE"] = commit_date + except (subprocess.CalledProcessError, FileNotFoundError): + # If git is not available or not in a git repo, use a default value + envvars["VITE_DISPATCH_COMMIT_DATE"] = "Unknown" is_windows = os.name == "nt" windows_cmds = ["cmd", "/c"] default_cmds = ["npm", "run", "serve"] diff --git a/src/dispatch/static/dispatch/src/app/store.js b/src/dispatch/static/dispatch/src/app/store.js index 22c2187d981f..86bafc01edf3 100644 --- a/src/dispatch/static/dispatch/src/app/store.js +++ b/src/dispatch/static/dispatch/src/app/store.js @@ -10,6 +10,7 @@ const getDefaultRefreshState = () => { const latestCommitHash = import.meta.env.VITE_DISPATCH_COMMIT_HASH const latestCommitMessage = import.meta.env.VITE_DISPATCH_COMMIT_MESSAGE +const latestCommitDate = import.meta.env.VITE_DISPATCH_COMMIT_DATE const state = { toggleDrawer: true, @@ -18,6 +19,7 @@ const state = { }, loading: false, currentVersion: latestCommitHash, + currentVersionDate: latestCommitDate, } const getters = { @@ -36,14 +38,21 @@ const actions = { commit("SET_LOADING", value) }, showCommitMessage({ commit }) { - commit( - "notification_backend/addBeNotification", - { - text: `Hash: ${latestCommitHash} | Message: ${latestCommitMessage}`, - type: "success", - }, - { root: true } - ) + if (latestCommitHash && latestCommitHash !== "Unknown" && latestCommitHash !== "dev-local") { + // Open GitHub commit URL in a new tab + const githubUrl = `https://github.com/Netflix/dispatch/commit/${latestCommitHash}` + window.open(githubUrl, "_blank") + } else { + // Fallback to showing notification for local development or unknown commits + commit( + "notification_backend/addBeNotification", + { + text: `Hash: ${latestCommitHash} | Message: ${latestCommitMessage}`, + type: "success", + }, + { root: true } + ) + } }, } diff --git a/src/dispatch/static/dispatch/src/components/AppToolbar.vue b/src/dispatch/static/dispatch/src/components/AppToolbar.vue index 82e46655f446..5825541b9a3b 100644 --- a/src/dispatch/static/dispatch/src/components/AppToolbar.vue +++ b/src/dispatch/static/dispatch/src/components/AppToolbar.vue @@ -47,11 +47,17 @@ /> - Current version: {{ formatHash(currentVersion()) }} + Current version: {{ formatHash(currentVersion()) + }}{{ + currentVersionDate() && currentVersionDate() !== "Unknown" + ? ` (${currentVersionDate()})` + : "" + }} @@ -230,7 +236,7 @@ export default { }) }, ...mapState("auth", ["currentUser"]), - ...mapState("app", ["currentVersion"]), + ...mapState("app", ["currentVersion", "currentVersionDate"]), ...mapActions("auth", ["logout", "getExperimentalFeatures"]), ...mapActions("search", ["setQuery"]), ...mapActions("organization", ["showCreateEditDialog"]),