Git

github issue label 모든 repository에 한번에 적용하기

keepbang 2023. 11. 6. 16:23

회사에서 ci 작업을 진행하던 중 issue label을 적용시켜야 하는 상황이 생겨서 label을 적용하는 스크립트와 내용을 공유하고자 한다.

 


 

github 조직에서 관리자 권한은 issue label 을 한 번에 적용시킬 수 있을 거라 생각해서 찾아보니 처음 repository를 생성할 때 적용시키는 것만 있었다.

 

Set the labels that will be included when a new repository is created in this organization.

 

 

 

그래서 더 찾아보니 cmd로 api를 날려서 label을 적용 할 수 있는 github-label-sync 라는걸 찾았다!

 

필요한건 3가지 정도가 필요하고 위에서 말한 github-label-sync 는 단일 repository만 적용 가능하길래 모든 repository에 적용할 수 있도록 쉘 스크립트를 작성했다.

 

1. github-label-sync 는 npx로 구동되기 때문에 npx가 설치되어 있어야 한다.

2. public 은 상관없지만 private repository를 가져오려면 github token이 필요하다.

3. label 정보가 담겨있는 json 파일이 필요하다.

 

위에서 말한 3가지가 준비되면 내가 적용하고자 하는 repository에 모두 적용할 수 있다.

 

 


 

1. label 정보가 담겨있는 json 파일을 작성하기

 

[
  {
    "name": "resolved",
    "color": "008672",
    "description": "이슈 해결"
  },
  {
    "name": "bug",
    "color": "d73a4a",
    "description": "버그 수정"
  },
  {
    "name": "enhancement",
    "color": "a2eeef", 
    "description": "기능 추가 및 개선"
  },
  {
    "name": "test",
    "color": "cfd3d7", 
    "description": "테스트 및 테스트 코드 작성"
  },
  {
    "name": "release",
    "color": "e4e669",
    "description": "Released Product"
  },
  {
    "name": "staging",
    "color": "5319e7",
    "description": "staging server"
  }
]

 

위와 같이 적용하고자 하는 label 이름과 설명, 색상등을 입력하고 저장해 둔다.

2. Repository list 받아오기

 

50개가 넘어가는 repository를 다 한 번씩 적용하기에는 무리인 듯싶어서 repository list를 받아서 처리하기로 했다.

아래 api를 사용하면 repository 목록을 받아올 수 있다.

 

curl -u username:{github_token} https://api.github.com/orgs/{organization_name}/repos\?per_page\=500 | jq '.[].name' | sort >> repositories_name.txt

 

해당 organization에 권한이 있는 repository들을 불러와서 파일로 생성해 준다.

 

api 뒤에 per_page를 넣지 않으면 default 값인 30으로 들어가서 30개까지만 나온다.

 

위 명령어로 실행하면 큰따옴표가 포함된 텍스트파일이 만들어지는데 해당 파일을 열고 큰따옴표들을 없애준다.

 

3. 스크립트 실행하기

 

위에서 만들어진 파일 2개를 한 경로에 두고 아래 스크립트를 만들어서 실행한다.

 

#!/bin/bash

for repo in `cat ./repositories_name.txt`
do
    npx github-label-sync --access-token {github_token} --labels ./labels.json {organization_name}/$repo
    echo "$repo label create complated!"
done

 

label이 적용하기까지 좀 시간이 걸려서(1초 정도?) 기다리다 보면 다 적용이 된 걸 볼 수 있다.