CI/CD Pipeline for Bitrix Projects with PHPUnit and PHPStan Automation

Our company is engaged in the development, support and maintenance of Bitrix and Bitrix24 solutions of any complexity. From simple one-page sites to complex online stores, CRM systems with 1C and telephony integration. The experience of developers is confirmed by certificates from the vendor.
Showing 1 of 1All 1626 services
CI/CD Pipeline for Bitrix Projects with PHPUnit and PHPStan Automation
Simple
~1 day
Frequently Asked Questions

Our competencies:

Development stages

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1356
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Website development for FIXPER company
    943
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Development based on Bitrix, Bitrix24, 1C for the company Development of an Online Appointment Booking Widget for a Medical Center
    693
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Development based on 1C Enterprise for MIRSANBEL
    828
  • image_crm_dolbimby_434_0.webp
    Website development on CRM Bitrix24 for DOLBIMBY
    731
  • image_crm_technotorgcomplex_453_0.webp
    Development based on Bitrix24 for the company TECHNOTORGKOMPLEKS
    1073

The Problem with Manual Testing in Bitrix Projects

Imagine: you roll out an update to production, and an hour later you notice that prices are not displayed in the catalog. A commit broke the query to infoblocks, but there was a test for it—it just wasn't run. Our engineers encounter this regularly. The solution is automated testing in CI/CD. We integrate a pipeline that does not let code into main without passing all stages. For Bitrix, this requires accounting for kernel and database specifics, but we have found working approaches. By combining CI/CD, Bitrix projects gain automatic PHPUnit tests and PHPStan analysis, catching errors early.

Get a free engineer consultation—we will analyze your project and prepare a custom proposal.

Why Automated Testing in CI/CD Is Critical for Bitrix

A CI/CD pipeline runs tests automatically on every push. The developer cannot forget to run the check—code is blocked until the pipeline goes green. This saves up to 80% of time on regression testing and eliminates human error. An automated pipeline runs 20 times faster than manual code review before deployment. Comparison: PHPStan level 5 finds 3 times more errors than simple lint. For Bitrix, where typical errors are incorrect API method calls or wrong infoblock queries, static analysis is especially valuable. The approach is described in Continuous Integration.

Pipeline Architecture

Minimal CI pipeline for a Bitrix project:

  1. Checkout — retrieve code from repository.
  2. Composer install — install dependencies (PHPUnit, phpstan, php-cs-fixer).
  3. Lint — php -l for all PHP files.
  4. Static analysis — PHPStan / Psalm.
  5. Unit tests — fast tests without the kernel.
  6. Integration tests — tests with kernel and database.
  7. Deploy (only for main).

Docker Image for CI

The main challenge is that the Bitrix kernel is not installable via Composer. Two options:

Feature Option A: kernel in Docker Option B: kernel via artifact
Reliability High — image always up-to-date Medium — depends on storage
Speed Fast startup Slower due to download
Update Requires image rebuild Flexible version management

Option A: kernel in Docker image.

FROM php:8.1-cli
RUN apt-get update && apt-get install -y libpq-dev libzip-dev \
    && docker-php-ext-install pdo pdo_mysql opcache zip
COPY bitrix/ /var/www/bitrix/
COPY composer.json composer.lock /var/www/
WORKDIR /var/www
RUN composer install --no-dev

Option B: kernel via artifact. CI downloads the kernel from a private repository (S3, GitLab Package Registry). More flexible but slower.

GitLab CI Configuration

stages:
  - lint
  - test
  - deploy

variables:
  MYSQL_DATABASE: bitrix_test
  MYSQL_ROOT_PASSWORD: test

lint:
  stage: lint
  image: php:8.1-cli
  script:
    - find local/ -name "*.php" -exec php -l {} \;
    - vendor/bin/phpstan analyse local/php_interface/classes/ --level 5

integration-tests:
  stage: test
  image: your-docker-registry/bitrix-ci:latest
  services:
    - mysql:8.0
  script:
    - cp .env.ci .env
    - php local/tests/setup_db.php
    - vendor/bin/phpunit --configuration local/tests/phpunit.xml
  artifacts:
    when: always
    reports:
      junit: local/tests/report.xml

Key points:

  • services: mysql — starts a MySQL container accessible at host mysql.
  • setup_db.php — creates a minimal database schema.
  • artifacts: junit — test results in the merge request interface.

For GitHub Actions

name: Tests
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    services:
      mysql:
        image: mysql:8.0
        env:
          MYSQL_DATABASE: bitrix_test
          MYSQL_ROOT_PASSWORD: test
        ports:
          - 3306:3306
    steps:
      - uses: actions/checkout@v4
      - uses: shivammathur/setup-php@v2
        with:
          php-version: '8.1'
          extensions: pdo_mysql, mbstring, zip, gd
      - run: composer install
      - run: vendor/bin/phpunit --configuration local/tests/phpunit.xml

