Skip to content

[#1571] Split CircleCI config into multiple files.#2105

Open
AlexSkrypnyk wants to merge 1 commit intomainfrom
feature/1571-split-circleci-config
Open

[#1571] Split CircleCI config into multiple files.#2105
AlexSkrypnyk wants to merge 1 commit intomainfrom
feature/1571-split-circleci-config

Conversation

@AlexSkrypnyk
Copy link
Member

@AlexSkrypnyk AlexSkrypnyk commented Nov 17, 2025

Closes #1571

Summary by CodeRabbit

  • New Features
    • Dedicated post‑build CI test flow and a verification check to validate CI configuration.
  • Chores
    • Major CI pipeline overhaul: updated caching, images, tooling steps, migration handling, and artifact/test publishing.
    • Added CI config generator, lint/check scripts, and CI lint/lint‑fix commands.
  • Removed
    • Removed legacy CI configuration and legacy dependency update jobs.

@coderabbitai
Copy link

coderabbitai bot commented Nov 17, 2025

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Splits the monolithic CircleCI config into multiple files, adds a new vortex-dev-test-ci-postbuild job and migration-aware steps, introduces generated shared CI (vortex-test-common.yml), removes legacy Renovate jobs, and adds CI generator/lint tooling while updating installer detection/cleanup and tests to target the new files.

Changes

Cohort / File(s) Summary
Primary CircleCI split & new job
.circleci/build-test-deploy.yml
Introduces profile/provision gating, vortex-dev-test-ci-postbuild job, migration DB download/copy steps, versioned DB image/cache keys, and many TOOL_ steps and deployment boundaries.
Shared test/common CI
.circleci/vortex-test-common.yml
New shared config with runner anchors, remote-docker setup, codebase processing, cache strategies, DB/build/test jobs, variant overrides, tool/lint steps, and artifact/test-result handling.
Renovate / update-dependencies
.circleci/update-dependencies.yml, (removed) .circleci/config.yml
Adds standalone Renovate job file with scheduled/manual workflows; removes legacy update-dependencies and update-dependencies-manual jobs and deletes the monolithic .circleci/config.yml.
CI generator & lint
.vortex/tests/generate-vortex-dev-circleci, .vortex/tests/lint.ci.sh
Adds PHP generator to produce vortex-test-common.yml from build-test-deploy.yml, plus a lint script supporting --check/--fix for CI validation.
CI lint config & tooling
.vortex/.ahoy.yml, .github/workflows/vortex-test-common.yml, .vortex/tests/phpcs.xml, .vortex/tests/phpstan.neon
Adds lint-ci/lint-ci-fix commands, invokes ./tests/lint.ci.sh in CI lint step, and updates PHPCS/PHPStan entries to include the generator.
Installer cleanup & CI detection
.vortex/installer/src/Prompts/Handlers/DependencyUpdatesProvider.php, .vortex/installer/src/Prompts/Handlers/Internal.php, .vortex/installer/src/Prompts/Handlers/CiProvider.php
Extends installer to remove .circleci/update-dependencies.yml and generated vortex-*.yml files; broadens CircleCI detection to consider build-test-deploy.yml.
Tests & test infra updates
.vortex/tests/*, tests/phpunit/CircleCiConfigTest.php
Updates tests/traits to reference .circleci/build-test-deploy.yml; adds generator, lint script, PHPCS/phpstan entries, and CLAUDE.md command examples.
Docs
.circleci/README.md, .vortex/tests/CLAUDE.md
Removes one README line and adds installer/test command examples to CLAUDE.md.

Sequence Diagram(s)

sequenceDiagram
    participant Dev as Developer
    participant CircleCI as CircleCI
    participant Docker as RemoteDocker
    participant DB as MigrationDB
    participant Test as TestRunner
    participant Art as ArtifactStore

    Dev->>CircleCI: push/PR triggers workflows (commit → build → vortex-dev-test-ci-postbuild)
    CircleCI->>Docker: setup remote docker & pull VORTEX_DB_IMAGE_BASE (26.1.0)
    CircleCI->>DB: optional VORTEX_DOWNLOAD_DB2 -> download migration DB artifact
    Docker->>CircleCI: container ready
    CircleCI->>Test: run dotenv, ahoy, install deps, run PHPUnit/Behat
    Test->>Art: upload test results & artifacts
    CircleCI->>Dev: record job status and artifact metadata
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested labels

Requires more work

Poem

🐇
I nibbled configs, split them tidy and neat,
Seeded tests and DBs so pipelines can meet.
A generator hums, a linting hop and tune,
Artifacts bundled — builds will run soon!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: splitting CircleCI configuration into multiple files, which aligns with the primary objective of the PR.
Linked Issues check ✅ Passed The PR successfully implements the objective from issue #1571 by splitting the CircleCI config from a single config.yml into multiple files (build-test-deploy.yml, update-dependencies.yml, vortex-test-common.yml).
Out of Scope Changes check ✅ Passed Changes include supporting modifications to lint configuration, test files, installer handlers, and CI detection logic that are all necessary to support the split CircleCI configuration strategy.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/1571-split-circleci-config

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

@github-actions github-actions bot temporarily deployed to commit November 17, 2025 09:49 Inactive
@codecov
Copy link

codecov bot commented Nov 17, 2025

Codecov Report

❌ Patch coverage is 77.77778% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 78.35%. Comparing base (d318285) to head (42730f3).

Files with missing lines Patch % Lines
...vortex/installer/src/Prompts/Handlers/Internal.php 50.00% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2105      +/-   ##
==========================================
- Coverage   78.87%   78.35%   -0.53%     
==========================================
  Files         124      117       -7     
  Lines        6482     6330     -152     
  Branches       44        0      -44     
==========================================
- Hits         5113     4960     -153     
- Misses       1369     1370       +1     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 15

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9da0ba0 and 0996b16.

📒 Files selected for processing (12)
  • .circleci/README.md (1 hunks)
  • .circleci/SHARED_COMPONENTS.md (1 hunks)
  • .circleci/TESTING.md (1 hunks)
  • .circleci/WORKFLOW_MAPPING.md (1 hunks)
  • .circleci/build-test-deploy.yml (6 hunks)
  • .circleci/database-nightly.yml (1 hunks)
  • .circleci/update-dependencies.yml (1 hunks)
  • .circleci/vortex-test-didi-fi.yml (1 hunks)
  • .circleci/vortex-test-didi-ii.yml (1 hunks)
  • .circleci/vortex-test-postbuild.yml (1 hunks)
  • IMPLEMENTATION_SUMMARY.md (1 hunks)
  • plan.md (1 hunks)
🧰 Additional context used
🪛 LanguageTool
IMPLEMENTATION_SUMMARY.md

[uncategorized] ~42-~42: The official name of this software platform is spelled with a capital “H”.
Context: ...icate purpose - Consistent: Matches .github/workflows/ naming patterns - **Prefixe...

(GITHUB)

plan.md

[style] ~11-~11: ‘mixed together’ might be wordy. Consider a shorter alternative.
Context: ... all jobs, workflows, and configuration mixed together - Difficult to navigate and maintain - ...

(EN_WORDINESS_PREMIUM_MIXED_TOGETHER)


[uncategorized] ~51-~51: The official name of this software platform is spelled with a capital “H”.
Context: ...creation GitHub Actions Equivalent: .github/workflows/build-test-deploy.yml **Work...

(GITHUB)


[uncategorized] ~89-~89: The official name of this software platform is spelled with a capital “H”.
Context: ...arameter GitHub Actions Equivalent: .github/workflows/update-dependencies.yml **Wo...

(GITHUB)


[uncategorized] ~117-~117: The official name of this software platform is spelled with a capital “H”.
Context: ...Note:* Follows same naming pattern as .github/workflows/vortex-test-*.yml files. --...

(GITHUB)

.circleci/README.md

[uncategorized] ~300-~300: The official name of this software platform is spelled with a capital “H”.
Context: ...e.com - GitHub Actions (reference): .github/workflows/ directory --- ## Maintena...

(GITHUB)

🪛 markdownlint-cli2 (0.18.1)
.circleci/TESTING.md

19-19: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


26-26: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


33-33: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


43-43: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


49-49: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


55-55: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


65-65: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


93-93: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


104-104: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


118-118: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


131-131: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


141-141: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


148-148: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


160-160: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


177-177: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


196-196: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


202-202: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


208-208: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


213-213: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


231-231: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


235-235: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


239-239: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


243-243: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


247-247: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


259-259: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


263-263: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


267-267: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


271-271: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


331-331: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

.circleci/SHARED_COMPONENTS.md

7-7: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


11-11: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


15-15: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


18-18: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


22-22: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


26-26: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


30-30: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


39-39: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


44-44: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


49-49: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


54-54: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


58-58: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


62-62: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


68-68: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


74-74: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


83-83: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


92-92: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


97-97: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


104-104: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


112-112: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

IMPLEMENTATION_SUMMARY.md

39-39: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


45-45: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


51-51: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


60-60: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


66-66: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


72-72: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


78-78: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


88-88: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


96-96: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

.circleci/WORKFLOW_MAPPING.md

7-7: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


16-16: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


22-22: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


28-28: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


33-33: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


38-38: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


45-45: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


50-50: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


55-55: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


60-60: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


66-66: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


71-71: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

plan.md

27-27: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


48-48: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


67-67: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


84-84: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


87-87: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


88-88: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


104-104: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


121-121: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


137-137: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


153-153: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


168-168: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


179-179: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


197-197: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


245-245: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


273-273: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


289-289: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


307-307: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


312-312: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


317-317: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


322-322: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


329-329: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


336-336: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


343-343: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


350-350: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


357-357: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

.circleci/README.md

13-13: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


34-34: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


51-51: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


78-78: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


95-95: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


112-112: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


193-193: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


297-297: Bare URL used

(MD034, no-bare-urls)


298-298: Bare URL used

(MD034, no-bare-urls)


299-299: Bare URL used

(MD034, no-bare-urls)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (10)
  • GitHub Check: build (0)
  • GitHub Check: build (1)
  • GitHub Check: vortex-test-workflow (2)
  • GitHub Check: vortex-test-workflow (4)
  • GitHub Check: vortex-test-workflow (1)
  • GitHub Check: vortex-test-workflow (3)
  • GitHub Check: vortex-test-workflow (0)
  • GitHub Check: vortex-test-common
  • GitHub Check: vortex-test-installer (8.3)
  • GitHub Check: vortex-test-installer (8.4)
🔇 Additional comments (11)
.circleci/build-test-deploy.yml (2)

185-185: Verify workflow and job naming consistency.

Job names have been simplified in the workflows section (e.g., build-test-deploy workflow at line 447), but the original job names are preserved. Confirm this naming matches the intended refactor and documentation.

Line 447 shows workflow named build-test-deploy which matches the plan.md naming. Verify this is the intended name per the multi-file strategy.

Also applies to: 382-382, 417-417


41-41: Verify CI runner and cache version strings are current by checking Docker Hub and GitHub releases.

The version 25.10.0 (October 2025) is consistently pinned across your infrastructure—including in docker-compose.yml for mysql, valkey, and docker-wait-for-dependencies services. However, I cannot definitively confirm that drevops/ci-runner:25.10.0 and the v25.10.0-db11- cache keys are actual released versions.

To verify these versions are available and maintained:

  • Check Docker Hub for drevops/ci-runner:25.10.0 release
  • Check drevops/ci-runner GitHub releases to confirm version 25.10.0 exists
  • Confirm the -db11- cache suffix aligns with your database versioning strategy (likely MariaDB 11.x)
.circleci/README.md (1)

300-300: Capitalize "GitHub" correctly per branding guidelines.

Line 300 references "Github Actions" but the official branding is "GitHub".

- - **GitHub Actions (reference):** `.github/workflows/` directory
+ - **GitHub Actions (reference):** `.github/workflows/` directory

Likely an incorrect or invalid review comment.

.circleci/vortex-test-didi-ii.yml (3)

246-250: Workflow dependency chain is correct.

The workflow vortex-test-didi-ii correctly establishes that vortex-test-didi-build-ii depends on vortex-test-didi-database-ii, ensuring the database is prepared before the build test executes. This sequential dependency is semantically sound.


213-237: No issues found—cache branch configuration is correct.

Verification confirms both jobs in vortex-test-didi-ii.yml consistently define VORTEX_CI_DB_CACHE_BRANCH: vortex-dev-didi-ii, and this value is unique to the file with no conflicts against other configuration files (e.g., vortex-test-didi-fi.yml uses vortex-dev-didi-fi). Cache isolation is properly maintained.


119-126: No action required—cache key format is consistent across all sibling configuration files.

Verification confirms the cache key formats in vortex-test-didi-ii.yml match exactly across sibling files (build-test-deploy.yml, database-nightly.yml, vortex-test-didi-fi.yml). The distinction between db_cache_fallback in restore operations and db_cache_fallback_yes in save operations is intentional and consistently applied across all configuration files, indicating a deliberate cache strategy design.

IMPLEMENTATION_SUMMARY.md (1)

42-42: Capitalize "GitHub" consistently.

Line 42 references .github/workflows/ but the capitalization of "GitHub" in nearby text should be consistent. Change ".github/workflows/" context comment to use proper "GitHub" capitalization if part of a sentence or heading.

The reference to .github/workflows/ is correct as a path/directory name. No change needed here—this is a false positive from the static analysis tool. The linter flagged this as "uncategorized" because .github/ is a literal path, not a reference to the GitHub service/company. Disregard this hint.

.circleci/vortex-test-didi-fi.yml (2)

227-227: Tags are already unique across variants; no action required.

Verification confirms the FI and II variants use distinct, clearly distinguishable tags (vortex-dev-didi-database-fi vs. vortex-dev-database-ii) appended to the shared base image. These tags are sufficiently unique to prevent cache conflicts and accidental overwrites across pipeline runs.


213-249: No issues found. The VORTEX_DB_DOWNLOAD_SOURCE distinction between FI and II variants is intentional and correct.

Verification confirms:

  • FI variant correctly uses url for file-based database downloads (line 216)
  • II variant correctly uses VORTEX_CONTAINER_REGISTRY for container image downloads (line 216)
  • Both configurations are properly differentiated and architecturally appropriate
  • Comments in the FI file (lines 218-226) explain the design rationale

The code is correctly configured for its intended workflow.

.circleci/database-nightly.yml (2)

176-186: Override is intentional and correctly implemented.

The cache fallback logic works as designed: when VORTEX_CI_DB_CACHE_FALLBACK is set to "no", the bash expansion ${VORTEX_CI_DB_CACHE_FALLBACK/no/${CIRCLE_BUILD_NUM}} substitutes a unique build number into /tmp/db_cache_fallback, making cache keys unique per build and forcing a fresh cache build. When set to "yes" (base value), it remains constant, allowing cache restoration. The restore_cache keys correctly use this file's checksum, ensuring the cache invalidation logic functions properly without breaking the build.


182-182: Verify MariaDB image version 25.3.0 currency with drevops maintainers.

Confirmed findings:

  • CI runner version is synchronized at 25.10.0 across all 5 CircleCI config files ✓
  • MariaDB version 25.3.0 is pinned in database-nightly.yml:182 and consistent (only one occurrence)
  • Version mismatch exists: 25.10.0 (ci-runner) vs 25.3.0 (mariadb-drupal-data)

Cannot confirm via web search whether 25.3.0 is current or outdated for the custom drevops/mariadb-drupal-data image. Manually verify:

  • If version 25.10.0 exists for the MariaDB image
  • Whether the 25.3.0 pin is intentional or requires update for compatibility

Comment on lines +195 to +203
database-nightly:
triggers:
- schedule:
cron: *nightly_db_schedule
filters:
branches:
only:
- develop
jobs:
Copy link

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Verify cron schedule syntax and UTC timezone awareness.

The nightly database workflow uses cron schedule "0 18 * * *" (6 PM UTC daily on develop branch). Ensure that stakeholders are aware this runs in UTC and may execute at unexpected local times depending on timezone. Consider documenting the expected execution time in project documentation or CircleCI settings.

If the current schedule does not align with team expectations, adjust the hour value in the cron expression. For reference, common values: 0 2 * * * (2 AM UTC), 0 18 * * * (6 PM UTC), 0 22 * * * (10 PM UTC).

🤖 Prompt for AI Agents
In .circleci/database-nightly.yml around lines 195 to 203 the scheduled cron "0
18 * * *" is set for UTC (runs 18:00 UTC daily on develop) which may not match
team local expectations; verify the cron syntax and timezone with stakeholders,
either adjust the hour field to the correct UTC time that maps to the intended
local run time or document the UTC execution time near this job (or in project
docs/CircleCI settings) so everyone is aware of when it will run.

Comment on lines +13 to +217
#### 1. `build-test-deploy.yml`
**Pipeline Name:** `Database, Build, Test and Deploy`

**Purpose:** Core build, test, and deployment workflow for the project.

**Triggers:**
- Push to any branch
- Push to any tag

**Jobs:**
- `database` - Download and cache database
- `build` - Build stack, lint code, run tests
- `deploy` - Deploy to specific branches
- `deploy-tags` - Deploy tagged releases

**Conditionals:**
- `database` job: Conditional on `!PROVISION_TYPE_PROFILE`
- `deploy` and `deploy-tags` jobs: Conditional on `DEPLOYMENT`

---

#### 2. `database-nightly.yml`
**Pipeline Name:** `Database - Nightly refresh`

**Purpose:** Overnight database refresh and caching for next-day builds.

**Triggers:**
- Schedule: `0 18 * * *` (6 PM UTC daily)
- Branch: `develop` only

**Jobs:**
- `database-nightly` - Fresh database download and cache

**Conditionals:**
- Entire file: Conditional on `!PROVISION_TYPE_PROFILE`

---

#### 3. `update-dependencies.yml`
**Pipeline Name:** `Update dependencies`

**Purpose:** Self-hosted Renovate for automated dependency updates.

**Triggers:**
- Schedule: `5 11,23 * * *` (11:05 AM and 11:05 PM UTC daily)
- Manual: Pipeline parameter `run_update_dependencies`
- Branch: `develop` only

**Jobs:**
- `update-dependencies` - Run Renovate bot

**Requirements:**
- `RENOVATE_TOKEN` environment variable
- `RENOVATE_REPOSITORIES` environment variable
- `RENOVATE_GIT_AUTHOR` environment variable

**Conditionals:**
- Entire file: Conditional on `DEPS_UPDATE_PROVIDER_CI`

---

### Vortex Development Pipelines

These pipelines are used for Vortex framework testing and will be removed during project installation.

#### 4. `vortex-test-postbuild.yml`
**Pipeline Name:** `Vortex - Test (Post-build)`

**Purpose:** Vortex framework validation after main build.

**Triggers:**
- Push to any branch
- Push to any tag

**Jobs:**
- `vortex-test-postbuild` - Run Vortex post-build tests

**Conditionals:**
- Entire file: Conditional on `VORTEX_DEV`

---

#### 5. `vortex-test-didi-fi.yml`
**Pipeline Name:** `Vortex - Test (DIDI from file)`

**Purpose:** Test database-in-image workflow with file source.

**Triggers:**
- Push to any branch (implicit)

**Jobs:**
- `vortex-test-didi-database-fi` - Create DB image from file
- `vortex-test-didi-build-fi` - Build site with DIDI image

**Conditionals:**
- Entire file: Conditional on `VORTEX_DEV`

---

#### 6. `vortex-test-didi-ii.yml`
**Pipeline Name:** `Vortex - Test (DIDI from registry)`

**Purpose:** Test database-in-image workflow with registry source.

**Triggers:**
- Push to any branch (implicit)

**Jobs:**
- `vortex-test-didi-database-ii` - Create DB image from registry
- `vortex-test-didi-build-ii` - Build site with DIDI image

**Conditionals:**
- Entire file: Conditional on `VORTEX_DEV`

---

## Setting Up Pipelines in CircleCI

**Prerequisites:**
- CircleCI account connected to GitHub
- **CircleCI GitHub App integration** (required for multiple pipelines)
- Existing project configured in CircleCI

### Configuration Steps

1. **Access CircleCI UI:**
- Go to your project in CircleCI
- Navigate to **Project Settings** → **Project Setup**

2. **Create Each Pipeline:**

For each configuration file, click **Add Pipeline** and configure:

| Config File | Pipeline Name | Config Path | Trigger |
|-------------|--------------|-------------|---------|
| build-test-deploy.yml | `Database, Build, Test and Deploy` | `.circleci/build-test-deploy.yml` | Push to all branches, all tags |
| database-nightly.yml | `Database - Nightly refresh` | `.circleci/database-nightly.yml` | Schedule (`0 18 * * *` on `develop`) |
| update-dependencies.yml | `Update dependencies` | `.circleci/update-dependencies.yml` | Schedule (`5 11,23 * * *` on `develop`) + Manual |
| vortex-test-postbuild.yml | `Vortex - Test (Post-build)` | `.circleci/vortex-test-postbuild.yml` | Push to all branches, all tags |
| vortex-test-didi-fi.yml | `Vortex - Test (DIDI from file)` | `.circleci/vortex-test-didi-fi.yml` | Push to all branches |
| vortex-test-didi-ii.yml | `Vortex - Test (DIDI from registry)` | `.circleci/vortex-test-didi-ii.yml` | Push to all branches |

3. **Configure Environment Variables:**

Ensure the following project-level environment variables are set:

**Required for all pipelines:**
- `VORTEX_CONTAINER_REGISTRY_USER` - Docker registry username
- `VORTEX_CONTAINER_REGISTRY_PASS` - Docker registry password

**Required for database pipelines:**
- Add SSH key for database downloads (fingerprint in config)

**Required for deployment pipelines:**
- Add SSH key for deployments (fingerprint in config)

**Required for update-dependencies pipeline:**
- `RENOVATE_TOKEN` - GitHub access token
- `RENOVATE_REPOSITORIES` - Repository to run Renovate on
- `RENOVATE_GIT_AUTHOR` - Author for Renovate commits

### Trigger Configuration Examples

**For scheduled pipelines:**
- In CircleCI UI, select **Trigger** → **Schedule**
- Set cron expression and target branch
- Example: `0 18 * * *` on branch `develop`

**For manual triggers:**
- Use pipeline parameters in config file
- Trigger via CircleCI UI or API

**For push triggers:**
- Select **Trigger** → **GitHub event**
- Choose appropriate events (push, tag, pull request)

---

## File Organization

```
.circleci/
├── README.md # This file
├── WORKFLOW_MAPPING.md # Workflow mapping documentation
├── SHARED_COMPONENTS.md # Shared component analysis
├── build-test-deploy.yml # Main pipeline
├── database-nightly.yml # Nightly DB refresh
├── update-dependencies.yml # Dependency updates
├── vortex-test-postbuild.yml # Vortex post-build tests
├── vortex-test-didi-fi.yml # Vortex DIDI from file tests
└── vortex-test-didi-ii.yml # Vortex DIDI from registry tests
```

---

## Naming Conventions

Files follow **GitHub Actions-style naming** for consistency:

- **Kebab-case:** All lowercase with hyphens (e.g., `build-test-deploy.yml`)
- **Descriptive names:** Action-oriented naming (e.g., `update-dependencies.yml`)
- **Vortex prefix:** Development workflows prefixed with `vortex-` (e.g., `vortex-test-*.yml`)

Pipeline names in CircleCI UI also follow this convention for easy identification.

Copy link

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Fix Markdown formatting: add blank lines around headings.

Multiple headings lack required blank lines per MD022. Ensure each heading is surrounded by blank lines.

Apply blank lines around headings at lines 13, 34, 51, 78, 95, 112 and others.

🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

13-13: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


34-34: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


51-51: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


78-78: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


95-95: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


112-112: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


193-193: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
.circleci/README.md around lines 13 to 217: several Markdown headings are not
surrounded by blank lines (MD022); to fix, insert a single blank line before and
after each heading listed (lines 13, 34, 51, 78, 95, 112 and any other headings
in this range), ensuring top-level and subsection headings have an empty line
above and below so lists and paragraphs are separated from the heading; scan the
file for any additional headings in this block and apply the same change.


## File Organization

```
Copy link

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Specify language for fenced code block.

Line 193 uses a fenced code block without specifying a language identifier per MD040.

- ```
+ ```bash
  .circleci/
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

193-193: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
In .circleci/README.md around line 193, the fenced code block opener is missing
a language identifier (MD040); update the opening backticks to include the
language (e.g., change ``` to ```bash) so the block reads as a bash code block,
ensuring the language tag follows the three backticks on that line.

Comment on lines +297 to +299
- **CircleCI Multiple Pipelines:** https://circleci.com/docs/set-up-multiple-configuration-files-for-a-project/
- **CircleCI GitHub App:** https://circleci.com/docs/github-apps-integration/
- **Vortex Documentation:** https://www.vortextemplate.com
Copy link

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Wrap bare URLs in Markdown link syntax.

Lines 297-299 contain bare URLs that should be properly linked per MD034.

- - **CircleCI Multiple Pipelines:** https://circleci.com/docs/set-up-multiple-configuration-files-for-a-project/
- - **CircleCI GitHub App:** https://circleci.com/docs/github-apps-integration/
- - **Vortex Documentation:** https://www.vortextemplate.com
+ - **CircleCI Multiple Pipelines:** [https://circleci.com/docs/set-up-multiple-configuration-files-for-a-project/](https://circleci.com/docs/set-up-multiple-configuration-files-for-a-project/)
+ - **CircleCI GitHub App:** [https://circleci.com/docs/github-apps-integration/](https://circleci.com/docs/github-apps-integration/)
+ - **Vortex Documentation:** [https://www.vortextemplate.com](https://www.vortextemplate.com)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- **CircleCI Multiple Pipelines:** https://circleci.com/docs/set-up-multiple-configuration-files-for-a-project/
- **CircleCI GitHub App:** https://circleci.com/docs/github-apps-integration/
- **Vortex Documentation:** https://www.vortextemplate.com
- **CircleCI Multiple Pipelines:** [https://circleci.com/docs/set-up-multiple-configuration-files-for-a-project/](https://circleci.com/docs/set-up-multiple-configuration-files-for-a-project/)
- **CircleCI GitHub App:** [https://circleci.com/docs/github-apps-integration/](https://circleci.com/docs/github-apps-integration/)
- **Vortex Documentation:** [https://www.vortextemplate.com](https://www.vortextemplate.com)
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

297-297: Bare URL used

(MD034, no-bare-urls)


298-298: Bare URL used

(MD034, no-bare-urls)


299-299: Bare URL used

(MD034, no-bare-urls)

🤖 Prompt for AI Agents
In .circleci/README.md around lines 297 to 299, there are bare URLs that violate
MD034; replace each plain URL with proper Markdown link syntax by providing
descriptive link text followed by the URL in brackets/parentheses (e.g.,
[CircleCI Multiple
Pipelines](https://circleci.com/docs/set-up-multiple-configuration-files-for-a-project/)),
updating all three lines so none contain raw bare URLs.

Comment on lines +1 to +134
# Shared Components Across CircleCI Configs

This document identifies shared components and their usage across the split configuration files.

## Aliases (All Files Need These)

### 1. **db_ssh_fingerprint** (lines 16-20)
- **Used by:** build-test-deploy.yml, database-nightly.yml, vortex-test-didi-*.yml
- **Conditional:** !PROVISION_TYPE_PROFILE
- **Purpose:** SSH key for database downloads
```yaml
- &db_ssh_fingerprint "SHA256:6d+U5QubT0eAWz+4N2wt+WM2qx6o4cvyvQ6xILETJ84"
```

### 2. **deploy_ssh_fingerprint** (lines 22-24)
- **Used by:** build-test-deploy.yml
- **Purpose:** SSH key for deployments
```yaml
- &deploy_ssh_fingerprint "SHA256:6d+U5QubT0eAWz+4N2wt+WM2qx6o4cvyvQ6xILETJ84"
```

### 3. **nightly_db_schedule** (lines 26-29)
- **Used by:** database-nightly.yml
- **Conditional:** !PROVISION_TYPE_PROFILE
- **Purpose:** Cron schedule for nightly DB refresh
```yaml
- &nightly_db_schedule "0 18 * * *"
```

### 4. **runner_config** (lines 31-83)
- **Used by:** ALL config files (universal)
- **Purpose:** Shared runner container configuration
- **Contains:**
- working_directory alias
- Environment variables (DB cache, test results, artifacts)
- Docker image and auth
- Resource class

### 5. **test_results** anchor (line 69)
- **Used by:** build-test-deploy.yml, vortex-test-*.yml
- **Purpose:** Test results directory path
- **Embedded in:** runner_config environment

### 6. **artifacts** anchor (line 71)
- **Used by:** build-test-deploy.yml, vortex-test-*.yml
- **Purpose:** Artifacts directory path
- **Embedded in:** runner_config environment

### 7. **working_directory** anchor (line 33)
- **Used by:** ALL config files
- **Purpose:** Project working directory
- **Embedded in:** runner_config

### 8. **step_setup_remote_docker** (lines 85-91)
- **Used by:** build-test-deploy.yml, database-nightly.yml, vortex-test-*.yml
- **Purpose:** Setup remote docker with layer caching

### 9. **step_process_codebase_for_ci** (lines 93-98)
- **Used by:** build-test-deploy.yml, database-nightly.yml, vortex-test-postbuild.yml
- **Purpose:** Process docker-compose.yml for CI

### 10. **load_variables_from_dotenv** (lines 100-104)
- **Used by:** build-test-deploy.yml, database-nightly.yml, vortex-test-postbuild.yml
- **Purpose:** Load .env variables into bash environment

## Parameters

### run_update_dependencies (lines 110-113)
- **Used by:** update-dependencies.yml only
- **Purpose:** Manual trigger for dependency updates

## File-Specific Component Mapping

### build-test-deploy.yml
**Needs:**
- db_ssh_fingerprint (conditional)
- deploy_ssh_fingerprint
- runner_config (with all embedded anchors)
- step_setup_remote_docker
- step_process_codebase_for_ci
- load_variables_from_dotenv

### database-nightly.yml
**Needs:**
- db_ssh_fingerprint
- nightly_db_schedule
- runner_config (with all embedded anchors)
- step_setup_remote_docker
- step_process_codebase_for_ci
- load_variables_from_dotenv

### update-dependencies.yml
**Needs:**
- parameters: run_update_dependencies
- NO other shared components (uses different docker image)

### vortex-test-postbuild.yml
**Needs:**
- runner_config (with all embedded anchors)
- step_setup_remote_docker
- step_process_codebase_for_ci
- load_variables_from_dotenv

### vortex-test-didi-fi.yml
**Needs:**
- db_ssh_fingerprint (for database job)
- runner_config (with all embedded anchors)
- step_setup_remote_docker
- step_process_codebase_for_ci
- load_variables_from_dotenv

### vortex-test-didi-ii.yml
**Needs:**
- db_ssh_fingerprint (for database job)
- runner_config (with all embedded anchors)
- step_setup_remote_docker
- step_process_codebase_for_ci
- load_variables_from_dotenv

## Strategy

Each config file will include its own copy of required aliases. This approach:
- ✅ Maintains file independence
- ✅ No cross-file dependencies
- ✅ Each file is self-contained and complete
- ✅ Easier to understand and modify
- ⚠️ Some duplication (acceptable trade-off)

## Consistency Notes

1. All aliases must be identical across files
2. runner_config version (drevops/ci-runner:25.10.0) must match
3. Conditional markers (#;<, #;>) must be preserved in all files
4. Comments should be consistent across files
Copy link

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Fix Markdown formatting: add blank lines around headings and code blocks.

Multiple formatting issues per Markdown best practices:

  • MD022: Many headings lack surrounding blank lines (lines 7, 15, 22, 30, 39, 44, 49, 54, 58, 62, 68, 74, 83, 92, 97, 104, 112)
  • MD031: Fenced code blocks on lines 11, 18, 26 need blank lines above them

Apply blank lines before and after all headings and code blocks per Markdown formatting standards.

Example for line 11:

  `.yaml
  - &db_ssh_fingerprint "SHA256:6d+U5QubT0eAWz+4N2wt+WM2qx6o4cvyvQ6xILETJ84"

becomes:

```diff
  `.yaml

  - &db_ssh_fingerprint "SHA256:6d+U5QubT0eAWz+4N2wt+WM2qx6o4cvyvQ6xILETJ84"



> Committable suggestion skipped: line range outside the PR's diff.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.18.1)</summary>

7-7: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

---

11-11: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)

---

15-15: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

---

18-18: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)

---

22-22: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

---

26-26: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)

---

30-30: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

---

39-39: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

---

44-44: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

---

49-49: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

---

54-54: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

---

58-58: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

---

62-62: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

---

68-68: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

---

74-74: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

---

83-83: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

---

92-92: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

---

97-97: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

---

104-104: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

---

112-112: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

</details>

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

.circleci/SHARED_COMPONENTS.md around lines 1 to 134: fix Markdown spacing
violations (MD022, MD031) by inserting a single blank line before and after each
heading and before and after each fenced code block; specifically add blank
lines surrounding the headings referenced (lines 7, 15, 22, 30, 39, 44, 49, 54,
58, 62, 68, 74, 83, 92, 97, 104, 112) and ensure code blocks at lines ~11, ~18,
~26 (and any other fenced blocks) have an empty line above and below them so all
headings and fenced blocks follow Markdown best practices.


</details>

<!-- This is an auto-generated comment by CodeRabbit -->

Comment on lines +39 to +78
#### GitHub Actions-Style Naming
- **Kebab-case**: `build-test-deploy.yml`, `update-dependencies.yml`
- **Descriptive**: Names clearly indicate purpose
- **Consistent**: Matches `.github/workflows/` naming patterns
- **Prefixed**: Vortex development files use `vortex-` prefix

#### Self-Contained Files
- Each file includes all required aliases
- No cross-file dependencies
- Independent pipeline execution
- Complete workflow definitions

#### Preserved Functionality
- All conditional markers (`#;<`, `#;>`) intact
- Original job definitions preserved
- Caching behavior maintained
- Environment variable usage unchanged
- SSH key configuration preserved

## Benefits Achieved

### Maintainability
- ✅ Smaller, focused files (average ~245 lines vs. 763)
- ✅ Clear separation of concerns
- ✅ Easier to navigate and understand
- ✅ Reduced merge conflicts

### Clarity
- ✅ Purpose-driven organization
- ✅ Consumer vs. development clearly separated
- ✅ Better documentation per pipeline
- ✅ Intuitive file naming

### Flexibility
- ✅ Independent pipeline triggers
- ✅ Isolated testing workflows
- ✅ Easier to modify specific pipelines
- ✅ Better error isolation

### Consumer Experience
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

Add blank lines above subheadings per Markdown best practices (MD022).

Multiple subheadings lack preceding blank lines, reducing readability. Add a blank line before each subheading to comply with the markdownlint standard.

 ## Overview

 Successfully split the monolithic 763-line `.circleci/config.yml` into 6 focused, maintainable configuration files following GitHub Actions-style naming conventions.

 ## What Was Implemented

 ### 1. Configuration Files Created

+
 | File | Purpose | Lines | Status |

 ...

 ### 2. Documentation Created

+
 | Document | Purpose | Status |

 ...

 ### 3. Key Features

+
 #### GitHub Actions-Style Naming

+
 - **Kebab-case**: `build-test-deploy.yml`, `update-dependencies.yml`

 ...

+
 #### Self-Contained Files

+
 - Each file includes all required aliases

 ...

+
 #### Preserved Functionality

+
 - All conditional markers (`#;<`, `#;>`) intact

 ...

 ## Benefits Achieved

+
 ### Maintainability

+
 - ✅ Smaller, focused files (average ~245 lines vs. 763)

 ...

+
 ### Clarity

+
 - ✅ Purpose-driven organization

 ...

+
 ### Flexibility

+
 - ✅ Independent pipeline triggers

 ...

+
 ### Consumer Experience

+
 - ✅ Cleaner consumer projects (Vortex dev files removed)

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~42-~42: The official name of this software platform is spelled with a capital “H”.
Context: ...icate purpose - Consistent: Matches .github/workflows/ naming patterns - **Prefixe...

(GITHUB)

🪛 markdownlint-cli2 (0.18.1)

39-39: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


45-45: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


51-51: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


60-60: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


66-66: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


72-72: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


78-78: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

🤖 Prompt for AI Agents
In IMPLEMENTATION_SUMMARY.md around lines 39 to 78, several subheadings lack a
blank line above them which violates markdownlint MD022; insert a single blank
line before each subheading (lines that start with one or more #) within this
range so every heading is preceded by an empty line, ensure you don't remove
existing content or alter heading text, and keep surrounding spacing consistent
with the rest of the document.


### Main Project Pipelines (Consumer Projects)

```
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

Specify language identifier for fenced code blocks (MD040).

Code blocks at lines 88 and 96 lack language specification. Add language identifiers for syntax highlighting and clarity.

 ### Pipeline Structure

-\`\`\`
+\`\`\`text
 build-test-deploy.yml     → Push to branches/tags → Build, test, deploy

 ...

-\`\`\`

 ### Vortex Development Pipelines (Removed During Installation)

-\`\`\`
+\`\`\`text
 vortex-test-postbuild.yml → Push to branches/tags → Post-build validation

Also applies to: 96-96

🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

88-88: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
In IMPLEMENTATION_SUMMARY.md around lines 88 and 96, the fenced code blocks are
missing language identifiers (MD040); add the appropriate language tags (e.g.,
```json, ```js, ```yaml, or ```text as applicable) immediately after the opening
triple backticks for both blocks so they render with correct syntax highlighting
and satisfy the linter.

plan.md Outdated
Comment on lines +25 to +440
Split the configuration into logical, purpose-driven files using GitHub Actions-style naming conventions for consistency:

```
.circleci/
├── build-test-deploy.yml # Main pipeline (commit workflow)
├── database-nightly.yml # Nightly database refresh pipeline
├── update-dependencies.yml # Renovate/dependency updates pipeline
├── vortex-test-postbuild.yml # Vortex post-build validation tests
├── vortex-test-didi-fi.yml # Database-in-image from file tests
└── vortex-test-didi-ii.yml # Database-in-image from registry tests
```

**Naming Conventions (aligned with GitHub Actions):**
- Use kebab-case (lowercase with hyphens)
- Descriptive, action-oriented names (build-test-deploy, update-dependencies)
- Prefix Vortex development workflows with `vortex-` (e.g., `vortex-test-*`)
- Match GitHub Actions equivalents where they exist:
- `.github/workflows/build-test-deploy.yml` → `.circleci/build-test-deploy.yml`
- `.github/workflows/update-dependencies.yml` → `.circleci/update-dependencies.yml`
- `.github/workflows/vortex-test-*.yml` → `.circleci/vortex-test-*.yml`

## File Breakdown

### 1. **build-test-deploy.yml** - Main Build Pipeline
**Purpose:** Core build, test, and deployment workflow
**Trigger:** Push to any branch, tag creation
**GitHub Actions Equivalent:** `.github/workflows/build-test-deploy.yml`
**Workflow Name:** `Database, Build, Test and Deploy` (matches GHA)

**Contents:**
- Aliases (SSH fingerprints, runner config, shared steps)
- Jobs:
- `database` (conditional: !PROVISION_TYPE_PROFILE)
- `build`
- `deploy`
- `deploy-tags`
- Workflow: `build-test-deploy`

**Size:** ~470 lines

---

### 2. **database-nightly.yml** - Nightly Database Pipeline
**Purpose:** Overnight database refresh and caching
**Trigger:** Scheduled cron (`0 18 * * *`) on `develop` branch
**Workflow Name:** `Database - Nightly refresh`

**Contents:**
- Shared aliases (SSH fingerprints, runner config, db cache config)
- Jobs:
- `database-nightly`
- Workflow: `database-nightly`

**Size:** ~200 lines (includes shared aliases)

**Note:** In GitHub Actions, this is part of `build-test-deploy.yml` with a schedule trigger. CircleCI requires separate file for clarity.

---

### 3. **update-dependencies.yml** - Dependency Updates Pipeline
**Purpose:** Self-hosted Renovate for automated dependency updates
**Trigger:**
- Scheduled cron (`5 11,23 * * *`) on `develop` branch
- Manual trigger via pipeline parameter
**GitHub Actions Equivalent:** `.github/workflows/update-dependencies.yml`
**Workflow Name:** `Update dependencies` (matches GHA)

**Contents:**
- Parameters (run_update_dependencies)
- Jobs:
- `update-dependencies`
- Workflows:
- `update-dependencies-scheduled`
- `update-dependencies-manual`

**Size:** ~60 lines

---

### 4. **vortex-test-postbuild.yml** - Post-Build Tests
**Purpose:** Vortex framework validation after main build
**Trigger:** Push to any branch (runs after main pipeline)
**Workflow Name:** `Vortex - Test (Post-build)`

**Contents:**
- Shared aliases (runner config)
- Jobs:
- `vortex-test-postbuild`
- Workflow: `vortex-test-postbuild`

**Size:** ~80 lines

**Note:** Follows same naming pattern as `.github/workflows/vortex-test-*.yml` files.

---

### 5. **vortex-test-didi-fi.yml** - DIDI File-to-Image Tests
**Purpose:** Test database-in-image workflow with file source
**Trigger:** Push to any branch
**Workflow Name:** `Vortex - Test (DIDI from file)`

**Contents:**
- Shared aliases (runner config, db config)
- Jobs:
- `vortex-test-didi-database-fi` (creates image from DB file)
- `vortex-test-didi-build-fi` (builds site with DIDI image)
- Workflow: `vortex-test-didi-fi`

**Size:** ~250 lines (includes shared job definitions)

---

### 6. **vortex-test-didi-ii.yml** - DIDI Image-to-Image Tests
**Purpose:** Test database-in-image workflow with registry source
**Trigger:** Push to any branch
**Workflow Name:** `Vortex - Test (DIDI from registry)`

**Contents:**
- Shared aliases (runner config, db config)
- Jobs:
- `vortex-test-didi-database-ii` (creates image from registry)
- `vortex-test-didi-build-ii` (builds site with DIDI image)
- Workflow: `vortex-test-didi-ii`

**Size:** ~250 lines (includes shared job definitions)

## Implementation Strategy

### Phase 1: Preparation and Validation
1. **Document current behavior:**
- Map all workflows to their triggers
- Identify job dependencies across workflows
- Document environment variables per workflow

2. **Create reference documentation:**
- CircleCI pipeline configuration requirements
- Trigger event mappings for each workflow
- Variable inheritance and scoping rules

3. **Validate prerequisites:**
- Confirm CircleCI GitHub App is installed
- Verify permissions for pipeline management

### Phase 2: Extract Shared Components
1. **Identify common elements:**
- Aliases used across multiple jobs (runner_config, ssh fingerprints)
- Shared steps (setup_remote_docker, process_codebase_for_ci)
- Common parameters and environment variables

2. **Create extraction strategy:**
- Determine which aliases need duplication vs. reference
- Document which shared components belong in each file
- Plan for maintaining consistency across files

### Phase 3: Split Configuration Files
1. **Create individual config files:**
- Start with simplest workflows first (update-dependencies)
- Move to isolated workflows (nightly-db)
- Handle complex workflows last (vortex-dev tests)

2. **For each file:**
- Copy necessary CircleCI structure (`version: '2.1'`)
- Include all required shared components (aliases, steps)
- Preserve Vortex comment markers (`#;<`, `#;>`)
- Maintain conditional logic for installer
- Ensure all environment variables are accessible

3. **Handle Vortex-specific concerns:**
- Preserve installer token markers
- Maintain comment structure for template processing
- Ensure conditional includes work correctly

### Phase 4: Configure CircleCI Pipelines
1. **Access CircleCI UI:**
- Navigate to Project Settings → Project Setup

2. **Create pipelines (in order):**

**Note:** Pipeline names in CircleCI UI follow GitHub Actions style for consistency.

- **Build, Test and Deploy Pipeline**
- Name: `Database, Build, Test and Deploy`
- Config: `.circleci/build-test-deploy.yml`
- Trigger: Push to all branches, all tags
- _Matches:_ `.github/workflows/build-test-deploy.yml`

- **Nightly Database Pipeline**
- Name: `Database - Nightly refresh`
- Config: `.circleci/database-nightly.yml`
- Trigger: Schedule (`0 18 * * *` on `develop`)
- _Note:_ GHA combines this with main workflow; CircleCI separates for clarity

- **Update Dependencies Pipeline**
- Name: `Update dependencies`
- Config: `.circleci/update-dependencies.yml`
- Trigger: Schedule (`5 11,23 * * *` on `develop`) + Manual
- _Matches:_ `.github/workflows/update-dependencies.yml`

- **Vortex Post-Build Tests Pipeline**
- Name: `Vortex - Test (Post-build)`
- Config: `.circleci/vortex-test-postbuild.yml`
- Trigger: Push to all branches
- _Follows pattern:_ `.github/workflows/vortex-test-*.yml`

- **Vortex DIDI-FI Tests Pipeline**
- Name: `Vortex - Test (DIDI from file)`
- Config: `.circleci/vortex-test-didi-fi.yml`
- Trigger: Push to all branches
- _Follows pattern:_ `.github/workflows/vortex-test-*.yml`

- **Vortex DIDI-II Tests Pipeline**
- Name: `Vortex - Test (DIDI from registry)`
- Config: `.circleci/vortex-test-didi-ii.yml`
- Trigger: Push to all branches
- _Follows pattern:_ `.github/workflows/vortex-test-*.yml`

3. **Configure environment variables:**
- Ensure all pipelines inherit project-level variables
- Document any pipeline-specific variables needed

### Phase 5: Testing and Validation
1. **Create test branch:**
- Create `feature/1571-split-circleci-config` branch
- Push with split configuration

2. **Validate each pipeline:**
- **Commit workflow:** Push to test branch, verify build runs
- **Nightly DB:** Manually trigger or wait for schedule
- **Update dependencies:** Trigger manually via parameter
- **Vortex dev tests:** Verify all three DIDI workflows run

3. **Test scenarios:**
- Push to feature branch (should trigger main + vortex-dev pipelines)
- Push to `develop` (should trigger all applicable workflows)
- Create tag (should trigger deploy-tags job)
- Schedule triggers (wait for or manually trigger)

4. **Verify job dependencies:**
- Ensure `build` waits for `database` in main pipeline
- Ensure `deploy` waits for `build`
- Verify Vortex DIDI build jobs wait for database jobs

5. **Check for regressions:**
- Compare job outputs with previous runs
- Verify all tests pass
- Ensure deployments work correctly
- Validate caching behavior

### Phase 6: Documentation Updates
1. **Update project documentation:**
- `docs/ci.md` - Explain new multi-pipeline structure
- `README.md` - Update CircleCI setup instructions
- `.circleci/README.md` (create) - Document pipeline organization

2. **Document for consumer projects:**
- How installer handles multiple files
- Which files are removed/kept for consumer projects
- How to configure their own pipelines post-install

3. **Create maintenance guide:**
- How to add new workflows
- How to modify shared components
- Testing guidelines for CI changes

### Phase 7: Installer Integration
1. **Update Vortex installer:**
- Modify installer to handle multiple CircleCI files
- Ensure Vortex-dev files are removed during installation
- Preserve conditional markers and processing logic

2. **Test installer behavior:**
- Run installer with various configurations
- Verify correct files are generated for consumer projects
- Ensure conditional blocks work across all files

3. **Update installer tests:**
- Add test cases for multi-file scenarios
- Verify file generation logic
- Test Vortex-dev file removal

## Benefits

### Maintainability
- **Smaller files:** Each file focuses on single responsibility
- **Easier navigation:** Find relevant configuration quickly
- **Reduced conflicts:** Changes to different workflows don't collide

### Clarity
- **Purpose-driven organization:** File name indicates purpose
- **Separated concerns:** Consumer vs. Vortex development clearly split
- **Better documentation:** Each file documents its own trigger and purpose

### Flexibility
- **Independent triggers:** Each pipeline runs on appropriate events
- **Isolated testing:** Test workflows without affecting main pipeline
- **Easier debugging:** Identify which pipeline failed at a glance

### Consumer Experience
- **Cleaner projects:** Consumer projects don't receive Vortex-dev configs
- **Simpler customization:** Modify specific pipelines without touching others
- **Clear examples:** Each config file serves as standalone example

## Risks and Mitigation

### Risk 1: CircleCI GitHub App Requirement
**Impact:** Consumer projects must use GitHub App integration
**Mitigation:**
- Document requirement clearly in installation guide
- Provide migration guide for existing projects
- Consider maintaining single-file option as fallback (legacy mode)

### Risk 2: Increased Complexity
**Impact:** More files to manage and configure
**Mitigation:**
- Comprehensive documentation
- Clear naming conventions
- Automated validation in CI

### Risk 3: Shared Component Duplication
**Impact:** Aliases and steps may need duplication across files
**Mitigation:**
- Accept reasonable duplication for independence
- Document canonical definitions
- Use comments to track which components are shared

### Risk 4: Installer Compatibility
**Impact:** Installer must handle multiple files correctly
**Mitigation:**
- Thorough testing of installer changes
- Maintain backward compatibility during transition
- Provide migration scripts if needed

### Risk 5: Breaking Consumer Projects
**Impact:** Existing projects might break after update
**Mitigation:**
- Mark as breaking change in release notes
- Provide migration guide with manual steps
- Consider phased rollout or opt-in mechanism

## Success Criteria

1. **Functionality:**
- All workflows continue to work as before
- Job dependencies are preserved
- Caching behavior remains consistent
- Deployments succeed without changes

2. **Code Quality:**
- Each config file is under 300 lines
- Clear separation of concerns
- No duplicate job definitions (shared via references)
- Preserved Vortex template processing markers

3. **Documentation:**
- Pipeline structure documented
- Trigger events clearly explained
- Consumer migration guide available
- Maintenance guide created

4. **Testing:**
- All existing tests pass
- New pipeline-specific tests added
- Installer tests validate multi-file handling

5. **Consumer Impact:**
- Installation process documented
- Consumer projects receive only relevant configs
- Migration path for existing projects

## Open Questions

1. **Should we provide a single-file fallback for projects not using GitHub App?**
- Consider maintaining both structures
- Or require GitHub App as prerequisite

2. **How should shared aliases be handled?**
- Duplicate in each file (independence)
- Or create a shared config via CircleCI orb

3. **Should pipeline names be configurable?**
- Allow consumers to customize pipeline names
- Or enforce standard naming convention

4. **How to handle Vortex version upgrades?**
- Update all config files in sync
- Or version each file independently

5. **Should we extract orbs for common functionality?**
- Create Vortex CircleCI orb for shared commands
- Or keep everything in config files

## Timeline Estimate

- **Phase 1 (Preparation):** 2-4 hours
- **Phase 2 (Extract Shared):** 2-3 hours
- **Phase 3 (Split Files):** 4-6 hours
- **Phase 4 (Configure Pipelines):** 2-3 hours
- **Phase 5 (Testing):** 4-6 hours
- **Phase 6 (Documentation):** 3-4 hours
- **Phase 7 (Installer):** 4-6 hours

**Total Estimated Time:** 21-32 hours

## Next Steps

1. Review and approve this plan
2. Answer open questions
3. Create subtasks in GitHub issue
4. Begin Phase 1 implementation
5. Regular checkpoints after each phase

---

**Issue:** #1571
**Branch:** `feature/1571-split-circleci-config`
**Milestone:** 25.11.0
Copy link

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Fix Markdown formatting: add blank lines around headings and adjust list indentation.

Multiple formatting issues per Markdown best practices:

  • MD022: Many headings lack surrounding blank lines (lines 48, 67, 84, 104, 121, 137, 153, 168, 179, 197, 245, 273, 289, 307, 312, 317, 322, 329, 336, 343, 350, 357)
  • MD007: Lines 87-88 have incorrect list indentation (2 spaces instead of 0)

Example fix for line 87-88:

  **Trigger:**
-   - Scheduled cron (`5 11,23 * * *`) on `develop` branch
-   - Manual trigger via pipeline parameter
+  - Scheduled cron (`5 11,23 * * *`) on `develop` branch
+  - Manual trigger via pipeline parameter

Apply consistent blank lines around all headings throughout the file.

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~51-~51: The official name of this software platform is spelled with a capital “H”.
Context: ...creation GitHub Actions Equivalent: .github/workflows/build-test-deploy.yml **Work...

(GITHUB)


[uncategorized] ~89-~89: The official name of this software platform is spelled with a capital “H”.
Context: ...arameter GitHub Actions Equivalent: .github/workflows/update-dependencies.yml **Wo...

(GITHUB)


[uncategorized] ~117-~117: The official name of this software platform is spelled with a capital “H”.
Context: ...Note:* Follows same naming pattern as .github/workflows/vortex-test-*.yml files. --...

(GITHUB)

🪛 markdownlint-cli2 (0.18.1)

27-27: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


48-48: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


67-67: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


84-84: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


87-87: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


88-88: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


104-104: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


121-121: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


137-137: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


153-153: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


168-168: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


179-179: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


197-197: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


245-245: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


273-273: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


289-289: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


307-307: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


312-312: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


317-317: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


322-322: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


329-329: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


336-336: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


343-343: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


350-350: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


357-357: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

🤖 Prompt for AI Agents
In plan.md around lines 25 to 440, many headings lack surrounding blank lines
(MD022) and the list at lines 87-88 has incorrect indentation (MD007); add a
blank line above and below each heading listed (lines 48, 67, 84, 104, 121, 137,
153, 168, 179, 197, 245, 273, 289, 307, 312, 317, 322, 329, 336, 343, 350, 357)
to ensure one blank line before and after each heading, and fix the list
indentation at lines 87-88 by removing the two-space indent so the list items
align with the top-level list format (or adjust nesting consistently), then run
your Markdown linter to confirm MD022 and MD007 are resolved.

plan.md Outdated

Split the configuration into logical, purpose-driven files using GitHub Actions-style naming conventions for consistency:

```
Copy link

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Specify language for fenced code block.

Line 27 uses a fenced code block without a language identifier per MD040.

- ```
+ ```
  .circleci/

Or to highlight the file structure syntax:

- ```
+ ```text
  .circleci/
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

27-27: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
In plan.md around line 27 the fenced code block opening is missing a language
identifier (MD040); update the block to include an explicit language/tag (for
example `text` or `bash`) before the directory listing so it becomes a fenced
block with a language (e.g., replace the opening ``` with ```text), and scan
nearby fenced blocks to add appropriate language identifiers as needed.

plan.md Outdated
### 1. **build-test-deploy.yml** - Main Build Pipeline
**Purpose:** Core build, test, and deployment workflow
**Trigger:** Push to any branch, tag creation
**GitHub Actions Equivalent:** `.github/workflows/build-test-deploy.yml`
Copy link

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Capitalize GitHub branding correctly.

Multiple references to "Github Actions" should use the official "GitHub" capitalization per style guidelines.

- **GitHub Actions Equivalent:** `.github/workflows/build-test-deploy.yml`
+ **GitHub Actions Equivalent:** `.github/workflows/build-test-deploy.yml`

(Note: This appears correct in provided code; verify lines 51, 89, 117 in source if LanguageTool flagged them.)

Also applies to: 89-89, 117-117

🧰 Tools
🪛 LanguageTool

[uncategorized] ~51-~51: The official name of this software platform is spelled with a capital “H”.
Context: ...creation GitHub Actions Equivalent: .github/workflows/build-test-deploy.yml **Work...

(GITHUB)

🤖 Prompt for AI Agents
In plan.md around lines 51, 89 and 117, instances of "Github" (e.g., "Github
Actions") are not using the official branding; update those occurrences to the
correct capitalization "GitHub" (so "GitHub Actions" where applicable) and run a
quick search in the file to replace any other "Github" -> "GitHub" to ensure
consistent styling.

@AlexSkrypnyk AlexSkrypnyk added the Requires more work Pull request was reviewed and reviver(s) asked to work further on the pull request label Nov 25, 2025
@AlexSkrypnyk AlexSkrypnyk moved this from BACKLOG to Next release in Vortex Nov 25, 2025
@github-actions github-actions bot added the CONFLICT Pull request has a conflict that needs to be resolved before it can be merged label Nov 26, 2025
@AlexSkrypnyk AlexSkrypnyk added this to the 2.0 milestone Dec 3, 2025
@AlexSkrypnyk AlexSkrypnyk modified the milestones: 2.0, 1.35.0 Jan 5, 2026
@AlexSkrypnyk AlexSkrypnyk moved this from Next release to BACKLOG in Vortex Jan 6, 2026
@AlexSkrypnyk AlexSkrypnyk marked this pull request as draft January 7, 2026 07:30
@AlexSkrypnyk AlexSkrypnyk force-pushed the feature/1571-split-circleci-config branch from 0996b16 to a403b63 Compare February 25, 2026 03:16
@github-actions github-actions bot removed the CONFLICT Pull request has a conflict that needs to be resolved before it can be merged label Feb 25, 2026
@github-actions

This comment has been minimized.

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-02-25 03:23:42

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.65% (177/187)

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-02-25 03:26:48

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.65% (177/187)

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-02-25 03:27:09

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.65% (177/187)

@AlexSkrypnyk AlexSkrypnyk force-pushed the feature/1571-split-circleci-config branch from a403b63 to 9c1f9fa Compare February 25, 2026 03:32
@github-actions

This comment has been minimized.

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-02-25 03:39:47

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.65% (177/187)

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-02-25 03:43:00

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.65% (177/187)

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-02-25 03:43:09

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.65% (177/187)

@AlexSkrypnyk AlexSkrypnyk force-pushed the feature/1571-split-circleci-config branch 2 times, most recently from 94604a0 to 098fd6c Compare February 25, 2026 23:14
@AlexSkrypnyk AlexSkrypnyk added Needs review Pull request needs a review from assigned developers and removed Requires more work Pull request was reviewed and reviver(s) asked to work further on the pull request labels Feb 25, 2026
@AlexSkrypnyk AlexSkrypnyk modified the milestones: 2.0, 1.37.0 Feb 25, 2026
@AlexSkrypnyk AlexSkrypnyk moved this from BACKLOG to In progress in Vortex Feb 25, 2026
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-02-25 23:21:41

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.65% (177/187)

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.vortex/installer/src/Prompts/Handlers/DependencyUpdatesProvider.php (1)

61-67: ⚠️ Potential issue | 🟠 Major

Update provider discovery to account for split CircleCI config file.

The discover() method (lines 61–67) checks for .github/workflows/update-dependencies.yml and for 'update-dependencies' in .circleci/config.yml, but does not directly check for .circleci/update-dependencies.yml. If a project uses only the split CI config file and lacks the 'update-dependencies' marker in the main config, discover() incorrectly returns RENOVATEBOT_APP instead of RENOVATEBOT_CI, causing provider detection to drift from the actual configuration.

Add a check for .circleci/update-dependencies.yml existence to the first condition:

Proposed fix
-    if (file_exists($this->dstDir . '/.github/workflows/update-dependencies.yml')) {
+    if (
+      file_exists($this->dstDir . '/.github/workflows/update-dependencies.yml') ||
+      file_exists($this->dstDir . '/.circleci/update-dependencies.yml')
+    ) {
       return self::RENOVATEBOT_CI;
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.vortex/installer/src/Prompts/Handlers/DependencyUpdatesProvider.php around
lines 61 - 67, The discover() method in DependencyUpdatesProvider should also
detect a split CircleCI file; add a file existence check for $this->dstDir .
'/.circleci/update-dependencies.yml' so that when that file exists discover()
returns self::RENOVATEBOT_CI (same behavior as the existing
.github/workflows/update-dependencies.yml check). Update the conditional that
currently checks file_exists($this->dstDir .
'/.github/workflows/update-dependencies.yml') (or add a new similar if) to
include the .circleci/update-dependencies.yml path, ensuring RENOVATEBOT_CI is
returned when either CI workflow file is present.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.circleci/build-test-deploy.yml:
- Line 601: Update the branch matching regex so the "project/*" alternative is
properly anchored and the letter range is correct: replace the faulty character
class `[a-zA-z0-9\-\.]+` with a correct `[a-zA-Z0-9\-.]+` (or move/escape the
hyphen) and add a trailing `$` to the `project\/...` alternative so it reads
`project\/[a-zA-Z0-9\-.]+$`; change this in the single regex expression that
appears in the pipeline `only:` pattern.

In @.circleci/vortex-test-common.yml:
- Line 446: The VORTEX_DOWNLOAD_DB_SOURCE environment value is set to the
variable name "VORTEX_CONTAINER_REGISTRY" but the downloader expects a literal
like "container_registry"; update the VORTEX_DOWNLOAD_DB_SOURCE entry to use the
literal container_registry so the downloader's matching logic (which checks
values like container_registry, url, ftp, acquia, lagoon, s3) will select the
container registry path.

---

Outside diff comments:
In @.vortex/installer/src/Prompts/Handlers/DependencyUpdatesProvider.php:
- Around line 61-67: The discover() method in DependencyUpdatesProvider should
also detect a split CircleCI file; add a file existence check for $this->dstDir
. '/.circleci/update-dependencies.yml' so that when that file exists discover()
returns self::RENOVATEBOT_CI (same behavior as the existing
.github/workflows/update-dependencies.yml check). Update the conditional that
currently checks file_exists($this->dstDir .
'/.github/workflows/update-dependencies.yml') (or add a new similar if) to
include the .circleci/update-dependencies.yml path, ensuring RENOVATEBOT_CI is
returned when either CI workflow file is present.

ℹ️ Review info

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0996b16 and 098fd6c.

📒 Files selected for processing (7)
  • .circleci/build-test-deploy.yml
  • .circleci/update-dependencies.yml
  • .circleci/vortex-test-common.yml
  • .github/workflows/vortex-test-common.yml
  • .vortex/.ahoy.yml
  • .vortex/installer/src/Prompts/Handlers/DependencyUpdatesProvider.php
  • .vortex/installer/src/Prompts/Handlers/Internal.php

# - release/2023-04-17, release/2023-04-17.123 (date-based)
# - hotfix/123.456.789, hotfix/123.456.789-rc.1213 (per https://semver.org/)
# - hotfix/2023-04-17, hotfix/2023-04-17.123 (date-based)
only: /^(production|main|master|develop)$|^project\/[a-zA-z0-9\-\.]+|^(feature|bugfix)\/[a-zA-Z0-9\-\.\,_]+$|^ci.*|^(release|hotfix)\/[0-9]+(\.[0-9]+){2}(-rc\.[0-9]+)?$|^(release|hotfix)\/[0-9]{4}-[0-9]{2}-[0-9]{2}(\.[0-9]+)?$/
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

python - <<'PY'
import re

# Current regex (as described in review)
current = r'^(production|main|master|develop)$|^project\/[a-zA-z0-9\-\.]+|^(feature|bugfix)\/[a-zA-Z0-9\-\.\,_]+$|^ci.*|^(release|hotfix)\/[0-9]+(\.[0-9]+){2}(-rc\.[0-9]+)?$|^(release|hotfix)\/[0-9]{4}-[0-9]{2}-[0-9]{2}(\.[0-9]+)?$'

# Proposed fix regex
proposed = r'^(production|main|master|develop)$|^project\/[a-zA-Z0-9\-.]+$|^(feature|bugfix)\/[a-zA-Z0-9\-\.\,_]+$|^ci.*|^(release|hotfix)\/[0-9]+(\.[0-9]+){2}(-rc\.[0-9]+)?$|^(release|hotfix)\/[0-9]{4}-[0-9]{2}-[0-9]{2}(\.[0-9]+)?$'

test_cases = [
    ("project/ok-name", True, "Valid project branch"),
    ("project/ok.name", True, "Valid project branch with dot"),
    ("project/bad!name", False, "Invalid character - exclamation mark"),
    ("project/bad[name", False, "Invalid character - bracket"),
    ("project/valid-suffix", True, "Valid project branch with dash"),
    ("project/valid/extra", False, "Should NOT match - has slash (overmatch in current)"),
    ("project/valid-extra-junk", True, "Should NOT match - overmatch without anchor in current"),
]

print("Testing CURRENT regex pattern:")
print("=" * 70)
for test, expected_intention, description in test_cases:
    match = bool(re.match(current, test))
    status = "✓" if match else "✗"
    print(f"{status} {test:30} -> {str(match):5} ({description})")

print("\n" + "=" * 70)
print("Testing PROPOSED regex pattern:")
print("=" * 70)
for test, expected_intention, description in test_cases:
    match = bool(re.match(proposed, test))
    status = "✓" if match else "✗"
    print(f"{status} {test:30} -> {str(match):5} ({description})")

print("\n" + "=" * 70)
print("KEY DIFFERENCE - Testing overmatch behavior:")
print("=" * 70)
# The issue: current pattern has no $ anchor on project/*, so it matches prefixes
overmatch_test = "project/my-project-extra-chars-that-should-not-match"
current_result = bool(re.match(current, overmatch_test))
proposed_result = bool(re.match(proposed, overmatch_test))
print(f"Test: {overmatch_test}")
print(f"Current (no $): {current_result} (PROBLEM: overmatch)")
print(f"Proposed ($):  {proposed_result} (FIXED)")
PY

Repository: drevops/vortex

Length of output: 1775


🏁 Script executed:

# Check if the file exists and view the relevant section
if [ -f ".circleci/build-test-deploy.yml" ]; then
    echo "File found. Checking line 601 context:"
    sed -n '595,610p' ".circleci/build-test-deploy.yml"
else
    echo "File not found at expected path"
    find . -name "build-test-deploy.yml" -type f 2>/dev/null | head -5
fi

Repository: drevops/vortex

Length of output: 983


Add $ anchor to project/* deploy branch regex and fix character class typo.

Line 601 has two issues in the project/* pattern:

  1. Missing $ end-anchor allows unintended prefix matches (e.g., "project/bad" matches in "project/bad!name")
  2. Character class typo [a-zA-z...] creates an unintended range (A-z includes [\]^_), matching invalid characters like [
Proposed fix
-              only: /^(production|main|master|develop)$|^project\/[a-zA-z0-9\-\.]+|^(feature|bugfix)\/[a-zA-Z0-9\-\.\,_]+$|^ci.*|^(release|hotfix)\/[0-9]+(\.[0-9]+){2}(-rc\.[0-9]+)?$|^(release|hotfix)\/[0-9]{4}-[0-9]{2}-[0-9]{2}(\.[0-9]+)?$/
+              only: /^(production|main|master|develop)$|^project\/[a-zA-Z0-9\-.]+$|^(feature|bugfix)\/[a-zA-Z0-9\-\.\,_]+$|^ci.*|^(release|hotfix)\/[0-9]+(\.[0-9]+){2}(-rc\.[0-9]+)?$|^(release|hotfix)\/[0-9]{4}-[0-9]{2}-[0-9]{2}(\.[0-9]+)?$/
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
only: /^(production|main|master|develop)$|^project\/[a-zA-z0-9\-\.]+|^(feature|bugfix)\/[a-zA-Z0-9\-\.\,_]+$|^ci.*|^(release|hotfix)\/[0-9]+(\.[0-9]+){2}(-rc\.[0-9]+)?$|^(release|hotfix)\/[0-9]{4}-[0-9]{2}-[0-9]{2}(\.[0-9]+)?$/
only: /^(production|main|master|develop)$|^project\/[a-zA-Z0-9\-.]+$|^(feature|bugfix)\/[a-zA-Z0-9\-\.\,_]+$|^ci.*|^(release|hotfix)\/[0-9]+(\.[0-9]+){2}(-rc\.[0-9]+)?$|^(release|hotfix)\/[0-9]{4}-[0-9]{2}-[0-9]{2}(\.[0-9]+)?$/
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.circleci/build-test-deploy.yml at line 601, Update the branch matching
regex so the "project/*" alternative is properly anchored and the letter range
is correct: replace the faulty character class `[a-zA-z0-9\-\.]+` with a correct
`[a-zA-Z0-9\-.]+` (or move/escape the hyphen) and add a trailing `$` to the
`project\/...` alternative so it reads `project\/[a-zA-Z0-9\-.]+$`; change this
in the single regex expression that appears in the pipeline `only:` pattern.

vortex-dev-database-ii:
<<: *job-database
environment:
VORTEX_DOWNLOAD_DB_SOURCE: VORTEX_CONTAINER_REGISTRY
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Searching for VORTEX_DOWNLOAD_DB_SOURCE usage =="
rg -n "VORTEX_DOWNLOAD_DB_SOURCE" -g '!**/vendor/**' -C3

echo ""
echo "== Searching for download-db related files =="
fd -t f "download.*db" -g '!**/vendor/**'

echo ""
echo "== Checking container_registry and VORTEX_CONTAINER_REGISTRY usage =="
rg -n "VORTEX_CONTAINER_REGISTRY|container_registry" -g '!**/vendor/**' -C2

Repository: drevops/vortex

Length of output: 2311


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Context around line 446 in .circleci/vortex-test-common.yml =="
sed -n '430,460p' .circleci/vortex-test-common.yml | cat -n

echo ""
echo "== Searching for all VORTEX_DOWNLOAD_DB_SOURCE values in the yml file =="
grep -n "VORTEX_DOWNLOAD_DB_SOURCE" .circleci/vortex-test-common.yml

echo ""
echo "== Searching for VORTEX_CONTAINER_REGISTRY definition/usage =="
rg -n "VORTEX_CONTAINER_REGISTRY" -g '!**/vendor/**'

Repository: drevops/vortex

Length of output: 5494


Fix VORTEX_DOWNLOAD_DB_SOURCE value in II variant: use container_registry literal, not variable reference.

Line 446 incorrectly sets VORTEX_DOWNLOAD_DB_SOURCE: VORTEX_CONTAINER_REGISTRY (a variable name). The downloader script expects literal string values like container_registry, url, ftp, acquia, lagoon, or s3. With the current value, no download method will match and DB acquisition will be skipped.

Fix
-      VORTEX_DOWNLOAD_DB_SOURCE: VORTEX_CONTAINER_REGISTRY
+      VORTEX_DOWNLOAD_DB_SOURCE: container_registry
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
VORTEX_DOWNLOAD_DB_SOURCE: VORTEX_CONTAINER_REGISTRY
VORTEX_DOWNLOAD_DB_SOURCE: container_registry
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.circleci/vortex-test-common.yml at line 446, The VORTEX_DOWNLOAD_DB_SOURCE
environment value is set to the variable name "VORTEX_CONTAINER_REGISTRY" but
the downloader expects a literal like "container_registry"; update the
VORTEX_DOWNLOAD_DB_SOURCE entry to use the literal container_registry so the
downloader's matching logic (which checks values like container_registry, url,
ftp, acquia, lagoon, s3) will select the container registry path.

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-02-25 23:25:09

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.65% (177/187)

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-02-25 23:25:13

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.65% (177/187)

@AlexSkrypnyk AlexSkrypnyk force-pushed the feature/1571-split-circleci-config branch from 098fd6c to b53d47c Compare February 26, 2026 00:22
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.circleci/update-dependencies.yml:
- Around line 36-52: Rename the CircleCI step name to accurately reflect that it
validates multiple environment variables: update the step with name "Check if
RENOVATE_TOKEN is set" to something like "Check required RENOVATE env vars
(TOKEN, REPOSITORIES, GIT_AUTHOR)" so the step name matches the script that
checks RENOVATE_TOKEN, RENOVATE_REPOSITORIES and RENOVATE_GIT_AUTHOR; locate the
step by the existing name string and modify the name field only to improve
clarity without changing the existing commands.

In @.vortex/tests/generate-vortex-dev-circleci:
- Around line 70-77: In the build_variant_job invocation named
'vortex-dev-database-ii' update the VORTEX_DOWNLOAD_DB_SOURCE value to the
literal source type expected by the downloader (use 'container_registry' instead
of the variable name VORTEX_CONTAINER_REGISTRY) so the DB download method
matches; locate the build_variant_job call and replace the
VORTEX_DOWNLOAD_DB_SOURCE entry accordingly.

ℹ️ Review info

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 098fd6c and b53d47c.

⛔ Files ignored due to path filters (31)
  • .vortex/installer/tests/Fixtures/handler_process/ciprovider_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/ciprovider_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deploy_types_all_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deploy_types_all_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deploy_types_none_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deploy_types_none_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deps_updates_provider_ci_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deps_updates_provider_ci_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deps_updates_provider_ci_circleci/.circleci/update-dependencies.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_disabled_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_disabled_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_enabled_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_enabled_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/timezone_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/timezone_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_be_lint_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_be_lint_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_be_tests_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_be_tests_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_behat_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_behat_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpcs_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpcs_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpmd_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpmd_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpstan_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpstan_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpunit_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpunit_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_rector_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_rector_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
📒 Files selected for processing (14)
  • .circleci/README.md
  • .circleci/build-test-deploy.yml
  • .circleci/config.yml
  • .circleci/update-dependencies.yml
  • .circleci/vortex-test-common.yml
  • .github/workflows/vortex-test-common.yml
  • .vortex/.ahoy.yml
  • .vortex/installer/src/Prompts/Handlers/DependencyUpdatesProvider.php
  • .vortex/installer/src/Prompts/Handlers/Internal.php
  • .vortex/tests/CLAUDE.md
  • .vortex/tests/generate-vortex-dev-circleci
  • .vortex/tests/lint.ci.sh
  • .vortex/tests/phpcs.xml
  • .vortex/tests/phpstan.neon
💤 Files with no reviewable changes (2)
  • .circleci/README.md
  • .circleci/config.yml

Comment on lines +36 to +52
- run:
name: Check if RENOVATE_TOKEN is set
command: |
if [ -z "${RENOVATE_TOKEN}" ]; then
echo "RENOVATE_TOKEN is not set. Skipping job."
circleci-agent step halt
fi

if [ -z "${RENOVATE_REPOSITORIES}" ]; then
echo "Renovate repository is not set. Skipping job."
circleci-agent step halt
fi

if [ -z "${RENOVATE_GIT_AUTHOR}" ]; then
echo "Renovate git author is not set. Skipping job."
circleci-agent step halt
fi
Copy link

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Step name doesn't match step content.

The step name "Check if RENOVATE_TOKEN is set" is misleading since the step also validates RENOVATE_REPOSITORIES and RENOVATE_GIT_AUTHOR. Consider renaming for clarity.

Suggested fix
       - run:
-          name: Check if RENOVATE_TOKEN is set
+          name: Validate required environment variables
           command: |
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- run:
name: Check if RENOVATE_TOKEN is set
command: |
if [ -z "${RENOVATE_TOKEN}" ]; then
echo "RENOVATE_TOKEN is not set. Skipping job."
circleci-agent step halt
fi
if [ -z "${RENOVATE_REPOSITORIES}" ]; then
echo "Renovate repository is not set. Skipping job."
circleci-agent step halt
fi
if [ -z "${RENOVATE_GIT_AUTHOR}" ]; then
echo "Renovate git author is not set. Skipping job."
circleci-agent step halt
fi
- run:
name: Validate required environment variables
command: |
if [ -z "${RENOVATE_TOKEN}" ]; then
echo "RENOVATE_TOKEN is not set. Skipping job."
circleci-agent step halt
fi
if [ -z "${RENOVATE_REPOSITORIES}" ]; then
echo "Renovate repository is not set. Skipping job."
circleci-agent step halt
fi
if [ -z "${RENOVATE_GIT_AUTHOR}" ]; then
echo "Renovate git author is not set. Skipping job."
circleci-agent step halt
fi
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.circleci/update-dependencies.yml around lines 36 - 52, Rename the CircleCI
step name to accurately reflect that it validates multiple environment
variables: update the step with name "Check if RENOVATE_TOKEN is set" to
something like "Check required RENOVATE env vars (TOKEN, REPOSITORIES,
GIT_AUTHOR)" so the step name matches the script that checks RENOVATE_TOKEN,
RENOVATE_REPOSITORIES and RENOVATE_GIT_AUTHOR; locate the step by the existing
name string and modify the name field only to improve clarity without changing
the existing commands.

Comment on lines +70 to +77
build_variant_job('vortex-dev-database-ii', '*job-database', [
'VORTEX_DOWNLOAD_DB_SOURCE' => 'VORTEX_CONTAINER_REGISTRY',
'VORTEX_DOWNLOAD_DB_FORCE' => 1,
'VORTEX_DB_IMAGE' => 'drevops/vortex-dev-mariadb-drupal-data-demo-destination-11.x',
'VORTEX_DEPLOY_CONTAINER_REGISTRY_IMAGE_TAG' => 'vortex-dev-database-ii',
'VORTEX_EXPORT_DB_CONTAINER_REGISTRY_DEPLOY_PROCEED' => 1,
'VORTEX_CI_DB_CACHE_BRANCH' => 'vortex-dev-didi-ii',
]),
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

Fix VORTEX_DOWNLOAD_DB_SOURCE value: use container_registry literal, not variable name.

The value VORTEX_CONTAINER_REGISTRY is the variable name, but the downloader script expects literal source type strings like container_registry, url, ftp, acquia, lagoon, or s3. With this value, no download method will match and DB acquisition will be skipped.

Compare with line 55 which correctly uses 'url' as the literal source type.

Proposed fix
   build_variant_job('vortex-dev-database-ii', '*job-database', [
-    'VORTEX_DOWNLOAD_DB_SOURCE' => 'VORTEX_CONTAINER_REGISTRY',
+    'VORTEX_DOWNLOAD_DB_SOURCE' => 'container_registry',
     'VORTEX_DOWNLOAD_DB_FORCE' => 1,
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
build_variant_job('vortex-dev-database-ii', '*job-database', [
'VORTEX_DOWNLOAD_DB_SOURCE' => 'VORTEX_CONTAINER_REGISTRY',
'VORTEX_DOWNLOAD_DB_FORCE' => 1,
'VORTEX_DB_IMAGE' => 'drevops/vortex-dev-mariadb-drupal-data-demo-destination-11.x',
'VORTEX_DEPLOY_CONTAINER_REGISTRY_IMAGE_TAG' => 'vortex-dev-database-ii',
'VORTEX_EXPORT_DB_CONTAINER_REGISTRY_DEPLOY_PROCEED' => 1,
'VORTEX_CI_DB_CACHE_BRANCH' => 'vortex-dev-didi-ii',
]),
build_variant_job('vortex-dev-database-ii', '*job-database', [
'VORTEX_DOWNLOAD_DB_SOURCE' => 'container_registry',
'VORTEX_DOWNLOAD_DB_FORCE' => 1,
'VORTEX_DB_IMAGE' => 'drevops/vortex-dev-mariadb-drupal-data-demo-destination-11.x',
'VORTEX_DEPLOY_CONTAINER_REGISTRY_IMAGE_TAG' => 'vortex-dev-database-ii',
'VORTEX_EXPORT_DB_CONTAINER_REGISTRY_DEPLOY_PROCEED' => 1,
'VORTEX_CI_DB_CACHE_BRANCH' => 'vortex-dev-didi-ii',
]),
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.vortex/tests/generate-vortex-dev-circleci around lines 70 - 77, In the
build_variant_job invocation named 'vortex-dev-database-ii' update the
VORTEX_DOWNLOAD_DB_SOURCE value to the literal source type expected by the
downloader (use 'container_registry' instead of the variable name
VORTEX_CONTAINER_REGISTRY) so the DB download method matches; locate the
build_variant_job call and replace the VORTEX_DOWNLOAD_DB_SOURCE entry
accordingly.

@AlexSkrypnyk AlexSkrypnyk force-pushed the feature/1571-split-circleci-config branch from b53d47c to 1845d8a Compare February 26, 2026 00:38
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
tests/phpunit/CircleCiConfigTest.php (1)

50-51: 🧹 Nitpick | 🔵 Trivial

Consider adding job name assertions for test robustness.

The tests access jobs by array index (jobs[2], jobs[3]), which could silently test wrong data if job order changes. Consider adding assertions to verify the job names.

Example assertion
public function testDeployBranchRegex(string $branch, bool $expected = TRUE): void {
    $job = $this->config['workflows']['commit']['jobs'][2];
    $this->assertArrayHasKey('deploy', $job, 'Expected deploy job at index 2');
    // ... rest of test
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/phpunit/CircleCiConfigTest.php` around lines 50 - 51, The test
testDeployBranchRegex uses jobs by numeric index which is brittle; before using
$this->config['workflows']['commit']['jobs'][2] assert the presence and name of
the job to ensure you're testing the intended entry. Add assertions such as
asserting the array key or that the job contains a 'deploy' key (e.g. using
$this->assertArrayHasKey('deploy', $job) and/or checking the job name/key) and
then extract the filters from that verified $job to run the preg_match assertion
against the branch regex.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.vortex/tests/generate-vortex-dev-circleci:
- Around line 220-222: The loop in build_variant_job that currently does foreach
($env as $key => $value) and uses sprintf('      %s: %s', $key, $value) can
produce invalid YAML for values with special characters; update it to emit
quoted YAML strings by escaping any embedded double quotes in $value and
wrapping the result in double quotes (or use a YAML-encoding helper if
available) so each line becomes key: "escaped value", ensuring values containing
:, #, newlines, etc. are safe.

---

Outside diff comments:
In `@tests/phpunit/CircleCiConfigTest.php`:
- Around line 50-51: The test testDeployBranchRegex uses jobs by numeric index
which is brittle; before using $this->config['workflows']['commit']['jobs'][2]
assert the presence and name of the job to ensure you're testing the intended
entry. Add assertions such as asserting the array key or that the job contains a
'deploy' key (e.g. using $this->assertArrayHasKey('deploy', $job) and/or
checking the job name/key) and then extract the filters from that verified $job
to run the preg_match assertion against the branch regex.

ℹ️ Review info

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b53d47c and 1845d8a.

⛔ Files ignored due to path filters (31)
  • .vortex/installer/tests/Fixtures/handler_process/ciprovider_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/ciprovider_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deploy_types_all_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deploy_types_all_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deploy_types_none_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deploy_types_none_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deps_updates_provider_ci_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deps_updates_provider_ci_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deps_updates_provider_ci_circleci/.circleci/update-dependencies.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_disabled_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_disabled_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_enabled_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_enabled_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/timezone_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/timezone_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_be_lint_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_be_lint_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_be_tests_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_be_tests_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_behat_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_behat_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpcs_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpcs_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpmd_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpmd_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpstan_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpstan_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpunit_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpunit_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_rector_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_rector_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
📒 Files selected for processing (22)
  • .circleci/README.md
  • .circleci/build-test-deploy.yml
  • .circleci/config.yml
  • .circleci/update-dependencies.yml
  • .circleci/vortex-test-common.yml
  • .github/workflows/vortex-test-common.yml
  • .vortex/.ahoy.yml
  • .vortex/installer/src/Prompts/Handlers/CiProvider.php
  • .vortex/installer/src/Prompts/Handlers/DependencyUpdatesProvider.php
  • .vortex/installer/src/Prompts/Handlers/Internal.php
  • .vortex/installer/tests/Functional/Handlers/CiProviderHandlerProcessTest.php
  • .vortex/installer/tests/Functional/Handlers/MigrationHandlerProcessTest.php
  • .vortex/installer/tests/Functional/Handlers/TimezoneHandlerProcessTest.php
  • .vortex/installer/tests/Unit/Handlers/CiProviderHandlerDiscoveryTest.php
  • .vortex/installer/tests/Unit/Handlers/DependencyUpdatesProviderHandlerDiscoveryTest.php
  • .vortex/tests/CLAUDE.md
  • .vortex/tests/generate-vortex-dev-circleci
  • .vortex/tests/lint.ci.sh
  • .vortex/tests/phpcs.xml
  • .vortex/tests/phpstan.neon
  • .vortex/tests/phpunit/Traits/SutTrait.php
  • tests/phpunit/CircleCiConfigTest.php
💤 Files with no reviewable changes (2)
  • .circleci/config.yml
  • .circleci/README.md

Comment on lines +220 to +222
foreach ($env as $key => $value) {
$lines[] = sprintf(' %s: %s', $key, $value);
}
Copy link

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Consider quoting YAML string values to handle special characters.

The build_variant_job function outputs values directly without YAML quoting. If a value contains special characters (:, #, etc.), the generated YAML could be invalid.

Proposed fix
   foreach ($env as $key => $value) {
-    $lines[] = sprintf('      %s: %s', $key, $value);
+    $yaml_value = is_int($value) ? $value : "'" . str_replace("'", "''", (string) $value) . "'";
+    $lines[] = sprintf('      %s: %s', $key, $yaml_value);
   }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
foreach ($env as $key => $value) {
$lines[] = sprintf(' %s: %s', $key, $value);
}
foreach ($env as $key => $value) {
$yaml_value = is_int($value) ? $value : "'" . str_replace("'", "''", (string) $value) . "'";
$lines[] = sprintf(' %s: %s', $key, $yaml_value);
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.vortex/tests/generate-vortex-dev-circleci around lines 220 - 222, The loop
in build_variant_job that currently does foreach ($env as $key => $value) and
uses sprintf('      %s: %s', $key, $value) can produce invalid YAML for values
with special characters; update it to emit quoted YAML strings by escaping any
embedded double quotes in $value and wrapping the result in double quotes (or
use a YAML-encoding helper if available) so each line becomes key: "escaped
value", ensuring values containing :, #, newlines, etc. are safe.

@github-actions

This comment has been minimized.

@AlexSkrypnyk AlexSkrypnyk force-pushed the feature/1571-split-circleci-config branch from 1845d8a to ef0d952 Compare February 26, 2026 00:47
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (5)
.circleci/update-dependencies.yml (1)

36-52: 🧹 Nitpick | 🔵 Trivial

Step name doesn't reflect all validated variables.

The step validates RENOVATE_TOKEN, RENOVATE_REPOSITORIES, and RENOVATE_GIT_AUTHOR, but the name only mentions RENOVATE_TOKEN. Consider renaming for clarity.

Suggested fix
       - run:
-          name: Check if RENOVATE_TOKEN is set
+          name: Validate required environment variables
           command: |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.circleci/update-dependencies.yml around lines 36 - 52, The step name "Check
if RENOVATE_TOKEN is set" is misleading because the run block validates
RENOVATE_TOKEN, RENOVATE_REPOSITORIES, and RENOVATE_GIT_AUTHOR; update the step
name to reflect all validated variables (e.g., "Check RENOVATE_TOKEN,
RENOVATE_REPOSITORIES, and RENOVATE_GIT_AUTHOR are set") so the job header
matches the checks performed in the run block that references RENOVATE_TOKEN,
RENOVATE_REPOSITORIES, and RENOVATE_GIT_AUTHOR.
.vortex/tests/generate-vortex-dev-circleci (2)

70-77: ⚠️ Potential issue | 🔴 Critical

Fix VORTEX_DOWNLOAD_DB_SOURCE value: use literal source type, not variable name.

The value 'VORTEX_CONTAINER_REGISTRY' is a variable name, but the download script expects literal source type strings like container_registry, url, ftp, acquia, lagoon, or s3. Compare with line 55 which correctly uses 'url'.

Proposed fix
   build_variant_job('vortex-dev-database-ii', '*job-database', [
-    'VORTEX_DOWNLOAD_DB_SOURCE' => 'VORTEX_CONTAINER_REGISTRY',
+    'VORTEX_DOWNLOAD_DB_SOURCE' => 'container_registry',
     'VORTEX_DOWNLOAD_DB_FORCE' => 1,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.vortex/tests/generate-vortex-dev-circleci around lines 70 - 77, The
VORTEX_DOWNLOAD_DB_SOURCE in the build_variant_job call for
'vortex-dev-database-ii' is set to the variable name 'VORTEX_CONTAINER_REGISTRY'
but the download script expects a literal source string; update the key/value
pair inside the build_variant_job invocation (the map passed to
build_variant_job for 'vortex-dev-database-ii') to set
'VORTEX_DOWNLOAD_DB_SOURCE' => 'container_registry' (matching the literal types
like 'url' used elsewhere).

220-222: 🧹 Nitpick | 🔵 Trivial

Consider quoting YAML string values to handle special characters.

The build_variant_job function outputs values directly without YAML quoting. If a value contains special characters (:, #, ', etc.), the generated YAML could be invalid.

Proposed fix
   foreach ($env as $key => $value) {
-    $lines[] = sprintf('      %s: %s', $key, $value);
+    $yaml_value = is_int($value) ? $value : "'" . str_replace("'", "''", (string) $value) . "'";
+    $lines[] = sprintf('      %s: %s', $key, $yaml_value);
   }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.vortex/tests/generate-vortex-dev-circleci around lines 220 - 222, The loop
in build_variant_job emits raw YAML values which break when values contain
special chars; update the foreach ($env as $key => $value) block so values are
YAML-quoted and any inner single quotes are escaped by doubling them before
writing. Replace the sprintf('      %s: %s', $key, $value) usage with a form
that applies escaping (e.g. $safe = str_replace("'", "''", (string)$value);
$lines[] = sprintf('      %s: '\''%s'\''', $key, $safe)) so all env values are
wrapped in single quotes and safe for YAML parsing.
.circleci/vortex-test-common.yml (1)

446-446: ⚠️ Potential issue | 🟡 Minor

Fix VORTEX_DOWNLOAD_DB_SOURCE value: use container_registry literal, not variable reference.

The downloader script expects literal string values like container_registry, url, ftp, acquia, lagoon, or s3. With VORTEX_CONTAINER_REGISTRY (a variable name), no download method will match.

Fix
-      VORTEX_DOWNLOAD_DB_SOURCE: VORTEX_CONTAINER_REGISTRY
+      VORTEX_DOWNLOAD_DB_SOURCE: container_registry
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.circleci/vortex-test-common.yml at line 446, The VORTEX_DOWNLOAD_DB_SOURCE
environment value is currently set to the variable name
VORTEX_CONTAINER_REGISTRY instead of the expected literal; update the value of
VORTEX_DOWNLOAD_DB_SOURCE to the literal string container_registry so the
downloader's selection logic (which checks for literal values like
container_registry, url, ftp, acquia, lagoon, s3) will match; change the
assignment that references VORTEX_CONTAINER_REGISTRY to use the literal
container_registry and verify no other similar env keys mistakenly use variable
names.
.circleci/build-test-deploy.yml (1)

601-601: ⚠️ Potential issue | 🟡 Minor

Add $ anchor to project/* deploy branch regex and fix character class typo.

The project/* pattern has two issues:

  1. Missing $ end-anchor allows unintended prefix matches
  2. Character class [a-zA-z...] (lowercase 'z') creates an unintended range including [\]^_
Proposed fix
-              only: /^(production|main|master|develop)$|^project\/[a-zA-z0-9\-\.]+|^(feature|bugfix)\/[a-zA-Z0-9\-\.\,_]+$|^ci.*|^(release|hotfix)\/[0-9]+(\.[0-9]+){2}(-rc\.[0-9]+)?$|^(release|hotfix)\/[0-9]{4}-[0-9]{2}-[0-9]{2}(\.[0-9]+)?$/
+              only: /^(production|main|master|develop)$|^project\/[a-zA-Z0-9\-.]+$|^(feature|bugfix)\/[a-zA-Z0-9\-\.\,_]+$|^ci.*|^(release|hotfix)\/[0-9]+(\.[0-9]+){2}(-rc\.[0-9]+)?$|^(release|hotfix)\/[0-9]{4}-[0-9]{2}-[0-9]{2}(\.[0-9]+)?$/
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.circleci/build-test-deploy.yml at line 601, Update the branch-filter regex
on the only: line so the project/* alternative is properly anchored and the
character class typo is fixed: replace the existing project\/[a-zA-z0-9\-\.]+
with project\/[a-zA-Z0-9\-.]+ and add a trailing $ (i.e.,
^project\/[a-zA-Z0-9\-.]+$) inside the overall alternation so it matches only
full project/* branch names; edit the only: regex string where it appears.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.vortex/.ahoy.yml:
- Around line 62-66: Add a "name" field to the new ahoy tasks so they match the
existing entries' metadata: update the lint-ci and lint-ci-fix blocks to include
name: "Lint CI" (or similar descriptive strings like "lint-ci" and
"lint-ci-fix") so they appear in ahoy help; ensure the keys "lint-ci" and
"lint-ci-fix" remain as the command identifiers and only add the name property
under each task.

---

Duplicate comments:
In @.circleci/build-test-deploy.yml:
- Line 601: Update the branch-filter regex on the only: line so the project/*
alternative is properly anchored and the character class typo is fixed: replace
the existing project\/[a-zA-z0-9\-\.]+ with project\/[a-zA-Z0-9\-.]+ and add a
trailing $ (i.e., ^project\/[a-zA-Z0-9\-.]+$) inside the overall alternation so
it matches only full project/* branch names; edit the only: regex string where
it appears.

In @.circleci/update-dependencies.yml:
- Around line 36-52: The step name "Check if RENOVATE_TOKEN is set" is
misleading because the run block validates RENOVATE_TOKEN,
RENOVATE_REPOSITORIES, and RENOVATE_GIT_AUTHOR; update the step name to reflect
all validated variables (e.g., "Check RENOVATE_TOKEN, RENOVATE_REPOSITORIES, and
RENOVATE_GIT_AUTHOR are set") so the job header matches the checks performed in
the run block that references RENOVATE_TOKEN, RENOVATE_REPOSITORIES, and
RENOVATE_GIT_AUTHOR.

In @.circleci/vortex-test-common.yml:
- Line 446: The VORTEX_DOWNLOAD_DB_SOURCE environment value is currently set to
the variable name VORTEX_CONTAINER_REGISTRY instead of the expected literal;
update the value of VORTEX_DOWNLOAD_DB_SOURCE to the literal string
container_registry so the downloader's selection logic (which checks for literal
values like container_registry, url, ftp, acquia, lagoon, s3) will match; change
the assignment that references VORTEX_CONTAINER_REGISTRY to use the literal
container_registry and verify no other similar env keys mistakenly use variable
names.

In @.vortex/tests/generate-vortex-dev-circleci:
- Around line 70-77: The VORTEX_DOWNLOAD_DB_SOURCE in the build_variant_job call
for 'vortex-dev-database-ii' is set to the variable name
'VORTEX_CONTAINER_REGISTRY' but the download script expects a literal source
string; update the key/value pair inside the build_variant_job invocation (the
map passed to build_variant_job for 'vortex-dev-database-ii') to set
'VORTEX_DOWNLOAD_DB_SOURCE' => 'container_registry' (matching the literal types
like 'url' used elsewhere).
- Around line 220-222: The loop in build_variant_job emits raw YAML values which
break when values contain special chars; update the foreach ($env as $key =>
$value) block so values are YAML-quoted and any inner single quotes are escaped
by doubling them before writing. Replace the sprintf('      %s: %s', $key,
$value) usage with a form that applies escaping (e.g. $safe = str_replace("'",
"''", (string)$value); $lines[] = sprintf('      %s: '\''%s'\''', $key, $safe))
so all env values are wrapped in single quotes and safe for YAML parsing.

ℹ️ Review info

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1845d8a and ef0d952.

⛔ Files ignored due to path filters (44)
  • .vortex/installer/tests/Fixtures/handler_process/ciprovider_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/ciprovider_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/ciprovider_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deploy_types_all_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deploy_types_all_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deploy_types_all_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deploy_types_none_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deploy_types_none_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deploy_types_none_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deps_updates_provider_ci_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deps_updates_provider_ci_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deps_updates_provider_ci_circleci/.circleci/update-dependencies.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deps_updates_provider_ci_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_disabled_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_disabled_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_disabled_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_enabled_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_enabled_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_enabled_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/timezone_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/timezone_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/timezone_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_be_lint_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_be_lint_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_be_lint_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_be_tests_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_be_tests_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_behat_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_behat_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_behat_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpcs_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpcs_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpcs_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpmd_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpmd_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpmd_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpstan_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpstan_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpstan_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpunit_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpunit_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_rector_circleci/.circleci/README.md is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_rector_circleci/.circleci/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_rector_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
📒 Files selected for processing (22)
  • .circleci/README.md
  • .circleci/build-test-deploy.yml
  • .circleci/config.yml
  • .circleci/update-dependencies.yml
  • .circleci/vortex-test-common.yml
  • .github/workflows/vortex-test-common.yml
  • .vortex/.ahoy.yml
  • .vortex/installer/src/Prompts/Handlers/CiProvider.php
  • .vortex/installer/src/Prompts/Handlers/DependencyUpdatesProvider.php
  • .vortex/installer/src/Prompts/Handlers/Internal.php
  • .vortex/installer/tests/Functional/Handlers/CiProviderHandlerProcessTest.php
  • .vortex/installer/tests/Functional/Handlers/MigrationHandlerProcessTest.php
  • .vortex/installer/tests/Functional/Handlers/TimezoneHandlerProcessTest.php
  • .vortex/installer/tests/Unit/Handlers/CiProviderHandlerDiscoveryTest.php
  • .vortex/installer/tests/Unit/Handlers/DependencyUpdatesProviderHandlerDiscoveryTest.php
  • .vortex/tests/CLAUDE.md
  • .vortex/tests/generate-vortex-dev-circleci
  • .vortex/tests/lint.ci.sh
  • .vortex/tests/phpcs.xml
  • .vortex/tests/phpstan.neon
  • .vortex/tests/phpunit/Traits/SutTrait.php
  • tests/phpunit/CircleCiConfigTest.php
💤 Files with no reviewable changes (2)
  • .circleci/README.md
  • .circleci/config.yml

Comment on lines +62 to +66
lint-ci:
cmd: ./tests/lint.ci.sh

lint-ci-fix:
cmd: ./tests/lint.ci.sh --fix
Copy link

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Consider adding name fields for consistency.

The new lint-ci and lint-ci-fix commands are missing the name field that other commands in this file use (e.g., lint-installer, lint-tests). While not required for functionality, adding them improves discoverability via ahoy help.

Suggested improvement
   lint-ci:
+    name: Lint CI configurations.
     cmd: ./tests/lint.ci.sh

   lint-ci-fix:
+    name: Fix CI configuration linting issues.
     cmd: ./tests/lint.ci.sh --fix
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
lint-ci:
cmd: ./tests/lint.ci.sh
lint-ci-fix:
cmd: ./tests/lint.ci.sh --fix
lint-ci:
name: Lint CI configurations.
cmd: ./tests/lint.ci.sh
lint-ci-fix:
name: Fix CI configuration linting issues.
cmd: ./tests/lint.ci.sh --fix
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.vortex/.ahoy.yml around lines 62 - 66, Add a "name" field to the new ahoy
tasks so they match the existing entries' metadata: update the lint-ci and
lint-ci-fix blocks to include name: "Lint CI" (or similar descriptive strings
like "lint-ci" and "lint-ci-fix") so they appear in ahoy help; ensure the keys
"lint-ci" and "lint-ci-fix" remain as the command identifiers and only add the
name property under each task.

@github-actions

This comment has been minimized.

@AlexSkrypnyk AlexSkrypnyk force-pushed the feature/1571-split-circleci-config branch from ef0d952 to bbcca74 Compare February 26, 2026 00:59
@github-actions

This comment has been minimized.

@AlexSkrypnyk
Copy link
Member Author

This is technically ready, but the way CircleCI wants the pipelines to be manually configured raises questions of feasibility of this approach to split into multiple files.

@github-actions github-actions bot added CONFLICT Pull request has a conflict that needs to be resolved before it can be merged and removed Needs review Pull request needs a review from assigned developers labels Feb 26, 2026
@AlexSkrypnyk AlexSkrypnyk force-pushed the feature/1571-split-circleci-config branch from bbcca74 to 42730f3 Compare February 27, 2026 02:31
@github-actions github-actions bot removed the CONFLICT Pull request has a conflict that needs to be resolved before it can be merged label Feb 27, 2026
@github-actions
Copy link

Code Coverage Report:
  2026-02-27 02:38:44

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.65% (177/187)

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-02-27 02:42:08

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.65% (177/187)

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-02-27 02:42:14

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.65% (177/187)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In progress

Development

Successfully merging this pull request may close these issues.

Split CircleCI config into multiple files

1 participant