From 83875cf0883e33da7eb303c87f3c46aecc60228a Mon Sep 17 00:00:00 2001 From: Nathan Yee Date: Thu, 31 Jul 2025 11:40:42 -0700 Subject: [PATCH 1/3] Add git commit hash and date to development --- docker/Dockerfile | 3 ++ src/dispatch/cli.py | 29 +++++++++++++++++++ src/dispatch/static/dispatch/src/app/store.js | 25 +++++++++++----- .../dispatch/src/components/AppToolbar.vue | 6 ++-- 4 files changed, 52 insertions(+), 11 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 0a7ecfae69d9..7c484ce4627f 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -47,6 +47,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..a5809a809150 100644 --- a/src/dispatch/static/dispatch/src/components/AppToolbar.vue +++ b/src/dispatch/static/dispatch/src/components/AppToolbar.vue @@ -48,10 +48,10 @@ - Current version: {{ formatHash(currentVersion()) }} + Current version: {{ formatHash(currentVersion()) }}{{ currentVersionDate() && currentVersionDate() !== "Unknown" ? ` (${currentVersionDate()})` : "" }} @@ -230,7 +230,7 @@ export default { }) }, ...mapState("auth", ["currentUser"]), - ...mapState("app", ["currentVersion"]), + ...mapState("app", ["currentVersion", "currentVersionDate"]), ...mapActions("auth", ["logout", "getExperimentalFeatures"]), ...mapActions("search", ["setQuery"]), ...mapActions("organization", ["showCreateEditDialog"]), From 76eb96e361ae0c8f0b54a7c7925e8c5a9dd9d7c4 Mon Sep 17 00:00:00 2001 From: Nathan Yee Date: Thu, 31 Jul 2025 11:58:38 -0700 Subject: [PATCH 2/3] Update link to href instead --- src/dispatch/static/dispatch/src/components/AppToolbar.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dispatch/static/dispatch/src/components/AppToolbar.vue b/src/dispatch/static/dispatch/src/components/AppToolbar.vue index a5809a809150..ffd555f86f57 100644 --- a/src/dispatch/static/dispatch/src/components/AppToolbar.vue +++ b/src/dispatch/static/dispatch/src/components/AppToolbar.vue @@ -47,7 +47,8 @@ /> From b9831d3ebbcf7f36d8bada27692bfcf9cc9b4963 Mon Sep 17 00:00:00 2001 From: Nathan Yee Date: Thu, 31 Jul 2025 13:54:05 -0700 Subject: [PATCH 3/3] Format with linter --- src/dispatch/static/dispatch/src/components/AppToolbar.vue | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/dispatch/static/dispatch/src/components/AppToolbar.vue b/src/dispatch/static/dispatch/src/components/AppToolbar.vue index ffd555f86f57..5825541b9a3b 100644 --- a/src/dispatch/static/dispatch/src/components/AppToolbar.vue +++ b/src/dispatch/static/dispatch/src/components/AppToolbar.vue @@ -52,7 +52,12 @@ append-icon="mdi-open-in-new" > - Current version: {{ formatHash(currentVersion()) }}{{ currentVersionDate() && currentVersionDate() !== "Unknown" ? ` (${currentVersionDate()})` : "" }} + Current version: {{ formatHash(currentVersion()) + }}{{ + currentVersionDate() && currentVersionDate() !== "Unknown" + ? ` (${currentVersionDate()})` + : "" + }}