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