2 апр. 2021 г.
Всем привет! Сегодня хотел бы рассказать о настройке анализа кода PHP(Symfony) проекта c помощью Psalm. А также генерацию html отчета и последующую интеграцию с Github Actions.
Psalm - инструмент для статического анализа и поиска ошибок в PHP проектах. Пример работы можно посмотреть на на официальном сайте.
Изначально настраивал для этого блога. Но затем, для большей наглядности, также настроил для одного из открытых проектов - placeholder-service.
Установка Psalm описана в документации.
composer require --dev vimeo/psalm
./vendor/bin/psalm --init
После установки будет создан файл psalm.xml
.
Для запуска проверки всего проекта выполним команду:
./vendor/bin/psalm
Также можно проверить определенные файлы:
./vendor/bin/psalm src/Controller
И сохранить результаты в XML:
./vendor/bin/psalm --report=checkstyle.xml
Для создания html отчета можно использовать библиотеку psalm-html-output. Для генерации отчета используется xsltproc. Сначала нужно установить библиотеку.
composer require --dev roave/psalm-html-output
Затем установить системный пакет xsltproc
apt install xsltproc
Отчет создается такой командой:
vendor/bin/psalm --output-format=xml | xsltproc vendor/roave/psalm-html-output/psalm-html-output.xsl - > psalm-report.html
Для более удобного запуска можно добавить скрипты в composer composer.json
.
И запускать таким образом: composer psalm
и composer psalm-report-html
.
{
...
"scripts": {
...
"psalm": [
"vendor/bin/psalm --report=checkstyle.xml"
],
"psalm-report-html": [
"vendor/bin/psalm --output-format=xml | xsltproc vendor/roave/psalm-html-output/psalm-html-output.xsl - > psalm-report.html"
],
...
}
...
}
Настройка github actions и настройка отображения html отчетов в pull request описана в предыдущих постах.
Нам нужно будет добавить генерацию html отчета и загрузку на сторонний web-сервер. Для этого создадим новое workflow .github/workflows/psalm.yml
.
Для private репозитория нужно обязательно защитить Web-сервер с помощью basic auth или другим способом!
## —— Upload tests coverage report to remote server
- name: Extract branch name
shell: bash
run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
id: extract_branch
- name: Print branch name
shell: bash
run: echo ${{ steps.extract_branch.outputs.branch }}
- name: Create directories for reports
uses: appleboy/ssh-action@master
env:
BRANCH: ${{ steps.extract_branch.outputs.branch }}
FILES_PATH: ${{ secrets.GA_FILES_PATH }}
with:
envs: BRANCH,FILES_PATH
host: ${{ secrets.REMOTE_HOST }}
username: ${{ secrets.REMOTE_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
passphrase: ''
script: mkdir -p $FILES_PATH/$BRANCH
- name: Uploads reports to server
uses: appleboy/scp-action@master
with:
host: ${{ secrets.REMOTE_HOST }}
username: ${{ secrets.REMOTE_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
passphrase: ''
rm: true
source: "coverage"
target: ${{ secrets.GA_FILES_PATH }}/${{ steps.extract_branch.outputs.branch }}
Затем добавить создание комментария со ссылкой на отчет в workflow .github/workflows/pull_request_comments.yml
.
name: Pull request comments
on:
pull_request:
jobs:
pull_request_comments:
runs-on: ubuntu-20.04
steps:
- name: Extract branch name
shell: bash
run: echo "##[set-output name=branch;]$(echo ${GITHUB_HEAD_REF})"
id: extract_branch
- name: Print branch name
shell: bash
run: echo ${{ steps.extract_branch.outputs.branch }}
- name: Add psalm code static analysis report comment
uses: mshick/add-pr-comment@v1
with:
message: |
Psalm static analysis report: [http://files.antonshell.me/github-actions/placeholder-service/${{ steps.extract_branch.outputs.branch }}/psalm/psalm-report.html](http://files.antonshell.me/github-actions/placeholder-service/${{ steps.extract_branch.outputs.branch }}/psalm/psalm-report.html)
repo-token: ${{ secrets.GITHUB_TOKEN }}
repo-token-user-login: 'github-actions[bot]' # The user.login for temporary GitHub tokens
allow-repeats: false # This is the default
В результате получаем примерно такой отчет.
Тестовый проект доступен на github. Также есть Pull Request с реализацией покрытия тестами. На этом пока все. Спасибо за внимание!