-
Gemfile.lock의 PLATFORMS 환경 통일하기 (feat. Gem)Infra 2023. 5. 22. 08:38
안녕하세요. 그린입니다🍏
이번 포스팅에서는 Gemfile.lock에서 플랫폼 부분을 팀원과 동일한 환경으로 통일하는 학습을 해보려해요🙋🏻
우선 주제에 대해 학습하기전 먼저 왜 Gemfile이 필요한건지 Gem이나 RubyGems는 그럼 무엇인지 왜 통일해야 하는지 알아보겠습니다!
우선 Gem은 무엇일까요?
Gem?
우리가 인프라를 구축하다보면 Swift외 다른 언어를 쓸 경우가 많이 주어집니다.
특히 CI/CD를 Fastlane으로 해준다면 Fastlane은 Ruby 언어를 사용하기에 더욱더 그렇죠.
이때 Gem이라는 개념은 타 언어인 Ruby에서의 라이브러리를 나타냅니다.
즉 우리도 Pod들이 있고 Podfile.lock이 생성되며 외부 라이브러리를 관리하고 하는것처럼 Gem도 동일한 Pod의 개념으로 볼 수 있습니다😃
해당 공식 사이트에서 여러 라이브러리들을 즉 Gem을 찾을 수 있습니다.
CocoaPods하고 너무 동일해요!
필요한 Gem이 있으면 아래 명령어로 설치해줄 수 있습니다.
$ gem install "필요한 Gem"
Gem을 알면 자연스레 Bundler를 알게 되는데 얘는 뭘까요?
Bundler?
Bundler는 쉽게 Gem이라는 라이브러리들을 정의해두었다면 그걸 사용할 수 있게 해주는 명령어 입니다.
즉, Gemfile에 필요한 Gem을 추가하고 bundler install을 통해 Gem을 사용하는 환경을 만들 수 있습니다🙌
Bundler도 Gem이기에 아래 명령어로 Bundler를 설치해줄 수 있습니다.
$ gem install bundler
현재 일자 기준으로 2.4.13 버전이 최신입니다.
하나 빼먹은 개념인 RubyGems에 대해 짧게 짚고 가볼께요🙋🏻
RubyGems?
위에서 Gem들을 찾으려면 RubyGems.org 공식 사이트를 가는것처럼 RubyGems는 Gem을 생성 및 수정 등 관리를 위한 툴입니다.
즉, Ruby 프로그래밍 언어를 위한 패키지 관리자로 이해할 수 있습니다.
CocoaPods처럼 라이브러리를 만들면 배포할 수 있는 포맷도 제공해주고 서버도 제공해줍니다.
당연히 Ruby가 먼저 설치되어 있는것이 선행입니다.
여기까지 개념에 대해 어느정도 알아봤습니다🎉
이제 그럼 본격적으로 팀원간 환경을 통일해볼까요?환경이 다를 경우?
위와 같이 Gem을 통해 fastlane을 Gemfile에서 심어주고 각 팀원들이 사용한다고 가정해볼때 아래와 같이 Gemfile.lock이 생성되고 PLATFORMS 부분을 보면 각자가 갖는 환경 즉, Ruby, Bundler, RubyGems에 맞춰진 OS 지원 환경으로 설정되는걸 볼 수 있습니다.
PLATFORMS arm64-darwin-22 arm64-darwin-21 arm64-darwin-20
나의 환경에서는 arm64-darwin-22인데 다른 팀원의 OS 환경이 달라 21, 20이 추가되었다고 볼께요.
사실 저 플랫폼 부분은 지원하는걸 의미하기에 저렇게 두어도 전혀 문제가 없고 무방하긴 하지만 그래도 팀원끼리 각자의 개발 장비 환경을 맞추면 나중에 모를 이슈를 미연에 방지할 수 있을것 같습니다.
우선 저 arm64-darwin-22와 같은건 어떤걸 의미하는지 짧게 알아볼까요?
Gemfile.lock의 PLATFORMS?
우선 PLATFORMS는 지원하는 OS 환경을 의미하며 즉, 저기에 arm64-darwin-22가 들어있다면 해당 OS 플랫폼에서 해당 의존성 환경들이 작동한다라고 이해할 수 있습니다.
그럼 arm64-darwin-22/21/20 이것들은 뭔가 할텐데요.
arm64가 붙어있으니 iOS 개발자들은 직감적으로 애플의 M1 칩 기반을 떠올릴 수 있을거에요.
arm64는 Apple Silicon 아키텍쳐를 나타내며 darwin은 macOS의 커널 이름입니다.
22는 macOS 버전 번호를 나타내는걸로 알고 있습니다.
즉 각자의 macOS들이 다르면 저 지원하는 플랫폼의 환경이 다를거에요.
만약 macOS 버전도 동일한데 지원하는 플랫폼 버전이 다르게 또 추가된다면 이는 우리가 앞으로 해볼 환경설정이 맞지 않아 누군가 예전 버전을 사용하고 있어서 신규 플랫폼이 업데이트가 되지 않은거라 볼 수 있습니다😄
즉 우리는 저 플랫폼을 현재 지원하고있는것의 최신인 arm64-darwin-22로 맞춰보겠습니다🕺🏻
PLATFOMRS 통일을 위한 환경 설정하기
우선 Ruby도 설치되지 않았고 Bundler도 역시나 미설치고 모든게 처음이라는 가정하에 Homebrew부터 설치하면서 스텝을 나아가보겠습니다!
1️⃣ Homebrew 설치 (이미 설치되어 있다면 2번 스텝으로 가주세요!)
Homebrew는 다들 아시겠지만 Ruby로 개발된 macOS 전용 패키지 관리자로 외부 프로그램을 쉽게 설치할 수 있습니다.
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
2️⃣ Homebrew 업데이트 (기존 설치되어 있는 경우)
$ brew update
3️⃣ Ruby 환경 준비를 위한 rbenv 및 Ruby 설치를 위한 패키지 설치
$ brew install rbenv ruby-build libyaml
4️⃣ rbenv를 이용한 Ruby 설치
여기서 rbenv는 루비 언어를 독립적으로 사용할 수 있게 해주는 패키지 관리자로 Homebrew와 Gem이 모두 루비로 쓰는것을 보면 여러 ruby 버전이 꼬일 수 있습니다.
이에 각 필요한 ruby 버전을 독립적으로 사용할 수 있게 해주며 이러한 독립적으로 사용을 권장하고 있습니다.
생성되는 경로는 usr/.rbenv/versions에 생기게 됩니다.
현재 일자 기준으로 최신이자 안정화된 Ruby 버전은 3.2.2임으로 해당 버전으로 진행합니다.
$ rbenv install 3.2.0
5️⃣ rbenv를 이용해 Ruby 시스템 전역 설정
바로 위 4번 스텝에서 version 파일이 보이시죠?
저 파일안에 3.2.2 버전만 넣어주게 되는것입니다.
그럼 전역적으로 Ruby 시스템을 설정할 수 있습니다.
$ rbenv global 3.2.2
6️⃣ RubyGems 업데이트
RubyGems의 버전을 맞춰줘볼까요?
특정하게 맞춰주고자 현재 일자 기준 최신 버전은 3.4.12로 명시해줍니다.
$ gem update —system 3.4.12
아! Bundler 설치도 필요하죠🙋🏻
7️⃣ Bundler 설치
현재 일자 기준 Bundler의 최신 버전은 2.4.13입니다.
$ gem install bundler
자 이렇게 팀원들이 설정을 모두 맞췄다면 끝입니다.그럼 모든 터미널은 한번 꼭 닫아주시고 실제 프로젝트로 가서 Gemfile을 구성해주고 다시 Gem들을 설치하게 되면 Gemfile.lock이 생성되겠죠?
그럼 이제 팀원들이 각자 프로젝트를 내려받고 Gem 설치나 업데이트를 해줘도 플랫폼 부분에서는 통일된 하나의 arm64-darwin-22만 보일것입니다😄
마무리
아주 간단하다고는 못하지만 개념만 알면 쉬운 부분이였습니다🏄🏻♂️
굳이 이렇게까지 해야하나..? 라고 할 수 있지만 각자 특별한 상황이 없는한 팀원끼리 OS 및 시스템 버전도 통일해놓는것이 안전할것 같습니다!
[참고 자료]