Skip to content

Commit bbc1ac8

Browse files
Migrate build system to esbuild and add environment validation (#1234)
* refactor: migrate build system to esbuild and add environment validation Replace rollup with esbuild bundler for all client libraries, improve TypeScript configurations, and introduce Zod-based environment variable validation for console webapp with separate client/server schemas. Fix Next.js env var inlining in clientEnv by using explicit property access instead of passing process.env object to Zod. * functions-server and profiles - consolidate all in rotor package * libs/core-functions move mongodb, isolated-vm and other heavy deps directly into rotor
1 parent fcb8b34 commit bbc1ac8

File tree

271 files changed

+9455
-17538
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

271 files changed

+9455
-17538
lines changed

.github/workflows/client-libraries-build.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,15 +147,15 @@ jobs:
147147
148148
# Publish @jitsu/protocols
149149
echo "Publishing @jitsu/protocols..."
150-
docker exec builder sh -c "cd types/protocols && npm publish --tag ${NPM_TAG} --access public"
150+
docker exec builder sh -c "cd types/protocols && pnpm publish --tag ${NPM_TAG} --access public"
151151
152152
# Publish @jitsu/js
153153
echo "Publishing @jitsu/js..."
154-
docker exec builder sh -c "cd libs/jitsu-js && npm publish --tag ${NPM_TAG} --access public"
154+
docker exec builder sh -c "cd libs/jitsu-js && pnpm publish --tag ${NPM_TAG} --access public"
155155
156156
# Publish @jitsu/jitsu-react
157157
echo "Publishing @jitsu/jitsu-react..."
158-
docker exec builder sh -c "cd libs/jitsu-react && npm publish --tag ${NPM_TAG} --access public"
158+
docker exec builder sh -c "cd libs/jitsu-react && pnpm publish --tag ${NPM_TAG} --access public"
159159
160160
- name: 🧹 Cleanup container
161161
if: always()

.github/workflows/lint.yml

Lines changed: 55 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,18 @@ jobs:
4040
- '**/playwright/**'
4141
- '**/*.spec.ts'
4242
- '**/playwright.config.ts'
43+
nodejs:
44+
- 'cli/**'
45+
- 'libs/**'
46+
- 'services/**'
47+
- 'types/**'
48+
- 'webapps/**'
49+
- 'package.json'
50+
- 'pnpm-lock.yaml'
51+
- 'pnpm-workspace.yaml'
4352
4453
- name: 🚀 Setup Turbo cache
54+
if: steps.changes.outputs.nodejs == 'true'
4555
uses: actions/cache@v4
4656
with:
4757
path: |
@@ -52,39 +62,50 @@ jobs:
5262
${{ runner.os }}-turbo-lint-
5363
5464
- name: 🐳 Pull and start builder container
65+
if: steps.changes.outputs.nodejs == 'true'
5566
run: |
5667
docker pull jitsucom/jitsu-builder:latest
5768
docker run -d --name builder -v ${{ github.workspace }}:/workspace -w /workspace -e CI=true jitsucom/jitsu-builder:latest tail -f /dev/null
5869
5970
- name: 📦 Fetch dependencies from store
71+
if: steps.changes.outputs.nodejs == 'true'
6072
run: |
6173
docker exec builder sh -c 'echo "pnpm store path: $(pnpm store path)"'
6274
docker exec builder pnpm fetch
6375
6476
- name: 📦 Install dependencies
77+
if: steps.changes.outputs.nodejs == 'true'
6578
run: docker exec builder pnpm install --frozen-lockfile --offline
6679

6780
- name: ✨ Check code format
81+
if: steps.changes.outputs.nodejs == 'true'
6882
run: docker exec builder pnpm format:check:all
6983

7084
- name: 🔧 Run codegen
85+
if: steps.changes.outputs.nodejs == 'true'
7186
run: docker exec builder pnpm codegen
7287

7388
- name: 🧪️ Run Typecheck
89+
if: steps.changes.outputs.nodejs == 'true'
7490
run: docker exec builder pnpm typecheck
7591

7692
- name: 🧪 Run linter
93+
if: steps.changes.outputs.nodejs == 'true'
7794
run: docker exec builder pnpm lint
7895

7996
- name: 🧪 Run tests
97+
if: steps.changes.outputs.nodejs == 'true'
8098
run: docker exec builder pnpm test
8199

82100
- name: 🎭 Run Playwright tests
83-
if: steps.changes.outputs.playwright == 'true'
84-
run: docker exec builder pnpm test:playwright
101+
if: steps.changes.outputs.nodejs == 'true' && steps.changes.outputs.playwright == 'true'
102+
# Note: build of @jitsu/js and all it's dep is required for playwright tests to work
103+
run: |
104+
docker exec builder pnpm --filter jsondiffpatch --filter @jitsu/js build
105+
docker exec builder pnpm test:playwright
85106
86107
- name: 🧹 Cleanup container
87-
if: always()
108+
if: always() && steps.changes.outputs.nodejs == 'true'
88109
run: docker stop builder && docker rm builder
89110

90111
bulker-test:
@@ -100,40 +121,52 @@ jobs:
100121
fetch-depth: 0
101122
submodules: true
102123

124+
- name: 🔍 Check changed files
125+
id: changes
126+
uses: dorny/paths-filter@v3
127+
with:
128+
filters: |
129+
bulker:
130+
- 'bulker/**'
131+
103132
- name: Set up Go
104-
uses: actions/setup-go@v5
133+
if: steps.changes.outputs.bulker == 'true'
134+
uses: actions/setup-go@v6
105135
with:
106-
go-version: '1.24.9'
107-
cache: false
136+
go-version: '1.25'
137+
cache-dependency-path: "bulker/**/*.sum"
138+
check-latest: true
139+
# cache: false
108140

109141
- name: 🧪 Run Bulker tests
142+
if: steps.changes.outputs.bulker == 'true'
110143
working-directory: ./bulker
111-
# env:
112-
# AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
113-
# AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
114-
# AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
115-
# BULKER_TEST_BIGQUERY: ${{ secrets.BULKER_TEST_BIGQUERY }}
116-
# BULKER_TEST_REDSHIFT_IAM: ${{ secrets.BULKER_TEST_REDSHIFT_IAM }}
117-
# BULKER_TEST_S3: ${{ secrets.BULKER_TEST_S3 }}
118-
# BULKER_TEST_MOTHERDUCK: ${{ secrets.BULKER_TEST_MOTHERDUCK }}
119-
# BULKER_TEST_REDSHIFT_SERVERLESS: ${{ secrets.BULKER_TEST_REDSHIFT_SERVERLESS }}
120-
# BULKER_TEST_SNOWFLAKE: ${{ secrets.BULKER_TEST_SNOWFLAKE }}
121-
# BULKER_TEST_MILLION_ROWS_BATCHED: postgres
122-
# TESTCONTAINERS_RYUK_DISABLED: true
144+
env:
145+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
146+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
147+
AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
148+
BULKER_TEST_BIGQUERY: ${{ secrets.BULKER_TEST_BIGQUERY }}
149+
BULKER_TEST_REDSHIFT_IAM: ${{ secrets.BULKER_TEST_REDSHIFT_IAM }}
150+
BULKER_TEST_S3: ${{ secrets.BULKER_TEST_S3 }}
151+
BULKER_TEST_MOTHERDUCK: ${{ secrets.BULKER_TEST_MOTHERDUCK }}
152+
# BULKER_TEST_REDSHIFT: ${{ secrets.BULKER_TEST_REDSHIFT }}
153+
BULKER_TEST_REDSHIFT_SERVERLESS: ${{ secrets.BULKER_TEST_REDSHIFT_SERVERLESS }}
154+
BULKER_TEST_SNOWFLAKE: ${{ secrets.BULKER_TEST_SNOWFLAKE }}
155+
BULKER_TEST_MILLION_ROWS_BATCHED: postgres
156+
TESTCONTAINERS_RYUK_DISABLED: true
123157
run: |
124-
exit 0
125-
# go test -parallel=10 -timeout 60m -json ./jitsubase/... ./kafkabase/... ./eventslog/... ./bulkerlib/... ./bulkerapp/... > test_report.json
158+
go test -parallel=10 -timeout 60m -json ./jitsubase/... ./kafkabase/... ./eventslog/... ./bulkerlib/... ./bulkerapp/... > test_report.json
126159
127160
128161
- name: 📊 Generate test report
129-
if: always()
162+
if: always() && steps.changes.outputs.bulker == 'true'
130163
working-directory: ./bulker
131164
run: |
132165
go install github.com/vakenbolt/go-test-report@latest
133166
cat test_report.json | ~/go/bin/go-test-report
134167
135168
- name: 📤 Upload test artifacts
136-
if: always()
169+
if: always() && steps.changes.outputs.bulker == 'true'
137170
uses: actions/upload-artifact@v4
138171
with:
139172
name: bulker-test-report

.github/workflows/services-build.yaml

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ jobs:
125125
BRANCH: ${{ github.ref_name }}
126126
COMMIT_SHA: ${{ github.sha }}
127127
run: |
128-
TARGETS="console rotor profiles"
128+
TARGETS="console rotor"
129129
REGISTRY="${{ secrets.DOCKERHUB_USERNAME }}"
130130
SHORT_SHA=$(git rev-parse --short=7 HEAD)
131131
@@ -217,7 +217,7 @@ jobs:
217217
BRANCH: ${{ github.ref_name }}
218218
COMMIT_SHA: ${{ github.sha }}
219219
run: |
220-
TARGETS="bulker ingest sidecar syncctl ingmgr cfgkpr admin reprocessing-worker"
220+
TARGETS="bulker ingest sidecar syncctl operator ingmgr cfgkpr admin reprocessing-worker"
221221
REGISTRY="${{ secrets.DOCKERHUB_USERNAME }}"
222222
SHORT_SHA=$(git rev-parse --short=7 HEAD)
223223
BUILD_TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
@@ -444,12 +444,16 @@ jobs:
444444
445445
# Update CLI
446446
docker exec builder sh -c "cd cli/jitsu-cli && jq --arg version \"${VERSION}\" '.version = \$version' package.json > package.json.tmp && mv package.json.tmp package.json"
447+
448+
# Update Types
449+
docker exec builder sh -c "cd types/protocols && jq --arg version \"${VERSION}\" '.version = \$version' package.json > package.json.tmp && mv package.json.tmp package.json"
447450
448451
# Update Functions Library
449452
docker exec builder sh -c "cd libs/functions && jq --arg version \"${VERSION}\" '.version = \$version' package.json > package.json.tmp && mv package.json.tmp package.json"
450453
451454
echo "Updated versions:"
452455
docker exec builder sh -c "cd cli/jitsu-cli && cat package.json | grep version"
456+
docker exec builder sh -c "cd types/protocols && cat package.json | grep version"
453457
docker exec builder sh -c "cd libs/functions && cat package.json | grep version"
454458
455459
- name: 🏗️ Build packages
@@ -479,11 +483,15 @@ jobs:
479483
480484
# Publish jitsu-cli
481485
echo "Publishing jitsu-cli..."
482-
docker exec builder sh -c "cd cli/jitsu-cli && npm publish --tag ${NPM_TAG} --access public ${DRY_RUN_FLAG}"
483-
486+
docker exec builder sh -c "cd cli/jitsu-cli && pnpm publish --tag ${NPM_TAG} --access public ${DRY_RUN_FLAG}"
487+
488+
# Publish @jitsu/protocols
489+
echo "Publishing @jitsu/protocols..."
490+
docker exec builder sh -c "cd types/protocols && pnpm publish --tag ${NPM_TAG} --access public ${DRY_RUN_FLAG}"
491+
484492
# Publish @jitsu/functions-lib
485493
echo "Publishing @jitsu/functions-lib..."
486-
docker exec builder sh -c "cd libs/functions && npm publish --tag ${NPM_TAG} --access public ${DRY_RUN_FLAG}"
494+
docker exec builder sh -c "cd libs/functions && pnpm publish --tag ${NPM_TAG} --access public ${DRY_RUN_FLAG}"
487495
488496
- name: 🧹 Cleanup container
489497
if: always()

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,5 @@ libs/jitsu-js/package/
3333
libs/jsondiffpatch/lib/
3434
.pnpm-store
3535
**/tsconfig.tsbuildinfo
36+
/services/functions-server/data/
37+
/services/functions-server/dist/

.npmrc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
auto-install-peers=true
22
strict-peer-dependencies=false
3-
node-options=--max-old-space-size=16384

all.Dockerfile

Lines changed: 3 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ WORKDIR /app
2828
# - procps: process management (ps, top, etc.)
2929
# - jq: JSON parsing for extracting package versions
3030
RUN apt-get update && \
31-
apt-get install -y --no-install-recommends nano curl cron bash netcat-traditional procps jq && \
31+
apt-get install -y --no-install-recommends ca-certificates nano curl cron bash netcat-traditional procps jq && \
3232
rm -rf /var/lib/apt/lists/*
3333

3434
# ============================================================================
@@ -190,48 +190,13 @@ EXPOSE 3401
190190
# Copy compiled JavaScript from builder stage
191191
# The /dist folder contains the bundled Node.js application
192192
COPY --from=builder /app/services/rotor/dist .
193+
COPY --from=builder /app/services/rotor/entrypoint.sh .
193194

194195
# Runtime environment configuration
195196
ENV NODE_ENV=production
196197
ENV JITSU_VERSION_COMMIT_SHA=${JITSU_BUILD_COMMIT_SHA}
197198
ENV JITSU_VERSION_DOCKER_TAG=${JITSU_BUILD_DOCKER_TAG}
198199
ENV JITSU_VERSION_STRING=${JITSU_BUILD_VERSION}
199200

200-
# CMD provides flags to node binary (ENTRYPOINT would be "node" if specified)
201-
# Flags:
202-
# --no-node-snapshot: Disable V8 snapshot (can cause issues in containers)
203-
# --max-old-space-size=2048: Limit heap to 2GB (prevents OOM in constrained environments)
204-
# main.js: The application entry point
205-
CMD ["--no-node-snapshot", "--max-old-space-size=2048", "main.js"]
206-
207-
# ============================================================================
208-
# PROFILES STAGE - User profile management service
209-
# ============================================================================
210-
# Node.js service for managing user profiles and identity resolution
211-
FROM base AS profiles
212-
213-
# Build arguments for version information
214-
ARG JITSU_BUILD_VERSION=dev,
215-
ARG JITSU_BUILD_DOCKER_TAG=dev,
216-
ARG JITSU_BUILD_COMMIT_SHA=unknown,
217-
218-
WORKDIR /app
219-
220-
# Create non-root user for security (same as rotor)
221-
RUN addgroup --system --gid 1001 runner
222-
RUN adduser --system --uid 1001 runner
223-
USER runner
224-
225-
EXPOSE 3401
226-
227-
# Copy compiled JavaScript from builder stage
228-
COPY --from=builder /app/services/profiles/dist .
229-
230-
# Runtime environment configuration
231-
ENV NODE_ENV=production
232-
ENV JITSU_VERSION_COMMIT_SHA=${JITSU_BUILD_COMMIT_SHA}
233-
ENV JITSU_VERSION_DOCKER_TAG=${JITSU_BUILD_DOCKER_TAG}
234-
ENV JITSU_VERSION_STRING=${JITSU_BUILD_VERSION}
235201

236-
# Node.js runtime flags (see rotor stage for detailed explanation)
237-
CMD ["--no-node-snapshot", "--max-old-space-size=2048", "main.js"]
202+
ENTRYPOINT ["/app/entrypoint.sh"]

builder.Dockerfile

Lines changed: 6 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,27 @@
1-
FROM debian:bookworm-slim
1+
FROM node:24-bookworm-slim
22

33
# Install Node.js 24 manually from NodeSource + all runtime dependencies
44
# This includes everything needed for building AND running the final images
55
RUN apt-get update && \
6-
apt-get install -y ca-certificates curl gnupg && \
7-
mkdir -p /etc/apt/keyrings && \
8-
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \
9-
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_24.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list && \
10-
apt-get update && \
11-
apt-get install -y nodejs && \
12-
apt-get install -y git curl telnet python3 g++ make jq nano cron bash netcat-traditional procps && \
6+
apt-get install -y ca-certificates gnupg git curl telnet python3 g++ make jq nano cron bash netcat-traditional procps && \
137
rm -rf /var/lib/apt/lists/* && \
148
npm -g install pnpm@10 && \
159
npm cache clean --force
1610

11+
#print current user
12+
RUN whoami && echo "Current user is $(whoami)"
13+
1714
# Set up pnpm global bin directory (for global package installs like Playwright)
1815
# Note: This does NOT affect the store location, which remains at /root/.local/share/pnpm/store
1916
ENV PNPM_HOME=/root/.local/share/pnpm
2017
ENV PATH="${PNPM_HOME}:${PATH}"
2118
# Override pnpm store location to avoid workspace-local stores
2219
ENV NPM_CONFIG_STORE_DIR=/pnpm-store
23-
ENV NODE_OPTIONS="--max-old-space-size=16384"
2420

2521
# Copy only the files needed for dependency fetching and Playwright version extraction
2622
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
2723
COPY libs/jitsu-js/package.json ./libs/jitsu-js/package.json
2824

29-
# Install minimal Chromium dependencies manually
30-
RUN apt-get update && \
31-
apt-get install -y \
32-
libnss3 \
33-
libnspr4 \
34-
libatk1.0-0 \
35-
libatk-bridge2.0-0 \
36-
libcups2 \
37-
libdrm2 \
38-
libdbus-1-3 \
39-
libxkbcommon0 \
40-
libxcomposite1 \
41-
libxdamage1 \
42-
libxfixes3 \
43-
libxrandr2 \
44-
libgbm1 \
45-
libpango-1.0-0 \
46-
libcairo2 \
47-
libasound2 \
48-
libatspi2.0-0 \
49-
&& rm -rf /var/lib/apt/lists/*
50-
5125
# Extract Playwright version before cleanup
5226
RUN PLAYWRIGHT_VERSION=$(jq -r '.devDependencies["@playwright/test"]' ./libs/jitsu-js/package.json) && \
5327
echo "${PLAYWRIGHT_VERSION}" > /tmp/playwright-version.txt && \
@@ -64,7 +38,7 @@ RUN rm -rf /package.json /pnpm-lock.yaml /pnpm-workspace.yaml /libs
6438
RUN PLAYWRIGHT_VERSION=$(cat /tmp/playwright-version.txt) && \
6539
echo "Installing Playwright version: ${PLAYWRIGHT_VERSION}" && \
6640
pnpm add --global playwright@${PLAYWRIGHT_VERSION} && \
67-
playwright install chromium
41+
playwright install chromium --with-deps --only-shell
6842

6943
# Clean up any leftover node_modules
7044
RUN rm -rf /node_modules

bulker/.github/workflows/tag-release.yml

Lines changed: 0 additions & 41 deletions
This file was deleted.

0 commit comments

Comments
 (0)