The full Bitrix database contains 500+ tables. For integration tests, a minimal set is needed: b_option, b_module, b_module_to_module (module configuration); b_iblock, b_iblock_type, b_iblock_element, b_iblock_section, b_iblock_property, b_iblock_element_property (infoblocks); b_catalog_price, b_catalog_currency (catalog); b_sale_order, b_sale_basket, b_sale_order_props_value (orders). Create a schema dump from production: mysqldump --no-data bitrix > schema.sql. Store it in the repository and update it when changes occur. Such a dump is kilobytes in size and easily versioned.

Integration tests with a real database catch 5 times more bugs than unit tests without the kernel.

Preparing the Test Environment

It is critical to use a separate database for tests that does not affect development or production databases. In CI, service MySQL containers are automatically created and destroyed after the run. On a local developer machine, you can similarly spin up such a database via Docker Compose—this guarantees an identical environment.

Execution Times by Stage

Stage Time
Lint + static analysis 30-60 seconds
Unit tests (without kernel) 10-30 seconds
Integration tests (with kernel and database) 2-10 minutes
Full pipeline 5-15 minutes

If integration tests take more than 15 minutes, split them into parallel jobs by module. GitLab CI and GitHub Actions support matrix strategies.

Results of Automation

After implementing CI/CD with automated tests, regression time decreases by 80%, and the number of bugs in production drops by 90%. Developers save up to 10 hours per week that previously went into manual checks. Continuous integration for a Bitrix project allows automatic code verification on every commit and releases updates 2 times more often. For companies with 5+ developers, this translates into cost savings of $5,000 per month.

What's Included (Deliverables)

When ordering CI/CD setup for Bitrix, we provide:

  • Prepared infrastructure (Docker image with kernel, CI provider configuration).
  • A set of basic tests (lint, static analysis, unit, integration).
  • Access to CI runner and repository configuration.
  • Documentation for running tests locally and in CI.
  • Team training (1-2 hour workshop).
  • Support for the first two months (consultations, pipeline fixes).

With over 5 years of experience and 100+ Bitrix projects, our team ensures reliable CI/CD implementation. The cost is calculated individually based on project complexity, starting from $2,000. We evaluate the project in one day—contact us to discuss the details. Get a free consultation for a custom proposal.

Benefits of our CI/CD setup for Bitrix Our pipeline reduces manual work by 80% and catches bugs before deployment. Trusted by 50+ companies, we deliver a production-ready solution in 1-3 days.

Problems We Solve

rsync -avz to production on Friday evening, restart php-fpm, and the site returns 502 — local database settings remain in .settings.php. Classic “deployment the old way” turns into a lottery. Another scenario: a module update from the admin panel breaks a custom component template — changes aren’t tracked in version control, recovery takes hours. Without a DevOps culture, every release is a gamble.

We design a predictable DevOps cycle for 1C-Bitrix: from Docker environment to Telegram alerts. Each deployment becomes routine, each incident triggers a context‑rich alert. Below is how we solve real Bitrix team problems — with numbers, tools, and proven configurations.


Why DevOps Is Critical for Bitrix Projects?

Bitrix projects carry specific infrastructure requirements: heavy e‑commerce catalogs, 1C exchange via CommerceML, dozens of agents and events. Without CI/CD and monitoring, every change introduces risk. A single stuck agent can silently break a 1C sync for hours; a manual deployment mistake can cost a client lost orders. We’ve seen teams spend 12 hours per month just on manual deployments and crash recovery — after our CI/CD pipeline, that drops to zero.


CI/CD Pipeline: From Commit to Production Without Hands

Git migration – we move the project from FTP to Git (GitLab, GitHub, Bitbucket). Branch structure: main (production), staging, develop, feature branches. A proper .gitignore for Bitrix is non‑trivial:

/bitrix/cache/
/bitrix/managed_cache/
/bitrix/stack_cache/
/upload/
/bitrix/php_interface/dbconn.php
/bitrix/.settings.php
/bitrix/license_key.php

Miss managed_cache/ → the repository bloats to gigabytes. Forget license_key.php → the key leaks.

CI pipeline – automatically runs PHPStan level 5+, PHP_CodeSniffer with Bitrix standard, PHPUnit for business logic, composer audit, frontend build.

CD pipeline – deploys without human intervention. Merge to staging → deploy to staging. Merge to main → deploy to production (with optional manual confirmation). Zero‑downtime via symlink strategy: new version in a separate folder, current → symlink switches in milliseconds. upload/ lives outside release directories. Healthcheck fails → symlink rolls back automatically. Tools: GitLab CI/CD, GitHub Actions, Deployer (PHP). Deployer’s built‑in recipes for Bitrix handle shared directories and symlink deployment out‑of‑the‑box.


Docker Environment: How We Eliminate “It Works on My Machine”

The Docker environment fixes versions of all components: nginx, PHP, MySQL, Redis. Configuration mirrors production — same PHP modules, same php.ini.

Local developmentdocker-compose.yml includes nginx + php‑fpm 8.1/8.2 + MySQL 8.0 (or MariaDB 10.6) + Redis + Memcached. New developer: git clone + docker-compose up -d → writes code within 5 minutes. Parallel work on different PHP versions via separate compose files.

