
Renovate란?
Renovate는 자동으로 의존성을 관리해주는 오픈소스 봇입니다. Mend에서 개발해 관리되고 있습니다.
Renovate가 의존성을 확인하고 자동으로 새로운 버전으로 수정해 PR(MR)을 만들어줍니다.
도입 목적
우리 단체가 관리하는 서비스에는 매우 오래된 서비스가 많습니다.
2015~17년쯤 개발된 서비스를 아직도 사용하고 있습니다.
그러나 의존성이 관리되지 않아 deprecated 된 패키지가 많고, 더 이상 다운로드가 불가능한 패키지도 존재합니다.
이러한 문제를 앞으로 예방하고자 자동으로 의존성을 체크해서 PR을 만들어주는 봇을 도입하기로 결정했습니다.
Dependabot VS Renovate
대표적인 의존성 관리 봇으로 Github에서 제공하는 Dependabot과 Renovate가 있습니다.
저는 그 중 Renovate를 선택했습니다.
Renovate와 Dependabot을 비교했을 때,
Renovate가 지원하는 언어(package manager)가 더 많고 Gitlab, Github를 비롯한 다양한 플랫폼을 지원하기 때문입니다.
Dependabot은 Github에 통합되어 편하게 쓸 수 있지만 Github에서만 쓸 수 있어 선택하지 않았습니다.
일반적으로 Github만 사용한다면 Dependabot이 훨씬 편할 수 있습니다.
다만 Github와 Gitlab을 동시에 사용하고 있기에 Renovate를 선택해야만 했습니다.
Renovate도 Mend에서 호스팅해주는 앱을 사용할 수 있지만 무료 사용량 제한으로 인해
직접 Renovate를 호스팅하기로 결정했습니다.
아래는 Renovate 공식 홈페이지에 있는 Renovate와 Dependabot 기능 비교 표입니다.
특징 | Renovate | Dependabot |
호스팅 | 셀프 호스팅 지원 Mend 호스팅 앱 사용 가능 |
Github 에서 호스팅됨 |
종속성 대시보드 | Yes | No |
모노레포 패키지 한번에 업데이트 | Yes | No |
그룹화된 업데이트 | Yes | Yes |
스케줄링 | Yes | Yes |
변경 로그 표시 | Yes | Yes |
지원 플랫폼 | Github, Gitlab, Bitbucket, Azure, Gitea 등 | Github |
공식 지원 언어 | 매우 많음 | 많음 |
셀프 호스팅 방법
Renovate의 공식 문서에 가보면 Renovate를 설치하는 여러 방법이 안내되어 있습니다.
npmjs / Docker / Kubernetes / CircleCI 예시가 존재합니다.
저희는 고가용성의 쿠버네티스 클러스터가 이미 구축되어 있고, ArgoCD를 통해 쿠버네티스 클러스터에 쉽게 배포할 수 있기에
Renovate 봇을 ArgoCD를 이용하여 쿠버네티스 클러스터로 배포하기로 결정하였습니다.
쿠버네티스 Kustomize 파일 작성
Gitlab과 Github 2가지의 Renovate 봇을 효율적으로 운영하기 위해서
base에 Renovate의 공통되는 yaml을 넣고, overlays 를 통해 Gitlab과 Github 버전 2가지를 운영하기로 했습니다.
base/cronjob.yaml
해당 내용들은 공식 사이트에 있는 kubernetes 배포 도움말을 참고하였습니다.
apiVersion: batch/v1
kind: CronJob
metadata:
name: renovate-github
spec:
schedule: "00 00 * * 2"
concurrencyPolicy: Forbid
jobTemplate:
spec:
ttlSecondsAfterFinished: 60
template:
spec:
containers:
- name: renovate-github
image: renovate/renovate:latest
volumeMounts:
- name: config
mountPath: /opt/renovate/config.json
subPath: config.json
- name: work
mountPath: '/tmp/renovate/'
env:
- name: LOG_LEVEL
value: info
envFrom:
- secretRef:
name: renovate-secret
restartPolicy: Never
volumes:
- name: config
configMap:
name: renovate-config
- name: work
emptyDir: {}
base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- cronjob.yaml
overlays/github/config.json
모두가 추가 계정 필요없이, Renovate Config 레포에서 손쉽게 관리 레포지토리를 추가할 수 있도록
config.json에 관리 대상 레포지토리를 넣을 수 있게 작성했습니다.
{
"platform": "github",
"dryRun": null,
"extends": ["config:base"],
"dependencyDashboard": true,
"prConcurrentLimit": 1,
"packageRules": [
{
"matchPackagePatterns": [".*"],
"groupName": "all-updates"
}
],
"repositories": [
"your-name/your-repo"
]
}
overlays/kustomization.json
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: renovate-github
configMapGenerator:
- name: renovate-config
files:
- config.json
resources:
- ../../base
- secret.yaml
generatorOptions:
disableNameSuffixHash: true
namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: renovate-github
secret.yaml
우리 팀은 Vault를 통해 환경변수를 관리한다.
아래 코드는 공식 홈페이지에 있는 secret.yaml 예시이다.
만약 Vault를 사용해 환경변수를 관리한다면 stringData -> data로 바꿔야 한다.
apiVersion: v1
kind: Secret
metadata:
name: renovate-secret
type: Opaque
stringData:
RENOVATE_GITHUB_COM_TOKEN: 'any-personal-user-token-for-github-com-for-fetching-changelogs'
RENOVATE_AUTODISCOVER: 'false'
RENOVATE_ENDPOINT: 'https://github.company.com/api/v3'
RENOVATE_GIT_AUTHOR: 'Renovate Bot <bot@renovateapp.com>'
RENOVATE_PLATFORM: 'github'
RENOVATE_TOKEN: 'your-github-enterprise-renovate-user-token'
봇이 실행되면
봇이 실행되면
깃허브 이슈에는 Renovate Dashboard가 생깁니다.
여기에서 관리할 수 있는거 같은데, 아무래도 Self-Hosting에다가 크론잡으로 한번 돌고 끝나다보니 실제로 사용할 수는 없는거 같습니다.
최초 1회에 한해 Renovate Configure PR이 올라옵니다.
해당 PR을 머지해주면 다음 크론잡이 실행될때부터 의존성을 검사하기 시작합니다.
'Infra' 카테고리의 다른 글
VMware Workstation Pro 무료 설치 for 개인 사용자용 (0) | 2025.01.23 |
---|
소프트웨어학과 현주씌의 일상을 담는 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!