깃허브 레이블 도둑을 만들어 보았다.

JongHun, Lim·2024년 3월 11일
15

사건의 발단

평화롭게 깃허브를 염탐하던 중.. 학교 선배가 우아코스에서 했던 프로젝트를 보게 되었다.
"역시.. 사람이 아니라 괴물이었어" 라고 혼잣말로 중얼거리던 와중 내 눈을 사로잡았던 건 알록달록하고 화려한 레이블이었다.

이런 엄청난 PR 내역들을 보고 난 후에 내 레포지토리를 보았다.

초라하다.
그래서 나도 레포하나에 레이블을 한 번 만들어 보았다.

굉장히 초라하다.
참고로 저거 하나 만드는데 30분 걸렸다.


자아성찰

내 귀차니즘이 또 한 번 발동해버렸다.
레이블 하나 만들고 나니 더 이상 만들기 귀찮아졌고, 또 하나의 문제점이 있었다. 이 레포지토리에서 레이블을 만들어 봤자 다른 레포지토리에서 재사용 할 수가 없었다.

그렇다. 깃허브는 레이블을 레포지토리 간 공유할 수 있는 기능이 없어서 한 번 만들었던 레이블을 또 쓰고 싶다면 수동으로 또 한 번 만들어줘야 했다.

여기서 나는 자아성찰의 시간을 가져보기로 했다.

나는 레이블을 이쁘게 디자인 할 수 있는 디자인 감각이 뛰어난가?

전혀 아니다. 어릴 때도 미술시간을 제일 싫어했다.

나는 레포지토리마다 수동으로 레이블을 만들 수 있을 정도로 근면성실한가?

더더욱 아니다. 살면서 주석을 써 본적이 없는 사람. 그것이 나다.

레이블을 체계적이고 효과적으로 쓸 수 있는가?

아마 아닐 것이다. 제대로 된 협업경험조차 없는 사람이며 혼자 개발할 때 Issue나 PR은 그날 저녁밥이 만족스러웠을 때 하는 편이다.

그럼에도 예쁜 레이블을 가지고 싶은가?

그렇다. 내가 만들긴 귀찮고 하기 싫은 작업이고, 가지고 있어 봐야 쓸 데 없지만 그럼에도 가지고 싶다.
남이 만든 예쁜 레이블들을 '딸깍' 한 번으로 훔쳐오고 싶다.

그래서 레이블 도둑을 한 번 만들어보았다.


기능

완성된 모듈은 npm 서버에 업로드 해서 언제든지 사용할 수 있도록 했다. (https://www.npmjs.com/package/github-label-copier)

typescript로 개발했기 때문에 javascript로 사용을 하더라도 자동완성 기능의 혜택을 볼 수 있다.
우선 셋팅하는 법부터 알아보자.

npm install github-label-copier
// index.js

const { createCopier } = require('github-label-copier');

const copier = createCopier('GITHUB_TOKEN');	// 적절한 권한은 필수

참고로 GITHUB_TOKEN은 선택사항이다. 다만 토큰이 있고 없고에 따라서 쓸 수 있는 기능의 차이가 있으며, 본인의 private repository를 탐색하려면 토큰은 필수값이다.

복사하기

이 모듈의 핵심기능이다. 남의 레이블을 훔쳐와서 내 레포에 적용하는 기능을 알아보자.

copier.copyLabels({
  from: 'https://github.com/{Owner}/{Repo}',
  to: 'https://github.com/{Owner}/{Repo}'
});

굉장히 간단하다. 이 방법으로 선배의 레이블을 훔쳐보자.

// index.js

const dotenv = require('dotenv');
dotenv.config();
const { createCopier } = require('github-label-copier');

const token = process.env.GITHUB_TOKEN;

const copier = createCopier(token);

copier.copyLabels({
  from: 'https://github.com/woowacourse-teams/2023-yozm-cafe',
  to: 'https://github.com/leemhoon00/github-label-copier',
});

캬캬캬캬ㅑㅋ 성공이다.
이 방법으로 내가 이전에 썼던 레이블들도 재사용 할 수 있다.

json이나 yaml로 저장하기

복사 기능만 있으면 모듈이 좀 심심할 것 같아서 두 가지 기능을 추가로 만들었다. 바로 파일로 저장하기 기능과 저장된 파일을 통해 레포에 푸쉬하는 기능이다.

copier.saveLabels({
  url: 'https://github.com/leemhoon00/github-label-copier',
  format: 'yaml',	// 'json' | 'yaml', 기본값: 'json'
});

format 옵션은 선택사항으로, 기본값은 json 포맷이다.
실행하고 나면 index.js가 있는 폴더에 yaml 파일이 하나 생성된다.

json이나 yaml로 푸쉬하기

레이블 디자인 작업을 yaml이나 json으로 하고싶은 사람도 있을 것이다.
그런 사람들을 위해서 로컬에 있는 파일을 통해 레포지토리에 푸쉬하는 기능을 만들었다.

우선 루트폴더에 yaml 파일을 위치시켜두자.

copier.pushLabels({
  filename: 'labels.yaml',
  url: 'https://github.com/leemhoon00/github-label-copier',
});

json이나 yaml 둘 다 가능하다.

참고로 이 레이블들도 어디선가 훔쳐온 것들이다.


완성

정작 만들고 나니 쓸 일 없을 것 같긴하다. 만드는 동안엔 재밌었으니 나쁘지 않았던 것 같기도..

레포주소
https://github.com/leemhoon00/github-label-copier

1개의 댓글

comment-user-thumbnail
2024년 3월 24일

ㅋㅋㅋㅋ좋은데요. 저런라이브러리가있군요

답글 달기