실행 시 발생하는 Gem: FilePermissionError 처리

현상.


Reviewdog/action-rubocop을 사용하여 GiitHub Actions를 실행할 때 Gem:FilePermissionError가 발생했습니다.
GiitHub Acittons 로그

Run reviewdog/action-rubocop@v1
🐶 Installing reviewdog ... https://github.com/reviewdog/reviewdog
 Installing rubocop with extensions ... https://github.com/rubocop/rubocop
  ERROR:  While executing gem ... (Gem::FilePermissionError)
      You don't have write permissions for the /var/lib/gems/2.7.0 directory.
  Error: Process completed with exit code 1.
이 때의 작업 프로세스 파일은 다음과 같은yml입니다.
name: reviewdog
on: [pull_request]
jobs:
  rubocop:
    name: runner / rubocop
    runs-on: ubuntu-latest
    steps:
      - name: Check out code
        uses: actions/checkout@v1
      - name: rubocop
        uses: reviewdog/action-rubocop@v1
        with:
          rubocop_version: 1.8.1
          # rubocop_extensions: rubocop-rails:gemfile rubocop-rspec:gemfile
          github_token: ${{ secrets.github_token }}
          reporter: github-pr-review # Default is github-pr-check

조사하다.


문제 발생 지점 파악


우선 문제가 발생한 곳의 특정이다.Reviewdog의 코드, action을 찾았습니다.yml script.쉬를 실행하고 있는 것 같습니다.
・・・略・・・
runs:
  using: 'composite'
  steps:
    - run: $GITHUB_ACTION_PATH/script.sh
・・・略・・・
https://github.com/reviewdog/action-rubocop/blob/cdeaf0c191d62bcc651ae3a231c268f10b8ca1a5/action.yml#L46
이거 scirpt.sh와 현상의 로그를 확인한 후 Installing rubocop with extensions ... https://github.com/rubocop/rubocop의 로그를 발견하면 실패하고gem install가 실패합니다.
・・・略・・・
echo '::group::🐶 Installing reviewdog ... https://github.com/reviewdog/reviewdog'
curl -sfL https://raw.githubusercontent.com/reviewdog/reviewdog/master/install.sh | sh -s -- -b "${TEMP_PATH}" "${REVIEWDOG_VERSION}" 2>&1
echo '::endgroup::'

echo '::group:: Installing rubocop with extensions ... https://github.com/rubocop/rubocop'
# if 'gemfile' rubocop version selected
if [ "${INPUT_RUBOCOP_VERSION}" = "gemfile" ]; then
  # if Gemfile.lock is here
  if [ -f 'Gemfile.lock' ]; then
    # grep for rubocop version
    RUBOCOP_GEMFILE_VERSION=$(ruby -ne 'print $& if /^\s{4}rubocop\s\(\K.*(?=\))/' Gemfile.lock)

    # if rubocop version found, then pass it to the gem install
    # left it empty otherwise, so no version will be passed
    if [ -n "$RUBOCOP_GEMFILE_VERSION" ]; then
      RUBOCOP_VERSION=$RUBOCOP_GEMFILE_VERSION
      else
        printf "Cannot get the rubocop's version from Gemfile.lock. The latest version will be installed."
    fi
    else
      printf 'Gemfile.lock not found. The latest version will be installed.'
  fi
  else
    # set desired rubocop version
    RUBOCOP_VERSION=$INPUT_RUBOCOP_VERSION
fi

gem install -N rubocop --version "${RUBOCOP_VERSION}"

# Traverse over list of rubocop extensions
for extension in $INPUT_RUBOCOP_EXTENSIONS; do
  # grep for name and version
  INPUT_RUBOCOP_EXTENSION_NAME=$(echo "$extension" |awk 'BEGIN { FS = ":" } ; { print $1 }')
  INPUT_RUBOCOP_EXTENSION_VERSION=$(echo "$extension" |awk 'BEGIN { FS = ":" } ; { print $2 }')

  # if version is 'gemfile'
  if [ "${INPUT_RUBOCOP_EXTENSION_VERSION}" = "gemfile" ]; then
    # if Gemfile.lock is here
    if [ -f 'Gemfile.lock' ]; then
      # grep for rubocop extension version
      RUBOCOP_EXTENSION_GEMFILE_VERSION=$(ruby -ne "print $& if /^\s{4}$INPUT_RUBOCOP_EXTENSION_NAME\s\(\K.*(?=\))/" Gemfile.lock)

      # if rubocop extension version found, then pass it to the gem install
      # left it empty otherwise, so no version will be passed
      if [ -n "$RUBOCOP_EXTENSION_GEMFILE_VERSION" ]; then
        RUBOCOP_EXTENSION_VERSION=$RUBOCOP_EXTENSION_GEMFILE_VERSION
        else
          printf "Cannot get the rubocop extension version from Gemfile.lock. The latest version will be installed."
      fi
      else
        printf 'Gemfile.lock not found. The latest version will be installed.'
    fi
  else
    # set desired rubocop extension version
    RUBOCOP_EXTENSION_VERSION=$INPUT_RUBOCOP_EXTENSION_VERSION
  fi

  # Handle extensions with no version qualifier
  if [ -z "${RUBOCOP_EXTENSION_VERSION}" ]; then
    unset RUBOCOP_EXTENSION_VERSION_FLAG
  else
    RUBOCOP_EXTENSION_VERSION_FLAG="--version ${RUBOCOP_EXTENSION_VERSION}"
  fi

  # shellcheck disable=SC2086
  gem install -N "${INPUT_RUBOCOP_EXTENSION_NAME}" ${RUBOCOP_EXTENSION_VERSION_FLAG}
done
echo '::endgroup::'

export REVIEWDOG_GITHUB_API_TOKEN="${INPUT_GITHUB_TOKEN}"

echo '::group:: Running rubocop with reviewdog 🐶 ...'
・・・略・・・
https://github.com/reviewdog/action-rubocop/blob/master/script.sh
이gem의 설치 실패와 이번 오류 로그를 조사한 결과 다음과 같은 두 편의 글이 발견되었다.
  • GiitHub Action ReviewDog 오류
  • gem install에서 permission 오류가 발생했을 때 대응하는 방법
  • 이 두 기사와 이번 현상을 보면 원인과 대책은 다음과 같다.
    GiitHub Actions에 gem을 사용하여 Rubbocop을 설치할 때 GiitHub Actions 시스템 측면의 Ruby를 참조한 것 같습니다. 따라서 이 참조가 Permission Error로 바뀌면서 이런 현상이 발생했습니다.
    워크플로우에서 ruby/setup-ruby 동작을 추가하여 GiitHub Actions의 로컬 측면 Ruby를 참조하여 Permission Error에서 발생하지 않은 상태에서gem을 설치할 수 있습니다."

    대응


    워크플로우 파일에 ruby/setup-ruby 작업을 추가하여 Ruby 버전(3.00)을 지정하여 이 문제를 해결했습니다.
    name: reviewdog
    on: [pull_request]
    jobs:
      rubocop:
        name: runner / rubocop
        runs-on: ubuntu-latest
        steps:
          - name: Check out code
            uses: actions/checkout@v1
          - uses: ruby/setup-ruby@v1
            with:
              ruby-version: 3.0.0
          - name: rubocop
            uses: reviewdog/action-rubocop@v1
            with:
              rubocop_version: 1.8.1
              github_token: ${{ secrets.github_token }}
              reporter: github-pr-review # Default is github-pr-check
    

    좋은 웹페이지 즐겨찾기