Rails 업그레이드 지침

우리는 최신 Rails 릴리스를 사용하여 GitLab을 실행하여 성능, 보안 업데이트, 및 새로운 기능을 활용하기 위해 노력합니다.

Rails 업그레이드 접근 방식

  1. GitLab을 위한 MR 준비.
  2. Gitaly를 위한 MR 준비.
  3. 보안 패치용 패치 릴리스 및 백포트 생성.

GitLab을 위한 MR 준비

  1. Ruby on Rails 업그레이드 가이드를 확인하고 애플리케이션을 다가오는 변경 사항에 대비하세요.
  2. Gemfile에서 rails gem 버전을 업데이트하세요.
  3. bundle update rails 명령을 실행하세요.
  4. 업데이트 작업 rake rails:update을 실행하세요.
  5. qa/Gemfile에서 activesupport 버전을 업데이트하세요.
  6. qa 폴더에서 bundle update --conservative activesupport를 실행하세요.
  7. 모든 Bundler 충돌을 해결하세요.
  8. @rails/ujs@rails/actioncable npm 패키지가 새로운 rails 버전과 일치하는지 package.json에서 확인하세요.
  9. 업데이트 후 로컬 패치 파일 버전이 일치하도록 yarn patch-package @rails/ujs 명령을 실행하세요.
  10. pipeline:run-all-rspec 라벨이 있는 MR을 생성하고 파이프라인이 실패하는지 확인하세요.
  11. git bisect로 rails 리포지터리에 대해 특정 명세 실패를 해결하고 디버그하세요. 아래 디버깅 섹션을 참조하세요.
  12. Merge Request 설명에 두 버전 간의 Gem 차이에 대한 링크를 포함하세요. 예를 들어, 이 링크는 activesupport 6.1.3.2 to 6.1.4.1의 gem 차이입니다.

Gitaly를 위한 MR 준비

  1. Gitaly Ruby의 Gemfile에서 activesupport gem 버전을 업데이트하세요.
  2. bundle update --conservative activesupport를 실행하세요.
  3. 이 변경 사항을 가지고 Gitaly 프로젝트에 MR을 생성하세요.
  4. 이 MR을 GitLab 프로젝트에서 생성된 MR에 종속되도록 만드세요.
  5. GitLab 프로젝트의 MR을 Merge한 이후에만 이 MR을 Merge하세요.

보안 패치용 패치 릴리스 및 백포트 생성

만약 Rails 업그레이드가 패치 릴리스를 초과하고 중요한 보안 패치가 포함된 경우, 이를 Self-managed 고객에게 릴리스하세요. 진행 방법은 릴리스 매니저와 상의하세요.

폐기 로거

우리는 또한 Ruby 및 Rails 폐기 경고를 log/deprecation_json.log 파일에 기록합니다. 이는 테스트에서 충분히 커버되지 않은 코드가 있고, 따라서 DeprecationToolkitEnv를 통과하게 될 수 있는 코드에 대한 단서를 제공합니다.

GitLab SaaS의 경우 GitLab 팀 멤버는 Kibana(https://log.gprd.gitlab.net/goto/f7cebf1ff05038d901ba2c45925c7e01)에서 이 로그 이벤트를 확인할 수 있습니다.

Rails에 대한 Git bisect

일반적으로, 명세 실패의 원인이 무엇인지 알고 있다면, 추가적인 컨텍스트를 제공하고 명세 실패에 대한 수정을 찾는 데 도움이 됩니다. 명세 실패를 일으킨 Rails 변경이 무엇인지 효과적이고 빠르게 찾기 위해 git bisect 명령을 사용할 수 있습니다:

  1. 원하는 폴더에 rails 프로젝트를 클론합니다. 예를 들어, GDK 루트 디렉터리 일 수 있습니다:

    cd <GDK_FOLDER>
    git clone https://github.com/rails/rails.git
    
  2. GitLab Gemfilegem 'rails' 라인을 다음과 같이 바꿉니다:

    gem 'rails', ENV['RAILS_VERSION'], path: ENV['RAILS_FOLDER']
    
  3. RAILS_FOLDER 환경 변수를 클론한 Rails 폴더로 설정하세요:

    export RAILS_FOLDER="<GDK_FOLDER>/rails"
    
  4. 디렉터리를 RAILS_FOLDER로 변경하고 git bisect 명령에 대한 범위를 설정하세요:

    cd $RAILS_FOLDER
    git bisect start <NEW_VERSION_TAG> <OLD_VERSION_TAG>
    

    여기서 <NEW_VERSION_TAG>은 명세가 실패한 태그이며, <OLD_VERSION_TAG>는 성공한 명세의 태그입니다. 예를 들어, 만약 6.1.3.2 버전에서 6.1.4.1 버전으로 업그레이드한다면, git bisect start v6.1.4.1 v6.1.3.2를 사용합니다. 명세가 실패한 태그를 <NEW_VERSION_TAG>으로 대체하고, 성공한 명세의 태그를 <OLD_VERSION_TAG>으로 대체합니다. 예를 들어, 6.1.3.2 버전에서 6.1.4.1 버전으로 업그레이드한다면, git bisect start v6.1.4.1 v6.1.3.2를 사용합니다. 결과에서 약간의 스텝이 얼마나 걸리는지 볼 수 있습니다.

  5. git bisect 프로세스를 시작하고 scripts/rails-update-bisect에 명세 파일 이름을 인수로 전달하세요. 전체 명세 파일 대신 하나의 예제를 선택하는 것이 빠를 수 있습니다.

    git bisect run <GDK_FOLDER>/gitlab/scripts/rails-update-bisect spec/models/ability_spec.rb
    # 또는
    git bisect run <GDK_FOLDER>/gitlab/scripts/rails-update-bisect spec/models/ability_spec.rb:7
    
  6. 프로세스가 완료되면, git bisect은 커밋 해시를 출력하는데, 이를 사용하여 rails/rails 리포지터리에서 해당 MR을 찾을 수 있습니다.
  7. git bisect reset 명령을 실행하여 bisect 모드를 종료하세요.
  8. Gemfile의 변경 사항을 되돌리세요:

    git checkout -- Gemfile
    

추가 독서 자료