Notice
Recent Posts
Recent Comments
관리 메뉴

즐겁게, 코드

Github Action과 함께 알고리즘 풀이 저장 자동화하기 본문

⚡️ DevOps/CI & CD

Github Action과 함께 알고리즘 풀이 저장 자동화하기

Chamming2 2022. 5. 6. 02:41
본 포스트의 내용은 이 깃허브 레포에서 확인해보실 수 있습니다. 🙂​ 

저는 알고리즘 문제를 풀이하면 그 코드를 깃허브에 업로드하곤 하는데요, 어느 날 저장소의 일관되지 않은 커밋 메시지가 신경쓰이기 시작했습니다.

제멋대로인 커밋 메시지...😢

컨벤션이나 커밋 템플릿을 따로 제작해둔다고 해도 이는 결국 사람이 남기는 것인 만큼 실수가 발생할 여지가 충분히 있었고, 이번 기회에 Github Action 을 사용해 커밋 메시지를 고정하는 태스크를 추가해보려 시도했습니다.

✅ 나중에 알게 된 사실이지만, 이렇게 Git의 이벤트(Ex. commit, push...) 를 감지해 특정 액션을 트리거히고자 할 때는 클라이언트에서 실행되는 Git hooks 를 사용할 수도 있습니다.

1. 커밋 메시지 고정하기

첫 번째 목표는 커밋 메시지를 특정 컨벤션으로 강제로 고정시키는 것이었습니다.

 

현재는 [feat: 푼 문제 번호] 또는 [문제 유형 : 문제 번호] 처럼 커밋 메시지를 통일하려고 시도는 했으나 제대로 이루어지지 않고 있었는데요, 이번 작업에서는 {현재 날짜} 문제풀이 기록 이라는 이름으로 커밋 메시지가 통일되도록 시도했습니다.

 

이를 위해 stefanzweifel/git-auto-commit-action@v4 이라는 커스텀 액션을 도입했고, 처음에는 이렇게만 작성하면 될 줄 알았습니다.

name: 알고리즘 문제풀이 기록
on:
  push:
    branches:
      - "master"
jobs:
  Create-PS-Record:
    name: "금일 알고리즘 문제풀이 기록"
    runs-on: ubuntu-latest
    steps:
      # 오늘 날짜를 환경 변수에 저장합니다.
      # date 커맨드를 사용하면 오늘 날짜 정보를 형식에 맞게 읽어올 수 있습니다.
      - name: set Today Date
        run: echo TODAY_DATE=$(date +%Y년\ %m월\ %d일) >> $GITHUB_ENV

      - name: overlap commit
        uses: stefanzweifel/git-auto-commit-action@v4
        with:
          commit_message: ${{ env.TODAY_DATE }} 문제 풀이 기록
          commit_user_name: Chanmin, Kim <kimchanmin1@gmail.com>
          commit_author: "Chanmin, Kim <kimchanmin1@gmail.com>"

Tip - runs-on, with 등 정해진 Github Action 키의 이름을 어떻게 다 외울 수 있나요?

 

저도 처음에는 이 부분이 막막하게 느껴졌는데요, Github Actions VSCode 익스텐션을 사용하면 인텔리센스처럼 액션 키 자동완성이나 YAML 유효성 검증을 지원해줘 어렵지 않게 태스크를 작성할 수 있었습니다.

 

그리고 공식 문서가 정말 잘 되어있는 편이라, 문서를 따라가다 보면 금방 익히실 수 있을 거에요!

띠용? 😱

그런데 액션을 통해 커밋을 추가하니 현재 저장소가 깃 저장소가 아니라는 메시지가 출력되었는데요, 이유를 알아보니 액션에서 현재 저장소의 정보(커밋 기록, 파일 목록 등)을 불러오기 위해서는 checkout 이라는 커스텀 액션을 반드시 스텝 제일 위에서 사용해야 함을 알 수 있었습니다.

name: 알고리즘 문제풀이 기록
on:
  push:
    branches:
      - "master"