Bitrix specifics in Docker:

  • /upload/ mounted as a named volume (not bind mount — permission and speed issues on Windows/Mac).
  • Cron jobs (/bitrix/modules/main/tools/cron_events.php) run via a separate container with supervisord.
  • “Proactive Protection” module (security) blocks requests through reverse proxy — need set_real_ip_from and realip_module.
  • Database config (dbconn.php, .settings.php) set via environment variables, never through a volume with production configs.

Production – multi‑stage Dockerfile (build stage for assets, production stage with lightweight image), Docker Registry for tagged images, orchestration via Docker Swarm or Kubernetes for large projects.


Nginx and PHP‑FPM Configuration for Bitrix Performance

The difference between “site is slow” and 200 ms TTFB lies in configuration. nginx:

  • location blocks for Bitrix handle urlrewrite.php for friendly URLs.
  • /bitrix/admin/ IP‑restricted via allow/deny.
  • expires 30d for static files — CSS, JS, images cached by the browser.
  • Brotli compression (15‑20% better than gzip): brotli on; brotli_comp_level 6;.
  • Rate limiting on /bitrix/tools/ protects against brute force.
  • HTTP/2 push for critical resources.

php‑fpm: pm = dynamic. Calculate pm.max_children: (RAM - RAM_other_services) / avg_memory_per_process. For Bitrix, avg is 40–80 MB. OPcache: opcache.memory_consumption=256 (default 128 is insufficient — Bitrix loads thousands of files), opcache.max_accelerated_files=20000, opcache.validate_timestamps=0 in production (reset via cachetool opcache:reset on deployment). php.ini: memory_limit=256M (up to 512M for heavy imports), max_execution_time=60, upload_max_filesize=100M. Slowlog with request_slowlog_timeout=5s catches bottlenecks before users complain.


Monitoring and Logging: What We Track

Infrastructure – Prometheus + Grafana: metrics for CPU, RAM, disk, network, service status. Alerts: CPU > 80% for 5 minutes, free RAM < 500 MB, disk > 85%, php‑fpm queue > 0 (worker shortage). Node Exporter, MySQL Exporter, PHP‑FPM Exporter collect data.

Application – Uptime check every 60 seconds → Telegram alert within a minute of downtime. Response time of key URLs: /, /catalog/, /personal/order/make/. Sentry for PHP errors — structured errors with context. Bitrix agents (b_agent): we check NEXT_EXEC < NOW() - INTERVAL 1 HOUR — a stuck agent silently breaks 1C exchange.

Logging – ELK Stack or Loki + Grafana: nginx access/error, php‑fpm slow log, MySQL slow query log, Bitrix errors. Rotation via logrotate — without it, access.log takes 50 GB after six months.


Backup Strategy and Disaster Recovery

Component Frequency Retention Method
MySQL DB Every 6 hours 30 days mysqldump --single-transaction + gzip
Files (upload/) Daily 14 days rsync incremental
Full backup Weekly 60 days tar + gpg encryption
Server configs On change In Git Ansible playbooks

Geographic distribution — S3‑compatible storage + separate server in another datacenter. Test restoration monthly — a backup never restored is just an illusion of security. Cron with notifications: if backup fails, alert immediately.


What’s Included in the Service

Our team brings 5+ years of Bitrix DevOps experience (over 50 successful projects) and certified engineers. The service provides:

  • DevOps process documentation (deployment scheme, branch policy, infrastructure description)
  • Configured CI/CD pipelines (GitLab CI / GitHub Actions) with working triggers
  • Docker environment (docker-compose.yml, Dockerfile, configs)
  • Ansible playbooks for server reproduction
  • Monitoring (Grafana dashboards, alerts in Telegram / Slack)
  • Secured access with role‑based model
  • Team training: two sessions on CI/CD, Docker, and deployment
  • Support during implementation (two weeks after launch)

Infrastructure‑as‑code with Ansible is 5× faster than manual server configuration and eliminates human errors.


Implementation Process and Timelines

  1. Audit of current state – assess infrastructure, software, processes (2–3 days).
  2. Architecture design – choose stack (Docker / K8s / Ansible), agree on CI/CD policies, set up repository.
  3. Environment setup – Docker for local development, staging, production servers.
  4. CI/CD implementation – write pipelines, test deployment, integrate with monitoring.
  5. Monitoring and alerting – install Prometheus + Grafana, configure dashboards and notifications.
  6. Team training – two sessions on tool usage.
Task Duration
Docker environment for local development 2–3 days
CI/CD pipeline (GitLab CI / GitHub Actions) 1–2 weeks
Staging environment 3–5 days
Monitoring + alerting (Prometheus + Grafana) 1–2 weeks
Centralized logging (ELK / Loki) 1–2 weeks
Ansible server automation 2–3 weeks
Comprehensive DevOps implementation 4–8 weeks

DevOps is not a project with an end date — it’s a transition from “upload via FTP and pray” to predictable processes. Each deployment is routine, each incident carries context, each new developer does docker-compose up instead of a three‑day environment setup.

Get a consultation – we’ll prepare a tailored implementation plan within 2–3 days. Order a turnkey DevOps implementation – gain stability and full control over your infrastructure.