Skip to content

Proj i04 7/clean up cicd pipeline - #133

Merged
giang-h-vu merged 20 commits into
mainfrom
PROJ-I04-7/clean-up-cicd-pipeline
Jul 16, 2026
Merged

Proj i04 7/clean up cicd pipeline#133
giang-h-vu merged 20 commits into
mainfrom
PROJ-I04-7/clean-up-cicd-pipeline

Conversation

@giang-h-vu

@giang-h-vu giang-h-vu commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator

Summary

Closes #


Motivation & Context


Changes


Steps for Testing


Checklist

  • I have self-reviewed the diff
  • Code is clean — no debug statements, commented-out code, or TODOs left behind
  • All CI checks pass (build · test · lint)
  • Tests added or updated to cover the changes (if needed)
  • New env vars added to .env.example
  • OpenAPI spec updated and codegen re-run (make -C api generate) if any endpoint changed
  • Screenshots or screen recordings attached for any UI changes

Summary by CodeRabbit

  • New Features

    • Added a reusable deployment workflow supporting optional platform setup, application deployment, smoke checks, and deployment summaries.
    • Consolidated continuous integration into one workflow that runs only the relevant checks for changed services and components.
    • Added deployment support for normalized image tags and environment-specific configuration.
  • Improvements

    • Dev deployments now handle cluster status more safely and use automated authentication.
    • Production deployments require an explicit image tag.
  • Chores

    • Removed multiple separate component-specific CI workflow files.

The wake step's grep only recognized 'Stopped'; any other cluster.sh
output (transitional states, garbled az errors) silently proceeded into
a confusing Terraform failure. Allowlist the script's actual outputs
and fail loudly otherwise.

Prod dispatch defaulted to the mutable 'latest' tag, making an
accidental deploy of unreleased main a single click. Still deployable,
but only by typing it deliberately.
Dev and prod each carried their own copy of the Ansible toolchain setup
and playbook invocation, and they had already drifted (tag handling,
bootstrap args). Both workflows now call .github/actions/ansible-deploy,
which runs bootstrap (explicit opt-in flag, dev only) + deploy, pins
ansible-core for reproducible runs, smoke-checks the public URL with
strict TLS after deploying, and writes a step summary (inventory, tag,
URL) to the run page. Trigger-specific tag derivation stays in the
callers as dedicated steps.
Eight per-service workflows were ~95% copy-paste and had already
drifted (checkout versions, persist-credentials, permissions), and
every PR ran all of them regardless of what changed.

One ci.yml now detects changed components (dorny/paths-filter), runs
only the affected jobs (java services as a dynamic matrix; a spec
change fans out to everything since DTOs are generated from it), and
funnels results into a ci-ok aggregator gate. Branch protection should
require exactly one check: ci-ok — dynamic matrix legs must never be
individually required (an ungenerated leg reports nothing and deadlocks
the PR). Also: stale PR runs are now cancelled on new pushes, every job
has a timeout, and main gets a post-merge CI run.
@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Review skipped

Too many files!

This PR contains 162 files, which is 112 over the limit of 50.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: fa5e1eaf-3ebc-4a5d-a8b4-16c87d780a93

📥 Commits

Reviewing files that changed from the base of the PR and between fc610ff and 3b37350.

