Интеграционные тесты могут выполняться часами, они охватывают крайние случаи и сложные потоки, которые не проверяет обычный модульный тестовый костюм, в моем случае интеграционный тест – это более глубокий уровень тестирования.
Дело в том, что я не хочу, чтобы они баллотировались для какой-либо фиксации в моем PR.
Да, этот поток не сработает для меня:
name: Java CI on: [push] jobs: build:
Я хочу, чтобы они запустились перед Я выполняю слияние, удовлетворит ли меня нижеприведенный поток?
name: Java CI on: push: branches: - master
Нет, для меня слишком поздно, код уже объединен, а если мои тесты потерпят неудачу? мастер сломлен? ни в коем случае, я хочу запустить их перед слиянием…
Я придумал какое-то решение в стиле “бота”, я напишу комментарий в PR, и это запустит задание по интеграции, может быть полезно запустить его еще до того, как я буду готов к слиянию, просто чтобы понять, каков мой статус PR.
С этим решением есть 2 проблемы (помимо того, что оно не является автоматическим и требует, чтобы кто-то “попросил” работу ci ..)
- Задание не выполняется в контексте PR.
- Нужно проверить на любом шаге, что это необходимый комментарий, который я искал.
И с тем, и с другим можно справиться, просто имейте это в виду, потому что это немного усложнит решение.
Давайте начнем описывать процесс шаг за шагом:
Вот триггер, я хочу, чтобы он запускался для каждого комментария.
name: integration-test on: issue_comment: types: [created]
Но только для комментария с текстом “ci”: Я использую приятное действие , которое проверяет текст комментария и выдает мне результат, если этот комментарий совпадает с моим триггерным словом, у него также есть хорошая возможность добавлять смайлики, если комментарий совпадает:
steps: - uses: khan/pull-request-comment-trigger@master id: check with: trigger: 'ci' reaction: rocket env: GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'
После того, как мой комментарий будет проверен, я хочу отправить сообщение в PR со ссылкой на задание, которая необходима, потому что сборка выполняется не в контексте PR, она выполняется из мастера, чтобы установить связь между PR и сборкой, я отправляю этот комментарий обратно в PR:
- name: send comment if: steps.check.outputs.triggered == 'true' env: URL: ${{ github.event.issue.comments_url }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | curl \ -X POST \ $URL \ -H "Content-Type: application/json" \ -H "Authorization: token $GITHUB_TOKEN" \ --data '{ "body": ":test_tube: [starting ci integration job]( https://github.com/'"$GITHUB_REPOSITORY"'/actions/runs/'"$GITHUB_RUN_ID"')" }'
Следующим шагом будет вытащить ветку PR, как уже было сказано, это необходимо, потому что сборка не выполняется в контексте PR
- name: Get PR informations if: steps.check.outputs.triggered == 'true' id: pr_data run: | echo "::set-output name=branch::${{ fromJson(steps.request.outputs.data).head.ref }}" echo "::set-output name=repo_name::${{ fromJson(steps.request.outputs.data).head.repo.full_name }}" echo "::set-output name=repo_clone_url::${{ fromJson(steps.request.outputs.data).head.repo.clone_url }}" echo "::set-output name=repo_ssh_url::${{ fromJson(steps.request.outputs.data).head.repo.ssh_url }}" - name: Checkout PR Branch if: steps.check.outputs.triggered == 'true' uses: actions/checkout@v2 with: token: ${{ secrets.GITHUB_TOKEN }} repository: ${{ fromJson(steps.request.outputs.data).head.repo.full_name }} ref: ${{ steps.pr_data.outputs.branch }}
И, последнее, добавьте проверенную ревизию фиксации в вывод шага, который мне понадобится на следующих шагах.
- name: debug if: steps.check.outputs.triggered == 'true' id: debug run: | echo ::set-output name=sha::$( curl -u "u:${{github.token}}" https://api.github.com/repos/${{steps.pr_data.outputs.repo_name}}/git/ref/heads/${{steps.pr_data.outputs.branch}} | jq .object.sha | tr -d '"' )
Теперь наступает обычный этап сборки, в моем случае выполняется модульный тест Java с Maven (-Pci включит профиль maven, который запускает только интеграционные тесты)
- name: Set up JDK 1.8 if: steps.check.outputs.triggered == 'true' uses: actions/setup-java@v1 with: java-version: 1.8 - name: Build with Maven if: steps.check.outputs.triggered == 'true' run: mvn clean install -Pci
После этого шага задание выполнено с ошибкой или успешно, и я хочу отправить сообщение с указанием статуса, оно отправит ссылку с URL-адресом сборки задания с помощью ${{GITHUB_RUN_ID}}
.
- name: Create success comment if: steps.check.outputs.triggered == 'true' && success() env: URL: ${{ github.event.issue.comments_url }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | curl \ -X POST \ $URL \ -H "Content-Type: application/json" \ -H "Authorization: token $GITHUB_TOKEN" \ --data '{ "body": ":v: [finish ci integration job successfully]( https://github.com/'"$GITHUB_REPOSITORY"'/actions/runs/'"$GITHUB_RUN_ID"')" }' - name: Create fail comment if: steps.check.outputs.triggered == 'true' && failure() env: URL: ${{ github.event.issue.comments_url }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | curl \ -X POST \ $URL \ -H "Content-Type: application/json" \ -H "Authorization: token $GITHUB_TOKEN" \ --data '{ "body": ":facepalm: [ci integration job failed]( https://github.com/'"$GITHUB_REPOSITORY"'/actions/runs/'"$GITHUB_RUN_ID"')" }'
Бонусная часть! актуально, если в вашей сборке есть надежные отчеты Вы можете сгенерировать отчет о тестировании, используя это приятное действие. Но вы должны отправить ему свой последний коммит PR, чтобы увидеть результаты тестирования в самом PR, именно по этой причине я вывожу идентификатор sha коммита на шаге debug
.
- name: Publish Test Report if: steps.check.outputs.triggered == 'true' && (failure() || success()) uses: scacap/action-surefire-report@v1 with: github_token: ${{ secrets.GITHUB_TOKEN }} commit: ${{ steps.debug.outputs.sha }} check_name: integration_test_results
То есть!
Вот как это выглядит в разговоре о пиаре:
Оригинал: “https://dev.to/brachiwernick/integration-test-with-github-actions-2fma”