Uing? Uing!!

[Git] github actions로 README.md 자동생성하기 본문

Git

[Git] github actions로 README.md 자동생성하기

Uing!! 2022. 4. 28. 20:12
반응형

최근에 LeetCode를 풀고 있는데, 내가 풀어 둔 문제 목록을 레포지토리 첫 화면에 예쁘게 보여주면 좋겠다는 생각이 들었다.

LeetHub처럼 LeetCode의 내 실제 제출 목록을 분석해서 깃헙에 자동으로 올려주는 크롬 익스텐션도 있지만, 

나는 솔루션을 편하게 작성하기 위해 직접 작성한 Solution이라는 클래스를 상속받아 사용하고 있어서, 실제로 내가 제출한 정답부분 외에 해당 클래스에 포함된 givenTestCases 등의 내용도 함께 직접 커밋&푸시를 하고 싶었다.

 

그래서 README.md를 내가 원하는 방식으로 내 실제 repo 내용에 기반해서 자동 생성해주는 툴을 찾아보게 되었고, GitHub Actions를 이용하면 가능하다는 것을 알게 되었다.

GitHub Actions

GitHub Actions는 나의 '언젠가 블로그에 작성하려고 만들어 둔 포스팅 예정 목록'에 들어 있는데, 어쩌다 보니 이 글을 먼저 작성하게 되었다.

GitHub Actions는 깃허브에서 특정 동작이 발생하면 (또는 직접 액션을 실행하면) workflow에 정의해 둔 액션이 자동으로 실행되는 기능이다.

보통은 간단하게 CI/CD를 하기 위해서 많이 사용되는데, 이에 대한 자세한 내용은 추후에 관련 포스팅으로 작성하고 이 글에 링크를 추가할 예정.

오늘은 이 GitHub Actions를 README.md의 자동생성에 활용하는 방법만 간략하게 소개하고자 한다.

README.md 자동 생성하기

1. README.md를 생성하는 스크립트 작성 (python, etc)

GitHub Action을 작성하기에 앞서, README.md 파일을 만드는 스크립트를 작성할 필요가 있다.

스크립트를 작성하고 실행하는 방법은 여러 가지가 있겠지만, 나는 가장 편하게 느껴지는 python을 사용하기로 결정했다.

 

처음에는 간단하게 레포지토리 내의 solution 폴더에서 파일명들을 가져오고, 파일명에 기반해서 문제 번호와 이름을 불러오는 정도로 만들었다. (이때 결과물은 스크린샷을 찍어두지 않아서 글로만ㅠㅠ)

막상 실제로 README.md가 작성되는 것까지 확인하고 나니 각 문제의 실제 난이도와, 난이도별 푼 문제 개수 등도 함께 표시하면 더 좋을 것 같다는 생각이 들었다.

문제 번호나 이름으로 LeetCode에서 정보를 받아올 방법을 찾아보다가 leetcode-python라는 api를 찾았고, 해당 api를 활용해서 정보를 받아오고 가공해서 README.md 파일을 생성해주는 코드로 발전시켰다.

 

아래는 루트 폴더에 README.md를 생성하는 update-readme.py 파일의 뒷부분이다.

leetcode-kotlin/update-readme.py at master · sechiyo97/leetcode-kotlin (github.com)

# 코드의 윗 부분은 생략: github의 실제 update-readme.py에서 확인 가능합니다

solution_files = [f for f in listdir(solution_file_dir) if f[0:3]=="Sol"]

problems = []
for solution_file in solution_files:
    split = solution_file.split(".")[0].split("_")
    problem_number = split[1]
    problem_ref_name = "-".join(split[2:])
    problem = Problem(problem_number, problem_ref_name, solution_file)
    problems.append(problem)
    
problems.sort(key=lambda solution: int(solution.problem_number))

readme = open("README.md", "w")
readme.write(title_project + "\n" + desc_project + "\n\n")
readme.write(title_problem_solved + "\n")
readme.write(table_header_total + "\n" + get_table_content_string_total(problems) + "\n\n")
readme.write(table_header_difficulty + "\n" + get_table_content_string_difficulty(problems) + "\n\n")
readme.write(table_header_problems + "\n" + get_table_content_string_problems(problems))

readme.close()

