Renovate 간단하게 살펴보기

1ilsang
1ilsang
로스트아크 하실래염?
published
renovate

이번에는 디펜던시를 자동으로 최신화 해주는 Renovate에 대해 다뤄보겠습니다.

Index

  • INTRO
  • Renovate란?
  • Renovate의 장점
  • 적용 방법
  • 마무리

INTRO

image

리포지터리에서 위와 같은 노티를 많이 보셨을텐데요, 혹여나 critical severity가 존재한다면 마음 한켠이 굉장히 불안해지기 시작합니다. "그날이 왔구나" 생각하며 일정을 산정해 버전업 계획을 세우게 됩니다.

오래된 버전을 올리는것은 굉장히 고통스러운 작업을 동반합니다.

노티로 알려주는 패키지는 "종속성"에 포함되는 패키지도 있습니다. 따라서 복잡하게 얽힌 관계를 한땀한땀 쫓아가며 올려야 하는 패키지들을 수색하는 과정이 필요합니다.

image

만약 minimist 라는 라이브러리의 버전을 올려야 한다고 할 경우, 이 라이브러리를 종속성으로 가지고 있는 "실제로 설치된" 라이브러리를 yarn.lock과 같은 락파일에서 디펜던시 그래프를 찾아 올라가야 합니다. 위의 예에서는 detective 패키지가 종속성을 가지고 있습니다. 하지만 detective는 설치한 적이 없기 때문에 package.json에 없습니다. 따라서 detective 라이브러리를 종속하고 있는 또 다른 라이브러리를 찾아 올라가야 합니다. 이는 굉장히 고통스러운 과정입니다.

의존성이 커지기 전에 조금씩 버전을 올렸다면 이런 문제는 없지 않았을까 생각했었는데요, Renovate를 통해 어느정도 도움을 받을수 있다고 생각해 공유드리려고 합니다.

깃헙의 공식 툴인 dependabot 과의 차이점도 향후 작성해볼 예정입니다. 레딧에서 다양한 의견을 볼 수 있습니다.

Renovate란?

image

Renovate는 자동으로 디펜던시를 업데이트 해주는 봇입니다.

리포지터리의 패키지 관리자 파일을 확인하고 업데이트가 필요한 종속성을 발견하면 Pull Request 를 자동으로 해줍니다.

Renovate의 장점

  • MIT license / 오픈소스
  • 간단한 봇 설치 및 유지보수가 필요하지 않다
    • 리포지터리의 디펜던시에 renovate가 추가되지 않는다는 큰 장점이 있다(레포와 완전히 별개로 동작).
  • 풍부한 json 봇 동작 설정
  • PR 자동 생성 + 릴리즈 노트
  • monorepo 지원
image

Renovate를 적용하면 PR이 생성됩니다.

PR을 확인해보면 아래와 같은 특징을 찾아보실 수 있습니다.

  1. 캐럿 -> PIN 버전으로 변경되었습니다.
    • 버전을 특정하고 이후의 버전은 새로운 PR로 생성됩니다.
  2. 릴리즈 노트를 제공합니다.
    • 현재 버전과 타겟 버전 사이의 추가 내역 제공해주기 때문에 로그를 명시적으로 확인할 수 있습니다.
  3. Compare Source를 제공합니다.
    • 라이브러리 코드의 어디가 바뀌었는지 정확히 알 수 있습니다.
  4. PR이므로 DroneCI 및 actions와 조합해 2중 검증을 할 수 있습니다.

그 외에도 main 브랜치에 다른 브랜치가 merge되어 rebase가 필요할 경우 토글 버튼만으로 처리할수 있습니다.

{
  "extends": ["config:base"],
  // PR의 기본 라벨 설정
  "labels": ["renovate", "translate"],
  "packageRules": [
    {
      // 타입패키지들은 major업데이트가 아닌 이상 자동 merge
      "packagePatterns": ["^@types/"],
      "automerge": true,
      // automerge시 comment를 설정할 수 있습니다.
      "automergeType": "pr-comment",
      "automergeComment": "types: auto merge",
      "major": {
        "automerge": false
      }
    },
    {
      // lint 관련 패키지들은 하나의 PR로 생성하도록 설정
      "groupName": "lints",
      "matchPackagePatterns": ["^eslint", "^prettier", "^markdownlint"],
      "labels": ["lint"]
    }
  ]
}

또한 JSON 설정을 통해 auto merge, label, semver 범위 지정, PR 스케줄 설정, 최대 PR 개수 설정(기본 10개) 등의 옵션을 설정할수 있습니다.

적용 방법

적용방법은 상당히 간단합니다. 봇을 설치해주면 사실상 끝납니다.

  1. Renovate app을 설치합니다.

Renovate app 봇을 설치합니다.

image

그후 설치 페이지로 진입해서 봇을 추가할 리포지터리를 선택합니다.

  1. Renovate PR을 merge 합니다.

앱을 레포에 등록하면 자동으로 PR이 생성됩니다. 해당 PR을 머지합니다.

  1. PR 확인 및 renovate.json 설정

이제 앞에서 본것과 같이 업데이트가 필요한 라이브러리의 PR이 자동으로 생성됩니다. 기본 값은 10개이기 때문에 renovate.json 값을 수정해 원하는 방식으로 조정할 수 있습니다.

마무리

image

그동안 디펜던시는 "기간 잡아서 한방에 처리하자"로 남겨두고 있었습니다.

그렇기 때문에 정말 특정한 이슈가 없는 이상 버전 올릴 생각을 잘 하지 않게 되었고, 그 결과 수많은 Breaking change를 만나며 고생했던 기억이 있습니다. 무엇보다 "사용하고 있는 라이브러리의 최신 근황"에 대해 궁금해 하지 않았던 점도 한몫 했습니다.

이제, Renovate가 제공해주는 지속되는 PR을 통해 놓치지 않고 새로운 버전을 쫓아갈 수 있을거라 생각하고 있습니다. 또한 changeLog 및 sourceCompare를 통해 각 라이브러리의 근황도 자연스럽게 알게 될거라 기대하고 있습니다.

그럼 이만!