Travis CI에서 textlint의 지적을 Pull Request의 리뷰 코멘트로 작성

10687 단어 textlintTravisCI
textlint를 Travis CI에서 움직여 지속적으로 문장을 확인하십시오 - Qiita

계속되는 이야기입니다.

textlint 의 체크가 실패하면, Pull Request의 코멘트로서 써 주는 것을 만드는 구조의 이야기입니다.



일반적으로 Lint계를 CI로 달리게 하면, 어디에서 실패했는지를 확인하기 어렵고 CI까지 보러 가는 것은 번거롭고 알기 어렵습니다.
GitHub에서는 리뷰 코멘트로 해당 행에 코멘트를 쓸 수 있으므로, 직접 거기에 지적의 코멘트 있는 것이 좋다.

Hound 가 바로 그러한 서비스입니다만, 임의의 툴에는 대응하고 있지 않습니다.

saddler이라는 도구가 Travis CI 또는 Circle CI에서 동일한 작업을 수행 할 수 있습니다.
  • 변경된 파일에 rubocop 또는 jscs를 실행하여 pull request에 자동으로 주석 처리 – Saddler - checkstyle to anywhere
  • packsaddle/ruby-saddler

  • .travis.yml 설정



    보통의 CI의 설정은 textlint를 Travis CI에서 움직여 지속적으로 문장을 확인하십시오 - Qiita 에 있는 대로이므로, 거기까지는 이미 되어 있다고 전제입니다.

    리뷰 코멘트를 기입하는 타이밍은, 테스트 실패(Lint 실패)했을 때이므로, .travis.ymlafter_failure 에 리뷰 코멘트를 기입하는 쉘 스크립트를 추가합니다.
    sudo: false
    language: node_js
    node_js: "stable"
    after_failure:
      - ./.travis/review-textlint.sh
    

    Ruby가 필요하기 때문에 language: ruby 를 기본으로 하는 경우는 다음과 같이 설정할 수 있습니다.
    sudo: false
    language: ruby
    rvm:
    - '2.2'
    env:
      - NODE_JS_VERSION='6'
    install:
      - nvm install $NODE_JS_VERSION
      - nvm use $NODE_JS_VERSION
      - npm install
    script:
      - npm test
    after_failure:
      - ./.travis/review-textlint.sh
    

    Travis CI에는 기본적으로 ruby가 들어있는 언어가 많기 때문에 명시적으로 ruby를 넣지 않아도 움직인다고 생각합니다.

    GitHub의 Token 설정



    Travis CI에서 saddler이 리뷰 코멘트를 작성하려면 GitHub Token 설정이 필요합니다.
    GITHUB_ACCESS_TOKEN=xxx 라는 환경 변수가 설정되면 자동으로 사용할 수 있습니다.

    Personal Access Tokens 에서 repo 의 권한을 포함한 Token 을 발행해, 커멘드 라인으로부터 travis 커멘드로 다음과 같이 설정하면 환경 변수가 정의됩니다.
    travis env set GITHUB_ACCESS_TOKEN xxx
    

    또한 Travis CI의 해당 리포지토리 설정 화면에서도 설정할 수 있습니다.



    레비 그림 w-xtint. sh


    review-textlint.sh 에서는, 그 Pull Request로 변경한 파일만 textlint 로 Lint 해 그 결과를 Pull Request 에 기입하고 있습니다.

    Travis CI에서는 git clone가 shallow이므로, 다른 브랜치 등을 취득하는 작업이 필요합니다 (Circle CI에서는 불필요합니다).
    이것을 하지 않으면 git diff 그리고 차등의 파일명 취득을 잘 할 수 없다고 생각합니다.
  • bash - GIT fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree in Travis - Stack Overflow

  • 또, Pull Request시 이외는 실행하지 않게 "$TRAVIS_PULL_REQUEST" 그리고 분기하고 있습니다. (Circle CI에서는 CI_PULL_REQUEST를 볼 필요가 있습니다)
    #!/bin/bash
    
    # Test if pull request
    if [ "$TRAVIS_PULL_REQUEST" = "false" ] || [ -z "$TRAVIS_PULL_REQUEST" ]; then
      echo 'not pull request.'
      exit 0
    fi
    
    # Fetch other branch
    # To avoid ambiguous argument
    # http://stackoverflow.com/questions/37303969/git-fatal-ambiguous-argument-head-unknown-revision-or-path-not-in-the-workin
    if [ "$TRAVIS" == "true" ]; then
      #resolving `detached HEAD` by attaching HEAD to the `TRAVIS_FROM_BRANCH` branch
      TRAVIS_FROM_BRANCH="travis_from_branch"
      git branch $TRAVIS_FROM_BRANCH
      git checkout $TRAVIS_FROM_BRANCH
    
      #fetching `TRAVIS_BRANCH` branch
      git fetch origin $TRAVIS_BRANCH
      git checkout -qf FETCH_HEAD
      git branch $TRAVIS_BRANCH
      git checkout $TRAVIS_BRANCH
    
      #switch to `TRAVIS_FROM_BRANCH`
      git checkout $TRAVIS_FROM_BRANCH
    fi
    
    # Install saddler
    # https://github.com/packsaddle/ruby-saddler
    # Need secret env: `GITHUB_ACCESS_TOKEN=xxx`
    gem install --no-document checkstyle_filter-git saddler saddler-reporter-github
    
    # Diff Target Branch
    # diff HEAD...target
    # http://stackoverflow.com/questions/3161204/find-the-parent-branch-of-a-git-branch
    # http://qiita.com/upinetree/items/0b74b08b64442f0a89b9
    declare diffBranchName=$(git show-branch | grep '*' | grep -v "$(git rev-parse --abbrev-ref HEAD)" | head -1 | awk -F'[]~^[]' '{print $2}')
    
    # filter files and lint
    echo "${diffBranchName}...HEAD"
    echo "textlint -> review_comments"
    git diff --name-only --diff-filter=ACMR ${diffBranchName} \
    | grep -a '.*.md$' \
    | xargs $(npm bin)/textlint -f checkstyle \
    | checkstyle_filter-git diff ${diffBranchName} \
    | saddler report \
        --require saddler/reporter/github \
        --reporter Saddler::Reporter::Github::PullRequestReviewComment
    

    나중에 이 파일을 .travis/review-textlint.sh 에 넣고 실행할 수 있도록 chmod +x .travis/review-textlint.sh 합니다.

    이제 리뷰 주석으로 Lint 결과를 쓸 수 있습니다.



    참고 프로젝트


  • azu/JavaScript-Plugin-Architecture: JavaScript 플러그인 아키텍처
  • Review Test by azu · Pull Request #118 · azu/JavaScript-Plugin-Architecture
  • 좋은 웹페이지 즐겨찾기