GitHub Actions의 증분 린트 수정

개발이 활발한 레거시 프로젝트에 새 Lint 규칙을 어떻게 적용합니까? 최근에 standard gem을 추가했는데 이제 많은 파일을 변경해야 하지만 한 번에 적용할 수 없었습니다.



나는 같은 문제를 겪었고 이 PR이 검토되는 동안 정기적인 리베이스가 필요하거나 일부 안전한 변경이 성가신 문제를 일으킬 수 있기 때문에 작은 변경 사항을 대량으로 추가할 수 없었습니다.

가장 일반적인 솔루션



개발자에게 별도의 커밋으로 PR의 모든 변경된 파일에 대한 외관 변경 사항을 추가하도록 요청하십시오. 비즈니스 논리 변경 사항을 찾을 때 Code Reviewer에 몇 가지 문제가 추가됩니다.

큰 열정이 없는 PR 작성자 및 코드 리뷰어는 이를 따를 것입니다.

그래서 저는 이 성가신 문제를 기계에 맡기기로 했습니다!



Photo by Thierry K



접근하다



지속적인 통합(GitHub 작업)에 간단한 정기 작업을 추가했습니다.
  • 결제 저장소,
  • 임의의 파일을 여러 개 선택,
  • 안전한 린트 자동 수정 실행,
  • 새로운 변경 사항으로 PR 만들기

  • 자동 수정 변경 사항이 있는 공개 PR




    #!/usr/bin/env bash
    
    set -e
    
    echo "-----Create and switch to new branch-----"
    
    current_date=$(date +"%Y%m%d%H%M")
    new_branch_name="auto-fix-lint-${current_date}"
    git checkout -b "$new_branch_name"
    
    git config user.name "jt-bot"
    git config user.email "[email protected]"
    
    echo "-----Run Rubocop-----"
    
    # shellcheck disable=SC2046
    bin/rubocop --no-server --fail-level "E" -a $(bin/rubocop --no-server -L **/*.rb | sort -R | head -n 5 | tr "\n" " ")
    
    echo "-----Commit Updates-----"
    
    git add .
    
    commit_message="Auto-fix lint warnings ${current_date}"
    
    git commit -am "$commit_message" ||
      (bin/rubocop -aF --fail-level "A" && exit 1) ||
      git commit -am "$commit_message" ||  exit 1
    
    if [[ -z "${GITHUB_TOKEN}" ]]; then
      echo "No Pull Request, because no GITHUB_TOKEN passed!"
      exit 1
    else
      git push "https://${GITHUB_TOKEN}@github.com/${GITHUB_USERNAME}/${GITHUB_REPONAME}.git" -f
    
      curl -X POST \
        -H "Authorization: token ${GITHUB_TOKEN}" \
        -d '{"title":"'"$commit_message"'","base":"develop","head":"'"$GITHUB_USERNAME"':'"$new_branch_name"'"}' \
        "https://api.github.com/repos/${GITHUB_USERNAME}/${GITHUB_REPONAME}/pulls"
    fi
    


    라인별




    current_date=$(date +"%Y%m%d%H%M")
    new_branch_name="auto-fix-lint-${current_date}"
    git checkout -b "$new_branch_name"
    


    변경 사항을 저장할 고유한 분기를 만듭니다.

    git config user.name "jt-bot"
    git config user.email "[email protected]"
    


    커밋을 수행하도록 Git을 설정합니다.

    bin/rubocop --no-server --fail-level "E" -a $(bin/rubocop --no-server -L **/*.rb | sort -R | head -n 5 | tr "\n" " ")
    


    이 줄은 Rubocop 파일에서 지원하는 모든 파일을 찾아 섞고 상위 5개를 가져옵니다(업데이트할 수 있음).

    git commit -am "$commit_message" ||
      (bin/rubocop -aF --fail-level "A" && exit 1) ||
      git commit -am "$commit_message" ||  exit 1
    


    이전 단계에서 변경 사항이 없으면 변경 사항이 있는 첫 번째 파일을 찾으려고 합니다.

    git push "https://${GITHUB_TOKEN}@github.com/${GITHUB_USERNAME}/${GITHUB_REPONAME}.git" -f
    
      curl -X POST \
        -H "Authorization: token ${GITHUB_TOKEN}" \
        -d '{"title":"'"$commit_message"'","base":"develop","head":"'"$GITHUB_USERNAME"':'"$new_branch_name"'"}' \
        "https://api.github.com/repos/${GITHUB_USERNAME}/${GITHUB_REPONAME}/pulls"
    


    변경 사항으로 PR을 푸시하고 생성합니다.

    2. 스케줄러를 사용한 GitHub 작업 흐름



    Need to use Personal Tokens only for GitHub to get it you should use GitHub Docs: Creating a personal access token. And more details why we need to use Personal Tokens: GitHub Docs: Triggering a workflow from a workflow



    ---
    name: Auto-fix
    
    on:
      schedule:
        # * is a special character in YAML so you have to quote this string
        - cron: '0 0 * * 1,3' # Each Monday and Wednesday
    
    env:
      CI: true
      RAILS_ENV: test
    
    concurrency:
      group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
      cancel-in-progress: true
    
    jobs:
      rubocop:
        runs-on: ubuntu-latest
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GITHUB_USERNAME: jetthoughts
          GITHUB_REPONAME: jt_tools
    
        steps:
          - uses: actions/checkout@v3
            with:
              fetch-depth: 1
    
          - name: Set up Ruby
            uses: ruby/setup-ruby@v1
            with:
              bundler-cache: true
    
          - name: Create Pull Request with RuboCop fixes (3 retries)
            continue-on-error: true
            run: |
              bin/ci-generates-lint-fix || bin/ci-generates-lint-fix || bin/ci-generates-lint-fix
    


    보너스: 자동 병합되도록 PR 표시 및 코드 검토 요청




    ---
    name: Enable auto-merge for bots' PRs
    
    on: pull_request
    
    permissions:
      pull-requests: write
      statuses: write
      contents: write
    
    jobs:
      select_for_auto_merge:
        runs-on: ubuntu-latest
        if: ${{ github.actor == 'github-actions[bot]' ||  startsWith(github.head_ref, 'auto-') }}
        steps:
          - name: Enable auto-merge for bots' PRs
            run: |
              gh pr merge --auto --rebase "$PR_URL"
              gh pr edit "$PR_URL" --add-reviewer "@jetthoughts/developers" --add-label "Need to review"
            env:
              PR_URL: ${{github.event.pull_request.html_url}}
              GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
    


    그리고 우리는 "원자적 습관"을 얻었습니다.



    몇 주 후에 깨끗한 코드를 얻을 수 있으며 코드 검토자나 개발자에게 해가 되지 않습니다 ;)




    Paul Keen은 오픈 소스 기여자이자 JetThoughts의 CTO입니다. 그를 팔로우하거나 GitHub .

    If you enjoyed this story, we recommend reading our latest tech stories and trending tech stories.

    좋은 웹페이지 즐겨찾기