Skip to content

CI/CD Pipeline ​

Logidav uses a Jenkins-based CI/CD pipeline defined in Jenkinsfile. The pipeline supports three modes -- full, fast, and skip -- depending on the branch and target.

Branch Policy ​

View diagram source
flowchart TD
    A[Push / PR] --> B{Target branch?}
    B -->|main| C[Full Mode]
    B -->|develop| D[Fast Mode]
    B -->|other| E[Skip / Optional]
    C --> F[All checks + Docker build]
    D --> G[Tests + basic PHPStan]
    E --> H[No CI unless configured]

Diagram

BranchCI ModeWhat Runs
main or PR to mainfullTests, PHPStan, format check, Docker build
develop or PR to developfastTests, basic PHPStan
other branchesskipOptional, no automatic pipeline

Pipeline Stages ​

The full pipeline runs through these stages sequentially:

View diagram source
flowchart LR
    A[Branch Policy] --> B[Checkout]
    B --> C[Prepare Config]
    C --> D[Composer Install]
    D --> E[Schema Dump]
    E --> F[PHPUnit Tests]
    F --> G[PHPStan]
    G --> H[Format Check]
    H --> I[Docker Build]
    I --> J[Email Notification]

Diagram

In fast mode, the pipeline skips the format check and Docker build stages, running only through PHPStan.

Stage Details ​

Branch Policy -- Determines whether to run full, fast, or skip based on the branch name and PR target.

Prepare Config -- CI merges .github/parameters.yml into app/config/parameters.yml to provide test-safe configuration values (test database credentials, mock API keys, etc.).

Composer Install -- Installs PHP dependencies. Uses Composer 1 for the main install step due to legacy compatibility requirements.

Schema Dump -- Runs doctrine:schema:update --dump-sql to detect pending schema changes. Review any SQL output carefully -- unexpected schema changes can indicate missing migrations.

PHPUnit Tests -- Runs the full test suite with SYMFONY_DEPRECATIONS_HELPER=weak_vendors. All tests must pass.

PHPStan -- Static analysis at the configured level. Runs with a 2G memory limit (--memory-limit=2G). Both full and fast modes include this check.

Format Check (full mode only) -- Verifies code style compliance using php-cs-fixer --dry-run. Fails if any file does not match PSR-2/PSR-12 standards.

Docker Build (full mode only) -- Builds and pushes Docker images to GHCR (GitHub Container Registry) for deployment.

Email Notification -- Sends build results to committers. Failure emails include the culprit list to identify who introduced the breaking change.

Interpreting Build Results ​

Test Failures ​

Check the PHPUnit output in the Jenkins console log. Common causes:

  • Missing mock setup -- a test calls a method that was not mocked
  • Database state -- test assumes data that does not exist in the CI database
  • Environment differences -- code depends on parameters.yml values not present in CI config

PHPStan Failures ​

Fix type errors reported by PHPStan. The analysis runs with a 2G memory limit, so out-of-memory errors are rare but possible for very large changesets.

bash
# Run locally to reproduce
vendor/bin/phpstan analyse --memory-limit=2G

Format Failures ​

The format check uses php-cs-fixer. Fix locally and commit:

bash
# Check what needs fixing
vendor/bin/php-cs-fixer fix --dry-run --diff

# Apply fixes
vendor/bin/php-cs-fixer fix

# Commit the style fixes
git add -p && git commit -m "style: apply php-cs-fixer formatting"

Schema Dump Warnings ​

If the schema dump stage produces unexpected SQL, it means your entities are out of sync with the database schema. Review the output:

  • Expected changes: new columns/tables from your PR -- verify the SQL is correct
  • Unexpected changes: changes you did not make -- investigate before merging

WARNING

Do not ignore schema dump warnings. Unexpected SQL output often indicates a missing or incorrect migration that could cause problems in production.

Docker Images ​

The pipeline builds two Docker images, pushed to GHCR on main branch changes:

ImageDockerfilePurpose
PHP CLIDockerfile.ciPHP 7.3 CLI with required extensions for running tests
Jenkins AgentDockerfile.jenkins-agentJenkins agent with Composer 1 + 2 installed

These images are used by the CI pipeline itself. Changes to Dockerfiles on the main branch trigger a rebuild and push.

Config Preparation ​

CI configuration lives in .github/parameters.yml and is merged into the application config during the Prepare Config stage. This file contains:

  • Test database connection details
  • Mock API credentials (non-functional, for test isolation)
  • CI-specific feature flags

DANGER

Never put real production credentials in .github/parameters.yml. This file is committed to the repository and visible to all developers.

Running CI Checks Locally ​

Before pushing, replicate the CI checks locally:

bash
# 1. Tests
SYMFONY_DEPRECATIONS_HELPER=weak_vendors vendor/bin/simple-phpunit -c phpunit.xml.dist

# 2. PHPStan
vendor/bin/phpstan analyse --memory-limit=2G

# 3. Code style (full mode only)
vendor/bin/php-cs-fixer fix --dry-run --diff

# 4. Schema check
php bin/console doctrine:schema:update --dump-sql -e=dev

If all four pass locally, your PR should pass CI.

See Also ​

Internal developer documentation for Menzzo systems.