jobs:
  Create-PS-Record:
    name: "금일 알고리즘 문제풀이 기록"
    runs-on: ubuntu-latest
    steps:
      - name: set Today Date
        run: echo TODAY_DATE=$(date +%Y년\ %m월\ %d일) >> $GITHUB_ENV

      # 저장소 정보를 읽어옵니다.
      - name: fetch repository info
        uses: actions/checkout@v2
        with:
          ref: ${{ github.head_ref }}

      - name: overlap commit
        uses: stefanzweifel/git-auto-commit-action@v4
        with:
          commit_message: ${{ env.TODAY_DATE }} 문제 풀이 기록
          commit_user_name: Chanmin, Kim <kimchanmin1@gmail.com>
          commit_author: "Chanmin, Kim <kimchanmin1@gmail.com>"

이제 커밋을 남기면 {현재 날짜} 문제풀이 기록 이라는 이름의 커밋이 새로 추가되는데요, 이를 통해 원하는 형태의 커밋 메시지를 남길 수 있게 되었습니다.

🧐 그런데 이러면 두 개의 커밋이 생긴다는 건데, 커밋을 스쿼시하거나 commit --amend 로 해결할 수 있는 방법은 없을까요?

 

아쉽게도 Github Action 태스크는 주어진 스텝을 클라우드 상에서 실행하는 것이다 보니, 별도의 텍스트 에디터를 필요로 하는 두 동작에 대해서는 구현할 수 있는 방법이 없는 것 같았습니다. 😢

2. 작성한 코드를 특정 폴더로 이동시키기

커밋 메시지를 고정시킨다는 처음의 목적을 달성하니 두 번째 시도를 해보고 싶었습니다.

기존에는 알고리즘 문제를 유형별로 나눈 폴더에 기록하고 있었는데, 일일 알고리즘 풀이 저장을 목적으로 하는 만큼, 이를 {YYYY년-MM월-DD일} 폴더에 자동으로 위치시키고 싶었습니다.

 

따라서 이를 위해 오늘 날짜 이름으로 폴더를 생성한 후, 해당 폴더로 소스를 옮기는 쉘 스크립트를 다음과 같이 작성했습니다.

name: 알고리즘 문제풀이 기록
on:
  push:
    branches:
      - "master"
jobs:
  Create-PS-Record:
    name: "금일 알고리즘 문제풀이 기록"
    runs-on: ubuntu-latest
    steps:
      - name: set Today Date
        run: echo TODAY_DATE=$(date +%Y년\ %m월\ %d일) >> $GITHUB_ENV

      - name: fetch repository info
        uses: actions/checkout@v2
        with:
          ref: ${{ github.head_ref }}

      # 스크립트 설명
      # try: 오늘 날짜로 된 폴더를 생성한 후, 루트 폴더에 위치한 파이썬 파일을 생성된 폴더로 옮깁니다.
      # catch: 루트 폴더에 위치한 파이썬 파일을 생성된 폴더로 옮깁니다.
      - name: make directory with today's date & move solved code
        run: mkdir "$(date '+%Y년 %m월 %d일')" && mv *.py "$('date +%Y년 %m월 %d일')" || mv *.py "$(date '+%Y년 %m월 %d일')"

      - name: show current directory (to check mkdir's success)
        run: ls

      - name: overlap commit
        uses: stefanzweifel/git-auto-commit-action@v4
        with:
          commit_message: ${{ env.TODAY_DATE }} 문제 풀이 기록
          commit_user_name: Chanmin, Kim <kimchanmin1@gmail.com>
          commit_author: "Chanmin, Kim <kimchanmin1@gmail.com>"

결과는 성공한 모습입니다!

 

이제 루트 폴더에 오늘 해결한 문제 풀이들을 위치시키고, 커밋을 아무렇게나 남기기만 하면 자동으로 {오늘 날짜} 풀이 기록 이라는 커밋 메시지와 함께 {오늘 날짜} 폴더 안에 문제 코드들이 위치하게 됩니다.

 

비록 간단한 작업이지만 Github Action을 사용해 처음으로 특정 작업을 자동화해본 경험이었는데요, 리눅스 커맨드와 쉘 스크립트 문법에 대해서도 알아볼 수 있었던 즐거운 시도였던 것 같습니다! 😆

반응형
Comments
소소한 팁 : 광고를 눌러주시면, 제가 뮤지컬을 마음껏 보러다닐 수 있어요!
와!! 바로 눌러야겠네요! 😆