Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

GitHub과 연동해서 의존성 라이브러리를 관리할 수 있는 서비스들

요즘은 오픈소스 라이브러리 없이 개발하는 건 상상하기 어렵다. 그래서 많은 라이브러리를 가져다 쓰기 마련인데 각 라이브러리에도 버그가 있고 새로운 버전이 계속 나오기 때문에 개발하면서 이 의존성 관리를 하기는 쉽지 않다. 경험상 새로운 버전이 나올 때마다 올리는 것은 무척 귀찮은 일이지만 또 너무 내버려 두면 나중에 올릴 때 호환성을 맞추는 비용이 많이 들어서 올리기가 어려워진다.

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 의존성을 실시간으로 감시하고 자동으로 업데이트할 수 있게 해준다.

Greenkeeper와 GitHub 연동

GitHub와 로그인이 연동되어 있으므로 로그인하고 Greenkeeper를 연동하고 연결할 저장소를 지정하면 된다. 연결할 저장소는 package.json이 있어야 하고 CI가 연결되어 있어야 한다. 이 조건이 충족되면 다음과 같이 Greenkeeper 페이지에서 대기 상태로 표시된다.

Greenkeeper의 대시보드

처음에는 빨간색으로 있다가 아래와 같은 초기 Pull Request이 올라오고 노란색으로 대기상태로 바뀐다.

Greenkeeper의 초기화 Pull Request

이 첫 Pull Request를 머지하면 Greenkeeper에서 enabled 상태로 바뀐다. 이 PR에는 Greenkeeper의 배지를 README에 추가하는 커밋과 의존성에서 새로운 버전이 나온게 있으면 이를 업데이트하는 커밋이 포함되어 있다.

이후 프로젝트를 진행하던 중 새로운 버전이 나오면 다음과 같이 의존성을 업데이트하는 Pull Reqeust가 자동으로 올라온다.

Greenkeeper가 의존성을 업데이트하는 Pull Request

이 Pull Reqeust에는 새 버번의 릴리스 노트와 포함된 커밋까지 정리되어 있으므로 쉽게 내용을 확인하고 적용할지 말지를 결정할 수 있다. 그리고 CI 연결이 필수이므로 테스트코드가 잘 작성되어 있다면 새 버전이 적용된 Pull Reqeust에서 테스트를 실행하고 테스트가 깨지지 않으면 머지할 수 있다.

Greenkeeper가 package.json을 변경한 화면

위처럼 package.json에 해당 버전을 자동으로 업데이트해주므로 쉽게 최신 버전을 계속 적용할 수 있다.

Dependency CI

Greenkeeper가 의존성을 최신으로 업데이트하는 데 집중한다면 Dependency CI는 의존성 모듈을 검사하는 역할을 한다. Greenkeeper처럼 최신 버전으로 업데이트하는 기능은 조만간 나올 거라고만 되어 있고 현재는 의존성 중에 폐기되거나 보안 문제가 있는 모듈이 있는지를 주로 검사하고 있다. 가장 큰 장점은 npm만 지원하는 게 아니라 Maven, RubyGems, Nuget, CPAN, CocoaPods, Go 등 다양한 언어의 의존성을 관리해 준다는 점이다.

Dependency CI와 GitHub 저장소의 연동

GitHub으로 로그인한 뒤 원하는 저장소를 활성화하면 연결이 된다.

Dependency CI에서 커밋마다 의존성 테스트를 한 결과 화면

CI라는 이름답게 이후에는 커밋이나 Pull Request가 올라올 때마다 해당 코드를 기준으로 검사하고 결과를 알려준다.

Dependency CI의 CI 테스트 상세화면

위처럼 사용 중인 의존성의 버전과 라이센스 등이 표시된다. CI처럼 failure 상태로 나오는데 Jade 모듈이 현재 Deprecated된 상태이므로 이를 알려주는 것이다. Dependency CI에서 의존성을 최신 버전으로 올려주는 기능이 추가되면 가장 쓰기 좋지 않을까 싶다.

Gemnasium

Gemnasium도 Dependency CI와 거의 비슷한 역할을 한다. Gemnasium은 아마 Ruby부터 지원했던 기억이 있는데 지금은 npm, Python, PHP까지 지원하고 있다. 기억으로는 Gemnasium이 이 중에서는 제일 오래된 것 같다.

Gemnasium의 대시보드

대시보드에서는 연동한 프로젝트의 의존성 상태를 전체적으로 볼 수 있다.

Gemnasium에서 의존성 상태를 확인한 화면

프로젝트 상세화면으로 들어가면 각 의존성의 버전과 outdated 여부를 확인할 수 있고 새 버전에 대한 Changelog를 한 번에 볼 수 있어서 편하다. Gemnasium은 알림 기능이 잘 되어 있어서 이메일 등으로 알림 설정을 해두면 새 버전이 나왔을 때 알림을 받을 수 있으므로 정기적으로 확인해서 의존성을 업데이트하기 쉽다. 현재 beta 상태로 의존성 자동 업데이트 기능도 추가된 것 같은데 모두에게 적용되는 베타 기능이 아니라서 아직 사용해 볼 수는 없었다.

2017/10/07 17:05 2017/10/07 17:05