jeudi 17 octobre 2019

Installer phpstan

phpstan/phpstan est un outil de vérification du code.

Pour l'installer dans votre projet Symfony :
composer require --dev phpstan/phpstan phpstan/phpstan-symfony phpstan/phpstan-doctrine

Ensuite il faut lui créer le fichier de configuration phpstan.neon :
parameters: level: 5 paths: - src/ # Si quelqu'un trouve comment lui indiquer que ce répertoire n'a pas le même namespace que les autres dans src excludes_analyse: - src/Migrations/ symfony: container_xml_path: %rootDir%/../../../var/cache/dev/srcApp_KernelDevDebugContainer.xml includes: - vendor/phpstan/phpstan-symfony/extension.neon - vendor/phpstan/phpstan-doctrine/extension.neon

Vous pouvez créer un binaire bin/phpstan qui l'exécute dans un container Docker :
#!/usr/bin/env sh set -e if [ $(which docker || false) ]; then readonly PROJECT_DIRECTORY=$(realpath $(dirname $(realpath $0))/..) docker run \ --rm \ -v ${PROJECT_DIRECTORY}:/var/phpstan:ro \ -w /var/phpstan \ php:7.3.8-cli-alpine3.10 \ bin/phpstan $@ else php -d memory_limit=512M vendor/bin/phpstan analyse --ansi -c phpstan.neon $@ fi

Et enfin l'intégrer dans CircleCI :
version: '2.1' jobs: composer: docker: - image: composer working_directory: /var/repository steps: - checkout - restore_cache: key: composer-{{ checksum "composer.json" }}-{{ checksum "composer.lock" }} - run: command: | if [ ! -f vendor/autoload.php ];then composer global require hirak/prestissimo; composer install --ignore-platform-reqs --no-interaction --no-progress --classmap-authoritative; fi - save_cache: key: composer-{{ checksum "composer.json" }}-{{ checksum "composer.lock" }} paths: - ./vendor - persist_to_workspace: root: . paths: - vendor phpstan: docker: - image: php:7.3.8-cli-alpine3.10 working_directory: /var/repository steps: - checkout - restore_cache: keys: - composer-{{ checksum "composer.json" }}-{{ checksum "composer.lock" }} - run: name: Cache warmup command: bin/console cache:warmup --env=dev - run: name: phpstan command: bin/phpstan workflows: version: '2.1' Code quality: jobs: - phpstan: requires: - composer

Installer maglnet/composer-require-checker

maglnet/composer-require-checker va vérifier que vous avez bien toutes les dépendances utilisées indiquées dans votre composer.json.

Pour l'installer dans votre projet :
composer require --dev maglnet/composer-require-checker
Vous pouvez créer un binaire bin/composerRequireChecker qui l'exécute dans un container Docker :
#!/usr/bin/env sh #set -e if [ $(which docker || false) ]; then readonly PROJECT_DIRECTORY=$(realpath $(dirname $(realpath $0))/..) docker run \ --rm \ -it \ -v ${PROJECT_DIRECTORY}:/var/repository \ -w /var/repository \ --entrypoint=sh \ php:7.3.8-cli-alpine3.10 \ bin/composerRequireChecker $@ else php -d memory_limit=512M vendor/bin/composer-require-checker $@ fi
Et lancer ce container via CircleCI :
version: '2.1' jobs: composer: docker: - image: composer working_directory: /var/repository steps: - checkout - restore_cache: key: composer-{{ checksum "composer.json" }}-{{ checksum "composer.lock" }} - run: command: | if [ ! -f vendor/autoload.php ];then composer install --ignore-platform-reqs --no-interaction --no-progress --classmap-authoritative; fi - save_cache: key: composer-{{ checksum "composer.json" }}-{{ checksum "composer.lock" }} paths: - ./vendor - persist_to_workspace: root: . paths: - vendor composerRequireChecker: docker: - image: php:7.3.8-cli-alpine3.10 working_directory: /var/repository steps: - checkout - restore_cache: keys: - composer-{{ checksum "composer.json" }}-{{ checksum "composer.lock" }} - run: name: composerRequireChecker command: bin/composerRequireChecker workflows: version: '2.1' Code quality: jobs: - composer - composerRequireChecker: requires: - composer

jeudi 1 août 2019

Ajouter BlackFire dans votre container PHP

BlackFire est un outil pour vous aider à comprendre ce qu'il se passe dans votre code, et trouver les goulots d'étranglement pour améliorer les performances.

Voilà un exemple d'installation dans un container PHP :

Dockerfile
FROM php:7.3.7-cli # Install BlackFire RUN echo "foo" RUN \ apt-get update \ && apt-get install -y gnupg2 wget \ && wget -q -O - https://packages.blackfire.io/gpg.key | apt-key add - \ && echo "deb http://packages.blackfire.io/debian any main" | tee /etc/apt/sources.list.d/blackfire.list \ && apt-get update \ && apt-get install -y blackfire-agent blackfire-php # Configure BlackFire COPY .blackfire.ini /root/.blackfire.ini ARG BLACKFIRE_CLIENT_ID ARG BLACKFIRE_CLIENT_TOKEN ARG BLACKFIRE_SERVER_ID ARG BLACKFIRE_SERVER_TOKEN RUN \ sed "s/^client-id=$/client-id=${BLACKFIRE_CLIENT_ID}/" -i /root/.blackfire.ini \ && sed "s/^client-token=$/client-token=${BLACKFIRE_CLIENT_TOKEN}/" -i /root/.blackfire.ini \ && sed "s/^server-id=$/server-id=${BLACKFIRE_SERVER_ID}/" -i /etc/blackfire/agent \ && sed "s/^server-token=$/server-token=${BLACKFIRE_SERVER_TOKEN}/" -i /etc/blackfire/agent
blackfire.sh
#!/usr/bin/env bash readonly BLACKFIRE_CLIENT_ID= readonly BLACKFIRE_CLIENT_TOKEN= readonly BLACKFIRE_SERVER_ID= readonly BLACKFIRE_SERVER_TOKEN=
.blackfire.ini
[blackfire] ca-cert= client-id= client-token= endpoint=https://blackfire.io http-proxy= https-proxy= timeout=15s
Builder votre image
source blackfire.sh docker build \ -t ${PROJECT_NAME} \ --build-arg BLACKFIRE_CLIENT_ID=${BLACKFIRE_CLIENT_ID} \ --build-arg BLACKFIRE_CLIENT_TOKEN=${BLACKFIRE_CLIENT_TOKEN} \ --build-arg BLACKFIRE_SERVER_ID=${BLACKFIRE_SERVER_ID} \ --build-arg BLACKFIRE_SERVER_TOKEN=${BLACKFIRE_SERVER_TOKEN}


Ensuite pour profiler du PHP en CLI :
blackfire run php ...