Skip to content

[#2154] Extracted linting into standalone lint CI job.#2346

Merged
AlexSkrypnyk merged 1 commit intomainfrom
feature/2154-split-lint
Mar 10, 2026
Merged

[#2154] Extracted linting into standalone lint CI job.#2346
AlexSkrypnyk merged 1 commit intomainfrom
feature/2154-split-lint

Conversation

@AlexSkrypnyk
Copy link
Member

@AlexSkrypnyk AlexSkrypnyk commented Mar 9, 2026

Closes #2154

Summary by CodeRabbit

  • Chores

    • CI/CD pipelines restructured to run linting as a separate, parallel job alongside builds.
    • Duplicate per-node lint steps removed and lint responsibilities consolidated for consistency.
    • Deploy and tag workflows updated to require both build and lint jobs before proceeding.
    • Commit workflow updated so linting runs as part of commit flows with existing tag filters preserved.
  • Tests

    • CI config tests updated to reflect the revised workflow job ordering.

@coderabbitai
Copy link

coderabbitai bot commented Mar 9, 2026

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

Added a standalone lint CI job and wired it into CircleCI and GitHub Actions workflows; removed per-node lint steps from build paths and updated deploy workflows to require lint alongside build. Tests adjusted to account for changed job ordering.

Changes

Cohort / File(s) Summary
CircleCI config
\.circleci/config.yml
Added new lint job; removed duplicated per-node Hadolint/DCLint steps from build/database nodes; updated commit, deploy, and deploy-tags workflows to include lint as a requirement.
GitHub Actions workflow
.github/workflows/build-test-deploy.yml
Added a parallel lint job and moved many linting steps out of build; updated deploy to needs: [build, lint].
Common CI include
.circleci/vortex-test-common.yml
Removed multiple inline linting/static-analysis steps (Hadolint, DCLint, PHP/Node linters, Rector, PHPStan, PHPMD, Twig CS, Behat, Drupal theme lint) from the common build flow.
Tests
tests/phpunit/CircleCiConfigTest.php
Adjusted assertions/indexes to reflect shifted job ordering after lint job insertion.

Sequence Diagram(s)

sequenceDiagram
    rect rgba(200,200,255,0.5)
    participant CI as CI (CircleCI / GitHub Actions)
    end
    rect rgba(200,255,200,0.5)
    participant Reg as Container Registry
    end
    rect rgba(255,200,200,0.5)
    participant Deploy as Deployment Target
    end

    CI->>CI: Start pipeline (commit / workflow)
    par Lint job
        CI->>CI: run `lint` job (checkout, build CLI stack, install deps, run linters)
        CI->>Reg: optional registry login for image linting/audits
    and Build job
        CI->>CI: run `build` job (matrix builds, docker compose up, install deps, tests, artifacts)
        CI->>Reg: login / push images / pull base images
    end
    CI->>CI: wait for `build` + `lint` success
    CI->>Deploy: trigger deployment (only if both succeed)
    Deploy->>CI: report status
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Poem

🐰 I hopped through configs, split lint from the rest,
Jobs now run in parallel, each doing its best,
Linters in one burrow, builds in another,
I nudged the pipeline, then twitched for a flutter,
A carrot, a commit — CI’s little fest.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately reflects the main change: extracting linting into a standalone CI job across both CircleCI and GitHub Actions.
Linked Issues check ✅ Passed The pull request successfully implements the objective from issue #2154 by extracting linting into standalone jobs in both CircleCI and GitHub Actions workflows.
Out of Scope Changes check ✅ Passed All changes are directly related to the objective of splitting linting into standalone jobs; no out-of-scope modifications detected.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ 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/2154-split-lint

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

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/config.yml:
- Around line 321-324: The Composer validation step "Validate Composer
configuration" currently runs in both the lint and build jobs (the step runs
`composer validate --strict || [
"${VORTEX_CI_COMPOSER_VALIDATE_IGNORE_FAILURE:-0}" -eq 1 ]` in the build job),
causing redundant checks; either remove this step from the build job or add a
comment explaining the intentional duplication for faster parallel feedback;
update the build job to omit the `composer validate --strict` command (or add a
clarifying comment above the step) and leave the lint job as the canonical gate
that ensures `composer validate` is enforced (reference the "lint" job, "build"
job, "Validate Composer configuration" step, and the
`VORTEX_CI_COMPOSER_VALIDATE_IGNORE_FAILURE` env var when making the change).

In @.github/workflows/build-test-deploy.yml:
- Around line 334-336: The "Validate Composer configuration" step is duplicated
between the lint and build jobs (the step name and command composer validate
--strict) causing redundant validation; either remove the duplicate step from
one job (keep it in the canonical job—e.g., lint or build) or add a
comment/documentation in the workflow indicating the redundancy is intentional;
update or preserve the continue-on-error expression referencing
vars.VORTEX_CI_COMPOSER_VALIDATE_IGNORE_FAILURE as needed so behavior remains
consistent when you delete or move the step.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 247b7c03-5677-4af1-8166-21a03b9acc2c

📥 Commits

Reviewing files that changed from the base of the PR and between a990413 and 229770e.

📒 Files selected for processing (2)
  • .circleci/config.yml
  • .github/workflows/build-test-deploy.yml

@AlexSkrypnyk AlexSkrypnyk force-pushed the feature/2154-split-lint branch from 229770e to dcafdb2 Compare March 9, 2026 23:07
@AlexSkrypnyk AlexSkrypnyk changed the title [#2154] Extracted listing into standalone lint CI job. [#2154] Extracted linting into standalone lint CI job. Mar 9, 2026
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 @.github/workflows/build-test-deploy.yml:
- Around line 284-289: The build job currently has an unconditional "needs:
database" which becomes invalid when the !PROVISION_TYPE_PROFILE template
removes the database job; update the build job to only include the "needs:
database" line when the profile is present by moving or wrapping that line
inside the same !PROVISION_TYPE_PROFILE template block (i.e., add the same
template guard markers around the needs: database line so it is removed together
with the database job), ensuring the build job definition remains valid after
template processing.
- Around line 277-280: The step "Lint theme code with NodeJS linters" currently
uses GitHub vars in its if: condition which won't see values written at runtime;
remove the if: condition and instead guard the command at runtime by checking
the environment variable VORTEX_FRONTEND_BUILD_SKIP inside the run shell (e.g.
wrap or prefix the existing docker compose command with a bash check like if [
"$VORTEX_FRONTEND_BUILD_SKIP" = "1" ]; then echo "skipping frontend build"; else
<original docker compose exec -T cli bash -c "yarn
--cwd=${WEBROOT}/themes/custom/${DRUPAL_THEME} run lint">; fi) so the
.env-loaded $VORTEX_FRONTEND_BUILD_SKIP is honored at execution time.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: ee71209c-ee3b-4d63-b46a-ea18d5016291

📥 Commits

Reviewing files that changed from the base of the PR and between 229770e and dcafdb2.

📒 Files selected for processing (2)
  • .circleci/config.yml
  • .github/workflows/build-test-deploy.yml

Comment on lines 277 to 280
#;< DRUPAL_THEME
- name: Lint theme code with NodeJS linters
if: ${{ (matrix.instance == 0 || strategy.job-total == 1) && vars.VORTEX_FRONTEND_BUILD_SKIP != '1' }}
if: ${{ vars.VORTEX_FRONTEND_BUILD_SKIP != '1' }}
run: docker compose exec -T cli bash -c "yarn --cwd=\${WEBROOT}/themes/custom/\${DRUPAL_THEME} run lint"
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🌐 Web query:

In GitHub Actions, what is the difference between the varsandenvcontexts in a stepif:expression, and do values written to$GITHUB_ENVin an earlier step affect thevars context?

💡 Result:

  • vars context: read-only configuration variables defined in GitHub UI at the organization, repository, or environment scope (i.e., “Actions variables”). They’re exposed to expressions as vars.NAME. [1]
  • env context: environment variables that are set in the workflow YAML at the workflow/job/step env: level and are available to expressions as env.NAME. You can use env in step keys (including if) other than id/uses. [1]

Do values written to $GITHUB_ENV affect vars? No. Writing NAME=VALUE to $GITHUB_ENV creates/updates an environment variable for subsequent steps in the same job (i.e., it affects what you can read via env, not vars). [2]
vars remains the set of GitHub configuration variables from org/repo/environment settings and is not modified by $GITHUB_ENV. [1]

Sources
[1] GitHub Docs — Contexts (env and vars) https://docs.github.com/en/actions/reference/workflows-and-actions/contexts
[2] GitHub Docs — Using variables / $GITHUB_ENV to pass values between steps https://docs.github.com/en/actions/how-tos/write-workflows/choose-what-workflows-do/use-variables


🏁 Script executed:

# Find and examine the workflow file
fd -t f "build-test-deploy.yml" .github/workflows/

# Check file size
wc -l .github/workflows/build-test-deploy.yml

# Read around line 197 to see how VORTEX_FRONTEND_BUILD_SKIP is loaded
sed -n '190,205p' .github/workflows/build-test-deploy.yml

# Read around line 279 to see the current condition
sed -n '270,285p' .github/workflows/build-test-deploy.yml

Repository: drevops/vortex

Length of output: 1518


Switch this step to check runtime environment variables instead of repository variables.

Line 279 uses vars.VORTEX_FRONTEND_BUILD_SKIP, which reads GitHub UI configuration variables. However, line 197 loads VORTEX_FRONTEND_BUILD_SKIP from .env into the runtime environment via $GITHUB_ENV. Since $GITHUB_ENV writes do not affect the vars context, repos that disable frontend builds in .env will not be honored by the if condition on line 279—the step will still run. Use a shell guard instead to check the runtime environment variable:

Suggested fix
       - name: Lint theme code with NodeJS linters
-        if: ${{ vars.VORTEX_FRONTEND_BUILD_SKIP != '1' }}
-        run: docker compose exec -T cli bash -c "yarn --cwd=\${WEBROOT}/themes/custom/\${DRUPAL_THEME} run lint"
+        run: |
+          [ "${VORTEX_FRONTEND_BUILD_SKIP:-0}" = "1" ] && exit 0
+          docker compose exec -T cli bash -c "yarn --cwd=\${WEBROOT}/themes/custom/\${DRUPAL_THEME} run lint"
         continue-on-error: ${{ vars.VORTEX_CI_NODEJS_LINT_IGNORE_FAILURE == '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
#;< DRUPAL_THEME
- name: Lint theme code with NodeJS linters
if: ${{ (matrix.instance == 0 || strategy.job-total == 1) && vars.VORTEX_FRONTEND_BUILD_SKIP != '1' }}
if: ${{ vars.VORTEX_FRONTEND_BUILD_SKIP != '1' }}
run: docker compose exec -T cli bash -c "yarn --cwd=\${WEBROOT}/themes/custom/\${DRUPAL_THEME} run lint"
#;< DRUPAL_THEME
- name: Lint theme code with NodeJS linters
run: |
[ "${VORTEX_FRONTEND_BUILD_SKIP:-0}" = "1" ] && exit 0
docker compose exec -T cli bash -c "yarn --cwd=\${WEBROOT}/themes/custom/\${DRUPAL_THEME} run lint"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/build-test-deploy.yml around lines 277 - 280, The step
"Lint theme code with NodeJS linters" currently uses GitHub vars in its if:
condition which won't see values written at runtime; remove the if: condition
and instead guard the command at runtime by checking the environment variable
VORTEX_FRONTEND_BUILD_SKIP inside the run shell (e.g. wrap or prefix the
existing docker compose command with a bash check like if [
"$VORTEX_FRONTEND_BUILD_SKIP" = "1" ]; then echo "skipping frontend build"; else
<original docker compose exec -T cli bash -c "yarn
--cwd=${WEBROOT}/themes/custom/${DRUPAL_THEME} run lint">; fi) so the
.env-loaded $VORTEX_FRONTEND_BUILD_SKIP is honored at execution time.

Comment on lines +284 to +289
build:
runs-on: ubuntu-latest
needs: database
#;< !PROVISION_TYPE_PROFILE
if: ${{ github.event_name != 'schedule' && (github.event_name == 'push' || !startsWith(github.head_ref, 'project/')) }}
#;> !PROVISION_TYPE_PROFILE
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

python - <<'PY'
from pathlib import Path

path = Path(".github/workflows/build-test-deploy.yml")
lines = path.read_text().splitlines()

out = []
skip = False
for line in lines:
    stripped = line.strip()
    if stripped == "#;< !PROVISION_TYPE_PROFILE":
        skip = True
        continue
    if stripped == "#;> !PROVISION_TYPE_PROFILE":
        skip = False
        continue
    if not skip:
        out.append(line)

generated = "\n".join(out)
print("database job present:", "\n  database:\n" in "\n" + generated + "\n")
print("needs database present:", "needs: database" in generated)
PY

Repository: drevops/vortex

Length of output: 114


Guard needs: database for profile-generated workflows.

database is removed by the !PROVISION_TYPE_PROFILE template block, but the needs: database line (line 286) remains unconditionally. This creates an invalid workflow where the build job references a non-existent job after template processing.

Suggested fix
  build:
    runs-on: ubuntu-latest
+   #;< !PROVISION_TYPE_PROFILE
    needs: database
    #;< !PROVISION_TYPE_PROFILE
    if: ${{ github.event_name != 'schedule' && (github.event_name == 'push' || !startsWith(github.head_ref, 'project/')) }}
    #;> !PROVISION_TYPE_PROFILE
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/build-test-deploy.yml around lines 284 - 289, The build
job currently has an unconditional "needs: database" which becomes invalid when
the !PROVISION_TYPE_PROFILE template removes the database job; update the build
job to only include the "needs: database" line when the profile is present by
moving or wrapping that line inside the same !PROVISION_TYPE_PROFILE template
block (i.e., add the same template guard markers around the needs: database line
so it is removed together with the database job), ensuring the build job
definition remains valid after template processing.

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)
.circleci/config.yml (1)

467-470: ⚠️ Potential issue | 🟠 Major

Gate workspace persistence to single executor to avoid attach_workspace conflicts.

With parallelism: 2 on line 312, both parallel executors run the persist_to_workspace step at lines 467-470, persisting the same code/ path. According to CircleCI's official workspace documentation, when multiple concurrent executors persist the same filename/path, the downstream attach_workspace will error when it attempts to apply the conflicting layers.

Gate the export/persist steps (lines 363-370 and 467-470) to the primary executor only:

[ "${CIRCLE_NODE_TOTAL:-1}" -gt 1 ] && [ "${CIRCLE_NODE_INDEX:-0}" -ne 0 ] && exit 0

This pattern is already used elsewhere in the config for similar parallelism scenarios.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.circleci/config.yml around lines 467 - 470, The parallel executors are both
running the persist_to_workspace step (the block that persists root:
/tmp/workspace paths: - code) which causes attach_workspace conflicts; guard the
workspace export/persist steps (the export/persist block and the
persist_to_workspace block) so only the primary executor runs them by adding the
same primary-executor guard used elsewhere (check CIRCLE_NODE_TOTAL and
CIRCLE_NODE_INDEX and exit non-primary executors early), ensuring only the first
node performs the persist_to_workspace operation.
♻️ Duplicate comments (2)
.github/workflows/build-test-deploy.yml (2)

284-289: ⚠️ Potential issue | 🟠 Major

Guard needs: database for profile-generated workflows.

The database job (lines 57-167) is wrapped in #;< !PROVISION_TYPE_PROFILE / #;> !PROVISION_TYPE_PROFILE template markers, but needs: database at line 286 is not guarded. After template processing for profile-type projects, this creates an invalid workflow referencing a non-existent job.

Suggested fix
  build:
    runs-on: ubuntu-latest
+   #;< !PROVISION_TYPE_PROFILE
    needs: database
-   #;< !PROVISION_TYPE_PROFILE
    if: ${{ github.event_name != 'schedule' && (github.event_name == 'push' || !startsWith(github.head_ref, 'project/')) }}
    #;> !PROVISION_TYPE_PROFILE
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/build-test-deploy.yml around lines 284 - 289, The
workflow's build job references needs: database even though the database job is
conditionally removed by the PROVISION_TYPE_PROFILE template markers; update the
build job (job name "build") to guard or remove the needs: database dependency
under the same template markers (i.e., wrap the needs: database line with the
#;< !PROVISION_TYPE_PROFILE and #;> !PROVISION_TYPE_PROFILE markers or add an
equivalent conditional) so the reference to the database job is only present
when the database job is generated.

277-281: ⚠️ Potential issue | 🟠 Major

Switch this step to check runtime environment variables instead of repository variables.

Line 279 uses vars.VORTEX_FRONTEND_BUILD_SKIP, which reads GitHub UI configuration variables. However, line 197 loads VORTEX_FRONTEND_BUILD_SKIP from .env into the runtime environment via $GITHUB_ENV. Since $GITHUB_ENV writes do not affect the vars context, repos that disable frontend builds in .env will not be honored by the if condition—the step will still run.

Suggested fix using shell guard
      - name: Lint theme code with NodeJS linters
-        if: ${{ vars.VORTEX_FRONTEND_BUILD_SKIP != '1' }}
-        run: docker compose exec -T cli bash -c "yarn --cwd=\${WEBROOT}/themes/custom/\${DRUPAL_THEME} run lint"
+        run: |
+          [ "${VORTEX_FRONTEND_BUILD_SKIP:-0}" = "1" ] && exit 0
+          docker compose exec -T cli bash -c "yarn --cwd=\${WEBROOT}/themes/custom/\${DRUPAL_THEME} run lint"
        continue-on-error: ${{ vars.VORTEX_CI_NODEJS_LINT_IGNORE_FAILURE == '1' }}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/build-test-deploy.yml around lines 277 - 281, The workflow
step "Lint theme code with NodeJS linters" currently uses the repository vars
context (vars.VORTEX_FRONTEND_BUILD_SKIP) which doesn't reflect values written
to $GITHUB_ENV at runtime; update the step to check the runtime environment
instead (use env.VORTEX_FRONTEND_BUILD_SKIP in the step's if condition) or add a
shell guard at the start of the run command to exit early when
VORTEX_FRONTEND_BUILD_SKIP equals "1"; also preserve the continue-on-error
behavior using the existing VORTEX_CI_NODEJS_LINT_IGNORE_FAILURE variable
(env.VORTEX_CI_NODEJS_LINT_IGNORE_FAILURE) so the behavior remains consistent.
🤖 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/config.yml:
- Around line 352-357: The artifact export step named "Export built codebase" is
copying /app to /tmp/workspace/code before the app is fully prepared; move the
entire step that runs docker compose cp -L cli:"/app/." "/tmp/workspace/code"
(and the mkdir/du around it) so it executes after the build/provisioning steps
(specifically after the composer install and the site provisioning steps) so
artifacts snapshot the final prepared app rather than a pre-build copy.

---

Outside diff comments:
In @.circleci/config.yml:
- Around line 467-470: The parallel executors are both running the
persist_to_workspace step (the block that persists root: /tmp/workspace paths: -
code) which causes attach_workspace conflicts; guard the workspace
export/persist steps (the export/persist block and the persist_to_workspace
block) so only the primary executor runs them by adding the same
primary-executor guard used elsewhere (check CIRCLE_NODE_TOTAL and
CIRCLE_NODE_INDEX and exit non-primary executors early), ensuring only the first
node performs the persist_to_workspace operation.

---

Duplicate comments:
In @.github/workflows/build-test-deploy.yml:
- Around line 284-289: The workflow's build job references needs: database even
though the database job is conditionally removed by the PROVISION_TYPE_PROFILE
template markers; update the build job (job name "build") to guard or remove the
needs: database dependency under the same template markers (i.e., wrap the
needs: database line with the #;< !PROVISION_TYPE_PROFILE and #;>
!PROVISION_TYPE_PROFILE markers or add an equivalent conditional) so the
reference to the database job is only present when the database job is
generated.
- Around line 277-281: The workflow step "Lint theme code with NodeJS linters"
currently uses the repository vars context (vars.VORTEX_FRONTEND_BUILD_SKIP)
which doesn't reflect values written to $GITHUB_ENV at runtime; update the step
to check the runtime environment instead (use env.VORTEX_FRONTEND_BUILD_SKIP in
the step's if condition) or add a shell guard at the start of the run command to
exit early when VORTEX_FRONTEND_BUILD_SKIP equals "1"; also preserve the
continue-on-error behavior using the existing
VORTEX_CI_NODEJS_LINT_IGNORE_FAILURE variable
(env.VORTEX_CI_NODEJS_LINT_IGNORE_FAILURE) so the behavior remains consistent.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: de78d679-f961-4721-a4d6-df3391cde14c

📥 Commits

Reviewing files that changed from the base of the PR and between dcafdb2 and 930c65b.

📒 Files selected for processing (2)
  • .circleci/config.yml
  • .github/workflows/build-test-deploy.yml

Comment on lines +352 to +357
name: Export built codebase
command: |
echo "${VORTEX_DEPLOY_TYPES:-}" | grep -vq "artifact" && exit 0 || true
mkdir -p "/tmp/workspace/code"
docker compose cp -L cli:"/app/." "/tmp/workspace/code"
du -sh "/tmp/workspace/code"
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Move artifact export after the app is fully prepared.

Line 73 makes artifact deploys read from /tmp/workspace/code, but Line 356 snapshots that directory before Line 364 runs composer install and before Line 379 provisions the site. When VORTEX_DEPLOY_TYPES includes artifact, deploy will publish a pre-build snapshot instead of the prepared app.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.circleci/config.yml around lines 352 - 357, The artifact export step named
"Export built codebase" is copying /app to /tmp/workspace/code before the app is
fully prepared; move the entire step that runs docker compose cp -L cli:"/app/."
"/tmp/workspace/code" (and the mkdir/du around it) so it executes after the
build/provisioning steps (specifically after the composer install and the site
provisioning steps) so artifacts snapshot the final prepared app rather than a
pre-build copy.

@github-actions

This comment has been minimized.

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-03-10 00:09:04

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.71% (179/189)

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 (1)
.github/workflows/build-test-deploy.yml (1)

165-169: ⚠️ Potential issue | 🟠 Major

This guard ignores the .env-loaded skip flag.

Line 167 reads vars.VORTEX_FRONTEND_BUILD_SKIP, but Line 85 populates VORTEX_FRONTEND_BUILD_SKIP by writing to $GITHUB_ENV. GitHub documents vars as repository/organization/environment configuration variables, while $GITHUB_ENV creates runner environment variables for later steps; GitHub also evaluates if: before sending the step to the runner. As written, repos that disable frontend builds in .env will still execute theme lint here. CircleCI already uses the safer runtime shell guard in the equivalent step. (docs.github.com)

🐛 Suggested fix
       - name: Lint theme code with NodeJS linters
-        if: ${{ vars.VORTEX_FRONTEND_BUILD_SKIP != '1' }}
-        run: docker compose exec -T cli bash -c "yarn --cwd=\${WEBROOT}/themes/custom/\${DRUPAL_THEME} run lint"
+        run: |
+          [ "${VORTEX_FRONTEND_BUILD_SKIP:-0}" = "1" ] && exit 0
+          docker compose exec -T cli bash -c "yarn --cwd=\${WEBROOT}/themes/custom/\${DRUPAL_THEME} run lint"
         continue-on-error: ${{ vars.VORTEX_CI_NODEJS_LINT_IGNORE_FAILURE == '1' }}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/build-test-deploy.yml around lines 165 - 169, The step
"Lint theme code with NodeJS linters" currently uses an if: condition checking
vars.VORTEX_FRONTEND_BUILD_SKIP which is only for repository/organization
variables and is evaluated before $GITHUB_ENV is applied; change the condition
to check the runner environment variable set via $GITHUB_ENV by replacing if:
${{ vars.VORTEX_FRONTEND_BUILD_SKIP != '1' }} with if: ${{
env.VORTEX_FRONTEND_BUILD_SKIP != '1' }} so the runtime .env-written flag
(VORTEX_FRONTEND_BUILD_SKIP) actually prevents the step from running.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@tests/phpunit/CircleCiConfigTest.php`:
- Around line 50-52: Tests currently index into
$this->config['workflows']['commit']['jobs'] by position which breaks when job
ordering changes; add a private helper method (e.g. workflowJob(string
$workflow, string $job)) that iterates
$this->config['workflows'][$workflow]['jobs'], returns the matching job entry
when isset($entry[$job]) and calls self::fail(...) if not found, then update
testDeployBranchRegex to call $deploy = $this->workflowJob('commit','deploy')
and assert against $deploy['filters']['branches']['only'], and update the tag
test (testDeployTagRegex) to resolve 'deploy-tags' similarly and assert against
its ['filters']['tags']['only'].

---

Duplicate comments:
In @.github/workflows/build-test-deploy.yml:
- Around line 165-169: The step "Lint theme code with NodeJS linters" currently
uses an if: condition checking vars.VORTEX_FRONTEND_BUILD_SKIP which is only for
repository/organization variables and is evaluated before $GITHUB_ENV is
applied; change the condition to check the runner environment variable set via
$GITHUB_ENV by replacing if: ${{ vars.VORTEX_FRONTEND_BUILD_SKIP != '1' }} with
if: ${{ env.VORTEX_FRONTEND_BUILD_SKIP != '1' }} so the runtime .env-written
flag (VORTEX_FRONTEND_BUILD_SKIP) actually prevents the step from running.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 958d395d-cf67-4b34-9bf7-d1aaf5f8c7f1

📥 Commits

Reviewing files that changed from the base of the PR and between 930c65b and 37ce283.

⛔ Files ignored due to path filters (66)
  • .vortex/installer/tests/Fixtures/handler_process/_baseline/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/ciprovider_circleci/.circleci/config.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/db_download_source_acquia/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deploy_types_all_circleci/.circleci/config.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/config.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/deploy_types_none_gha/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deps_updates_provider_ci_circleci/.circleci/config.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/hosting_acquia/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/hosting_project_name___acquia/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_disabled_circleci/.circleci/config.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_download_source_acquia/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_download_source_ftp/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_download_source_lagoon/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_download_source_s3/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_download_source_url/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_enabled/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_enabled_circleci/.circleci/config.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/migration_enabled_lagoon/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/provision_profile/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/theme_claro/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/theme_olivero/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/theme_stark/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/timezone_circleci/.circleci/config.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/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_be_lint_circleci/.circleci/config.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/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_be_tests_circleci/.circleci/config.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_fe_lint/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_fe_lint_circleci/.circleci/config.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_fe_lint_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_fe_lint_no_theme/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_fe_lint_no_theme_circleci/.circleci/config.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_fe_lint_no_theme_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_behat/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_behat_circleci/.circleci/config.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_eslint/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_eslint_circleci/.circleci/config.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_eslint_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_eslint_no_theme/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpcs/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpcs_circleci/.circleci/config.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/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpmd_circleci/.circleci/config.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/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpstan_circleci/.circleci/config.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/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpunit_circleci/.circleci/config.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_rector/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_rector_circleci/.circleci/config.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/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_stylelint_circleci/.circleci/config.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_stylelint_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_stylelint_no_theme/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_none/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
📒 Files selected for processing (3)
  • .circleci/config.yml
  • .github/workflows/build-test-deploy.yml
  • tests/phpunit/CircleCiConfigTest.php

Comment on lines 50 to 52
public function testDeployBranchRegex(string $branch, bool $expected = TRUE): void {
$this->assertEquals($expected, preg_match($this->config['workflows']['commit']['jobs'][2]['deploy']['filters']['branches']['only'], $branch));
$this->assertEquals($expected, preg_match($this->config['workflows']['commit']['jobs'][3]['deploy']['filters']['branches']['only'], $branch));
}
Copy link

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Stop keying these assertions off workflow order.

Line 51 and Line 225 now depend on the exact position of deploy / deploy-tags inside workflows.commit.jobs. This PR already had to bump those indices once for lint; the next unrelated job insertion will break these tests again even if the regexes stay correct. Resolve the workflow entry by job name before reading filters.

♻️ Suggested direction
private function workflowJob(string $workflow, string $job): array {
  foreach ($this->config['workflows'][$workflow]['jobs'] as $entry) {
    if (isset($entry[$job])) {
      return $entry[$job];
    }
  }

  self::fail(sprintf('Job "%s" not found in workflow "%s".', $job, $workflow));
}

public function testDeployBranchRegex(string $branch, bool $expected = TRUE): void {
  $deploy = $this->workflowJob('commit', 'deploy');
  $this->assertEquals($expected, preg_match($deploy['filters']['branches']['only'], $branch));
}

public function testDeployTagRegex(string $branch, bool $expected = TRUE): void {
  $deployTags = $this->workflowJob('commit', 'deploy-tags');
  $this->assertEquals($expected, preg_match($deployTags['filters']['tags']['only'], $branch));
}

Also applies to: 224-226

🤖 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 - 52, Tests currently
index into $this->config['workflows']['commit']['jobs'] by position which breaks
when job ordering changes; add a private helper method (e.g. workflowJob(string
$workflow, string $job)) that iterates
$this->config['workflows'][$workflow]['jobs'], returns the matching job entry
when isset($entry[$job]) and calls self::fail(...) if not found, then update
testDeployBranchRegex to call $deploy = $this->workflowJob('commit','deploy')
and assert against $deploy['filters']['branches']['only'], and update the tag
test (testDeployTagRegex) to resolve 'deploy-tags' similarly and assert against
its ['filters']['tags']['only'].

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-03-10 00:13:42

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.71% (179/189)

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-03-10 00:13:57

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.71% (179/189)

@AlexSkrypnyk AlexSkrypnyk force-pushed the feature/2154-split-lint branch from 37ce283 to 5fc1740 Compare March 10, 2026 00:38
@github-actions

This comment has been minimized.

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-03-10 00:44:26

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.71% (179/189)

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.

♻️ Duplicate comments (3)
.circleci/config.yml (1)

120-123: 🧹 Nitpick | 🔵 Trivial

composer validate is still duplicated with build.

The same check still runs in the build job, so every pipeline pays for it twice. Keep one canonical gate or add a brief note if the redundancy is intentional.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.circleci/config.yml around lines 120 - 123, The "Validate Composer
configuration" run step (the command 'composer validate --strict || [
"${VORTEX_CI_COMPOSER_VALIDATE_IGNORE_FAILURE:-0}" -eq 1 ]') duplicates the same
check already executed in the build job; remove the duplicate step from one of
the jobs (either delete this run step or the corresponding one in the build job)
or consolidate into a single canonical job/responsibility and add a short
comment/note indicating why it is the single gate, ensuring only one CI stage
runs 'composer validate' to avoid double work.
tests/phpunit/CircleCiConfigTest.php (1)

50-52: 🛠️ Refactor suggestion | 🟠 Major

Stop keying these assertions to workflow order.

jobs[3] and jobs[4] will break again on the next unrelated workflow insertion. Resolve deploy and deploy-tags by name before reading their filters.

Also applies to: 224-226

🤖 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 - 52, The test
testDeployBranchRegex is brittle because it indexes
$this->config['workflows']['commit']['jobs'][3] (and similarly jobs[4]) by
position; change the test to locate the job entries by name instead: iterate or
array-search $this->config['workflows']['commit']['jobs'] for the job whose
key/name equals 'deploy' (and 'deploy-tags') and then read
['deploy']['filters']['branches']['only'] for the preg_match assertion; apply
the same change to the duplicate assertions around lines 224-226 so both checks
resolve jobs by name rather than by numeric index.
.github/workflows/build-test-deploy.yml (1)

165-169: ⚠️ Potential issue | 🟠 Major

Use the runtime VORTEX_FRONTEND_BUILD_SKIP here.

This step still checks vars.*, so a repo that sets VORTEX_FRONTEND_BUILD_SKIP=1 in .env will run theme lint anyway. Guard inside run: so the value loaded through $GITHUB_ENV is honored.

Suggested fix
       - name: Lint theme code with NodeJS linters
-        if: ${{ vars.VORTEX_FRONTEND_BUILD_SKIP != '1' }}
-        run: docker compose exec -T cli bash -c "yarn --cwd=\${WEBROOT}/themes/custom/\${DRUPAL_THEME} run lint"
+        run: |
+          [ "${VORTEX_FRONTEND_BUILD_SKIP:-0}" = "1" ] && exit 0
+          docker compose exec -T cli bash -c "yarn --cwd=\${WEBROOT}/themes/custom/\${DRUPAL_THEME} run lint"
         continue-on-error: ${{ vars.VORTEX_CI_NODEJS_LINT_IGNORE_FAILURE == '1' }}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/build-test-deploy.yml around lines 165 - 169, The step
uses the workflow conditional if: ${{ vars.VORTEX_FRONTEND_BUILD_SKIP != '1' }}
which only reads repository variables at workflow compile time instead of the
runtime environment variable VORTEX_FRONTEND_BUILD_SKIP; to fix, remove/replace
the if check and guard the execution inside the run command by prefixing the
docker compose call with a shell conditional that checks the runtime env var
(e.g. test or [ "$VORTEX_FRONTEND_BUILD_SKIP" != "1" ] && docker compose exec -T
cli bash -c "yarn --cwd=\${WEBROOT}/themes/custom/\${DRUPAL_THEME} run lint"),
keeping the existing continue-on-error behavior unchanged so the step still can
be skipped at runtime when VORTEX_FRONTEND_BUILD_SKIP=1.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In @.circleci/config.yml:
- Around line 120-123: The "Validate Composer configuration" run step (the
command 'composer validate --strict || [
"${VORTEX_CI_COMPOSER_VALIDATE_IGNORE_FAILURE:-0}" -eq 1 ]') duplicates the same
check already executed in the build job; remove the duplicate step from one of
the jobs (either delete this run step or the corresponding one in the build job)
or consolidate into a single canonical job/responsibility and add a short
comment/note indicating why it is the single gate, ensuring only one CI stage
runs 'composer validate' to avoid double work.

In @.github/workflows/build-test-deploy.yml:
- Around line 165-169: The step uses the workflow conditional if: ${{
vars.VORTEX_FRONTEND_BUILD_SKIP != '1' }} which only reads repository variables
at workflow compile time instead of the runtime environment variable
VORTEX_FRONTEND_BUILD_SKIP; to fix, remove/replace the if check and guard the
execution inside the run command by prefixing the docker compose call with a
shell conditional that checks the runtime env var (e.g. test or [
"$VORTEX_FRONTEND_BUILD_SKIP" != "1" ] && docker compose exec -T cli bash -c
"yarn --cwd=\${WEBROOT}/themes/custom/\${DRUPAL_THEME} run lint"), keeping the
existing continue-on-error behavior unchanged so the step still can be skipped
at runtime when VORTEX_FRONTEND_BUILD_SKIP=1.

In `@tests/phpunit/CircleCiConfigTest.php`:
- Around line 50-52: The test testDeployBranchRegex is brittle because it
indexes $this->config['workflows']['commit']['jobs'][3] (and similarly jobs[4])
by position; change the test to locate the job entries by name instead: iterate
or array-search $this->config['workflows']['commit']['jobs'] for the job whose
key/name equals 'deploy' (and 'deploy-tags') and then read
['deploy']['filters']['branches']['only'] for the preg_match assertion; apply
the same change to the duplicate assertions around lines 224-226 so both checks
resolve jobs by name rather than by numeric index.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: d6c43f2d-cd26-4070-bc8e-9d65eb3136ec

📥 Commits

Reviewing files that changed from the base of the PR and between 37ce283 and 5fc1740.

⛔ Files ignored due to path filters (66)
  • .vortex/installer/tests/Fixtures/handler_process/_baseline/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/ciprovider_circleci/.circleci/config.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/db_download_source_acquia/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deploy_types_all_circleci/.circleci/config.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/config.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/deploy_types_none_gha/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/deps_updates_provider_ci_circleci/.circleci/config.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/hosting_acquia/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/hosting_project_name___acquia/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_disabled_circleci/.circleci/config.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_download_source_acquia/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_download_source_ftp/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_download_source_lagoon/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_download_source_s3/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_download_source_url/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_enabled/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/migration_enabled_circleci/.circleci/config.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/migration_enabled_lagoon/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/provision_profile/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/theme_claro/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/theme_olivero/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/theme_stark/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/timezone_circleci/.circleci/config.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/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_be_lint_circleci/.circleci/config.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/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_be_tests_circleci/.circleci/config.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_fe_lint/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_fe_lint_circleci/.circleci/config.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_fe_lint_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_fe_lint_no_theme/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_fe_lint_no_theme_circleci/.circleci/config.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_groups_no_fe_lint_no_theme_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_behat/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_behat_circleci/.circleci/config.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_eslint/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_eslint_circleci/.circleci/config.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_eslint_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_eslint_no_theme/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpcs/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpcs_circleci/.circleci/config.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/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpmd_circleci/.circleci/config.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/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpstan_circleci/.circleci/config.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/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_phpunit_circleci/.circleci/config.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_rector/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_rector_circleci/.circleci/config.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/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_stylelint_circleci/.circleci/config.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_stylelint_circleci/tests/phpunit/CircleCiConfigTest.php is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_no_stylelint_no_theme/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
  • .vortex/installer/tests/Fixtures/handler_process/tools_none/.github/workflows/build-test-deploy.yml is excluded by !.vortex/installer/tests/Fixtures/**
📒 Files selected for processing (4)
  • .circleci/config.yml
  • .circleci/vortex-test-common.yml
  • .github/workflows/build-test-deploy.yml
  • tests/phpunit/CircleCiConfigTest.php
💤 Files with no reviewable changes (1)
  • .circleci/vortex-test-common.yml

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-03-10 00:47:15

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.71% (179/189)

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-03-10 01:53:44

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.71% (179/189)

@codecov
Copy link

codecov bot commented Mar 10, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 78.35%. Comparing base (a990413) to head (609f307).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2346      +/-   ##
==========================================
- Coverage   78.86%   78.35%   -0.52%     
==========================================
  Files         124      117       -7     
  Lines        6488     6329     -159     
  Branches       44        0      -44     
==========================================
- Hits         5117     4959     -158     
+ Misses       1371     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.

@AlexSkrypnyk AlexSkrypnyk force-pushed the feature/2154-split-lint branch from 5fc1740 to 6b91529 Compare March 10, 2026 02:20
@github-actions

This comment has been minimized.

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-03-10 02:26:21

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.71% (179/189)

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-03-10 02:29:25

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.71% (179/189)

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-03-10 02:29:43

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.71% (179/189)

@AlexSkrypnyk AlexSkrypnyk force-pushed the feature/2154-split-lint branch from 6b91529 to 101818d Compare March 10, 2026 04:54
@AlexSkrypnyk AlexSkrypnyk force-pushed the feature/2154-split-lint branch from 101818d to 609f307 Compare March 10, 2026 04:56
@github-actions

This comment has been minimized.

@github-actions
Copy link

Code Coverage Report:
  2026-03-10 05:01:20

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.71% (179/189)

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-03-10 05:01:55

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.71% (179/189)

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-03-10 05:05:11

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.71% (179/189)

@AlexSkrypnyk
Copy link
Member Author

Code Coverage Report:
  2026-03-10 05:05:29

 Summary:
  Classes:  0.00% (0/1)
  Methods:  0.00% (0/2)
  Lines:   94.71% (179/189)

@AlexSkrypnyk AlexSkrypnyk merged commit eef8bbf into main Mar 10, 2026
30 checks passed
@AlexSkrypnyk AlexSkrypnyk deleted the feature/2154-split-lint branch March 10, 2026 05:26
@github-project-automation github-project-automation bot moved this from BACKLOG to Release queue in Vortex Mar 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Release queue

Development

Successfully merging this pull request may close these issues.

Split Linting into own job in GHA and CircleCI

1 participant