⛔ Files ignored due to path filters (2)
  • services/genai/uv.lock is excluded by !**/*.lock
  • web-client/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (162)
  • .claude/skills/deep-teaching/SKILL.md
  • .env.example
  • .git-blame-ignore-revs
  • .github/actions/ansible-deploy/action.yml
  • .github/workflows/build-images.yml
  • .github/workflows/cd-dev.yml
  • .github/workflows/cd-prod.yml
  • .github/workflows/ci.yml
  • .gitignore
  • .pre-commit-config.yaml
  • CLAUDE.md
  • CODE_OF_CONDUCT.md
  • README.md
  • config/checkstyle.xml
  • docs/architecture/architecture.drawio
  • infra/README.md
  • infra/terraform/main.tf
  • ruff.toml
  • services/application/.dockerignore
  • services/application/pom.xml
  • services/application/src/main/java/com/jobready/application/ApplicationServiceApplication.java
  • services/application/src/main/java/com/jobready/application/config/SecurityConfig.java
  • services/application/src/main/java/com/jobready/application/controller/ApplicationController.java
  • services/application/src/main/java/com/jobready/application/exception/GlobalExceptionHandler.java
  • services/application/src/main/java/com/jobready/application/modelEntity/Application.java
  • services/application/src/main/java/com/jobready/application/modelEntity/Recommendation.java
  • services/application/src/main/java/com/jobready/application/repository/ApplicationRepository.java
  • services/application/src/main/java/com/jobready/application/repository/RecommendationRepository.java
  • services/application/src/main/java/com/jobready/application/service/ApplicationService.java
  • services/application/src/main/java/com/jobready/application/service/ApplicationServiceImpl.java
  • services/application/src/test/java/com/jobready/application/ApplicationServiceApplicationTests.java
  • services/application/src/test/java/com/jobready/application/controller/ApplicationControllerTest.java
  • services/application/src/test/java/com/jobready/application/modelEntity/StageConverterTest.java
  • services/application/src/test/java/com/jobready/application/service/ApplicationServiceImplTest.java
  • services/auth/.dockerignore
  • services/auth/pom.xml
  • services/auth/src/main/java/com/jobready/auth/AuthApplication.java
  • services/auth/src/main/java/com/jobready/auth/config/CookieProperties.java
  • services/auth/src/main/java/com/jobready/auth/config/JwtConfig.java
  • services/auth/src/main/java/com/jobready/auth/config/SecurityConfig.java
  • services/auth/src/main/java/com/jobready/auth/controller/AuthController.java
  • services/auth/src/main/java/com/jobready/auth/controller/JwksController.java
  • services/auth/src/main/java/com/jobready/auth/exception/GlobalExceptionHandler.java
  • services/auth/src/main/java/com/jobready/auth/model/IssuedSession.java
  • services/auth/src/main/java/com/jobready/auth/modelEntity/User.java
  • services/auth/src/main/java/com/jobready/auth/repository/UserRepository.java
  • services/auth/src/main/java/com/jobready/auth/service/AuthService.java
  • services/auth/src/main/java/com/jobready/auth/service/AuthServiceImpl.java
  • services/auth/src/main/java/com/jobready/auth/service/JwtService.java
  • services/auth/src/main/java/com/jobready/auth/service/JwtServiceImpl.java
  • services/auth/src/main/resources/application-local.properties
  • services/auth/src/test/java/com/jobready/auth/AuthApplicationTests.java
  • services/document/.dockerignore
  • services/document/pom.xml
  • services/document/src/main/java/com/jobready/document/DocumentServiceApplication.java
  • services/document/src/main/java/com/jobready/document/config/SecurityConfig.java
  • services/document/src/main/java/com/jobready/document/controller/ProfileController.java
  • services/document/src/main/java/com/jobready/document/exception/GlobalExceptionHandler.java
  • services/document/src/main/java/com/jobready/document/modelEntity/CoverLetterEntity.java
  • services/document/src/main/java/com/jobready/document/modelEntity/EducationEntity.java
  • services/document/src/main/java/com/jobready/document/modelEntity/LanguageEntity.java
  • services/document/src/main/java/com/jobready/document/modelEntity/ProfileEntity.java
  • services/document/src/main/java/com/jobready/document/modelEntity/ResumeEntity.java
  • services/document/src/main/java/com/jobready/document/modelEntity/SkillEntity.java
  • services/document/src/main/java/com/jobready/document/modelEntity/WorkExperienceEntity.java
  • services/document/src/main/java/com/jobready/document/repository/CoverLetterRepository.java
  • services/document/src/main/java/com/jobready/document/repository/EducationRepository.java
  • services/document/src/main/java/com/jobready/document/repository/LanguageRepository.java
  • services/document/src/main/java/com/jobready/document/repository/ProfileRepository.java
  • services/document/src/main/java/com/jobready/document/repository/ResumeRepository.java
  • services/document/src/main/java/com/jobready/document/repository/SkillRepository.java
  • services/document/src/main/java/com/jobready/document/repository/WorkExperienceRepository.java
  • services/document/src/main/java/com/jobready/document/service/DocumentService.java
  • services/document/src/main/java/com/jobready/document/service/DocumentServiceImpl.java
  • services/document/src/test/java/com/jobready/document/DocumentServiceApplicationTests.java
  • services/document/src/test/java/com/jobready/document/service/DocumentServiceImplTest.java
  • services/email/pyproject.toml
  • services/email/requirements.txt
  • services/email/src/auth.py
  • services/email/src/config.py
  • services/email/src/db.py
  • services/email/src/errors.py
  • services/email/src/gmail_client.py
  • services/email/src/main.py
  • services/email/src/migrate.py
  • services/email/src/poller.py
  • services/email/src/routers/connections.py
  • services/email/src/routers/emails.py
  • services/email/src/state.py
  • services/email/tests/test_auth.py
  • services/email/tests/test_connections.py
  • services/email/tests/test_migrate.py
  • services/email/tests/test_poller.py
  • services/gateway/pom.xml
  • services/gateway/src/main/java/com/jobready/gateway/GatewayApplication.java
  • services/gateway/src/main/java/com/jobready/gateway/config/HttpClientConfig.java
  • services/gateway/src/main/java/com/jobready/gateway/security/CookieToBearerFilter.java
  • services/gateway/src/main/java/com/jobready/gateway/security/SecurityConfig.java
  • services/gateway/src/main/resources/application.properties
  • services/gateway/src/test/java/com/jobready/gateway/GatewayApplicationTests.java
  • services/genai/pyproject.toml
  • services/genai/ruff.toml
  • services/genai/src/auth.py
  • services/genai/src/config.py
  • services/genai/src/db/pool.py
  • services/genai/src/llm/client.py
  • services/genai/src/models/schemas.py
  • services/genai/src/observability.py
  • services/genai/src/prompts/career_assistant/__init__.py
  • services/genai/src/prompts/career_assistant/system/commands.py
  • services/genai/src/prompts/summarization.py
  • services/genai/src/routers/chat.py
  • services/genai/src/services/chat/chain.py
  • services/genai/src/services/chat/session.py
  • services/genai/src/services/chat/utils/history.py
  • services/genai/src/services/chat/utils/summarizer.py
  • services/genai/src/services/profile_client.py
  • services/genai/src/tools/documents.py
  • services/genai/tests/test_document_client.py
  • web-client/.dockerignore
  • web-client/.prettierignore
  • web-client/.prettierrc
  • web-client/eslint.config.js
  • web-client/package.json
  • web-client/src/App.tsx
  • web-client/src/api/errors.ts
  • web-client/src/api/schemas.ts
  • web-client/src/components/chat/ChatInput.tsx
  • web-client/src/components/chat/MessageBubble.tsx
  • web-client/src/components/chat/SessionList.tsx
  • web-client/src/components/layout/AppShell.tsx
  • web-client/src/components/routing/ProtectedRoute.tsx
  • web-client/src/components/routing/PublicOnlyRoute.tsx
  • web-client/src/components/routing/Splash.tsx
  • web-client/src/components/ui/Button.tsx
  • web-client/src/components/ui/Card.tsx
  • web-client/src/components/ui/ErrorBanner.tsx
  • web-client/src/components/ui/Field.tsx
  • web-client/src/components/ui/StatusDot.tsx
  • web-client/src/components/ui/Tag.tsx
  • web-client/src/components/ui/index.ts
  • web-client/src/index.css
  • web-client/src/main.tsx
  • web-client/src/pages/ApplicationsPage.tsx
  • web-client/src/pages/AuthPage.tsx
  • web-client/src/pages/ChatPage.tsx
  • web-client/src/pages/DashboardPage.tsx
  • web-client/src/pages/JobsPage.tsx
  • web-client/src/pages/ProfilePage.tsx
  • web-client/src/pages/onboarding/OnboardingWizard.tsx
  • web-client/src/services/README.md
  • web-client/src/services/apiClient.ts
  • web-client/src/services/applications/applicationsApi.ts
  • web-client/src/services/applications/stages.ts
  • web-client/src/services/auth/authSlice.ts
  • web-client/src/services/chat/chatApi.ts
  • web-client/src/services/documents/documentsApi.ts
  • web-client/src/services/profile/profileApi.ts
  • web-client/src/services/session.ts
  • web-client/src/store/hooks.ts
  • web-client/src/store/index.ts
  • web-client/vite.config.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Review on demand using usage pricing
📝 Walkthrough

Walkthrough

Adds a reusable Ansible deployment action, updates development and production deployment workflows to use it, and consolidates component-specific CI checks into one path-aware workflow with an aggregate status gate.

Changes

Ansible deployment workflow

Layer / File(s) Summary
Reusable Ansible deployment action
.github/actions/ansible-deploy/action.yml
Defines Ansible installation, collection setup, optional bootstrap and deployment playbooks, smoke checks, and deployment summaries.
Development deployment integration
.github/workflows/cd-dev.yml
Adds job-level Azure OIDC variables, validates cluster status before startup, computes the image tag, and invokes the reusable deployment action.
Production deployment integration
.github/workflows/cd-prod.yml
Requires an explicit image tag, normalizes it, and delegates deployment to the reusable action.

Consolidated component CI

Layer / File(s) Summary
Change detection and workflow routing
.github/workflows/ci.yml
Adds push and pull-request triggers, concurrency, path filtering, and component job outputs.
Component validation jobs
.github/workflows/ci.yml
Runs conditional Java, email, GenAI, web-client, and OpenAPI checks using their respective toolchains.
Aggregate CI result
.github/workflows/ci.yml
Adds a required gate that fails when required jobs fail or are cancelled.
Removed component workflows
.github/workflows/ci-*.yml
Removes the previous standalone component CI workflow definitions.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant GitHub
  participant ChangesJob
  participant ComponentJobs
  participant CIOK
  GitHub->>ChangesJob: detect changed components
  ChangesJob->>ComponentJobs: enable matching validation jobs
  ComponentJobs->>CIOK: report job results
  CIOK->>GitHub: publish aggregate CI status
Loading

Possibly related PRs

Suggested labels: infra

Suggested reviewers: georges-nasrallah

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description is just the template skeleton; it lacks concrete summary, motivation, changes, testing steps, and linked issue number. Fill in the template with a brief summary, issue link, motivation, key changes, verification steps, and any relevant checklist items.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and clearly references the main change: cleanup of the CI/CD pipeline.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch PROJ-I04-7/clean-up-cicd-pipeline

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (4)
.github/workflows/ci.yml (3)

156-160: 🚀 Performance & Scalability | 🔵 Trivial | 💤 Low value

Enable caching for Python dependencies.

Consider using the built-in caching for pip in actions/setup-python to speed up the installation step for the email service.

♻️ Proposed refactor
       - name: Set up Python 3.12
         uses: actions/setup-python@v6
         with:
           python-version: "3.12"
+          cache: 'pip'
+          cache-dependency-path: 'services/email/requirements.txt'
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml around lines 156 - 160, Update the “Set up Python
3.12” actions/setup-python step to enable its built-in pip dependency caching by
configuring the cache option, while preserving the existing Python version and
setup behavior.

122-134: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Simplify Maven caching.

You can leverage the built-in caching provided by actions/setup-java, which automatically handles the ~/.m2/repository caching based on pom.xml files. This removes the need for a separate actions/cache step.

♻️ Proposed refactor
       - name: Set up Java 21
         uses: actions/setup-java@v5
         with:
           java-version: 21
           distribution: temurin
+          cache: maven
-
-      - name: Cache Maven repository
-        uses: actions/cache@v6
-        with:
-          path: ~/.m2/repository
-          key: maven-${{ hashFiles(format('services/{0}/pom.xml', matrix.service)) }}
-          restore-keys: maven-
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml around lines 122 - 134, Remove the separate “Cache
Maven repository” actions/cache step and configure the existing “Set up Java 21”
actions/setup-java step to enable Maven dependency caching via its built-in
cache option. Preserve the current Java version and Temurin distribution
settings.

17-20: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Avoid cancelling CI runs on the main branch.

Currently, cancel-in-progress: true will cancel running CI jobs on the main branch if a newer commit is pushed. While this is desirable for pull requests, cancelling jobs on main may result in missed deployments or missing status checks for intermediate commits.

Consider conditionally disabling cancellation for pushes to the default branch.

♻️ Proposed refactor
 concurrency:
   group: ci-${{ github.event.pull_request.number || github.ref }}
-  cancel-in-progress: true
+  cancel-in-progress: ${{ github.event_name == 'pull_request' }}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml around lines 17 - 20, Update the workflow
concurrency configuration so cancel-in-progress remains enabled for pull request
runs but is disabled for pushes to the main/default branch. Preserve the
existing concurrency group behavior and use the workflow’s GitHub event/ref
context to distinguish pull requests from default-branch pushes.
.github/actions/ansible-deploy/action.yml (1)

47-53: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Pin the kubernetes pip package too.

The comment explains ansible-core is pinned so a "deploy never breaks because pip resolved a different ansible-core that morning" — the same risk applies to the unpinned kubernetes package, which the kubernetes.core collection depends on.

♻️ Pin kubernetes package
-        pip install 'ansible-core==2.17.*' kubernetes
+        pip install 'ansible-core==2.17.*' 'kubernetes==31.*'
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/actions/ansible-deploy/action.yml around lines 47 - 53, Update the
“Install Ansible + collections” step so the pip-installed kubernetes package is
pinned to an intentional compatible version, alongside the existing ansible-core
constraint. Preserve the collection installation command and extend the nearby
comment to indicate that both dependency versions must be deliberately bumped.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/actions/ansible-deploy/action.yml:
- Around line 63-117: The reusable action still interpolates dynamic inputs
directly into shell scripts. In .github/actions/ansible-deploy/action.yml lines
63-117, add step-level env mappings for the listed vault, inventory, deployment,
URL, and extra-argument inputs, then reference those variables with shell-safe
quoting in the Bootstrap platform, Deploy app, Smoke check, and Write deploy
summary steps. In .github/workflows/cd-dev.yml lines 96-107, apply the same
pattern in Compute image tag by mapping github.event.workflow_run.head_sha and
inputs.image_tag to env variables and referencing them as shell variables; use
cd-prod.yml’s Normalize image tag step as the pattern.

In @.github/workflows/ci.yml:
- Around line 47-74: Update the paths-filter definitions in the filters block to
avoid list-item anchor references that create nested arrays. Remove the shared
anchor usage and repeat api/openapi.yaml and .github/workflows/ci.yml as flat
entries in each affected filter, preserving each service-specific path and the
existing openapi filter.

---

Nitpick comments:
In @.github/actions/ansible-deploy/action.yml:
- Around line 47-53: Update the “Install Ansible + collections” step so the
pip-installed kubernetes package is pinned to an intentional compatible version,
alongside the existing ansible-core constraint. Preserve the collection
installation command and extend the nearby comment to indicate that both
dependency versions must be deliberately bumped.

In @.github/workflows/ci.yml:
- Around line 156-160: Update the “Set up Python 3.12” actions/setup-python step
to enable its built-in pip dependency caching by configuring the cache option,
while preserving the existing Python version and setup behavior.
- Around line 122-134: Remove the separate “Cache Maven repository”
actions/cache step and configure the existing “Set up Java 21”
actions/setup-java step to enable Maven dependency caching via its built-in
cache option. Preserve the current Java version and Temurin distribution
settings.
- Around line 17-20: Update the workflow concurrency configuration so
cancel-in-progress remains enabled for pull request runs but is disabled for
pushes to the main/default branch. Preserve the existing concurrency group
behavior and use the workflow’s GitHub event/ref context to distinguish pull
requests from default-branch pushes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 8a0c3af9-da23-477b-82f2-27b7a86b1316

📥 Commits

Reviewing files that changed from the base of the PR and between b681bdd and fc610ff.

📒 Files selected for processing (12)
  • .github/actions/ansible-deploy/action.yml
  • .github/workflows/cd-dev.yml
  • .github/workflows/cd-prod.yml
  • .github/workflows/ci-application.yml
  • .github/workflows/ci-auth.yml
  • .github/workflows/ci-document.yml
  • .github/workflows/ci-email.yml
  • .github/workflows/ci-gateway.yml
  • .github/workflows/ci-genai.yml
  • .github/workflows/ci-openapi.yml
  • .github/workflows/ci-web-client.yml
  • .github/workflows/ci.yml
💤 Files with no reviewable changes (8)
  • .github/workflows/ci-gateway.yml
  • .github/workflows/ci-email.yml
  • .github/workflows/ci-application.yml
  • .github/workflows/ci-web-client.yml
  • .github/workflows/ci-genai.yml
  • .github/workflows/ci-auth.yml
  • .github/workflows/ci-document.yml
  • .github/workflows/ci-openapi.yml

Comment thread .github/actions/ansible-deploy/action.yml
Comment thread .github/workflows/ci.yml
Chain the pipeline CI -> build-images (workflow_run, success only) ->
cd-dev, so a red main can never publish or deploy images. Pin checkout
and sha- tags to the CI run's head_sha to survive rapid merges.

Drop the v* tag trigger from build-images: a git tag can point at any
commit, so tag-triggered builds bypassed the CI gate. Releases now
promote via crane copy in cd-prod (sha-<short> -> semver), so prod
ships the exact bytes dev ran and deploy structurally waits on the
tags existing (needs: promote-images) instead of relying on approval
timing.
Spotless (palantir-java-format) + slim shared Checkstyle for the four
Spring services, a repo-root ruff.toml both Python services extend,
mypy (permissive baseline) for genai/email, and Prettier plus the
missing eslint.config.js for web-client (npm run lint errored since
ESLint 9 with no flat config). Generated OpenAPI code is excluded in
each tool's own config so every entry point agrees.
Mechanical palantir-java-format run — no manual edits. SHA recorded
in .git-blame-ignore-revs at the end of this branch.
Mechanical ruff format run — no manual edits. SHA recorded in
.git-blame-ignore-revs at the end of this branch.
email previously ran ruff defaults; the shared root config adds
B/UP/SIM. Mostly auto-fixes (datetime.UTC alias, contextlib.suppress).
The fastapi.Depends B008 whitelist moves from genai's config to the
root — it is a FastAPI idiom, not a genai quirk.
Test classes deliberately use the method_scenario_expectation
underscore convention; Checkstyle's MethodName now skips src/test.
Mechanical prettier --write run — no manual edits. SHA recorded in
.git-blame-ignore-revs at the end of this branch.
Permissive-baseline mypy (now part of CI) surfaced real gaps: unguarded
fetchone()/pool access, a get_messages signature that hid its None
return, SecretStr coercion for langchain api keys, and an untyped
trace_config that every ainvoke call site tripped over.
Local repo hooks call the same project entry points CI runs (uv-pinned
ruff, web-client npm scripts) so tool versions stay single-sourced.
Java tooling and mypy stay CI-only — too slow for commit time. hadolint
is CI-only too: its pre-commit hook needs docker on every dev machine.
Python jobs gain ruff format --check + mypy; web-client gains eslint +
prettier --check (lint existed as a script but never ran in CI — and was
broken locally, see eslint.config.js commit). Java needs no new steps:
Spotless and Checkstyle are bound into mvnw verify. New path-filtered
infra-lint job lints workflows (actionlint via the pre-commit hook, so
the pin lives once) and Dockerfiles (hadolint).
One-time trailing-whitespace/end-of-file sweep so hooks don't trip on
pre-existing files. The fixer hooks now exclude OpenAPI codegen output
— fixing it up would make it drift from what codegen produces.
Go template syntax is not valid YAML; helm lint owns those files.
.oauth2ResourceServer(oauth2 -> oauth2
.bearerTokenResolver(cookieOrHeaderTokenResolver())
.jwt(Customizer.withDefaults()));
http.csrf(csrf -> csrf.disable())

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will address in a later ticket

.oauth2ResourceServer(oauth2 -> oauth2
.bearerTokenResolver(cookieOrHeaderTokenResolver())
.jwt(Customizer.withDefaults()));
http.csrf(csrf -> csrf.disable())
.oauth2ResourceServer(oauth2 -> oauth2
.bearerTokenResolver(cookieOrHeaderTokenResolver())
.jwt(Customizer.withDefaults()));
http.csrf(csrf -> csrf.disable())
.with(jwt().jwt(j -> j.subject(userId.toString())))
.contentType("application/json")
.content("{\"company\":\"\",\"job_title\":\"Engineer\"}"))
.andExpect(status().isUnprocessableEntity())
@giang-h-vu giang-h-vu self-assigned this Jul 16, 2026

@georges-nasrallah georges-nasrallah left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Check

@giang-h-vu
giang-h-vu merged commit 7a5e439 into main Jul 16, 2026
15 of 16 checks passed
@giang-h-vu
giang-h-vu deleted the PROJ-I04-7/clean-up-cicd-pipeline branch July 16, 2026 19:14
georges-nasrallah added a commit that referenced this pull request Jul 16, 2026
…eneration

Resolve conflicts from the repo-wide formatter rollout (#133).

The genai conflicts were semantic, not cosmetic:
- chat.py/summarizer: keep SUMMARY_EVERY and HISTORY_WINDOW as separate
  constants; main still conflated compression cadence with the replay window.
- chain.py: keep the four-argument system prompt — main's two-argument call
  would KeyError against the merged prompt's placeholders.
- session.py: keep is_first_user_session removed; the profile is now injected
  every turn, so the first-session check is dead code.
- DocumentServiceImplTest: application_id is optional in the spec, so the
  generated DTO has no three-argument constructor.

web-client conflicts were formatter-only; resolved to this branch's logic and
reformatted with the newly adopted Prettier config.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants