Rails 업그레이드 지침
우리는 최신 Rails 릴리스를 사용하여 GitLab을 실행하여 성능, 보안 업데이트, 및 새로운 기능을 활용하기 위해 노력합니다.
Rails 업그레이드 접근 방식
GitLab을 위한 MR 준비
- Ruby on Rails 업그레이드 가이드를 확인하고 애플리케이션을 다가오는 변경 사항에 대비하세요.
-
Gemfile
에서rails
gem 버전을 업데이트하세요. -
bundle update rails
명령을 실행하세요. - 업데이트 작업
rake rails:update
을 실행하세요. -
qa/Gemfile
에서activesupport
버전을 업데이트하세요. -
qa
폴더에서bundle update --conservative activesupport
를 실행하세요. - 모든 Bundler 충돌을 해결하세요.
-
@rails/ujs
와@rails/actioncable
npm 패키지가 새로운 rails 버전과 일치하는지package.json
에서 확인하세요. - 업데이트 후 로컬 패치 파일 버전이 일치하도록
yarn patch-package @rails/ujs
명령을 실행하세요. -
pipeline:run-all-rspec
라벨이 있는 MR을 생성하고 파이프라인이 실패하는지 확인하세요. -
git bisect
로 rails 리포지터리에 대해 특정 명세 실패를 해결하고 디버그하세요. 아래 디버깅 섹션을 참조하세요. - Merge Request 설명에 두 버전 간의 Gem 차이에 대한 링크를 포함하세요. 예를 들어, 이 링크는
activesupport
6.1.3.2 to 6.1.4.1의 gem 차이입니다.
Gitaly를 위한 MR 준비
-
Gitaly Ruby의 Gemfile에서
activesupport
gem 버전을 업데이트하세요. -
bundle update --conservative activesupport
를 실행하세요. - 이 변경 사항을 가지고 Gitaly 프로젝트에 MR을 생성하세요.
- 이 MR을 GitLab 프로젝트에서 생성된 MR에 종속되도록 만드세요.
- 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
명령을 사용할 수 있습니다:
-
원하는 폴더에
rails
프로젝트를 클론합니다. 예를 들어, GDK 루트 디렉터리 일 수 있습니다:cd <GDK_FOLDER> git clone https://github.com/rails/rails.git
-
GitLab
Gemfile
의gem 'rails'
라인을 다음과 같이 바꿉니다:gem 'rails', ENV['RAILS_VERSION'], path: ENV['RAILS_FOLDER']
-
RAILS_FOLDER
환경 변수를 클론한 Rails 폴더로 설정하세요:export RAILS_FOLDER="<GDK_FOLDER>/rails"
-
디렉터리를
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
를 사용합니다. 결과에서 약간의 스텝이 얼마나 걸리는지 볼 수 있습니다. -
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
- 프로세스가 완료되면,
git bisect
은 커밋 해시를 출력하는데, 이를 사용하여rails/rails
리포지터리에서 해당 MR을 찾을 수 있습니다. -
git bisect reset
명령을 실행하여bisect
모드를 종료하세요. -
Gemfile
의 변경 사항을 되돌리세요:git checkout -- Gemfile