CI에서 Python 패키지의 docstring 적용 범위를 추적하는 방법

몇 달 전에 공동 작업자가 Python 패키지의 docstring 적용 범위를 추적하는 방법을 요청했습니다. 우리는 코드에서 독스트링의 현재 적용 범위를 측정하고 풀 요청이 해당 값을 감소시키는 것을 방지하고 싶었습니다.

이 문제를 해결하려면 다음 요구 사항을 충족하는 워크플로우가 필요했습니다.
  • 적용 범위가 기본 분기(on pull requests ) 또는 이전 커밋(on push )의 점수보다 낮은 경우 작업 흐름이 실패하고 작업을 실패하게 만든 파일을 비난해야 합니다.
  • 기본 분기로 푸시하면 프로젝트의 현재 적용 범위가 업데이트되고 멋진 배지에 결과가 표시됩니다.

  • 그런 다음 대부분의 필요에 맞는 우수한 docstr-coverage 패키지를 찾았고 GitHub Actions, shields.iojsonbin.org과 함께 솔루션을 찾았습니다.

    jsonbin



    jsonbin.org은 서비스로서의 개인 키/값 JSON 저장소입니다.

    이 경우 이 서비스를 사용하여 shields.io endpoint 으로 동적 배지를 만듭니다. 작은 JSON 사전이 끝점에 전달되고 배지가 이동 중에 생성됩니다. 따라서 적용 범위가 변경될 때마다 저장소에 새 배지를 푸시하지 않습니다.

    {
      "schemaVersion": 1,
      "label": "docstr-cov",
      "message": "75%",
      "color": "green"
    }
    

    GitHub 계정으로 jsonbin에 로그인하고 토큰을 JSONBIN_APIKEY 라는 저장소 비밀로 저장해야 합니다.

    구성 파일



    리포지토리의 루트에 .docstr.yml라는 파일을 배치합니다.

    paths:
      - your_package
    verbose: 2 # int (0-3)
    skip_magic: True
    skip_file_doc: True
    skip_init: True
    skip_class_def: False
    skip_private: True
    follow_links: True
    percentage_only: False
    

    자세한 내용은 package documentation 을 참조하십시오.

    워크플로우



    이 워크플로우는 기본적으로 작동해야 합니다. 환경 변수를 조정할 필요는 없지만 RANGE 에 대해 다른 값을 선택할 수 있습니다.

    예를 들어 RANGE50..75는 커버리지가 아래50에 빨간색 배지가 표시되고 커버리지75 위에 녹색 배지가 표시됨을 의미합니다. Codecov와 똑같이 작동합니다!

    name: docstr-cov
    
    on:
      push:
        branches:
        - main
    
      pull_request:
        branches:
        - main
    
    env:
      RANGE: 50..75
      ENDPOINT: https://jsonbin.org/${{ github.repository_owner }}/${{ github.event.repository.name }}
      TOKEN: ${{ secrets.JSONBIN_APIKEY }}
    

    작업 수준에서 단계는 따르기 쉽습니다.
  • 비교 커밋( HEADBASE )은 이벤트 트리거에 따라 선택됩니다. 분기의 HEADpush 이벤트의 이전 커밋 또는 PR 대 기본의 HEAD pull_request의 분기.
  • BASEHEAD에 대한 커버리지 점수를 얻습니다. HEAD 점수가 낮으면 실패합니다.
  • 원인 파일(실패한 경우).

  • jobs:
      check:
        runs-on: ubuntu-latest
        steps:
    
          - uses: actions/checkout@v2
            with:
              fetch-depth: 0
    
          - name: Setup Python
            uses: actions/setup-python@v2
            with:
              python-version: 3.x
    
          - name: Install docstr-coverage
            run: pip install docstr-coverage
    
          - name: Get SHAs
            run: |
              if [[ ${{ github.event_name }} == 'push' ]]; then
                echo "BASE=$(git rev-parse HEAD^)" >> $GITHUB_ENV
                echo "HEAD=$(git rev-parse HEAD)" >> $GITHUB_ENV
    
              elif [[ ${{ github.event_name }} == 'pull_request' ]]; then
                echo "BASE=${{ github.event.pull_request.base.sha }}" >> $GITHUB_ENV
                echo "HEAD=${{ github.event.pull_request.head.sha }}" >> $GITHUB_ENV
    
              else
                echo "Unexpected event trigger"
                exit 1
              fi
    
          - name: Get base coverage
            run: |
              git checkout $BASE
              echo "BASE_COV=$(docstr-coverage -p)" >> $GITHUB_ENV
    
          - name: Test head coverage
            run: |
              git checkout $HEAD
              docstr-coverage --fail-under=$BASE_COV
    
          - name: Blame
            run: |
              git diff --name-only $(git merge-base $BASE $HEAD) | \
              xargs docstr-coverage --accept-empty
            if: failure()
    
    push 이벤트에서만:
  • 적용 범위 가져오기(반올림)
  • RANGE에 따라 색상 레이블을 설정합니다.
  • 결과를 jsonbin에 게시합니다.
  • 엔드포인트를 공개합니다.
  • 배지 URL을 인쇄합니다.

  •       - name: Get new coverage
            run: echo "NEW_COV=$(printf "%.f" $(docstr-coverage -p))" >> $GITHUB_ENV
            if: always() && github.event_name == 'push'
    
          - name: Set label color
            run: |
              if [[ $NEW_COV -ge $(echo {${{ env.RANGE }}} | awk '{print $NF;}') ]]; then
                echo "COLOR=green" >> $GITHUB_ENV
              elif [[ $NEW_COV -lt $(echo {${{ env.RANGE }}} | awk '{print $1;}') ]]; then
                echo "COLOR=red" >> $GITHUB_ENV
              else
                echo "COLOR=orange" >> $GITHUB_ENV
              fi
            if: always() && github.event_name == 'push'
    
          - name: Post results
            run: |
              curl -X POST $ENDPOINT/badges/docstr-cov \
              -H "authorization: token $TOKEN" \
              -d "{ \"schemaVersion\": 1, \"label\": \"docstr-cov\", \
                    \"message\": \"$NEW_COV%\", \"color\": \"$COLOR\" }"
            if: always() && github.event_name == 'push'
    
          - name: Set public endpoint
            run: |
              curl -X PUT $ENDPOINT/_perms -H "authorization: token $TOKEN"
            if: always() && github.event_name == 'push'
    
          - name: Show badge URL
            run: echo "https://img.shields.io/endpoint?url=$ENDPOINT/badges/docstr-cov"
            if: always() && github.event_name == 'push'
    

    배지는 main에 푸시할 때마다 동적으로 업데이트되어야 합니다. README.md에 추가하는 것을 잊지 마십시오.

    코드 받기




    에파사로 / docstr-cov-워크플로


    GitHub Actions를 사용하여 Python 패키지의 docstring 적용 범위 측정





    docstr-cov-워크플로


    GitHub Actions를 사용하여 Python 패키지의 docstring 범위 측정

    용법


  • .github/workflows/docstr-cov.yml.docstr.yaml를 저장소에 복사합니다.
  • package documentation 다음의 구성 파일을 조정합니다.
  • https://jsonbin.org에 로그인하고 API 키를 JSONBIN_APIKEY라는 저장소 암호로 저장합니다.
  • 적용 범위가 기본 분기(on pull_request ) 또는 이전 커밋(on push )의 점수보다 낮은 경우 작업 흐름이 실패하고 작업을 실패하게 만든 파일이 비난을 받습니다.
  • main 분기로 푸시하면 좋은 배지를 업데이트하여 프로젝트의 현재 적용 범위를 업데이트합니다.
  • 워크플로 맨 위에 있는 RANGE 변수를 조정하여 배지의 색상 범위를 변경할 수 있습니다. 예를 들어 50..75는 커버리지가 아래50에 빨간색 배지를 표시하고 커버리지75 위에 녹색 배지를 표시함을 의미합니다.
  • README.md에 배지를 추가해야 합니다.

  • 예시


    example/base.py를 변경하고 작업 흐름을 확인하십시오...

    View on GitHub

    좋은 웹페이지 즐겨찾기