GitHub Actions와의 통합 테스트

12095 단어 testingmavengithubjava
통합 테스트는 몇 시간 동안 실행할 수 있으며 일반 단위 테스트 슈트가 확인하지 않는 엣지 케이스와 복잡한 흐름을 다룹니다. 제 경우에는 통합 테스트가 더 깊은 수준의 테스트입니다.

요점은 내 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"텍스트가 포함된 주석에만 해당:
    댓글 텍스트를 확인하고 해당 댓글이 내 트리거 단어와 일치하면 출력을 제공하는 niceaction를 사용합니다. 댓글이 일치하면 이모티콘을 추가할 수 있는 멋진 기능도 있습니다.

    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 컨텍스트에서 빌드가 실행되지 않기 때문에 필요합니다.

     - 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 '"' )
    

    이제 일반 빌드 단계가 시작됩니다. 제 경우에는 Maven으로 Java 단위 테스트를 실행합니다(-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
    
    

    이 단계 후에 작업이 실패하거나 성공했으며 상태를 나타내는 메시지를 보내려고 합니다. 그러면 ${{GITHUB_RUN_ID}}를 사용하여 작업 빌드 URL이 포함된 링크가 전송됩니다.

     - 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"')" }'
    
    

    보너스 부분!
    빌드에 Surefire 보고서가 있는 경우 관련됨
    this nice 작업을 사용하여 테스트 보고서를 생성할 수 있습니다.
    그러나 PR 자체에서 테스트 결과를 보려면 마지막 PR 커밋을 보내야 합니다. 이것이 제가 debug 단계에서 커밋 sha id를 출력하는 이유입니다.

          - 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
    
    

    그건!

    PR 대화에서 다음과 같이 표시됩니다.

    좋은 웹페이지 즐겨찾기