'Giithub Action' 으로 pre-commiit 실행

26025 단어 GitHubPythonCItech

개시하다


이 글은 cookiecutter-django에서 사용된pre-commitGithub Actions의 동작을 이해하기 위해 쓴 글이다.pre-commit 코드의 성형과 유형 검사를 할 수 있다.GithubAction에서 집행pre-commit하면 환경을 구축할 필요가 없다.
샘플 창고
https://github.com/ikura1/test-pre-commit

pre-commiit 내용 읽기

GithubActions 실행하기 전에 pre-commit 무엇을 실행했는지 읽어 보세요.
exclude: "^docs/|/migrations/"
default_stages: [commit]

repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.2.0
    hooks:
      - id: trailing-whitespace
      - id: end-of-file-fixer
      - id: check-yaml

  - repo: https://github.com/psf/black
    rev: 22.3.0
    hooks:
      - id: black

  - repo: https://github.com/PyCQA/isort
    rev: 5.10.1
    hooks:
      - id: isort

  - repo: https://github.com/PyCQA/flake8
    rev: 4.0.1
    hooks:
      - id: flake8
        args: ["--config=setup.cfg"]
        additional_dependencies: [flake8-isort]

# sets up .pre-commit-ci.yaml to ensure pre-commit dependencies stay up to date
ci:
  autoupdate_schedule: weekly
  skip: []
  submodules: false

실행할 명령

