궤도상의 위험: 기계가 당신을 위해 코드 심사를 하도록 하세요!

본고는 저의 최근 RailsConf 강연'지형화 유류 Rails 응용 프로그램'(,slides)의 b부분입니다.
우리, 개발자는 우리의 업무 시간의 중요한 부분을 코드 심사에 썼다.때로는 코드를 쓰는 것보다 더 많은 시간이 걸린다.몇 시간이 걸리더라도 당김 요청에서 잠재적인 문제가 누락되는 것을 피할 수 없다.
우리는 단지 일반인일 뿐이다. 우리는 확실히 실수를 할 것이다. 특히 일상적인 임무를 처리할 때.
누가 심심한 일을 하고 실수를 하지 않는 것을 좋아합니까?로봇!🤖
본고에서, 나는 당신이 코드 심사를 하는 것을 도울 수 있는 로봇을 소개하고 싶습니다.그것의 이름은 Danger(또는 더 정확히 말하면 her의 이름)이다.

Danger runs during your CI process, and gives teams the chance to automate common code review chores.


프로젝트에 위험을 추가하려면 GEM 파일에 danger 을 추가하고 대화식 bundle exec danger init 명령을 실행하십시오.
  • 은 예시 Dangerfile을 생성했습니다. 여기서 루비 DSL을 사용하여 심사 규칙을 정의할 수 있습니다.
  • 은 GitHub 통합 설정을 안내합니다.
  • 마지막으로 CI에 위험한 작업을 추가할 수 있습니다.
  • dangergem 자체는 "small core"만 제공:
  • Git 통합으로 리셋 정보(제출, 차이 등)에 액세스할 수 있습니다.
  • Git 관리 서비스 통합(GitHub, BitBucket, Gitlab)을 통해 PRS 데이터에 액세스하고 설명을 추가합니다.
  • (내부) CI 서비스 integrations은 CI 구축을 PRS와 정확하게 일치시킵니다.
  • 모든 특정 기능 (예를 들어linters 통합) 은 플러그인을 통해 이루어집니다. (awesome-danger 검사)
    이것은 아마도 이 글의 결말일 것이다. Danger를 설치하고 플러그인을 선택하고 Dangerfile를 추가하면 완성된다.만약 이것이 내가 나누고 싶은 것이라면, 나는 단지 나누고 싶을 뿐이다.Rails 프로젝트에 위험을 추가하는 것은 더욱 까다롭고 흥미로워진다...

    GitHub 재통합


    위험 가설은 다음과 같다. GitHub workflow:
  • 새로운 GitHub 사용자를 만들었습니다.
  • 은 이를 합작자로 환매 협의에 추가한다(폐쇄 원본 코드 항목에 대해).
  • 은 이 사용자에게 접근 영패를 생성하고 이를 DANGER_GITHUB_API_TOKEN으로 CI에 추가합니다.
  • 잠깐만, 새 GitHub 사용자를 만듭니까?이메일과 비밀번호가 있습니까?로봇을 추가할 더 좋은 방법은 없나요?네, 있어요. - GitHub Apps이 있어요.
    GitHub 응용 프로그램은 우리가 필요로 하는 모든 것을 할 수 있다. 환매/PRS 데이터를 읽고 설명을 추가하는 것이다. 더욱 중요한 것은 더욱 세밀한 권한을 가진다*.
    * 최근 GitHub introduced개의 새로운 권한 수준은 협업자, 분류 및 유지보수에 사용됩니다.첫 번째는 위험한 사용자에게 적합하다.
    주요 차이점은 GitHub 응용 프로그램이 영패에 접근하는 작업 방식이다. 그들의 생존 기간은 매우 짧다(최대 10분).따라서 Danger를 실행할 때마다 방문 영패를 만들어야 합니다.
    비록 다른 모든 것은 변하지 않지만, 우리는 이 영패를 DANGER_GITHUB_API_TOKEN으로 전달하고, Danger는 사용자의 방문 영패와 같이 사용한다.

    Continue reading to see how to create a GitHub App and make it serve as Danger bot on CircleCI.


    1단계.새 GitHub 응용 프로그램을 만듭니다.


    개인 GitHub 응용 프로그램이나 조직 수준의 응용 프로그램을 만들 수 있습니다.만약 당신이 조직이 있다면, 우리는 당신이 다음 것을 사용하는 것을 건의합니다.
    these instructions에 따라 새 응용 프로그램을 만듭니다.우리는 권한 섹션에만 관심을 갖는다.
  • 에서 저장소 컨텐트로 읽기를 선택합니다.
  • 은 "문제"를 위해 "읽기 전용"을 선택합니다 (문제 및 청구서는 "closely related").
  • 은 요청 끌기를 위해 읽기와 쓰기를 선택합니다.
  • 새로 만든 응용 프로그램에서 응용 프로그램 설치 섹션으로 이동하여 계정에 설치합니다.이 응용 프로그램과 함께 사용할 저장소 목록을 선택할 수 있습니다.
    당신의 로봇을 위해 choose an avatar을 설치하는 것을 잊지 마세요)

    단계 2.영패 생성기를 추가합니다.


    영패 만료 문제를 해결하기 위해 우리는 간단한 루비 스크립트(github-token)를 작성했다. 이 스크립트는 "Authentication as an installation" 흐름을 사용하여 새 영패를 요청한다.이것은 CircleCI 구성에서 사용하는 방법입니다.
    danger:
      executor: ruby
      steps:
        - attach_workspace:
            at: .
        - run:
            name: Add github.com to known_hosts
            command: mkdir -p ~/.ssh && ssh-keyscan -H github.com > ~/.ssh/known_hosts
        - run:
            name: Danger review
            command: |
              DANGER_GITHUB_API_TOKEN=$(bundle exec .circleci/github-token) bundle exec danger
        - store_artifacts:
            path: tmp/brakeman
    

    The source code of the github-token script could be found in the evilmartians/terraforming-rails repo.


    스크립트 자체에 다음 정보가 필요합니다.
  • 개인 키가 응용 프로그램의 프로필에 들어가서 생성합니다.
  • 응용 프로그램 ID를 응용 프로그램 페이지에서 찾을 수 있습니다.
  • 설치 ID가 https://github.com/organizations/MY-ORG/settings/installations(또는 https://github.com/settings/installations은 개인 설치용)으로 이동하여 응용 프로그램의 구성을 클릭하고 URL을 확인합니다. 형식은 .../installations/ID이어야 합니다.
  • 이 정보는 CircleCI 환경: GITHUB_APP_PRIVATE_KEY*, GITHUB_APP_ID, GITHUB_INSTALLATION_ID에 각각 사용됩니다.
    *CircleCI는 여러 줄 환경 값을 지원하지 않으므로 벤드펴기 값을 복사하려면 다음과 같이 하십시오.
    $ cat private-key.pem | perl -p -e 's/\n/\\n/g' | pbcopy
    
    github-token 스크립트는 처리 키의 여러 줄을 되돌려줍니다.

    모듈식 위험 파일


    기본적으로 Dangerfile은 모든 심사 검사의 유일한 입구점이다.모든 내용을 하나의 파일에 저장하면 효과가 매우 좋다. 그것이 너무 커질 때까지, 이것은 통상적으로 매우 빨리 발생한다.
    다른 한편, 대부분의 수표는 서로 의존하지 않는다.그렇다면 왜 하나하나를 하나의 파일에 단독으로 저장하지 않습니까?
    이것이 바로 우리가 한 일이다.
  • 의 모든 수표는 .danger/ 디렉터리의 루비 파일에 저장됩니다.
  • Dangerfile은 모든 검사를 수행하고 공유 논리도 포함한다.
  • 이것은 우리의 Dangerfile입니다.
    # Shared consts
    CHANGED_FILES = (git.added_files + git.modified_files).freeze
    ADDED_FILES = git.added_files.freeze
    
    Dir[File.join(__dir__, ".danger/*.rb")].each do |danger_rule_file|
      danger_rule = danger_rule_file.gsub(%r{(^./.danger/|.rb)}, "")
      $stdout.print "- #{danger_rule} "
      # execute each check using `eval`
      eval File.read(danger_rule_file), binding, File.expand_path(danger_rule_file)
      $stdout.puts "✅"
    # allow a single check to fail without breaking others
    rescue Exception => e
      $stdout.puts "💥"
    
      # make sure the result is a failure if some check failed to execute
      fail "Danger rule :#{danger_rule} failed with exception: #{e.message}\n" \
           "Backtrace: \n#{e.backtrace.join("\n")}"
    end
    
    출력은 다음과 같습니다.
    $ bundle exec danger
    
    - rails_credentials ✅
    - missing_labels ✅
    - brakeman ✅
    - ruby_deps_inconsistency ✅
    - updated_deps ✅
    - missing_tests ✅
    - merge_commits ✅
    - db_schema_inconsistency ✅
    - outdated_seeds ✅
    
    Warnings:
    - [ ] Are you sure we don't need to add/update tests for the main app?
    

    추가 보상: 위험한 브레이크 맨 만나기


    내가 Danger를 시도하기 시작한 이유 중 하나는 Brakeman으로 자동으로 안전 검사를 하는 생각이었다.CI에서만 실행하는 것은 내 요구 사항에 맞지 않습니다.
  • 스캐너가 실행되는 결과를 볼 수 있는 더 좋은 방법이 필요합니다. 가장 좋은 것은 Github
  • 에서
  • Brakeman의 실패가 나의 구축을 빨간색으로 만드는 것을 원하지 않는다. (그것은 100% 정확하지 않고 오보가 발생할 수 있다. 특히 당신이 대량의 원 프로그래밍을 사용할 때)
  • 위험은 이 일의 정확한 도구인 것 같다.그것은 단지 기존의 Brakeman 통합 (또는 플러그인) 이 없을 뿐이다.
    그래서 내가 쓴 것은 네가 here을 받을 수 있다.
    이 검사는 Brakeman을 프로그래밍으로 실행하여 HTML 보고서를 생성하고 링크* 및 최종 위험 결과에 대한 보고서 요약을 추가합니다.

    * 보고서를 찾을 수 있는 CircleCI 구축 가공소재 탭에 대한 링크를 생성했습니다.코드는 Dangerfile 에서 제공됩니다.

    어쨌든


    사실은 Danger가 코드 심사의 좋은 파트너라는 것을 증명한다.지금부터 나는 모든 항목에서 사용할 것이다.

    What do you think about Danger? Do you have some tips? Feel free to share in the comments!


    P, 비록 우리는 terraforming-rails 환매 협의에서 상술한 코드를 공개했지만, 더 좋은 공유 방식은 PRS를 Danger 자체와/또는 플러그인에 추가하는 것이다.그래서 OSS에 기여하고 싶으면 어떻게 해야 할지 알아요.😉.
    https://evilmartians.com/chronicles에 대한 더 많은 개발 글을 읽으세요!

    좋은 웹페이지 즐겨찾기