diff --git a/.github/workflows/publish-webapp.yml b/.github/workflows/publish-webapp.yml
index 246a8ea31d..ed5a259a85 100644
--- a/.github/workflows/publish-webapp.yml
+++ b/.github/workflows/publish-webapp.yml
@@ -56,6 +56,17 @@ jobs:
echo "image_tags=${image_tags}" >> "$GITHUB_OUTPUT"
+ - name: 📝 Set the build info
+ id: set_build_info
+ run: |
+ tag=${{ steps.get_tag.outputs.tag }}
+ if [[ "${{ steps.get_tag.outputs.is_semver }}" == true ]]; then
+ echo "BUILD_APP_VERSION=${tag}" >> "$GITHUB_OUTPUT"
+ fi
+ echo "BUILD_GIT_SHA=${{ github.sha }}" >> "$GITHUB_OUTPUT"
+ echo "BUILD_GIT_REF_NAME=${{ github.ref_name }}" >> "$GITHUB_OUTPUT"
+ echo "BUILD_TIMESTAMP_SECONDS=$(date +%s)" >> "$GITHUB_OUTPUT"
+
- name: 🐙 Login to GitHub Container Registry
uses: docker/login-action@v3
with:
@@ -70,3 +81,8 @@ jobs:
platforms: linux/amd64,linux/arm64
tags: ${{ steps.set_tags.outputs.image_tags }}
push: true
+ build-args: |
+ BUILD_APP_VERSION=${{ steps.set_build_info.outputs.BUILD_APP_VERSION }}
+ BUILD_GIT_SHA=${{ steps.set_build_info.outputs.BUILD_GIT_SHA }}
+ BUILD_GIT_REF_NAME=${{ steps.set_build_info.outputs.BUILD_GIT_REF_NAME }}
+ BUILD_TIMESTAMP_SECONDS=${{ steps.set_build_info.outputs.BUILD_TIMESTAMP_SECONDS }}
diff --git a/apps/webapp/app/components/navigation/OrganizationSettingsSideMenu.tsx b/apps/webapp/app/components/navigation/OrganizationSettingsSideMenu.tsx
index 694ac87560..fe9d146521 100644
--- a/apps/webapp/app/components/navigation/OrganizationSettingsSideMenu.tsx
+++ b/apps/webapp/app/components/navigation/OrganizationSettingsSideMenu.tsx
@@ -22,16 +22,27 @@ import { SideMenuItem } from "./SideMenuItem";
import { useCurrentPlan } from "~/routes/_app.orgs.$organizationSlug/route";
import { Paragraph } from "../primitives/Paragraph";
import { Badge } from "../primitives/Badge";
+import { useHasAdminAccess } from "~/hooks/useUser";
+
+export type BuildInfo = {
+ appVersion: string | undefined;
+ packageVersion: string;
+ buildTimestampSeconds: string | undefined;
+ gitSha: string | undefined;
+ gitRefName: string | undefined;
+};
export function OrganizationSettingsSideMenu({
organization,
- version,
+ buildInfo,
}: {
organization: MatchedOrganization;
- version: string;
+ buildInfo: BuildInfo;
}) {
const { isManagedCloud } = useFeatures();
const currentPlan = useCurrentPlan();
+ const isAdmin = useHasAdminAccess();
+ const showBuildInfo = isAdmin || !isManagedCloud;
return (
- v{version}
+ {buildInfo.appVersion || `v${buildInfo.packageVersion}`}
+ {showBuildInfo && buildInfo.buildTimestampSeconds && (
+
+
+
+ {new Date(Number(buildInfo.buildTimestampSeconds) * 1000).toISOString()}
+
+
+ )}
+ {showBuildInfo && buildInfo.gitRefName && (
+
+
+
+ {buildInfo.gitRefName}
+
+
+ )}
+ {showBuildInfo && buildInfo.gitSha && (
+
+
+
+ {buildInfo.gitSha.slice(0, 9)}
+
+
+ )}
diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.settings/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.settings/route.tsx
index 735959e451..97fa202578 100644
--- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.settings/route.tsx
+++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.settings/route.tsx
@@ -1,25 +1,34 @@
import { Outlet } from "@remix-run/react";
import { type LoaderFunctionArgs } from "@remix-run/server-runtime";
-import { VERSION } from "@trigger.dev/core";
+import { VERSION as coreVersion } from "@trigger.dev/core";
import { typedjson, useTypedLoaderData } from "remix-typedjson";
import { AppContainer, MainBody } from "~/components/layout/AppLayout";
-import { OrganizationSettingsSideMenu } from "~/components/navigation/OrganizationSettingsSideMenu";
+import {
+ type BuildInfo,
+ OrganizationSettingsSideMenu,
+} from "~/components/navigation/OrganizationSettingsSideMenu";
import { useOrganization } from "~/hooks/useOrganizations";
export const loader = async ({ request, params }: LoaderFunctionArgs) => {
return typedjson({
- version: VERSION,
+ buildInfo: {
+ appVersion: process.env.BUILD_APP_VERSION,
+ packageVersion: coreVersion,
+ gitSha: process.env.BUILD_GIT_SHA,
+ gitRefName: process.env.BUILD_GIT_REF_NAME,
+ buildTimestampSeconds: process.env.BUILD_TIMESTAMP_SECONDS,
+ } satisfies BuildInfo,
});
};
export default function Page() {
- const { version } = useTypedLoaderData
();
+ const { buildInfo } = useTypedLoaderData();
const organization = useOrganization();
return (
-
+
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 210de7f309..86a77b5a2f 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -82,6 +82,16 @@ COPY --from=builder --chown=node:node /triggerdotdev/scripts ./scripts
COPY --from=builder /usr/local/bin/goose /usr/local/bin/goose
COPY --from=builder --chown=node:node /triggerdotdev/internal-packages/clickhouse/schema /triggerdotdev/internal-packages/clickhouse/schema
+# Build info
+ARG BUILD_APP_VERSION
+ARG BUILD_GIT_SHA
+ARG BUILD_GIT_REF_NAME
+ARG BUILD_TIMESTAMP_SECONDS
+ENV BUILD_APP_VERSION=${BUILD_APP_VERSION} \
+ BUILD_GIT_SHA=${BUILD_GIT_SHA} \
+ BUILD_GIT_REF_NAME=${BUILD_GIT_REF_NAME} \
+ BUILD_TIMESTAMP_SECONDS=${BUILD_TIMESTAMP_SECONDS}
+
EXPOSE 3000
USER node