mirror of
https://github.com/sourcebot-dev/sourcebot.git
synced 2025-12-19 07:45:22 +00:00
chore: Automated releases & bake SB version into code (#680)
Some checks are pending
Update Roadmap Released / update (push) Waiting to run
Some checks are pending
Update Roadmap Released / update (push) Waiting to run
This commit is contained in:
parent
00eb3e0199
commit
517fd1a3e4
18 changed files with 140 additions and 65 deletions
|
|
@ -77,9 +77,6 @@ SOURCEBOT_TELEMETRY_DISABLED=true # Disables telemetry collection
|
||||||
# Controls the number of concurrent indexing jobs that can run at once
|
# Controls the number of concurrent indexing jobs that can run at once
|
||||||
# INDEX_CONCURRENCY_MULTIPLE=
|
# INDEX_CONCURRENCY_MULTIPLE=
|
||||||
|
|
||||||
# Controls the version of the web app
|
|
||||||
# NEXT_PUBLIC_SOURCEBOT_VERSION=
|
|
||||||
|
|
||||||
# CONFIG_MAX_REPOS_NO_TOKEN=
|
# CONFIG_MAX_REPOS_NO_TOKEN=
|
||||||
NODE_ENV=development
|
NODE_ENV=development
|
||||||
# SOURCEBOT_TENANCY_MODE=single
|
# SOURCEBOT_TENANCY_MODE=single
|
||||||
|
|
|
||||||
2
.github/workflows/_gcp-deploy.yml
vendored
2
.github/workflows/_gcp-deploy.yml
vendored
|
|
@ -54,7 +54,6 @@ jobs:
|
||||||
${{ env.IMAGE_PATH }}:${{ github.sha }}
|
${{ env.IMAGE_PATH }}:${{ github.sha }}
|
||||||
${{ env.IMAGE_PATH }}:latest
|
${{ env.IMAGE_PATH }}:latest
|
||||||
build-args: |
|
build-args: |
|
||||||
NEXT_PUBLIC_SOURCEBOT_VERSION=${{ github.ref_name }}
|
|
||||||
NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT=${{ vars.NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT }}
|
NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT=${{ vars.NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT }}
|
||||||
NEXT_PUBLIC_SENTRY_ENVIRONMENT=${{ vars.NEXT_PUBLIC_SENTRY_ENVIRONMENT }}
|
NEXT_PUBLIC_SENTRY_ENVIRONMENT=${{ vars.NEXT_PUBLIC_SENTRY_ENVIRONMENT }}
|
||||||
NEXT_PUBLIC_SENTRY_WEBAPP_DSN=${{ vars.NEXT_PUBLIC_SENTRY_WEBAPP_DSN }}
|
NEXT_PUBLIC_SENTRY_WEBAPP_DSN=${{ vars.NEXT_PUBLIC_SENTRY_WEBAPP_DSN }}
|
||||||
|
|
@ -65,6 +64,7 @@ jobs:
|
||||||
SENTRY_ORG=${{ vars.SENTRY_ORG }}
|
SENTRY_ORG=${{ vars.SENTRY_ORG }}
|
||||||
SENTRY_WEBAPP_PROJECT=${{ vars.SENTRY_WEBAPP_PROJECT }}
|
SENTRY_WEBAPP_PROJECT=${{ vars.SENTRY_WEBAPP_PROJECT }}
|
||||||
SENTRY_BACKEND_PROJECT=${{ vars.SENTRY_BACKEND_PROJECT }}
|
SENTRY_BACKEND_PROJECT=${{ vars.SENTRY_BACKEND_PROJECT }}
|
||||||
|
SENTRY_RELEASE=${{ github.ref_name }}
|
||||||
|
|
||||||
|
|
||||||
- name: Deploy to GCP
|
- name: Deploy to GCP
|
||||||
|
|
|
||||||
9
.github/workflows/ghcr-publish.yml
vendored
9
.github/workflows/ghcr-publish.yml
vendored
|
|
@ -7,6 +7,12 @@ on:
|
||||||
push:
|
push:
|
||||||
branches: ["main"]
|
branches: ["main"]
|
||||||
tags: ["v*.*.*"]
|
tags: ["v*.*.*"]
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
description: 'Version tag (e.g., v4.10.5)'
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
|
||||||
env:
|
env:
|
||||||
# Use docker.io for Docker Hub if empty
|
# Use docker.io for Docker Hub if empty
|
||||||
|
|
@ -40,6 +46,7 @@ jobs:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
|
ref: ${{ inputs.version || github.ref_name }}
|
||||||
submodules: "true"
|
submodules: "true"
|
||||||
|
|
||||||
# Extract metadata (tags, labels) for Docker
|
# Extract metadata (tags, labels) for Docker
|
||||||
|
|
@ -77,8 +84,6 @@ jobs:
|
||||||
cache-to: type=gha,mode=max,scope=${{ env.PLATFORM_PAIR }}
|
cache-to: type=gha,mode=max,scope=${{ env.PLATFORM_PAIR }}
|
||||||
platforms: ${{ matrix.platform }}
|
platforms: ${{ matrix.platform }}
|
||||||
outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true,annotation.org.opencontainers.image.description=Blazingly fast code search
|
outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true,annotation.org.opencontainers.image.description=Blazingly fast code search
|
||||||
build-args: |
|
|
||||||
NEXT_PUBLIC_SOURCEBOT_VERSION=${{ github.ref_name }}
|
|
||||||
|
|
||||||
- name: Export digest
|
- name: Export digest
|
||||||
run: |
|
run: |
|
||||||
|
|
|
||||||
99
.github/workflows/release-sourcebot.yml
vendored
99
.github/workflows/release-sourcebot.yml
vendored
|
|
@ -3,35 +3,82 @@ name: Release Sourcebot
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
version:
|
bump_type:
|
||||||
description: "Version to release (e.g., 4.10.5)"
|
description: "Type of version bump to apply"
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: choice
|
||||||
|
options:
|
||||||
|
- patch
|
||||||
|
- minor
|
||||||
|
- major
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: release-sourcebot
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release:
|
release:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
|
outputs:
|
||||||
|
version: ${{ steps.calculate_version.outputs.version }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Validate version format
|
|
||||||
run: |
|
|
||||||
VERSION="${{ inputs.version }}"
|
|
||||||
if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9._-]+)?(\+[a-zA-Z0-9._-]+)?$ ]]; then
|
|
||||||
echo "Error: Version must follow semantic versioning format (X.Y.Z)"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
ref: main
|
ref: main
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Calculate new version
|
||||||
|
id: calculate_version
|
||||||
|
run: |
|
||||||
|
# Extract current version from CHANGELOG.md
|
||||||
|
CURRENT_VERSION=$(grep -oP '## \[\K[0-9]+\.[0-9]+\.[0-9]+' CHANGELOG.md | head -n 1)
|
||||||
|
|
||||||
|
if [ -z "$CURRENT_VERSION" ]; then
|
||||||
|
echo "Error: Could not extract current version from CHANGELOG.md"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Current version: $CURRENT_VERSION"
|
||||||
|
|
||||||
|
# Parse version components
|
||||||
|
IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION"
|
||||||
|
|
||||||
|
# Apply bump based on input
|
||||||
|
BUMP_TYPE="${{ inputs.bump_type }}"
|
||||||
|
case "$BUMP_TYPE" in
|
||||||
|
major)
|
||||||
|
MAJOR=$((MAJOR + 1))
|
||||||
|
MINOR=0
|
||||||
|
PATCH=0
|
||||||
|
;;
|
||||||
|
minor)
|
||||||
|
MINOR=$((MINOR + 1))
|
||||||
|
PATCH=0
|
||||||
|
;;
|
||||||
|
patch)
|
||||||
|
PATCH=$((PATCH + 1))
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Error: Invalid bump type: $BUMP_TYPE"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
NEW_VERSION="$MAJOR.$MINOR.$PATCH"
|
||||||
|
echo "New version: $NEW_VERSION"
|
||||||
|
|
||||||
|
# Export to GITHUB_ENV for use in subsequent steps within this job
|
||||||
|
echo "VERSION=$NEW_VERSION" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
# Export to GITHUB_OUTPUT for use in other jobs
|
||||||
|
echo "version=$NEW_VERSION" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Check if version already exists
|
- name: Check if version already exists
|
||||||
run: |
|
run: |
|
||||||
VERSION="${{ inputs.version }}"
|
|
||||||
if grep -q "## \[$VERSION\]" CHANGELOG.md; then
|
if grep -q "## \[$VERSION\]" CHANGELOG.md; then
|
||||||
echo "Error: Version $VERSION already exists in CHANGELOG.md"
|
echo "Error: Version $VERSION already exists in CHANGELOG.md"
|
||||||
exit 1
|
exit 1
|
||||||
|
|
@ -41,9 +88,8 @@ jobs:
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Update CHANGELOG.md
|
- name: Update CHANGELOG.md and version.ts
|
||||||
run: |
|
run: |
|
||||||
VERSION="${{ inputs.version }}"
|
|
||||||
DATE=$(date +%Y-%m-%d)
|
DATE=$(date +%Y-%m-%d)
|
||||||
|
|
||||||
# Insert the new version header after the [Unreleased] line
|
# Insert the new version header after the [Unreleased] line
|
||||||
|
|
@ -54,20 +100,26 @@ jobs:
|
||||||
echo "Updated CHANGELOG.md with version $VERSION"
|
echo "Updated CHANGELOG.md with version $VERSION"
|
||||||
cat CHANGELOG.md | head -n 15
|
cat CHANGELOG.md | head -n 15
|
||||||
|
|
||||||
|
# Update version.ts
|
||||||
|
cat > packages/shared/src/version.ts << EOF
|
||||||
|
// This file is auto-generated by .github/workflows/release-sourcebot.yml
|
||||||
|
export const SOURCEBOT_VERSION = "v$VERSION";
|
||||||
|
EOF
|
||||||
|
echo "Updated version.ts with version v$VERSION"
|
||||||
|
cat packages/shared/src/version.ts
|
||||||
|
|
||||||
- name: Configure git
|
- name: Configure git
|
||||||
run: |
|
run: |
|
||||||
git config user.name "github-actions[bot]"
|
git config user.name "github-actions[bot]"
|
||||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
git config user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
|
|
||||||
- name: Commit CHANGELOG
|
- name: Commit changes
|
||||||
run: |
|
run: |
|
||||||
VERSION="${{ inputs.version }}"
|
git add CHANGELOG.md packages/shared/src/version.ts
|
||||||
git add CHANGELOG.md
|
|
||||||
git commit -m "Release v$VERSION"
|
git commit -m "Release v$VERSION"
|
||||||
|
|
||||||
- name: Create annotated tag
|
- name: Create annotated tag
|
||||||
run: |
|
run: |
|
||||||
VERSION="${{ inputs.version }}"
|
|
||||||
git tag -a "v$VERSION" -m "sourcebot v$VERSION"
|
git tag -a "v$VERSION" -m "sourcebot v$VERSION"
|
||||||
|
|
||||||
- name: Push changes
|
- name: Push changes
|
||||||
|
|
@ -79,8 +131,17 @@ jobs:
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: |
|
run: |
|
||||||
VERSION="${{ inputs.version }}"
|
|
||||||
gh release create "v$VERSION" \
|
gh release create "v$VERSION" \
|
||||||
--verify-tag \
|
--verify-tag \
|
||||||
--generate-notes \
|
--generate-notes \
|
||||||
--latest
|
--latest
|
||||||
|
|
||||||
|
publish:
|
||||||
|
needs: release
|
||||||
|
uses: ./.github/workflows/ghcr-publish.yml
|
||||||
|
with:
|
||||||
|
version: v${{ needs.release.outputs.version }}
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write
|
||||||
|
id-token: write
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Bake Sourcebot version into code rather than relying on build arg. [#680](https://github.com/sourcebot-dev/sourcebot/pull/680)
|
||||||
|
|
||||||
## [4.10.4] - 2025-12-18
|
## [4.10.4] - 2025-12-18
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
|
||||||
20
Dockerfile
20
Dockerfile
|
|
@ -8,7 +8,6 @@
|
||||||
# in the webapp.
|
# in the webapp.
|
||||||
# @see: https://docs.docker.com/build/building/variables/#scoping
|
# @see: https://docs.docker.com/build/building/variables/#scoping
|
||||||
|
|
||||||
ARG NEXT_PUBLIC_SOURCEBOT_VERSION
|
|
||||||
ARG NEXT_PUBLIC_SENTRY_ENVIRONMENT
|
ARG NEXT_PUBLIC_SENTRY_ENVIRONMENT
|
||||||
ARG NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT
|
ARG NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT
|
||||||
ARG NEXT_PUBLIC_SENTRY_WEBAPP_DSN
|
ARG NEXT_PUBLIC_SENTRY_WEBAPP_DSN
|
||||||
|
|
@ -51,8 +50,6 @@ RUN yarn workspace @sourcebot/query-language install
|
||||||
FROM node-alpine AS web-builder
|
FROM node-alpine AS web-builder
|
||||||
ENV SKIP_ENV_VALIDATION=1
|
ENV SKIP_ENV_VALIDATION=1
|
||||||
# -----------
|
# -----------
|
||||||
ARG NEXT_PUBLIC_SOURCEBOT_VERSION
|
|
||||||
ENV NEXT_PUBLIC_SOURCEBOT_VERSION=$NEXT_PUBLIC_SOURCEBOT_VERSION
|
|
||||||
ARG NEXT_PUBLIC_SENTRY_ENVIRONMENT
|
ARG NEXT_PUBLIC_SENTRY_ENVIRONMENT
|
||||||
ENV NEXT_PUBLIC_SENTRY_ENVIRONMENT=$NEXT_PUBLIC_SENTRY_ENVIRONMENT
|
ENV NEXT_PUBLIC_SENTRY_ENVIRONMENT=$NEXT_PUBLIC_SENTRY_ENVIRONMENT
|
||||||
ARG NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT
|
ARG NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT
|
||||||
|
|
@ -72,7 +69,8 @@ ARG SENTRY_ORG
|
||||||
ENV SENTRY_ORG=$SENTRY_ORG
|
ENV SENTRY_ORG=$SENTRY_ORG
|
||||||
ARG SENTRY_WEBAPP_PROJECT
|
ARG SENTRY_WEBAPP_PROJECT
|
||||||
ENV SENTRY_WEBAPP_PROJECT=$SENTRY_WEBAPP_PROJECT
|
ENV SENTRY_WEBAPP_PROJECT=$SENTRY_WEBAPP_PROJECT
|
||||||
ENV SENTRY_RELEASE=$NEXT_PUBLIC_SOURCEBOT_VERSION
|
ARG SENTRY_RELEASE
|
||||||
|
ENV SENTRY_RELEASE=$SENTRY_RELEASE
|
||||||
# SMUAT = Source Map Upload Auth Token
|
# SMUAT = Source Map Upload Auth Token
|
||||||
ARG SENTRY_SMUAT
|
ARG SENTRY_SMUAT
|
||||||
ENV SENTRY_SMUAT=$SENTRY_SMUAT
|
ENV SENTRY_SMUAT=$SENTRY_SMUAT
|
||||||
|
|
@ -102,8 +100,6 @@ ENV SKIP_ENV_VALIDATION=0
|
||||||
FROM node-alpine AS backend-builder
|
FROM node-alpine AS backend-builder
|
||||||
ENV SKIP_ENV_VALIDATION=1
|
ENV SKIP_ENV_VALIDATION=1
|
||||||
# -----------
|
# -----------
|
||||||
ARG NEXT_PUBLIC_SOURCEBOT_VERSION
|
|
||||||
ENV NEXT_PUBLIC_SOURCEBOT_VERSION=$NEXT_PUBLIC_SOURCEBOT_VERSION
|
|
||||||
|
|
||||||
# To upload source maps to Sentry, we need to set the following build-time args.
|
# To upload source maps to Sentry, we need to set the following build-time args.
|
||||||
# It's important that we don't set these for oss builds, otherwise the Sentry
|
# It's important that we don't set these for oss builds, otherwise the Sentry
|
||||||
|
|
@ -115,6 +111,8 @@ ENV SENTRY_BACKEND_PROJECT=$SENTRY_BACKEND_PROJECT
|
||||||
# SMUAT = Source Map Upload Auth Token
|
# SMUAT = Source Map Upload Auth Token
|
||||||
ARG SENTRY_SMUAT
|
ARG SENTRY_SMUAT
|
||||||
ENV SENTRY_SMUAT=$SENTRY_SMUAT
|
ENV SENTRY_SMUAT=$SENTRY_SMUAT
|
||||||
|
ARG SENTRY_RELEASE
|
||||||
|
ENV SENTRY_RELEASE=$SENTRY_RELEASE
|
||||||
# -----------
|
# -----------
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
@ -132,12 +130,12 @@ RUN yarn workspace @sourcebot/backend install
|
||||||
RUN yarn workspace @sourcebot/backend build
|
RUN yarn workspace @sourcebot/backend build
|
||||||
|
|
||||||
# Upload source maps to Sentry if we have the necessary build-time args.
|
# Upload source maps to Sentry if we have the necessary build-time args.
|
||||||
RUN if [ -n "$SENTRY_SMUAT" ] && [ -n "$SENTRY_ORG" ] && [ -n "$SENTRY_BACKEND_PROJECT" ] && [ -n "$NEXT_PUBLIC_SOURCEBOT_VERSION" ]; then \
|
RUN if [ -n "$SENTRY_SMUAT" ] && [ -n "$SENTRY_ORG" ] && [ -n "$SENTRY_BACKEND_PROJECT" ] && [ -n "$SENTRY_RELEASE" ]; then \
|
||||||
apk add --no-cache curl; \
|
apk add --no-cache curl; \
|
||||||
curl -sL https://sentry.io/get-cli/ | sh; \
|
curl -sL https://sentry.io/get-cli/ | sh; \
|
||||||
sentry-cli login --auth-token $SENTRY_SMUAT; \
|
sentry-cli login --auth-token $SENTRY_SMUAT; \
|
||||||
sentry-cli sourcemaps inject --org $SENTRY_ORG --project $SENTRY_BACKEND_PROJECT --release $NEXT_PUBLIC_SOURCEBOT_VERSION ./packages/backend/dist; \
|
sentry-cli sourcemaps inject --org $SENTRY_ORG --project $SENTRY_BACKEND_PROJECT --release $SENTRY_RELEASE ./packages/backend/dist; \
|
||||||
sentry-cli sourcemaps upload --org $SENTRY_ORG --project $SENTRY_BACKEND_PROJECT --release $NEXT_PUBLIC_SOURCEBOT_VERSION ./packages/backend/dist; \
|
sentry-cli sourcemaps upload --org $SENTRY_ORG --project $SENTRY_BACKEND_PROJECT --release $SENTRY_RELEASE ./packages/backend/dist; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ENV SKIP_ENV_VALIDATION=0
|
ENV SKIP_ENV_VALIDATION=0
|
||||||
|
|
@ -146,8 +144,6 @@ ENV SKIP_ENV_VALIDATION=0
|
||||||
# ------ Runner ------
|
# ------ Runner ------
|
||||||
FROM node-alpine AS runner
|
FROM node-alpine AS runner
|
||||||
# -----------
|
# -----------
|
||||||
ARG NEXT_PUBLIC_SOURCEBOT_VERSION
|
|
||||||
ENV NEXT_PUBLIC_SOURCEBOT_VERSION=$NEXT_PUBLIC_SOURCEBOT_VERSION
|
|
||||||
ARG NEXT_PUBLIC_SENTRY_ENVIRONMENT
|
ARG NEXT_PUBLIC_SENTRY_ENVIRONMENT
|
||||||
ENV NEXT_PUBLIC_SENTRY_ENVIRONMENT=$NEXT_PUBLIC_SENTRY_ENVIRONMENT
|
ENV NEXT_PUBLIC_SENTRY_ENVIRONMENT=$NEXT_PUBLIC_SENTRY_ENVIRONMENT
|
||||||
ARG NEXT_PUBLIC_SENTRY_WEBAPP_DSN
|
ARG NEXT_PUBLIC_SENTRY_WEBAPP_DSN
|
||||||
|
|
@ -160,8 +156,6 @@ ARG NEXT_PUBLIC_LANGFUSE_BASE_URL
|
||||||
ENV NEXT_PUBLIC_LANGFUSE_BASE_URL=$NEXT_PUBLIC_LANGFUSE_BASE_URL
|
ENV NEXT_PUBLIC_LANGFUSE_BASE_URL=$NEXT_PUBLIC_LANGFUSE_BASE_URL
|
||||||
# -----------
|
# -----------
|
||||||
|
|
||||||
RUN echo "Sourcebot Version: $NEXT_PUBLIC_SOURCEBOT_VERSION"
|
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
ENV NEXT_TELEMETRY_DISABLED=1
|
ENV NEXT_TELEMETRY_DISABLED=1
|
||||||
|
|
|
||||||
|
|
@ -63,8 +63,20 @@ else
|
||||||
export REDIS_EMBEDDED="false"
|
export REDIS_EMBEDDED="false"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Extract version from version.ts
|
||||||
|
VERSION_FILE="/app/packages/shared/src/version.ts"
|
||||||
|
if [ -f "$VERSION_FILE" ]; then
|
||||||
|
SOURCEBOT_VERSION=$(grep -o '"v[^"]*"' "$VERSION_FILE" | tr -d '"')
|
||||||
|
# Validate extraction succeeded
|
||||||
|
if [ -z "$SOURCEBOT_VERSION" ]; then
|
||||||
|
echo -e "\e[33m[Warning] Failed to extract version from $VERSION_FILE. Setting to 'unknown'.\e[0m" >&2
|
||||||
|
SOURCEBOT_VERSION="unknown"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
SOURCEBOT_VERSION="unknown"
|
||||||
|
fi
|
||||||
|
|
||||||
echo -e "\e[34m[Info] Sourcebot version: $NEXT_PUBLIC_SOURCEBOT_VERSION\e[0m"
|
echo -e "\e[34m[Info] Sourcebot version: $SOURCEBOT_VERSION\e[0m"
|
||||||
|
|
||||||
if [ -n "$SOURCEBOT_TELEMETRY_DISABLED" ]; then
|
if [ -n "$SOURCEBOT_TELEMETRY_DISABLED" ]; then
|
||||||
# Validate that SOURCEBOT_TELEMETRY_DISABLED is either "true" or "false"
|
# Validate that SOURCEBOT_TELEMETRY_DISABLED is either "true" or "false"
|
||||||
|
|
@ -157,7 +169,7 @@ if [ ! -f "$FIRST_RUN_FILE" ]; then
|
||||||
"event": "install",
|
"event": "install",
|
||||||
"distinct_id": "'"$SOURCEBOT_INSTALL_ID"'",
|
"distinct_id": "'"$SOURCEBOT_INSTALL_ID"'",
|
||||||
"properties": {
|
"properties": {
|
||||||
"sourcebot_version": "'"$NEXT_PUBLIC_SOURCEBOT_VERSION"'"
|
"sourcebot_version": "'"$SOURCEBOT_VERSION"'"
|
||||||
}
|
}
|
||||||
}' https://us.i.posthog.com/capture/ ) then
|
}' https://us.i.posthog.com/capture/ ) then
|
||||||
echo -e "\e[33m[Warning] Failed to send install event.\e[0m"
|
echo -e "\e[33m[Warning] Failed to send install event.\e[0m"
|
||||||
|
|
@ -168,8 +180,8 @@ else
|
||||||
PREVIOUS_VERSION=$(cat "$FIRST_RUN_FILE" | jq -r '.version')
|
PREVIOUS_VERSION=$(cat "$FIRST_RUN_FILE" | jq -r '.version')
|
||||||
|
|
||||||
# If the version has changed, we assume an upgrade has occurred.
|
# If the version has changed, we assume an upgrade has occurred.
|
||||||
if [ "$PREVIOUS_VERSION" != "$NEXT_PUBLIC_SOURCEBOT_VERSION" ]; then
|
if [ "$PREVIOUS_VERSION" != "$SOURCEBOT_VERSION" ]; then
|
||||||
echo -e "\e[34m[Info] Upgraded from version $PREVIOUS_VERSION to $NEXT_PUBLIC_SOURCEBOT_VERSION\e[0m"
|
echo -e "\e[34m[Info] Upgraded from version $PREVIOUS_VERSION to $SOURCEBOT_VERSION\e[0m"
|
||||||
|
|
||||||
if [ "$SOURCEBOT_TELEMETRY_DISABLED" = "false" ]; then
|
if [ "$SOURCEBOT_TELEMETRY_DISABLED" = "false" ]; then
|
||||||
if ! ( curl -L --output /dev/null --silent --fail --header "Content-Type: application/json" -d '{
|
if ! ( curl -L --output /dev/null --silent --fail --header "Content-Type: application/json" -d '{
|
||||||
|
|
@ -178,7 +190,7 @@ else
|
||||||
"distinct_id": "'"$SOURCEBOT_INSTALL_ID"'",
|
"distinct_id": "'"$SOURCEBOT_INSTALL_ID"'",
|
||||||
"properties": {
|
"properties": {
|
||||||
"from_version": "'"$PREVIOUS_VERSION"'",
|
"from_version": "'"$PREVIOUS_VERSION"'",
|
||||||
"to_version": "'"$NEXT_PUBLIC_SOURCEBOT_VERSION"'"
|
"to_version": "'"$SOURCEBOT_VERSION"'"
|
||||||
}
|
}
|
||||||
}' https://us.i.posthog.com/capture/ ) then
|
}' https://us.i.posthog.com/capture/ ) then
|
||||||
echo -e "\e[33m[Warning] Failed to send upgrade event.\e[0m"
|
echo -e "\e[33m[Warning] Failed to send upgrade event.\e[0m"
|
||||||
|
|
@ -187,7 +199,7 @@ else
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "{\"version\": \"$NEXT_PUBLIC_SOURCEBOT_VERSION\", \"install_id\": \"$SOURCEBOT_INSTALL_ID\"}" > "$FIRST_RUN_FILE"
|
echo "{\"version\": \"$SOURCEBOT_VERSION\", \"install_id\": \"$SOURCEBOT_INSTALL_ID\"}" > "$FIRST_RUN_FILE"
|
||||||
|
|
||||||
# Start the database and wait for it to be ready before starting any other service
|
# Start the database and wait for it to be ready before starting any other service
|
||||||
if [ "$DATABASE_EMBEDDED" = "true" ]; then
|
if [ "$DATABASE_EMBEDDED" = "true" ]; then
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import * as Sentry from "@sentry/node";
|
import * as Sentry from "@sentry/node";
|
||||||
import { createLogger } from "@sourcebot/shared";
|
import { createLogger, SOURCEBOT_VERSION } from "@sourcebot/shared";
|
||||||
import { env } from "@sourcebot/shared/client";
|
import { env } from "@sourcebot/shared/client";
|
||||||
|
|
||||||
const logger = createLogger('instrument');
|
const logger = createLogger('instrument');
|
||||||
|
|
@ -7,7 +7,7 @@ const logger = createLogger('instrument');
|
||||||
if (!!env.NEXT_PUBLIC_SENTRY_BACKEND_DSN && !!env.NEXT_PUBLIC_SENTRY_ENVIRONMENT) {
|
if (!!env.NEXT_PUBLIC_SENTRY_BACKEND_DSN && !!env.NEXT_PUBLIC_SENTRY_ENVIRONMENT) {
|
||||||
Sentry.init({
|
Sentry.init({
|
||||||
dsn: env.NEXT_PUBLIC_SENTRY_BACKEND_DSN,
|
dsn: env.NEXT_PUBLIC_SENTRY_BACKEND_DSN,
|
||||||
release: env.NEXT_PUBLIC_SOURCEBOT_VERSION,
|
release: SOURCEBOT_VERSION,
|
||||||
environment: env.NEXT_PUBLIC_SENTRY_ENVIRONMENT,
|
environment: env.NEXT_PUBLIC_SENTRY_ENVIRONMENT,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
import { env as clientEnv } from "@sourcebot/shared/client";
|
import { env, SOURCEBOT_VERSION } from "@sourcebot/shared";
|
||||||
import { env } from "@sourcebot/shared";
|
|
||||||
import { PostHog } from 'posthog-node';
|
import { PostHog } from 'posthog-node';
|
||||||
import { PosthogEvent, PosthogEventMap } from './posthogEvents.js';
|
import { PosthogEvent, PosthogEventMap } from './posthogEvents.js';
|
||||||
|
|
||||||
|
|
@ -24,7 +23,7 @@ export function captureEvent<E extends PosthogEvent>(event: E, properties: Posth
|
||||||
event: event,
|
event: event,
|
||||||
properties: {
|
properties: {
|
||||||
...properties,
|
...properties,
|
||||||
sourcebot_version: clientEnv.NEXT_PUBLIC_SOURCEBOT_VERSION,
|
sourcebot_version: SOURCEBOT_VERSION,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ export const env = createEnv({
|
||||||
clientPrefix: "NEXT_PUBLIC_",
|
clientPrefix: "NEXT_PUBLIC_",
|
||||||
client: {
|
client: {
|
||||||
NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT: z.enum(SOURCEBOT_CLOUD_ENVIRONMENT).optional(),
|
NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT: z.enum(SOURCEBOT_CLOUD_ENVIRONMENT).optional(),
|
||||||
NEXT_PUBLIC_SOURCEBOT_VERSION: z.string().default("unknown"),
|
|
||||||
NEXT_PUBLIC_SENTRY_BACKEND_DSN: z.string().optional(),
|
NEXT_PUBLIC_SENTRY_BACKEND_DSN: z.string().optional(),
|
||||||
NEXT_PUBLIC_SENTRY_ENVIRONMENT: z.string().optional(),
|
NEXT_PUBLIC_SENTRY_ENVIRONMENT: z.string().optional(),
|
||||||
NEXT_PUBLIC_LANGFUSE_PUBLIC_KEY: z.string().optional(),
|
NEXT_PUBLIC_LANGFUSE_PUBLIC_KEY: z.string().optional(),
|
||||||
|
|
@ -14,7 +13,6 @@ export const env = createEnv({
|
||||||
},
|
},
|
||||||
runtimeEnvStrict: {
|
runtimeEnvStrict: {
|
||||||
NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT: process.env.NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT,
|
NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT: process.env.NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT,
|
||||||
NEXT_PUBLIC_SOURCEBOT_VERSION: process.env.NEXT_PUBLIC_SOURCEBOT_VERSION,
|
|
||||||
NEXT_PUBLIC_SENTRY_BACKEND_DSN: process.env.NEXT_PUBLIC_SENTRY_BACKEND_DSN,
|
NEXT_PUBLIC_SENTRY_BACKEND_DSN: process.env.NEXT_PUBLIC_SENTRY_BACKEND_DSN,
|
||||||
NEXT_PUBLIC_SENTRY_ENVIRONMENT: process.env.NEXT_PUBLIC_SENTRY_ENVIRONMENT,
|
NEXT_PUBLIC_SENTRY_ENVIRONMENT: process.env.NEXT_PUBLIC_SENTRY_ENVIRONMENT,
|
||||||
NEXT_PUBLIC_LANGFUSE_PUBLIC_KEY: process.env.NEXT_PUBLIC_LANGFUSE_PUBLIC_KEY,
|
NEXT_PUBLIC_LANGFUSE_PUBLIC_KEY: process.env.NEXT_PUBLIC_LANGFUSE_PUBLIC_KEY,
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,7 @@
|
||||||
export * from "./constants.js";
|
export * from "./constants.js";
|
||||||
export {
|
export {
|
||||||
env
|
env
|
||||||
} from "./env.client.js";
|
} from "./env.client.js";
|
||||||
|
export {
|
||||||
|
SOURCEBOT_VERSION,
|
||||||
|
} from "./version.js";
|
||||||
|
|
@ -46,4 +46,7 @@ export {
|
||||||
} from "./crypto.js";
|
} from "./crypto.js";
|
||||||
export {
|
export {
|
||||||
getDBConnectionString,
|
getDBConnectionString,
|
||||||
} from "./db.js";
|
} from "./db.js";
|
||||||
|
export {
|
||||||
|
SOURCEBOT_VERSION,
|
||||||
|
} from "./version.js";
|
||||||
2
packages/shared/src/version.ts
Normal file
2
packages/shared/src/version.ts
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
// This file is auto-generated by .github/workflows/release-sourcebot.yml
|
||||||
|
export const SOURCEBOT_VERSION = "v4.10.4";
|
||||||
|
|
@ -32,7 +32,7 @@ import { useKeymapType } from "@/hooks/useKeymapType"
|
||||||
import { useSession } from "next-auth/react";
|
import { useSession } from "next-auth/react";
|
||||||
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
|
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
|
||||||
import { signOut } from "next-auth/react"
|
import { signOut } from "next-auth/react"
|
||||||
import { env } from "@sourcebot/shared/client";
|
import { SOURCEBOT_VERSION } from "@sourcebot/shared/client";
|
||||||
import posthog from "posthog-js";
|
import posthog from "posthog-js";
|
||||||
import { useDomain } from "@/hooks/useDomain";
|
import { useDomain } from "@/hooks/useDomain";
|
||||||
|
|
||||||
|
|
@ -167,7 +167,7 @@ export const SettingsDropdown = ({
|
||||||
</DropdownMenuGroup>
|
</DropdownMenuGroup>
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
<div className="px-2 py-1 text-sm text-muted-foreground">
|
<div className="px-2 py-1 text-sm text-muted-foreground">
|
||||||
version: {env.NEXT_PUBLIC_SOURCEBOT_VERSION}
|
version: {SOURCEBOT_VERSION}
|
||||||
</div>
|
</div>
|
||||||
</DropdownMenuContent>
|
</DropdownMenuContent>
|
||||||
</DropdownMenu>
|
</DropdownMenu>
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { env } from "@sourcebot/shared/client";
|
import { SOURCEBOT_VERSION } from "@sourcebot/shared";
|
||||||
import { GetVersionResponse } from "@/lib/types";
|
import { GetVersionResponse } from "@/lib/types";
|
||||||
|
|
||||||
// Note: In Next.JS 14, GET methods with no params are cached by default at build time.
|
// Note: In Next.JS 14, GET methods with no params are cached by default at build time.
|
||||||
|
|
@ -10,6 +10,6 @@ export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
export const GET = async () => {
|
export const GET = async () => {
|
||||||
return Response.json({
|
return Response.json({
|
||||||
version: env.NEXT_PUBLIC_SOURCEBOT_VERSION,
|
version: SOURCEBOT_VERSION,
|
||||||
} satisfies GetVersionResponse);
|
} satisfies GetVersionResponse);
|
||||||
}
|
}
|
||||||
|
|
@ -6,8 +6,7 @@ import { PostHogProvider } from "./posthogProvider";
|
||||||
import { Toaster } from "@/components/ui/toaster";
|
import { Toaster } from "@/components/ui/toaster";
|
||||||
import { TooltipProvider } from "@/components/ui/tooltip";
|
import { TooltipProvider } from "@/components/ui/tooltip";
|
||||||
import { SessionProvider } from "next-auth/react";
|
import { SessionProvider } from "next-auth/react";
|
||||||
import { env } from "@sourcebot/shared";
|
import { env, SOURCEBOT_VERSION } from "@sourcebot/shared";
|
||||||
import { env as clientEnv } from "@sourcebot/shared/client";
|
|
||||||
import { PlanProvider } from "@/features/entitlements/planProvider";
|
import { PlanProvider } from "@/features/entitlements/planProvider";
|
||||||
import { getEntitlements } from "@sourcebot/shared";
|
import { getEntitlements } from "@sourcebot/shared";
|
||||||
|
|
||||||
|
|
@ -43,7 +42,7 @@ export default function RootLayout({
|
||||||
// @note: the posthog api key doesn't need to be kept secret,
|
// @note: the posthog api key doesn't need to be kept secret,
|
||||||
// so we are safe to send it to the client.
|
// so we are safe to send it to the client.
|
||||||
posthogApiKey={env.POSTHOG_PAPIK}
|
posthogApiKey={env.POSTHOG_PAPIK}
|
||||||
sourcebotVersion={clientEnv.NEXT_PUBLIC_SOURCEBOT_VERSION}
|
sourcebotVersion={SOURCEBOT_VERSION}
|
||||||
sourcebotInstallId={env.SOURCEBOT_INSTALL_ID}
|
sourcebotInstallId={env.SOURCEBOT_INSTALL_ID}
|
||||||
>
|
>
|
||||||
<ThemeProvider
|
<ThemeProvider
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
import { IAuditService, AuditEvent } from '@/ee/features/audit/types';
|
import { IAuditService, AuditEvent } from '@/ee/features/audit/types';
|
||||||
import { prisma } from '@/prisma';
|
import { prisma } from '@/prisma';
|
||||||
import { Audit } from '@prisma/client';
|
import { Audit } from '@prisma/client';
|
||||||
import { createLogger } from '@sourcebot/shared';
|
import { createLogger, SOURCEBOT_VERSION } from '@sourcebot/shared';
|
||||||
|
|
||||||
const logger = createLogger('audit-service');
|
const logger = createLogger('audit-service');
|
||||||
|
|
||||||
export class AuditService implements IAuditService {
|
export class AuditService implements IAuditService {
|
||||||
async createAudit(event: Omit<AuditEvent, 'sourcebotVersion'>): Promise<Audit | null> {
|
async createAudit(event: Omit<AuditEvent, 'sourcebotVersion'>): Promise<Audit | null> {
|
||||||
const sourcebotVersion = process.env.NEXT_PUBLIC_SOURCEBOT_VERSION || 'unknown';
|
const sourcebotVersion = SOURCEBOT_VERSION;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const audit = await prisma.audit.create({
|
const audit = await prisma.audit.create({
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
import { PostHog } from 'posthog-node'
|
import { PostHog } from 'posthog-node'
|
||||||
import { env } from '@sourcebot/shared'
|
import { env, SOURCEBOT_VERSION } from '@sourcebot/shared'
|
||||||
import { env as clientEnv } from '@sourcebot/shared/client';
|
|
||||||
import { RequestCookies } from 'next/dist/compiled/@edge-runtime/cookies';
|
import { RequestCookies } from 'next/dist/compiled/@edge-runtime/cookies';
|
||||||
import * as Sentry from "@sentry/nextjs";
|
import * as Sentry from "@sentry/nextjs";
|
||||||
import { PosthogEvent, PosthogEventMap } from './posthogEvents';
|
import { PosthogEvent, PosthogEventMap } from './posthogEvents';
|
||||||
|
|
@ -98,7 +97,7 @@ export async function captureEvent<E extends PosthogEvent>(event: E, properties:
|
||||||
event,
|
event,
|
||||||
properties: {
|
properties: {
|
||||||
...properties,
|
...properties,
|
||||||
sourcebot_version: clientEnv.NEXT_PUBLIC_SOURCEBOT_VERSION,
|
sourcebot_version: SOURCEBOT_VERSION,
|
||||||
install_id: env.SOURCEBOT_INSTALL_ID,
|
install_id: env.SOURCEBOT_INSTALL_ID,
|
||||||
$host: host,
|
$host: host,
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue