요즘은 오픈소스 라이브러리 없이 개발하는 건 상상하기 어렵다. 그래서 많은 라이브러리를 가져다 쓰기 마련인데 각 라이브러리에도 버그가 있고 새로운 버전이 계속 나오기 때문에 개발하면서 이 의존성 관리를 하기는 쉽지 않다. 경험상 새로운 버전이 나올 때마다 올리는 것은 무척 귀찮은 일이지만 또 너무 내버려 두면 나중에 올릴 때 호환성을 맞추는 비용이 많이 들어서 올리기가 어려워진다.
Node.js같은 경우 npm
에 버전 검사를 할 수 있는 npm outdated
명령어가 있어서 새로운 버전을 확인해서 package.json
을 수정할 수 있다.
$ npm outdated
Package Current Wanted Latest Location
debug 2.6.9 2.6.9 3.1.0 deps-test
여기서 Current는 현재 로컬에 설치된 버전이고 Wanted는 package.json
에 정의된 버전 범위에 따라 새로 설치하거나 업데이트할 때 설치되는 버전이다. Latest는 최신 버전이므로 Wanted와 Latest가 맞지 않으면 package.json
을 업데이트해야 새 버전이 적용된다.
이런 의존성 관리는 새 버전이 나왔는지 매번 확인하기도 어렵고 보안 취약점이 생겼을 때 알아차리기도 어려워서 관리하기가 쉽지 않다. GitHub과 연동해서 의존성을 쉽게 관리할 수 있도록 도와주는 서비스가 여럿 있다. 이러한 서비스가 꼭 Node.js만 지원하는 것은 아니지만 Node.js가 package.json
으로 의존성 관리가 통일되어 있기 때문인지 많이 지원하는 편이고 나도 이쪽을 많이 사용했으므로 Node.js를 기준으로 설명한다. Private 저장소를 사용한다면 유료로 써야 하지만 공개된 저장소라면 무료로 이용할 수 있으므로 이런 서비스를 이용하면 더 편하게 의존성을 편하게 관리할 수 있다.
Greenkeeper
Greenkeeper는 npm 의존성을 실시간으로 감시하고 자동으로 업데이트할 수 있게 해준다.
GitHub와 로그인이 연동되어 있으므로 로그인하고 Greenkeeper를 연동하고 연결할 저장소를 지정하면 된다. 연결할 저장소는 package.json
이 있어야 하고 CI가 연결되어 있어야 한다. 이 조건이 충족되면 다음과 같이 Greenkeeper 페이지에서 대기 상태로 표시된다.
처음에는 빨간색으로 있다가 아래와 같은 초기 Pull Request이 올라오고 노란색으로 대기상태로 바뀐다.
이 첫 Pull Request를 머지하면 Greenkeeper에서 enabled 상태로 바뀐다. 이 PR에는 Greenkeeper의 배지를 README에 추가하는 커밋과 의존성에서 새로운 버전이 나온게 있으면 이를 업데이트하는 커밋이 포함되어 있다.
이후 프로젝트를 진행하던 중 새로운 버전이 나오면 다음과 같이 의존성을 업데이트하는 Pull Reqeust가 자동으로 올라온다.
이 Pull Reqeust에는 새 버번의 릴리스 노트와 포함된 커밋까지 정리되어 있으므로 쉽게 내용을 확인하고 적용할지 말지를 결정할 수 있다. 그리고 CI 연결이 필수이므로 테스트코드가 잘 작성되어 있다면 새 버전이 적용된 Pull Reqeust에서 테스트를 실행하고 테스트가 깨지지 않으면 머지할 수 있다.
위처럼 package.json
에 해당 버전을 자동으로 업데이트해주므로 쉽게 최신 버전을 계속 적용할 수 있다.
Dependency CI
Greenkeeper가 의존성을 최신으로 업데이트하는 데 집중한다면 Dependency CI는 의존성 모듈을 검사하는 역할을 한다. Greenkeeper처럼 최신 버전으로 업데이트하는 기능은 조만간 나올 거라고만 되어 있고 현재는 의존성 중에 폐기되거나 보안 문제가 있는 모듈이 있는지를 주로 검사하고 있다. 가장 큰 장점은 npm만 지원하는 게 아니라 Maven, RubyGems, Nuget, CPAN, CocoaPods, Go 등 다양한 언어의 의존성을 관리해 준다는 점이다.
GitHub으로 로그인한 뒤 원하는 저장소를 활성화하면 연결이 된다.
CI라는 이름답게 이후에는 커밋이나 Pull Request가 올라올 때마다 해당 코드를 기준으로 검사하고 결과를 알려준다.
위처럼 사용 중인 의존성의 버전과 라이센스 등이 표시된다. CI처럼 failure 상태로 나오는데 Jade 모듈이 현재 Deprecated된 상태이므로 이를 알려주는 것이다. Dependency CI에서 의존성을 최신 버전으로 올려주는 기능이 추가되면 가장 쓰기 좋지 않을까 싶다.
Gemnasium
Gemnasium도 Dependency CI와 거의 비슷한 역할을 한다. Gemnasium은 아마 Ruby부터 지원했던 기억이 있는데 지금은 npm, Python, PHP까지 지원하고 있다. 기억으로는 Gemnasium이 이 중에서는 제일 오래된 것 같다.
대시보드에서는 연동한 프로젝트의 의존성 상태를 전체적으로 볼 수 있다.
프로젝트 상세화면으로 들어가면 각 의존성의 버전과 outdated 여부를 확인할 수 있고 새 버전에 대한 Changelog를 한 번에 볼 수 있어서 편하다. Gemnasium은 알림 기능이 잘 되어 있어서 이메일 등으로 알림 설정을 해두면 새 버전이 나왔을 때 알림을 받을 수 있으므로 정기적으로 확인해서 의존성을 업데이트하기 쉽다. 현재 beta 상태로 의존성 자동 업데이트 기능도 추가된 것 같은데 모두에게 적용되는 베타 기능이 아니라서 아직 사용해 볼 수는 없었다.
Comments