repos 내의 명령은 다음과 같이 순서대로 집행된다.
  • pre-commit-hooks
  • trailing-whitespace
  • 줄 끝 공간 삭제
  • 빈 행 삭제
  • end-of-file-fixer
  • 파일의 끝을 빈 줄로 변경
  • check-yaml
  • yaml 파일의 문법 검사
  • black
  • 코드의 성형
  • isort
  • import 라이브러리의 성형
  • flake8
  • 코드 스타일 검사
  • 기타

  • exclude
  • 제외된 파일 모드의 정의
  • 문서 폴더 및 DB 마이그레이션 폴더 지정
  • default_stages
  • 실행 단계의 정의
  • commit시 훅스의 집행을 제한
  • ci
  • pre-commit방향ci설정
  • autoupdate_schedule
  • 훅 버전 업데이트에 사용되는 시간표

  • 지정weekly, 매주 업데이트
  • skip
  • 건너뛸 hook ID 목록 지정
  • 건너뛰지 않도록 설정
  • submodules
  • 서브모듈을 설치한 귀속 체크아웃
  • false, 기본값false
  • 환경 구조


    우선 현지 환경pre-commit에서 실행하고 환경을 구축할 수 있다.
    # Code quality
    # ------------------------------------------------------------------------------
    flake8==4.0.1  # https://github.com/PyCQA/flake8
    flake8-isort==4.1.1  # https://github.com/gforcada/flake8-isort
    coverage==6.3.2  # https://github.com/nedbat/coveragepy
    black==22.3.0  # https://github.com/psf/black
    pylint-django==2.5.3  # https://github.com/PyCQA/pylint-django
    pre-commit==2.18.1  # https://github.com/pre-commit/pre-commit
    
    상술한 것은 로컬 환경용requirements.txt의 코드 품질 부분이다.
    다음 두 개pre-commit 중 사용하지 않아 설치되지 않았습니다.
  • coverage
  • pylint-django
  • pre-commiit의 실행 테스트


    성형이 필요한 다음 코드를 만들어서 pre-commit동작을 합니다.pre-commit install 이후 확인.GithubActions동작 시 pre-commit install하지 않은 상태에서 동작 확인을 한다.
    hoge.py
    import random
    from fizzbuzz import fizzbuzz as fb
    import click
    import os
    
    
    @click.command()
    @click.option('--num','-n',default=lambda: random.randint(1, 100),type=int,help='Number of loop')
    def fizzbuzz(num: int):
        fb(num)
    
    
    if __name__=='__main__':
      fizzbuzz()
    
    pre-commit 동작 로그
    $ >git commit -m "feat: isortなどが動作するコードに変更"
    [WARNING] Unstaged files detected.
    [INFO] Stashing unstaged files to C:\Users\ikura\.cache\pre-commit\patch1651315960-10368.
    trim trailing whitespace.................................................Passed
    fix end of files.........................................................Passed
    check yaml...........................................(no files to check)Skipped
    black....................................................................Failed
    - hook id: black
    - files were modified by this hook
    
    reformatted hoge.py
    
    All done! \u2728 \U0001f370 \u2728
    1 file reformatted, 1 file left unchanged.
    
    isort....................................................................Failed
    - hook id: isort
    - files were modified by this hook
    
    Fixing C:\Users\ikura\repos\test-pre-commit\hoge.py
    
    flake8...................................................................Passed
    [INFO] Restored changes from C:\Users\ikura\.cache\pre-commit\patch1651315960-10368.
    
    $ >
    
    pre-commit 실행 후 코드
    hoge.py
    import random
    
    import click
    
    from fizzbuzz import fizzbuzz as fb
    
    
    @click.command()
    @click.option(
        "--num",
        "-n",
        default=lambda: random.randint(1, 100),
        type=int,
        help="Number of loop",
    )
    def fizzbuzz(num: int):
        fb(num)
    
    
    if __name__ == "__main__":
        fizzbuzz()
    
    

    Giithub Action 섹션 읽기


    name: CI
    
    # Enable Buildkit and let compose use it to speed up image building
    env:
      DOCKER_BUILDKIT: 1
      COMPOSE_DOCKER_CLI_BUILD: 1
    
    on:
      pull_request:
        branches: ["master", "main"]
        paths-ignore: ["docs/**"]
    
      push:
        branches: ["master", "main"]
        paths-ignore: ["docs/**"]
    
    concurrency:
      group: ${{ github.head_ref || github.run_id }}
      cancel-in-progress: true
    
    jobs:
      linter:
        runs-on: ubuntu-latest
        steps:
          - name: Checkout Code Repository
            uses: actions/checkout@v3
    
          - name: Set up Python
            uses: actions/setup-python@v3
            with:
              python-version: "3.9"
              cache: pip
              cache-dependency-path: |
                requirements/base.txt
                requirements/local.txt
    
          - name: Run pre-commit
            uses: pre-commit/[email protected]
    
      # With no caching at all the entire ci process takes 4m 30s to complete!
      pytest:
        runs-on: ubuntu-latest
    
        steps:
          - name: Checkout Code Repository
            uses: actions/checkout@v3
    
          - name: Build the Stack
            run: docker-compose -f local.yml build
    
          - name: Run DB Migrations
            run: docker-compose -f local.yml run --rm django python manage.py migrate
    
          - name: Run Django Tests
            run: docker-compose -f local.yml run django pytest
    
          - name: Tear down the Stack
            run: docker-compose -f local.yml down
    
    jobs의 후반부pytest를 무시한다.앞부분을 읽으면 충분하고 간단한 동작으로 확인하면 테스트 부분의 동작을 검증하기 어렵다.

    실행 설정


    on:
      pull_request:
        branches: ["master", "main"]
        paths-ignore: ["docs/**"]
    
      push:
        branches: ["master", "main"]
        paths-ignore: ["docs/**"]
    
    concurrency:
      group: ${{ github.head_ref || github.run_id }}
      cancel-in-progress: true
    
    실행 정시on밀어넣기 요청 및 밀어넣기 시 master 또는 main 분기에서 수행됩니다.또한, 제외docs병렬concurrency
    변경을 허용하지 않고, 동시에 수법만 실행한다.

    실행 부분


    linter:
      runs-on: ubuntu-latest
      steps:
        - name: Checkout Code Repository
          uses: actions/checkout@v3
    
        - name: Set up Python
          uses: actions/setup-python@v3
          with:
            python-version: "3.9"
            cache: pip
            cache-dependency-path: |
              requirements/base.txt
              requirements/local.txt
    
        - name: Run pre-commit
          uses: pre-commit/[email protected]
    
  • actions/checkout@3
  • 코드의 체크아웃
  • actions/setup-python@v3
  • 파이톤의 Setup
  • 동작 확인 중 requirements.txt
  • 로 변경
  • pre-commit/[email protected]
  • pre-commit의 실행
  • 동작 확인

    pre-commit uninstall에서 삭제pre-commit하고 위에서 만든 슬픈 코드로 동작을 확인한다.
    코드별 조정 가능 시간Github Actions에 장애가 발생하여 수정을 요청합니다.o:
    error

    감상

    Github Actions좋은 기분pre-commit 최종 사용자는 반드시 현지에서 환경을 구축해야 한다Github Actions. 실행하면 사람이 환경에 참여하지 않는 것이 검사를 받는 것이 좋다.

    시험을 준비하다

  • mypy
  • 형 검사는 명령 집행

  • 에 포함되지 않음pre-commit
  • coverage
  • 테스트 레버 실행 명령
  • 참고 자료


    https://github.com/cookiecutter/cookiecutter-django
    https://pre-commit.com/
    https://pre-commit.ci/
    https://github.com/pre-commit/pre-commit-hooks
    https://github.com/psf/black
    https://github.com/PyCQA/isort
    https://github.com/PyCQA/flake8
    https://docs.github.com/ja/actions/using-jobs/using-concurrency

    좋은 웹페이지 즐겨찾기