From da4bc91df435a051740d752ec1a9d5cde70c0148 Mon Sep 17 00:00:00 2001 From: mesilov Date: Tue, 3 Mar 2026 11:15:05 +0600 Subject: [PATCH 01/10] Refactor Makefile: align structure and target naming with `b24phpsdk v3` style; remove legacy targets, standardize commands, and introduce grouped help sections. Signed-off-by: mesilov --- .tasks/84/makefile-parity-plan.md | 101 ++++++++++++++ Makefile | 211 +++++++++++++++++++----------- 2 files changed, 233 insertions(+), 79 deletions(-) create mode 100644 .tasks/84/makefile-parity-plan.md diff --git a/.tasks/84/makefile-parity-plan.md b/.tasks/84/makefile-parity-plan.md new file mode 100644 index 0000000..aa7c2dd --- /dev/null +++ b/.tasks/84/makefile-parity-plan.md @@ -0,0 +1,101 @@ +## Makefile Parity Plan: `bitrix24-php-lib` in `b24phpsdk v3` Style + +### Summary +Rebuild local `Makefile` in the structural and naming style of `b24phpsdk` `v3`: +- source style reference: https://github.com/bitrix24/b24phpsdk/blob/v3/Makefile +- target file: `Makefile` + +Chosen decisions: +- Use only new target names (no backward-compat aliases). +- Keep only targets relevant to this repository (no copied integration matrix from SDK). + +### Public Interface Changes (Make Targets) +Replace current target names with this final target set: + +1. Core behavior and scaffolding +- `.DEFAULT_GOAL := help` +- `%: @: # silence` +- `help` with grouped sections (docker/composer/lint/tests/dev/db/debug) +- `ENV := $(PWD)/.env`, `ENV_LOCAL := $(PWD)/.env.local` (keep repo-local env model) + +2. Docker targets +- `docker-init` (down -> build/pull as needed -> composer install -> up) +- `docker-up` +- `docker-down` +- `docker-down-clear` +- `docker-pull` +- `docker-restart` (depends on `docker-down docker-up`) + +3. Composer targets +- `composer-install` +- `composer-update` +- `composer-dumpautoload` +- `composer-clear-cache` (from old `clear`) +- `composer` (pass-through arguments via `$(filter-out ...)`) + +4. Lint/quality targets +- `lint-allowed-licenses` +- `lint-cs-fixer` +- `lint-cs-fixer-fix` +- `lint-phpstan` +- `lint-rector` +- `lint-rector-fix` +- `lint-all` (aggregator) + +5. Test targets +- `test-unit` (old `test-run-unit`) +- `test-functional` (old `test-run-functional`, including doctrine schema reset steps) +- `test-functional-one` (old `run-one-functional-test`; keep same default filter/path unless changed later) + +6. Utility/dev targets +- `php-cli-bash` +- `debug-show-env` (old `debug-print-env`) +- `doctrine-schema-drop` (old `schema-drop`) +- `doctrine-schema-create` (old `schema-create`) + +7. Phony declarations +- Add `.PHONY` for each non-file target, matching `b24phpsdk` style. + +### Implementation Details (Decision-Complete) +1. Rewrite file header and baseline structure to mirror `b24phpsdk` style: +- shebang placement, exported timeout vars, `.DEFAULT_GOAL`, wildcard silence, env includes, help block first. + +2. Standardize all docker invocations to `docker compose` (space form), not `docker-compose`. + +3. Replace old names entirely: +- remove `default`, `init`, `up`, `down`, `down-clear`, `restart`, `clear`, `test-run-unit`, `test-run-functional`, `run-one-functional-test`, `debug-print-env`, `schema-drop`, `schema-create`, `start-rector`, `coding-standards`. + +4. Preserve command semantics for this repo: +- functional tests still run doctrine schema drop/create/update before phpunit. +- lint commands still use installed vendor binaries from current project. +- composer pass-through remains unchanged behavior-wise. + +5. Ensure tab indentation for all recipe lines (fix current mixed-space recipe issue). + +### Test Cases and Scenarios +Run after rewrite: + +1. Structural/syntax checks +- `make help` prints grouped menu and exits 0. +- `make -n docker-up`, `make -n test-unit`, `make -n lint-all` produce expected command chains. + +2. Target behavior smoke checks +- `make docker-up` +- `make composer-install` +- `make lint-cs-fixer` +- `make lint-phpstan` +- `make test-unit` +- `make test-functional` (with DB env loaded) + +3. Pass-through checks +- `make composer "install --dry-run"` +- `make php-cli-bash` + +4. Regression checks +- Confirm removed legacy target names now fail (expected), because compatibility aliases were explicitly not requested. + +### Assumptions and Defaults +- Keep env file location at project root (`.env`, `.env.local`), not `tests/.env` from SDK. +- Keep only targets backed by tools/tests present in this repo (`phpunit` suites: `unit_tests`, `functional_tests`). +- Do not introduce SDK-specific dev/documentation/ngrok/integration-scope targets that have no local implementation. +- English target naming and help text preserved in SDK style. diff --git a/Makefile b/Makefile index d6663b5..2bb3c8f 100644 --- a/Makefile +++ b/Makefile @@ -9,118 +9,171 @@ export COMPOSE_HTTP_TIMEOUT=120 export DOCKER_CLIENT_TIMEOUT=120 +.DEFAULT_GOAL := help + +%: + @: # silence + # load default and personal env-variables ENV := $(PWD)/.env ENV_LOCAL := $(PWD)/.env.local include $(ENV) -include $(ENV_LOCAL) - -start-rector: vendor - vendor/bin/rector process tests --config=rector.php - -coding-standards: vendor - vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php --diff --verbose - -default: - @echo "make needs target:" - @egrep -e '^\S+' ./Makefile | grep -v default | sed -r 's/://' | sed -r 's/^/ - /' - -%: - @: # silence - -# Rule to print all environment variables for debugging -debug-print-env: - @echo "DATABASE_HOST=$(DATABASE_HOST)" - @echo "DATABASE_NAME=$(DATABASE_NAME)" - @echo "DATABASE_USER=$(DATABASE_USER)" - @echo "DATABASE_PASSWORD=$(DATABASE_PASSWORD)" - -init: +.PHONY: help +help: + @echo "-------------------------------" + @echo " bitrix24-php-lib Makefile" + @echo "-------------------------------" + @echo "" + @echo "docker-init - first installation" + @echo "docker-up - run docker" + @echo "docker-down - stop docker" + @echo "docker-down-clear - stop docker and remove volumes" + @echo "docker-pull - pull Docker images" + @echo "docker-restart - restart containers" + @echo "" + @echo "composer-install - install dependencies" + @echo "composer-update - update dependencies" + @echo "composer-dumpautoload - regenerate autoload" + @echo "composer-clear-cache - clear composer cache" + @echo "composer - run composer and pass arguments" + @echo "" + @echo "lint-all - run all linters" + @echo "lint-allowed-licenses - validate dependency licenses" + @echo "lint-cs-fixer - run php-cs-fixer in dry-run" + @echo "lint-cs-fixer-fix - run php-cs-fixer fix" + @echo "lint-phpstan - run phpstan" + @echo "lint-rector - run rector dry-run" + @echo "lint-rector-fix - run rector fix" + @echo "" + @echo "test-unit - run unit tests" + @echo "test-functional - run functional tests" + @echo "test-functional-one - run one functional test with debugger" + @echo "" + @echo "doctrine-schema-drop - drop database schema" + @echo "doctrine-schema-create - create database schema" + @echo "php-cli-bash - open shell in php-cli container" + @echo "debug-show-env - print db env variables" + +.PHONY: docker-init +docker-init: @echo "remove all containers" - docker-compose down --remove-orphans + docker compose down --remove-orphans + @echo "pull Docker images" + docker compose pull @echo "build containers" - docker-compose build + docker compose build @echo "install dependencies" - docker-compose run --rm php-cli composer install - @echo "change owner of var folder for access from container" - docker-compose run --rm php-cli chown -R www-data:www-data /var/www/html/var/ - @echo "run application…" - docker-compose up -d - + docker compose run --rm php-cli composer install + @echo "run application..." + docker compose up -d -clear: - docker-compose run --rm php-cli composer clear-cache +.PHONY: docker-up +docker-up: + @echo "run application..." + docker compose up --build -d -up: - @echo "run application…" - docker-compose up --build -d - -down: +.PHONY: docker-down +docker-down: @echo "stop application and remove containers" - docker-compose down --remove-orphans + docker compose down --remove-orphans -down-clear: +.PHONY: docker-down-clear +docker-down-clear: @echo "stop application and remove containers with volumes" - docker-compose down -v --remove-orphans + docker compose down -v --remove-orphans -restart: down up +.PHONY: docker-pull +docker-pull: + @echo "pull Docker images..." + docker compose pull -# container operations -php-cli-bash: - docker-compose run --rm php-cli sh $(filter-out $@,$(MAKECMDGOALS)) +.PHONY: docker-restart +docker-restart: docker-down docker-up -# composer operations +.PHONY: composer-install composer-install: - @echo "install dependencies…" - docker-compose run --rm php-cli composer install + @echo "install dependencies..." + docker compose run --rm php-cli composer install +.PHONY: composer-update composer-update: - @echo "update dependencies…" - docker-compose run --rm php-cli composer update + @echo "update dependencies..." + docker compose run --rm php-cli composer update +.PHONY: composer-dumpautoload composer-dumpautoload: - docker-compose run --rm php-cli composer dumpautoload -# composer call with any parameters -# Examples: + docker compose run --rm php-cli composer dumpautoload + +.PHONY: composer-clear-cache +composer-clear-cache: + docker compose run --rm php-cli composer clear-cache + +.PHONY: composer +# call composer with any parameters # make composer install # make composer "install --no-dev" composer: - docker-compose run --rm php-cli composer $(filter-out $@,$(MAKECMDGOALS)) + docker compose run --rm php-cli composer $(filter-out $@,$(MAKECMDGOALS)) -# check allowed licenses +.PHONY: lint-allowed-licenses lint-allowed-licenses: - docker-compose run --rm php-cli php vendor/bin/composer-license-checker -# linters + docker compose run --rm php-cli vendor/bin/composer-license-checker + +.PHONY: lint-cs-fixer +lint-cs-fixer: + docker compose run --rm php-cli php vendor/bin/php-cs-fixer fix --dry-run --diff --verbose + +.PHONY: lint-cs-fixer-fix +lint-cs-fixer-fix: + docker compose run --rm php-cli php vendor/bin/php-cs-fixer fix --diff --verbose + +.PHONY: lint-phpstan lint-phpstan: - docker-compose run --rm php-cli php vendor/bin/phpstan analyse --memory-limit 2G + docker compose run --rm php-cli php vendor/bin/phpstan analyse --memory-limit 2G + +.PHONY: lint-rector lint-rector: - docker-compose run --rm php-cli php vendor/bin/rector process --dry-run + docker compose run --rm php-cli php vendor/bin/rector process --dry-run + +.PHONY: lint-rector-fix lint-rector-fix: - docker-compose run --rm php-cli php vendor/bin/rector process -lint-cs-fixer: - docker-compose run --rm php-cli php vendor/bin/php-cs-fixer fix --dry-run --diff --verbose -lint-cs-fixer-fix: - docker-compose run --rm php-cli php vendor/bin/php-cs-fixer fix --diff --verbose + docker compose run --rm php-cli php vendor/bin/rector process -# unit-tests -test-run-unit: - docker-compose run --rm php-cli php vendor/bin/phpunit --testsuite=unit_tests --display-warnings --testdox +.PHONY: lint-all +lint-all: lint-allowed-licenses lint-cs-fixer lint-phpstan lint-rector -# functional-tests, work with test database -test-run-functional: debug-print-env - docker-compose run --rm php-cli php bin/doctrine orm:schema-tool:drop --force - docker-compose run --rm php-cli php bin/doctrine orm:schema-tool:create - docker-compose run --rm php-cli php bin/doctrine orm:schema-tool:update --dump-sql - docker-compose run --rm php-cli php vendor/bin/phpunit --testsuite=functional_tests --display-warnings --testdox +.PHONY: test-unit +test-unit: + docker compose run --rm php-cli php vendor/bin/phpunit --testsuite=unit_tests --display-warnings --testdox -# Run one functional test with debugger -run-one-functional-test: debug-print-env - docker-compose run --rm php-cli php -dxdebug.start_with_request=yes vendor/bin/phpunit --filter 'testChangeDomainUrlWithHappyPath' tests/Functional/Bitrix24Accounts/UseCase/ChangeDomainUrl/HandlerTest.php +.PHONY: debug-show-env +debug-show-env: + @echo "DATABASE_HOST=$(DATABASE_HOST)" + @echo "DATABASE_NAME=$(DATABASE_NAME)" + @echo "DATABASE_USER=$(DATABASE_USER)" + @echo "DATABASE_PASSWORD=$(DATABASE_PASSWORD)" + +.PHONY: test-functional +test-functional: debug-show-env + docker compose run --rm php-cli php bin/doctrine orm:schema-tool:drop --force + docker compose run --rm php-cli php bin/doctrine orm:schema-tool:create + docker compose run --rm php-cli php bin/doctrine orm:schema-tool:update --dump-sql + docker compose run --rm php-cli php vendor/bin/phpunit --testsuite=functional_tests --display-warnings --testdox -schema-drop: - docker-compose run --rm php-cli php bin/doctrine orm:schema-tool:drop --force +.PHONY: test-functional-one +test-functional-one: debug-show-env + docker compose run --rm php-cli php -dxdebug.start_with_request=yes vendor/bin/phpunit --filter 'testChangeDomainUrlWithHappyPath' tests/Functional/Bitrix24Accounts/UseCase/ChangeDomainUrl/HandlerTest.php -schema-create: - docker-compose run --rm php-cli php bin/doctrine orm:schema-tool:create +.PHONY: doctrine-schema-drop +doctrine-schema-drop: + docker compose run --rm php-cli php bin/doctrine orm:schema-tool:drop --force +.PHONY: doctrine-schema-create +doctrine-schema-create: + docker compose run --rm php-cli php bin/doctrine orm:schema-tool:create + +.PHONY: php-cli-bash +php-cli-bash: + docker compose run --rm php-cli sh $(filter-out $@,$(MAKECMDGOALS)) From 755e885358328aec31e5626eb1b29ec49460fde7 Mon Sep 17 00:00:00 2001 From: mesilov Date: Tue, 3 Mar 2026 11:15:19 +0600 Subject: [PATCH 02/10] Update composer.json: adjust dependencies to specific versions for better compatibility, including `b24phpsdk 3.0.*`, `doctrine-bundle 3.2.2`, `migrations-bundle 4.0.0`, and allow Symfony components ^7||^8 Signed-off-by: mesilov --- composer.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/composer.json b/composer.json index 80eb880..2dc30ff 100644 --- a/composer.json +++ b/composer.json @@ -47,18 +47,18 @@ "darsyn/ip-doctrine": "^6", "nesbot/carbon": "^3", "moneyphp/money": "^4", - "bitrix24/b24phpsdk": "dev-dev", + "bitrix24/b24phpsdk": "3.0.*", "doctrine/orm": "^3", - "doctrine/doctrine-bundle": "*", - "doctrine/doctrine-migrations-bundle": "*", + "doctrine/doctrine-bundle": "3.2.2", + "doctrine/doctrine-migrations-bundle": "4.0.0", "knplabs/knp-paginator-bundle": "^6", - "symfony/event-dispatcher": "^7", - "symfony/serializer": "^7", - "symfony/uid": "^7", - "symfony/yaml": "^7", - "symfony/cache": "^7", - "symfony/console": "^7", - "symfony/dotenv": "^7" + "symfony/event-dispatcher": "^7||^8", + "symfony/serializer": "^7||^8", + "symfony/uid": "^7||^8", + "symfony/yaml": "^7||^8", + "symfony/cache": "^7||^8", + "symfony/console": "^7||^8", + "symfony/dotenv": "^7||^8" }, "require-dev": { "doctrine/migrations": "^3", From 0f8085d4e2f04d4148e792538398d01e28011e00 Mon Sep 17 00:00:00 2001 From: mesilov Date: Tue, 3 Mar 2026 11:22:18 +0600 Subject: [PATCH 03/10] Fix failing unit tests in `SettingsFetcherTest`: add missing `symfony/property-access` to `require-dev` and update dependencies. Signed-off-by: mesilov --- .tasks/84/unit-tests-fix-plan.md | 51 ++++++++++++++++++++++++++++++++ CHANGELOG.md | 17 +++++++++++ composer.json | 1 + 3 files changed, 69 insertions(+) create mode 100644 .tasks/84/unit-tests-fix-plan.md diff --git a/.tasks/84/unit-tests-fix-plan.md b/.tasks/84/unit-tests-fix-plan.md new file mode 100644 index 0000000..613d9b2 --- /dev/null +++ b/.tasks/84/unit-tests-fix-plan.md @@ -0,0 +1,51 @@ +## План исправления падений `make test-unit` (18 ошибок Serializer/ObjectNormalizer) + +### Summary +По результату запуска `make test-unit`: +- Всего: `97` тестов, `145` assertions +- Ошибки: `18` +- Все 18 ошибок однотипны и приходят из `SettingsFetcherTest` с `LogicException`: + `ObjectNormalizer requires symfony/property-access`. + +Источник падений: +- `tests/Unit/ApplicationSettings/Services/SettingsFetcherTest.php` +- Инициализация `ObjectNormalizer()` в `setUp()`. + +Выбранная стратегия: добавить `symfony/property-access` в `require-dev`. + +### Important Changes (Public Interfaces / Dependencies) +1. Обновить dev-зависимости проекта: +- `composer.json`: добавить `symfony/property-access` в `require-dev` (версия в линии Symfony 7, например `^7`). +- `composer.lock`: обновить lock-файл после установки зависимости. + +2. Код бизнес-логики не менять: +- `src/ApplicationSettings/Services/SettingsFetcher.php` остаётся без изменений. +- Поведение API `SettingsFetcher::getItem()` и `SettingsFetcher::getValue()` не меняется. + +### Implementation Steps +1. Добавить пакет: +- `docker compose run --rm php-cli composer require --dev symfony/property-access:^7` + +2. Проверить, что dependency корректно зафиксирована: +- Убедиться, что в `composer.json` и `composer.lock` добавлен `symfony/property-access`. + +3. Перезапустить юнит-тесты: +- `make test-unit` + +4. Если останутся новые ошибки после этого фикса: +- Разобрать их как отдельную волну (ожидается, что текущие 18 ошибок исчезнут полностью). + +### Test Cases and Scenarios +1. Основной сценарий: +- `make test-unit` должен завершиться с `exit code 0`. + +2. Точечная проверка проблемного класса: +- Запустить только `SettingsFetcherTest` и убедиться, что тесты `getItem`/`getValue` больше не падают на `LogicException`. + +3. Регрессия: +- Повторный запуск полного `make test-unit` для проверки, что добавление зависимости не вызвало побочных падений в остальных unit-тестах. + +### Assumptions and Defaults +- Используемая версия Symfony в проекте остаётся в линии `^7`, поэтому `symfony/property-access:^7` совместим. +- Проблема инфраструктурная (отсутствующая dev-зависимость), а не дефект алгоритма `SettingsFetcher`. +- В рамках этого фикса не меняем структуру тестов и не переписываем сериализацию в `SettingsFetcherTest`. diff --git a/CHANGELOG.md b/CHANGELOG.md index d67af9f..ff441ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ +## 0.3.1 + +### Changed + +- **Makefile aligned with b24phpsdk v3 style** + - Set `help` as default target and added grouped help output + - Switched Docker commands from `docker-compose` to `docker compose` + - Renamed targets to SDK-style naming (`docker-*`, `test-unit`, `test-functional`, `debug-show-env`, `doctrine-schema-*`) + - Added explicit `.PHONY` declarations for operational targets + - Added `lint-all` aggregate target + +### Fixed + +- **Unit tests failing in `SettingsFetcherTest` due to missing serializer dependency** + - Added `symfony/property-access` to `require-dev` + - Restored successful run of `make test-unit` (`97 tests, 190 assertions`) + ## 0.3.0 ### Added diff --git a/composer.json b/composer.json index 2dc30ff..84c7b28 100644 --- a/composer.json +++ b/composer.json @@ -72,6 +72,7 @@ "rector/rector": "^1", "roave/security-advisories": "dev-master", "symfony/debug-bundle": "^7", + "symfony/property-access": "^7", "symfony/stopwatch": "^7", "symfony/var-exporter": "^7" }, From c09f015c7b979aa29dc077b3aad40d1faac518ee Mon Sep 17 00:00:00 2001 From: mesilov Date: Tue, 3 Mar 2026 11:36:09 +0600 Subject: [PATCH 04/10] Restore functional tests: update `ContactPerson` method signatures to align with `ContactPersonInterface`, implement `isPartner()`, and ensure compatibility with SDK contracts. Signed-off-by: mesilov --- .tasks/84/functional-tests-fix-plan.md | 50 +++++++++++++++++++++ CHANGELOG.md | 7 +++ composer.json | 30 ++++++------- src/ContactPersons/Entity/ContactPerson.php | 14 ++++-- 4 files changed, 82 insertions(+), 19 deletions(-) create mode 100644 .tasks/84/functional-tests-fix-plan.md diff --git a/.tasks/84/functional-tests-fix-plan.md b/.tasks/84/functional-tests-fix-plan.md new file mode 100644 index 0000000..46f0d8a --- /dev/null +++ b/.tasks/84/functional-tests-fix-plan.md @@ -0,0 +1,50 @@ +## План устранения падения `make test-functional` (совместимость `ContactPerson` с SDK interface) + +### Summary +Диагностический запуск `make test-functional` завершился до старта тестов с `Fatal error` при загрузке классов Doctrine/Entity: +- Команда упала на шаге `php bin/doctrine orm:schema-tool:drop --force`. +- Причина: несовместимая сигнатура метода в `ContactPerson` с контрактом SDK. + +Подтверждённая ошибка: +- `ContactPerson::markEmailAsVerified(): void` +- требует соответствия `ContactPersonInterface::markEmailAsVerified(?CarbonImmutable $verifiedAt = null): void` + +Файлы: +- `src/ContactPersons/Entity/ContactPerson.php:173` +- `vendor/bitrix24/b24phpsdk/src/Application/Contracts/ContactPersons/Entity/ContactPersonInterface.php:83` + +### Important Interface Changes Needed +1. Привести сигнатуры методов сущности к актуальному SDK контракту: +- `markEmailAsVerified(?CarbonImmutable $verifiedAt = null): void` +- `markMobilePhoneAsVerified(?CarbonImmutable $verifiedAt = null): void` + +2. Добавить отсутствующий метод интерфейса: +- `isPartner(): bool` + +Дополнительно выявлено по статическому сравнению: +- В классе сейчас `markMobilePhoneAsVerified(): void` без параметра. +- В классе отсутствует `isPartner()`, хотя он обязателен в интерфейсе. + +### Implementation Plan +1. Обновить `ContactPerson` сигнатуры обоих `mark*Verified` методов под интерфейс. +2. Внутри методов использовать переданный `$verifiedAt`, а при `null` ставить `new CarbonImmutable()`. +3. Добавить реализацию `isPartner(): bool` с семантикой контракта (true при наличии `bitrix24PartnerId`). +4. Проверить, что атрибуты `#[\Override]` остаются валидными после правок. +5. Перезапустить: +- `make test-functional` +- при успехе дополнительно `make test-unit` как регрессия по доменной модели. + +### Test Cases and Scenarios +1. Инфраструктурный smoke: +- `php bin/doctrine orm:schema-tool:drop --force` больше не падает с `Fatal error`. + +2. Основной сценарий: +- `make test-functional` проходит стадию bootstrap и выполняет тесты (или падает уже на реальных assertions, а не на загрузке класса). + +3. Регрессия: +- `make test-unit` остаётся зелёным после изменения сигнатур и добавления `isPartner()`. + +### Assumptions and Defaults +- Источник истины по контрактам: установленная версия `bitrix24/b24phpsdk` в `vendor`. +- Поведение `mark*Verified` должно поддерживать опциональный timestamp из интерфейса. +- `isPartner()` реализуется как проверка `null !== $this->bitrix24PartnerId`. diff --git a/CHANGELOG.md b/CHANGELOG.md index ff441ea..16f888e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,12 +8,19 @@ - Renamed targets to SDK-style naming (`docker-*`, `test-unit`, `test-functional`, `debug-show-env`, `doctrine-schema-*`) - Added explicit `.PHONY` declarations for operational targets - Added `lint-all` aggregate target +- **Dependency update for PHP 8.4 compatibility** + - Updated `darsyn/ip` from `^5` to `^6` + - Removed runtime deprecation warnings from functional test runs ### Fixed - **Unit tests failing in `SettingsFetcherTest` due to missing serializer dependency** - Added `symfony/property-access` to `require-dev` - Restored successful run of `make test-unit` (`97 tests, 190 assertions`) +- **Functional tests bootstrap failure due to SDK contract mismatch** + - Updated `ContactPerson::markEmailAsVerified()` and `ContactPerson::markMobilePhoneAsVerified()` signatures to match `ContactPersonInterface` + - Added missing `ContactPerson::isPartner()` method implementation + - Restored successful run of `make test-functional` (`62 tests, 127 assertions, 1 skipped`) ## 0.3.0 diff --git a/composer.json b/composer.json index 84c7b28..07742a2 100644 --- a/composer.json +++ b/composer.json @@ -35,30 +35,30 @@ }, "require": { "php": "8.3.* || 8.4.*", - "ext-json": "*", - "ext-curl": "*", "ext-bcmath": "*", + "ext-curl": "*", "ext-intl": "*", - "psr/log": "^3", - "fig/http-message-util": "^1", - "giggsey/libphonenumber-for-php": "^8", - "odolbeau/phone-number-bundle": "^4", - "darsyn/ip": "^5", - "darsyn/ip-doctrine": "^6", - "nesbot/carbon": "^3", - "moneyphp/money": "^4", + "ext-json": "*", "bitrix24/b24phpsdk": "3.0.*", - "doctrine/orm": "^3", + "darsyn/ip": "^6", + "darsyn/ip-doctrine": "^6", "doctrine/doctrine-bundle": "3.2.2", "doctrine/doctrine-migrations-bundle": "4.0.0", + "doctrine/orm": "^3", + "fig/http-message-util": "^1", + "giggsey/libphonenumber-for-php": "^8", "knplabs/knp-paginator-bundle": "^6", + "moneyphp/money": "^4", + "nesbot/carbon": "^3", + "odolbeau/phone-number-bundle": "^4", + "psr/log": "^3", + "symfony/cache": "^7||^8", + "symfony/console": "^7||^8", + "symfony/dotenv": "^7||^8", "symfony/event-dispatcher": "^7||^8", "symfony/serializer": "^7||^8", "symfony/uid": "^7||^8", - "symfony/yaml": "^7||^8", - "symfony/cache": "^7||^8", - "symfony/console": "^7||^8", - "symfony/dotenv": "^7||^8" + "symfony/yaml": "^7||^8" }, "require-dev": { "doctrine/migrations": "^3", diff --git a/src/ContactPersons/Entity/ContactPerson.php b/src/ContactPersons/Entity/ContactPerson.php index e9d70a1..54c10a4 100644 --- a/src/ContactPersons/Entity/ContactPerson.php +++ b/src/ContactPersons/Entity/ContactPerson.php @@ -170,10 +170,10 @@ public function changeEmail(?string $email): void } #[\Override] - public function markEmailAsVerified(): void + public function markEmailAsVerified(?CarbonImmutable $verifiedAt = null): void { $this->isEmailVerified = true; - $this->emailVerifiedAt = new CarbonImmutable(); + $this->emailVerifiedAt = $verifiedAt ?? new CarbonImmutable(); $this->events[] = new ContactPersonEmailVerifiedEvent( $this->id, $this->emailVerifiedAt, @@ -221,10 +221,10 @@ public function getMobilePhoneVerifiedAt(): ?CarbonImmutable } #[\Override] - public function markMobilePhoneAsVerified(): void + public function markMobilePhoneAsVerified(?CarbonImmutable $verifiedAt = null): void { $this->isMobilePhoneVerified = true; - $this->mobilePhoneVerifiedAt = new CarbonImmutable(); + $this->mobilePhoneVerifiedAt = $verifiedAt ?? new CarbonImmutable(); $this->events[] = new ContactPersonMobilePhoneVerifiedEvent( $this->id, $this->mobilePhoneVerifiedAt, @@ -277,6 +277,12 @@ public function setBitrix24PartnerId(?Uuid $uuid): void $this->updatedAt = new CarbonImmutable(); } + #[\Override] + public function isPartner(): bool + { + return $this->bitrix24PartnerId instanceof \Symfony\Component\Uid\Uuid; + } + #[\Override] public function isEmailVerified(): bool { From 4e2934a8a12f30f7d782e0c14fce579bda72f339 Mon Sep 17 00:00:00 2001 From: mesilov Date: Tue, 3 Mar 2026 11:39:27 +0600 Subject: [PATCH 05/10] Remove PHP 8.3 from test workflows: update functional and unit test configurations to target PHP 8.4 only. Signed-off-by: mesilov --- .github/workflows/tests-functional.yml | 1 - .github/workflows/tests-unit.yml | 1 - 2 files changed, 2 deletions(-) diff --git a/.github/workflows/tests-functional.yml b/.github/workflows/tests-functional.yml index d96ab98..0478fbb 100644 --- a/.github/workflows/tests-functional.yml +++ b/.github/workflows/tests-functional.yml @@ -21,7 +21,6 @@ jobs: fail-fast: false matrix: php-version: - - "8.3" - "8.4" dependencies: [ highest ] operating-system: [ ubuntu-latest ] diff --git a/.github/workflows/tests-unit.yml b/.github/workflows/tests-unit.yml index 873aaad..e4ec555 100644 --- a/.github/workflows/tests-unit.yml +++ b/.github/workflows/tests-unit.yml @@ -17,7 +17,6 @@ jobs: fail-fast: false matrix: php-version: - - "8.3" - "8.4" dependencies: [ highest ] operating-system: [ ubuntu-latest] From 24d6aa96f772c61bb833377262a5bbd826d88672 Mon Sep 17 00:00:00 2001 From: mesilov Date: Tue, 3 Mar 2026 11:42:55 +0600 Subject: [PATCH 06/10] Simplify `isPartner()` implementation: replace fully qualified class name with `Uuid` alias. Signed-off-by: mesilov --- src/ContactPersons/Entity/ContactPerson.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ContactPersons/Entity/ContactPerson.php b/src/ContactPersons/Entity/ContactPerson.php index 54c10a4..9a57203 100644 --- a/src/ContactPersons/Entity/ContactPerson.php +++ b/src/ContactPersons/Entity/ContactPerson.php @@ -280,7 +280,7 @@ public function setBitrix24PartnerId(?Uuid $uuid): void #[\Override] public function isPartner(): bool { - return $this->bitrix24PartnerId instanceof \Symfony\Component\Uid\Uuid; + return $this->bitrix24PartnerId instanceof Uuid; } #[\Override] From d7e47b806f481e15d8e7017457a279734a8c443e Mon Sep 17 00:00:00 2001 From: mesilov Date: Tue, 3 Mar 2026 11:57:41 +0600 Subject: [PATCH 07/10] Introduce GHCR-based dev/CI images for `php-cli`: add CI workflows to build/publish images, integrate GHCR usage in tests, and update local dev setup. Signed-off-by: mesilov --- .tasks/84/ghcr-dev-images-ci-plan.md | 97 ++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 .tasks/84/ghcr-dev-images-ci-plan.md diff --git a/.tasks/84/ghcr-dev-images-ci-plan.md b/.tasks/84/ghcr-dev-images-ci-plan.md new file mode 100644 index 0000000..84b67ed --- /dev/null +++ b/.tasks/84/ghcr-dev-images-ci-plan.md @@ -0,0 +1,97 @@ +## План внедрения GHCR-образов для dev/CI (`php-cli`) + +### Summary +Цель: чтобы dev-образ `php-cli` собирался в CI и публиковался в GitHub Container Registry, а CI-тесты использовали pull этого образа из GHCR вместо локальной установки PHP. + +Опорный референс из `bitrix24/b24phpsdk` (ветка `v3`): +- Workflow сборки: https://raw.githubusercontent.com/bitrix24/b24phpsdk/v3/.github/workflows/docker-build.yml +- `docker-compose` с `image + build`: https://raw.githubusercontent.com/bitrix24/b24phpsdk/v3/docker-compose.yaml + +Выбранные решения: +- Теги: `:php-cli` + immutable `:php-cli-`. +- Триггер сборки: изменения `docker/php-cli/Dockerfile` + `workflow_dispatch`. +- CI потребление: unit/functional тесты запускаются в GHCR image. + +### Important Changes / Interfaces +1. Новый CI workflow публикации образа +- Файл: `.github/workflows/docker-build.yml` +- Права job: `packages: write`, `contents: read` +- Buildx multi-arch: `linux/amd64,linux/arm64` +- Публикация тегов: + - `ghcr.io/mesilov/bitrix24-php-lib:php-cli` + - `ghcr.io/mesilov/bitrix24-php-lib:php-cli-` +- Кэш: `cache-from/to: type=gha` + +2. Контракт образа для compose/dev +- Файл: `docker-compose.yaml` +- `php-cli` получает: + - `image: ${PHP_CLI_IMAGE:-ghcr.io/mesilov/bitrix24-php-lib:php-cli}` + - `build: { context: ./docker/php-cli }` (fallback для локальной пересборки) +- Поведение: + - `make docker-pull` подтягивает GHCR image + - `make docker-up --build` при необходимости пересобирает локально + +3. Перевод тестовых workflow на GHCR image +- Файлы: + - `.github/workflows/tests-unit.yml` + - `.github/workflows/tests-functional.yml` +- Убрать `shivammathur/setup-php` (образ уже содержит PHP/extensions/composer) +- Добавить job-level container: + - `container.image: ghcr.io/mesilov/bitrix24-php-lib:php-cli` + - `container.credentials` через `${{ github.actor }}` + `${{ secrets.GITHUB_TOKEN }}` +- Добавить `permissions: packages: read` в тестовых job. + +4. Корректировка functional env под container+services +- Сейчас `DATABASE_HOST=localhost`; в container job это неверно. +- Изменить на hostname service-контейнера (например `bitrix24-php-lib-test-database`), чтобы подключение к Postgres было стабильным. +- Шаг установки `postgresql-client`/`pg_isready` убрать (или оставить только если реально нужен CLI-инструмент в job). + +### Implementation Steps (Decision Complete) +1. Создать `.github/workflows/docker-build.yml` по шаблону `b24phpsdk`, адаптировав: +- image path на `ghcr.io/mesilov/bitrix24-php-lib` +- два тега (`php-cli`, `php-cli-${short_sha}`) +- события: `push.paths: docker/php-cli/Dockerfile`, `workflow_dispatch`. + +2. Обновить `docker-compose.yaml`: +- добавить `image` для `php-cli` с env-override +- сохранить `build.context` для fallback +- не менять `database` сервис. + +3. Обновить `tests-unit.yml`: +- `permissions: packages: read` +- добавить `container.image` + `container.credentials` +- удалить setup-php step +- оставить `composer update` + `phpunit` как есть. + +4. Обновить `tests-functional.yml`: +- `permissions: packages: read` +- добавить `container.image` + credentials +- сменить `DATABASE_HOST` на service name +- удалить setup-php step и apt/pg_isready шаги +- оставить schema-tool + phpunit шаги. + +5. Проверить Makefile/локальный DX: +- Убедиться, что `docker-pull` реально тянет GHCR образ. +- При необходимости добавить короткую подсказку в `help` про переменную `PHP_CLI_IMAGE`. + +### Test Cases and Scenarios +1. Публикация образа +- Изменить `docker/php-cli/Dockerfile` в ветке. +- Проверить, что `docker-build` workflow публикует оба тега в GHCR. + +2. Pull в CI +- `tests-unit` и `tests-functional` стартуют в container image из GHCR без шага setup-php. +- Workflow не падают на pull/auth. + +3. Functional DB connectivity +- `DATABASE_HOST` резолвится на service container. +- schema-tool команды проходят стабильно. + +4. Локальный dev +- `make docker-pull` подтягивает `ghcr.io/mesilov/bitrix24-php-lib:php-cli`. +- `make docker-up` и `make test-*` остаются рабочими. + +### Assumptions and Defaults +- GHCR package для репозитория доступен для чтения в Actions через `GITHUB_TOKEN`. +- Основной registry-путь фиксируем как `ghcr.io/mesilov/bitrix24-php-lib`. +- Для локальной разработки build fallback сохраняется (`build.context`) и не ломает текущий поток. From 5fb49c04672f8a2501e6d394f211449f69e5b655 Mon Sep 17 00:00:00 2001 From: mesilov Date: Tue, 3 Mar 2026 12:03:32 +0600 Subject: [PATCH 08/10] Improve CI workflows: integrate `php-cli` GHCR image across all workflows, update `docker-compose.yaml` to use registry image with fallback to local build, and enhance PostgreSQL setup in functional tests. Signed-off-by: mesilov --- .github/workflows/docker-build.yml | 58 ++++++++++++++++++++++++++ .github/workflows/license-check.yml | 42 +++++++------------ .github/workflows/lint-cs-fixer.yml | 45 +++++++------------- .github/workflows/lint-phpstan.yml | 45 +++++++------------- .github/workflows/lint-rector.yml | 45 +++++++------------- .github/workflows/tests-functional.yml | 37 +++++++--------- .github/workflows/tests-unit.yml | 32 ++++++-------- CHANGELOG.md | 7 ++++ docker-compose.yaml | 1 + 9 files changed, 155 insertions(+), 157 deletions(-) create mode 100644 .github/workflows/docker-build.yml diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml new file mode 100644 index 0000000..09c13ef --- /dev/null +++ b/.github/workflows/docker-build.yml @@ -0,0 +1,58 @@ +name: "Build Docker image" + +on: + push: + paths: + - "docker/php-cli/Dockerfile" + workflow_dispatch: + +concurrency: + group: docker-build + cancel-in-progress: true + +jobs: + build: + name: "Build & push php-cli" + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: "Get metadata" + id: meta + run: | + echo "short_sha=${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT" + echo "rfc3339=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> "$GITHUB_OUTPUT" + + - name: "Checkout" + uses: actions/checkout@v4 + + - name: "Login to GitHub Container Registry" + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: "Setup Docker QEMU" + uses: docker/setup-qemu-action@v3 + + - name: "Setup Docker Buildx" + uses: docker/setup-buildx-action@v3 + + - name: "Build & push image" + uses: docker/build-push-action@v6 + with: + context: ./docker/php-cli + platforms: linux/amd64,linux/arm64 + push: true + tags: | + ghcr.io/mesilov/bitrix24-php-lib:php-cli + ghcr.io/mesilov/bitrix24-php-lib:php-cli-${{ steps.meta.outputs.short_sha }} + labels: | + org.opencontainers.image.source=${{ github.event.repository.html_url }} + org.opencontainers.image.created=${{ steps.meta.outputs.rfc3339 }} + org.opencontainers.image.revision=${{ github.sha }} + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/.github/workflows/license-check.yml b/.github/workflows/license-check.yml index 621a34b..730b7ce 100644 --- a/.github/workflows/license-check.yml +++ b/.github/workflows/license-check.yml @@ -1,4 +1,5 @@ name: "Allowed licenses checks" + on: push: pull_request: @@ -6,38 +7,25 @@ on: jobs: static-analysis: name: "composer-license-checker" - runs-on: ${{ matrix.operating-system }} - - strategy: - fail-fast: false - matrix: - php-version: - - "8.4" - dependencies: [ highest ] - operating-system: [ ubuntu-latest] + runs-on: ubuntu-latest + permissions: + contents: read + packages: read + container: + image: ghcr.io/mesilov/bitrix24-php-lib:php-cli + credentials: + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} steps: - name: "Checkout" - uses: "actions/checkout@v2" - - - name: "Install PHP" - uses: "shivammathur/setup-php@v2" - with: - coverage: "none" - php-version: "${{ matrix.php-version }}" - extensions: json, bcmath, curl, intl, mbstring - tools: composer:v2 - - - name: "Install lowest dependencies" - if: ${{ matrix.dependencies == 'lowest' }} - run: "composer update --prefer-lowest --no-interaction --no-progress --no-suggest" + uses: actions/checkout@v4 - - name: "Install highest dependencies" - if: ${{ matrix.dependencies == 'highest' }} - run: "composer update --no-interaction --no-progress --no-suggest" + - name: "Install dependencies" + run: composer update --no-interaction --no-progress --no-suggest - name: "composer-license-checker" - run: "php vendor/bin/composer-license-checker" + run: php vendor/bin/composer-license-checker - name: "is allowed licenses check succeeded" if: ${{ success() }} @@ -47,4 +35,4 @@ jobs: - name: "is allowed licenses check failed" if: ${{ failure() }} run: | - echo '::error:: ❗️ allowed licenses check failed (╯°益°)╯彡┻━┻' \ No newline at end of file + echo '::error:: ❗️ allowed licenses check failed (╯°益°)╯彡┻━┻' diff --git a/.github/workflows/lint-cs-fixer.yml b/.github/workflows/lint-cs-fixer.yml index d49006a..1695f51 100644 --- a/.github/workflows/lint-cs-fixer.yml +++ b/.github/workflows/lint-cs-fixer.yml @@ -1,44 +1,31 @@ +name: Lint CS-Fixer + on: push: pull_request: -name: Lint CS-Fixer - jobs: static-analysis: name: "CS-Fixer" - runs-on: ${{ matrix.operating-system }} - - strategy: - fail-fast: false - matrix: - php-version: - - "8.4" - dependencies: [ highest ] - operating-system: [ ubuntu-latest] + runs-on: ubuntu-latest + permissions: + contents: read + packages: read + container: + image: ghcr.io/mesilov/bitrix24-php-lib:php-cli + credentials: + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} steps: - name: "Checkout" - uses: "actions/checkout@v2" - - - name: "Install PHP" - uses: "shivammathur/setup-php@v2" - with: - coverage: "none" - php-version: "${{ matrix.php-version }}" - extensions: json, bcmath, curl, intl, mbstring - tools: composer:v2 - - - name: "Install lowest dependencies" - if: ${{ matrix.dependencies == 'lowest' }} - run: "composer update --prefer-lowest --no-interaction --no-progress --no-suggest" + uses: actions/checkout@v4 - - name: "Install highest dependencies" - if: ${{ matrix.dependencies == 'highest' }} - run: "composer update --no-interaction --no-progress --no-suggest" + - name: "Install dependencies" + run: composer update --no-interaction --no-progress --no-suggest - name: "CS-Fixer" - run: "vendor/bin/php-cs-fixer fix --dry-run --diff --verbose" + run: vendor/bin/php-cs-fixer fix --dry-run --diff --verbose - name: "is CS-Fixer check succeeded" if: ${{ success() }} @@ -48,4 +35,4 @@ jobs: - name: "is CS-Fixer check failed" if: ${{ failure() }} run: | - echo '::error:: ❗️ CS-Fixer check failed (╯°益°)╯彡┻━┻' \ No newline at end of file + echo '::error:: ❗️ CS-Fixer check failed (╯°益°)╯彡┻━┻' diff --git a/.github/workflows/lint-phpstan.yml b/.github/workflows/lint-phpstan.yml index 165a491..13f8519 100644 --- a/.github/workflows/lint-phpstan.yml +++ b/.github/workflows/lint-phpstan.yml @@ -1,44 +1,31 @@ +name: PHPStan lint checks + on: push: pull_request: -name: PHPStan lint checks - jobs: static-analysis: name: "PHPStan" - runs-on: ${{ matrix.operating-system }} - - strategy: - fail-fast: false - matrix: - php-version: - - "8.4" - dependencies: [ highest ] - operating-system: [ ubuntu-latest] + runs-on: ubuntu-latest + permissions: + contents: read + packages: read + container: + image: ghcr.io/mesilov/bitrix24-php-lib:php-cli + credentials: + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} steps: - name: "Checkout" - uses: "actions/checkout@v2" - - - name: "Install PHP" - uses: "shivammathur/setup-php@v2" - with: - coverage: "none" - php-version: "${{ matrix.php-version }}" - extensions: json, bcmath, curl, intl, mbstring - tools: composer:v2 - - - name: "Install lowest dependencies" - if: ${{ matrix.dependencies == 'lowest' }} - run: "composer update --prefer-lowest --no-interaction --no-progress --no-suggest" + uses: actions/checkout@v4 - - name: "Install highest dependencies" - if: ${{ matrix.dependencies == 'highest' }} - run: "composer update --no-interaction --no-progress --no-suggest" + - name: "Install dependencies" + run: composer update --no-interaction --no-progress --no-suggest - name: "PHPStan" - run: "vendor/bin/phpstan --memory-limit=2G analyse" + run: vendor/bin/phpstan --memory-limit=2G analyse - name: "is PHPStan check succeeded" if: ${{ success() }} @@ -48,4 +35,4 @@ jobs: - name: "is PHPStan check failed" if: ${{ failure() }} run: | - echo '::error:: ❗️ PHPStan check failed (╯°益°)╯彡┻━┻' \ No newline at end of file + echo '::error:: ❗️ PHPStan check failed (╯°益°)╯彡┻━┻' diff --git a/.github/workflows/lint-rector.yml b/.github/workflows/lint-rector.yml index 6572ef6..16c2308 100644 --- a/.github/workflows/lint-rector.yml +++ b/.github/workflows/lint-rector.yml @@ -1,44 +1,31 @@ +name: Rector lint checks + on: push: pull_request: -name: Rector lint checks - jobs: static-analysis: name: "Rector" - runs-on: ${{ matrix.operating-system }} - - strategy: - fail-fast: false - matrix: - php-version: - - "8.4" - dependencies: [ highest ] - operating-system: [ ubuntu-latest] + runs-on: ubuntu-latest + permissions: + contents: read + packages: read + container: + image: ghcr.io/mesilov/bitrix24-php-lib:php-cli + credentials: + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} steps: - name: "Checkout" - uses: "actions/checkout@v2" - - - name: "Install PHP" - uses: "shivammathur/setup-php@v2" - with: - coverage: "none" - php-version: "${{ matrix.php-version }}" - extensions: json, bcmath, curl, intl, mbstring - tools: composer:v2 - - - name: "Install lowest dependencies" - if: ${{ matrix.dependencies == 'lowest' }} - run: "composer update --prefer-lowest --no-interaction --no-progress --no-suggest" + uses: actions/checkout@v4 - - name: "Install highest dependencies" - if: ${{ matrix.dependencies == 'highest' }} - run: "composer update --no-interaction --no-progress --no-suggest" + - name: "Install dependencies" + run: composer update --no-interaction --no-progress --no-suggest - name: "Rector" - run: "vendor/bin/rector process --dry-run" + run: vendor/bin/rector process --dry-run - name: "is Rector check succeeded" if: ${{ success() }} @@ -48,4 +35,4 @@ jobs: - name: "is PHPStan check failed" if: ${{ failure() }} run: | - echo '::error:: ❗️ Rector check failed (╯°益°)╯彡┻━┻' \ No newline at end of file + echo '::error:: ❗️ Rector check failed (╯°益°)╯彡┻━┻' diff --git a/.github/workflows/tests-functional.yml b/.github/workflows/tests-functional.yml index 0478fbb..854fe52 100644 --- a/.github/workflows/tests-functional.yml +++ b/.github/workflows/tests-functional.yml @@ -6,7 +6,7 @@ on: env: COMPOSER_FLAGS: "--ansi --no-interaction --no-progress" - DATABASE_HOST: localhost + DATABASE_HOST: postgres DATABASE_USER: b24phpLibTest DATABASE_PASSWORD: b24phpLibTest DATABASE_NAME: b24phpLibTest @@ -14,18 +14,18 @@ env: jobs: tests: name: "Functional tests" + runs-on: ubuntu-latest + permissions: + contents: read + packages: read + container: + image: ghcr.io/mesilov/bitrix24-php-lib:php-cli + credentials: + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} - runs-on: ${{ matrix.operating-system }} - - strategy: - fail-fast: false - matrix: - php-version: - - "8.4" - dependencies: [ highest ] - operating-system: [ ubuntu-latest ] services: - bitrix24-php-lib-test-database: + postgres: image: postgres:16-alpine ports: - 5432:5432 @@ -41,14 +41,7 @@ jobs: steps: - name: "Checkout code" - uses: "actions/checkout@v2" - - - name: "Setup PHP" - uses: "shivammathur/setup-php@v2" - with: - coverage: "none" - php-version: "${{ matrix.php-version }}" - extensions: json, bcmath, curl, intl, mbstring, pdo_pgsql, pdo + uses: actions/checkout@v4 - name: "Install dependencies with Composer" run: | @@ -56,12 +49,11 @@ jobs: - name: "Install PostgreSQL client" run: | - sudo apt-get update - sudo apt-get install -y postgresql-client + apk add --no-cache postgresql-client - name: "Wait for PostgreSQL to be ready" run: | - until pg_isready -h localhost -p 5432 -U b24phpLibTest; do + until pg_isready -h postgres -p 5432 -U b24phpLibTest; do echo "Waiting for PostgreSQL to start..." sleep 2 done @@ -72,7 +64,6 @@ jobs: php bin/doctrine orm:schema-tool:create --dump-sql php bin/doctrine orm:schema-tool:update --force php bin/doctrine orm:info - # Запуск тестов с очисткой состояния между тестами php vendor/bin/phpunit --testsuite=functional_tests --display-warnings --testdox --process-isolation - name: "is functional tests succeeded" diff --git a/.github/workflows/tests-unit.yml b/.github/workflows/tests-unit.yml index e4ec555..b45b58f 100644 --- a/.github/workflows/tests-unit.yml +++ b/.github/workflows/tests-unit.yml @@ -10,34 +10,26 @@ env: jobs: tests: name: "PHPUnit tests" - - runs-on: ${{ matrix.operating-system }} - - strategy: - fail-fast: false - matrix: - php-version: - - "8.4" - dependencies: [ highest ] - operating-system: [ ubuntu-latest] + runs-on: ubuntu-latest + permissions: + contents: read + packages: read + container: + image: ghcr.io/mesilov/bitrix24-php-lib:php-cli + credentials: + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} steps: - name: "Checkout" - uses: "actions/checkout@v2" - - - name: "Install PHP" - uses: "shivammathur/setup-php@v2" - with: - coverage: "none" - php-version: "${{ matrix.php-version }}" - extensions: json, bcmath, curl, intl, mbstring + uses: actions/checkout@v4 - name: "Install dependencies" run: | composer update ${{ env.COMPOSER_FLAGS }} - name: "run unit tests" - run: "php vendor/bin/phpunit --testsuite=unit_tests --display-warnings --testdox" + run: php vendor/bin/phpunit --testsuite=unit_tests --display-warnings --testdox - name: "is unit tests tests succeeded" if: ${{ success() }} @@ -47,4 +39,4 @@ jobs: - name: "is unit tests tests failed" if: ${{ failure() }} run: | - echo '::error:: ❗️ unit tests tests failed (╯°益°)╯彡┻━┻' \ No newline at end of file + echo '::error:: ❗️ unit tests tests failed (╯°益°)╯彡┻━┻' diff --git a/CHANGELOG.md b/CHANGELOG.md index 16f888e..9b4c919 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,13 @@ - **Dependency update for PHP 8.4 compatibility** - Updated `darsyn/ip` from `^5` to `^6` - Removed runtime deprecation warnings from functional test runs +- **CI pipelines moved to dev Docker image from GHCR** + - Added workflow to build and publish `php-cli` image to `ghcr.io/mesilov/bitrix24-php-lib` (`php-cli` and `php-cli-` tags) + - Switched lint, unit, functional, and license-check workflows to run inside `ghcr.io/mesilov/bitrix24-php-lib:php-cli` + - Added GitHub Actions package permissions for pulling private GHCR images in jobs +- **Docker Compose image source updated for dev workflow** + - Added `image: ${PHP_CLI_IMAGE:-ghcr.io/mesilov/bitrix24-php-lib:php-cli}` to `php-cli` service + - Kept local `build` section as fallback when registry tag is unavailable ### Fixed diff --git a/docker-compose.yaml b/docker-compose.yaml index fbdff87..ea30d7d 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,5 +1,6 @@ services: php-cli: + image: ${PHP_CLI_IMAGE:-ghcr.io/mesilov/bitrix24-php-lib:php-cli} build: context: ./docker/php-cli depends_on: From 7936f7a429f1a2fe2b606274df5bbb93bd30647f Mon Sep 17 00:00:00 2001 From: mesilov Date: Tue, 3 Mar 2026 12:06:25 +0600 Subject: [PATCH 09/10] Add comment to `php-cli` Dockerfile to indicate DEV image build Signed-off-by: mesilov --- docker/php-cli/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/php-cli/Dockerfile b/docker/php-cli/Dockerfile index 6f1684b..465aee3 100644 --- a/docker/php-cli/Dockerfile +++ b/docker/php-cli/Dockerfile @@ -1,3 +1,4 @@ +# build DEV image FROM php:8.4-cli-alpine RUN apk add unzip libpq-dev git icu-dev autoconf build-base linux-headers \ From b73538b305e9b7ff7277da97028180812cd13cb9 Mon Sep 17 00:00:00 2001 From: mesilov Date: Tue, 3 Mar 2026 13:22:59 +0600 Subject: [PATCH 10/10] Update CHANGELOG.md: add notes on Makefile changes aligning with `b24phpsdk v3` style Signed-off-by: mesilov --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b4c919..24696ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ ## 0.3.1 ### Changed - + - **Makefile aligned with b24phpsdk v3 style** - Set `help` as default target and added grouped help output - Switched Docker commands from `docker-compose` to `docker compose`