Рубрики
Без рубрики

Интеграционный тест с действиями GitHub

Интеграционные тесты могут выполняться часами, они охватывают крайние случаи и сложные потоки, которые использует обычный модуль t… С тегами github, тестирование, java, maven.

Интеграционные тесты могут выполняться часами, они охватывают крайние случаи и сложные потоки, которые не проверяет обычный модульный тестовый костюм, в моем случае интеграционный тест – это более глубокий уровень тестирования.

Дело в том, что я не хочу, чтобы они баллотировались для какой-либо фиксации в моем PR.

Да, этот поток не сработает для меня:

name: Java CI 

on: [push]

jobs:
  build:

Я хочу, чтобы они запустились перед Я выполняю слияние, удовлетворит ли меня нижеприведенный поток?

name: Java CI 

on:
  push:
    branches:
      - master

Нет, для меня слишком поздно, код уже объединен, а если мои тесты потерпят неудачу? мастер сломлен? ни в коем случае, я хочу запустить их перед слиянием…

Я придумал какое-то решение в стиле “бота”, я напишу комментарий в PR, и это запустит задание по интеграции, может быть полезно запустить его еще до того, как я буду готов к слиянию, просто чтобы понять, каков мой статус PR.

С этим решением есть 2 проблемы (помимо того, что оно не является автоматическим и требует, чтобы кто-то “попросил” работу ci ..)

  1. Задание не выполняется в контексте PR.
  2. Нужно проверить на любом шаге, что это необходимый комментарий, который я искал.

И с тем, и с другим можно справиться, просто имейте это в виду, потому что это немного усложнит решение.

Давайте начнем описывать процесс шаг за шагом:

Вот триггер, я хочу, чтобы он запускался для каждого комментария.

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”