로컬에서 위 파일을 작성한 후, 프로젝트 루트 폴더에 README.md가 생성되는 것을 확인했다.

추가 확인을 위해 github에 수동 README 작성칸을 열어 두고 해당 결과물 파일의 내용을 복사해서 Preview해 보았고,

내가 원하는 Preview가 나올 때까지 update-readme.py 파일을 수정했다.

2. master에 푸시되면 자동으로 실행되는 GitHub Action 작성

스크립트를 작성했으니, 이제 그 스크립트를 실행하고 결과물을 올려줄 Action을 정의해야 한다.

 

GitHub의 해당 레포지토리에 웹으로 접근한 후, Actions 탭에 들어가면 새로운 액션을 생성할 수 있다.

스크립트와 관련된 템플릿을 열어도 되고, set up a workflow yourself로 빈 파일을 생성해도 된다.

 

 

Action은 레포지토리 내의 .github/workflows/{액션_이름}.yml 파일로 생성된다.

아래는 내가 작성한 'Update readme' 액션(.github/workflow/update-readme.yml)이다.

 

leetcode-kotlin/update-readme.yml at master · sechiyo97/leetcode-kotlin (github.com)

# This workflow runs update-readme.py which updates README.md file.

name: Update readme # GitHub Actions 탭에서 확인할 수 있는 액션 이름

on: # jobs가 실행되어야 하는 상황 정의
  push:
    branches: [ master ] # master 브랜치에 push가 발생했을 때
  pull_request:
    branches: [ master ] # master 브랜치에 pull request가 발생했을 때

jobs: # 실제 실행될 내용
  build:
    runs-on: ubuntu-latest # 빌드 환경
    steps:
    - uses: actions/checkout@v3 # checkout
    - name: Set up Python 3.10 
      uses: actions/setup-python@v3 # setup-python
      with:
        python-version: "3.10" # 3.10버전 파이썬 사용
    - name: Install dependencies # 1) 스크립트에 필요한 dependency 설치
      run: |
        python -m pip install --upgrade pip
        pip install python-leetcode 
    - name: Run update-readme.py # 2) update-readme.py 실행
      run: |
        python update-readme.py
    - name: Commit changes # 3) 추가된 파일 commit
      run: |
        git config --global user.name 'sechiyo97' # 유저명
        git config --global user.email 'sechiyo97@daum.net' # 유저 이메일
        git add -A
        git commit -am "auto-update README.md" # 커밋 메시지
    - name: Push changes # 4) master에 푸시
      run: |
        git push

이 액션 파일을 요약하면 이렇다.

(on) 전제: master 브랜치에 push나 pull request가 발생했을 때, 이 액션의 jobs를 실행한다.

(job-run#1) pip로 실행환경에 leetcode-python 라이브러리를 설치한다 (update-readme.py가 사용해야 하므로)

(job-run#2) update-readme.py를 실행하여 README.md를 생성한다.

(job-run#3) 내 계정정보로 수정사항을 commit한다. (커밋 메시지: 'auto-update README.md')

(job-run#4) commit한 내용을 master에 push한다.

 

여기까지 작성했다면 벌써 자동생성 기능 완성이다.

생각했던 것보다 간단해도 너무 간단하다!

실제 GitHub Actions 동작 및 결과

스크립트와 workflow를 정의해 둔 후, master 브랜치에 어제 작성했던 솔루션들을 머지했다.

master 브랜치를 푸시하는 순간, 정의한 대로 'Update readme' 액션이 실행된다.

실행 과정과 결과는 레포지토리 내 'Actions' 탭에서 확인할 수 있다.

잠시 기다리면 이렇게 액션이 완료되고,

master 브랜치에 'auto-update README.md'라는 메시지와 함께 커밋까지 진행된다.

액션이 종료된 이후 레포지토리에 다시 접근하면 이렇게 최신 목록으로 갱신된 것을 확인할 수 있다. (푼 문제 개수는 민망...)

 

아래는 해당 액션이 실제로 적용되어 있는 repository이다.

 

GitHub - sechiyo97/leetcode-kotlin: LeetCode Algorithm Practice

LeetCode Algorithm Practice. Contribute to sechiyo97/leetcode-kotlin development by creating an account on GitHub.

github.com

 

반응형
Comments