n개월 째 날라오던 Github Action 버그 고치기

Yeshin Lee
8 min readJul 6, 2024

--

TL;DR

  • Actions을 실행하는 workflow file을 확인해보세요.
  • yml 파일에는 여러 command를 한꺼번이 아닌 하나씩 실행되도록 작성하세요.

주변에서 좀 괜찮아보인다 싶은 것들은 그대로 베끼는 경향이 있는데, 그 중 하나가 모각코 진행자이신 종필님의 BookReview 였다.

이는 개발 관련 책을 읽고 정리해서 repository에 올리는 과정이다.

그러면 분명 읽었는데 뒤돌아서면 까먹은(..) 내용들도 생각날 때쯤 다시 한 번 되돌아볼 수 있기 때문에 도움이 된다고 생각하여 나도 작년부터 BookReview를 시작했다.

읽을 책 섹션을 issue에 올리고 해당 branch에서 내용을 정리한 후 PR 그리고 merge.

그런 생활을 지속하다 어느덧 issue를 올릴 때마다 label과 assignee를 설정하는 것이 귀찮아졌다.

‘대부분의 개발은 귀차니즘에서 시작되었다(?)’는 어디서 들었던 문장이 생각났다.

issue를 올리면 알아서 label과 assignee가 지정된다.

이럴 때 필요한 것이 Github Actions인데, 그동안 직접 만들어본 적이 없었다.

사내에서는 이미 구축이 되어 있었고, 지난 날 프로젝트를 진행할 때는 (놀랍게도) 이 반복되는 행동이 귀찮다고 여기지 않았었다.

이 참에 내 귀차니즘도 해결하고 Actions도 공부할 겸 시작했다.

이 생각을 처음 했을 당시에는, 이 귀차니즘을 해결하는 것이 우선이라 Actions이 뭔지 개념적인 부분만 간단하게 살펴보고 일단 만들었다.

잘 돌아가는 것을 확인하고 냅둔 어느 순간, Actions이 실패한다는 알람이 떴다.

그 당시에는 신경은 살짝 쓰이지만 크리티컬한 문제는 아니라고 생각해서 냅뒀다.

그렇게 n개월이 지나고.. 최근에 저 버그가 거슬리기 시작했다.

일단 에러 로그를 보았다.

ISSUE_TEMPLATE.md를 찾을 수 없다.

yml 파일을 만들 당시, 패키지를 참조하면서 빼먹었나 싶었다.

그 사이에 Github Actions에 대해 까먹어서 다시 한 번 살펴 보았다.

  • Github Actions는 build, test, 배포 파이프라인을 자동화하는 CI/CD(지속적 통합 및 지속적 배포) 플랫폼입니다.
  • 레포지토리에 변경 사항을 push하거나 production에 pr을 merge할 때 테스트를 돌릴 수 있는 워크플로우를 만들 수 있습니다.

이 정도는 알고 있기는 했지만 도큐먼트를 좀 더 보다가 집중이 잘 안돼서.. 일단 문제를 해결하고 나서 관련 개념을 좀 더 찾아보는 것으로 방향을 잡았다.

이 과정을 모각코 때 진행하고 있었는데, 종필님께서 Github CLI로도 이 문제를 해결할 수 있다고 힌트를 주셨다.

Github repository를 Shell에 명령어를 입력하면서 즉, CLI로 관리하는 것이다.

brew install gh로 Github CLI 설치해주고 유저 인증을 해준다.

인증하는 과정에서 잘 안된다 싶으면 token을 다시 만들어보는 것을 추천한다.

나의 동료이자 스승이자 어시스턴트인 ChatGPT 와 함께 이야기해가며 yml 파일을 재구성했다.

on:
issues:
types:
- opened

name: Add labels when create issue

permissions:
contents: read
issues: write

jobs:
stuff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: JasonEtco/create-an-issue@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

project_issue:
runs-on: ubuntu-latest
steps:
- env:
GITHUB_TOKEN: ${{ secrets.TOKEN }}
ISSUE_URL: ${{ github.event.issue.html_url }}
run: |
gh issue edit $ISSUE_URL --add-label "2024" --add-assignee "yeslee-v"

참고로 Github CLI에 인증하는 과정에서 처음에는 아래와 같이 작성했는데

- name: Authenticate with GitHub CLI
run: echo "${{ secrets.GITHUB_TOKEN }}" | gh auth login --with-token

보안 상의 이유로 Token을 출력하지 않는 방향으로 수정하였다.

- name: Authenticate with GitHub CLI
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh auth setup-git

그러나 다시 실패했는데, 이유가 뭔가 이상했다.

Run gh issue edit 37 --add-label "2024" --add-assignee "yeslee-v"
gh issue edit 37 --add-label "2024" --add-assignee "yeslee-v"
shell: /usr/bin/bash -e {0}
env:
GITHUB_TOKEN: ***
failed to update https://github.com/actions/checkout/issues/37: 'yeslee-v' not found
failed to update 1 issue

이해가 가지 않아 Shell에서 해당 command를 실행해보았는데 잘 돌아갔다.

permission에 pull-request: write 도 추가하고 yml 파일명도 바꿔 실행해 보았지만 여전히 실패했다.

참고로, Actions을 실행하는데 수정 전 파일을 참조할 수도 있다고 하여 yml 파일 명도 목적에 맞게 수정하였다.

이 참에 나의 Github username도 직접 입력하지 않고 환경 변수를 활용하였다.

- name: Add assignees to issue
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh issue edit ${{ github.event.issue.number }} --add-assignee ${{ github.event.issue.user.login }}

그래도 실패했다.

여기저기 둘러보다 workflow file을 확인했는데 이전 yml 파일로 돌아가고 있었다.

지금까지 에러 로그에만 초점을 두고 해결하고 있었는데 ‘설마?’가 ‘설마!’가 된 것이다.

슬슬 ChatGPT 와 이야기하는 것도 한계가 와, 주변 사람들은 어떻게 작성했는지 둘러보았다.

그 중 한 yml 파일에서는 label 붙이는 명령어와 assignee 설정하는 명령어가 분리되어 작성되어 있었다.

이 것 또한 ‘혹시?’ 반신반의하며 분리해서 실행하니 ! 성공적으로 실행되었다.

- name: Add labels to issue
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh issue edit ${{ github.event.issue.number }} --add-label "2024"

- name: Add assignees to issue
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh issue edit ${{ github.event.issue.number }} --add-assignee ${{ github.event.issue.user.login }}

분명 Shell에서 CLI로 실행했을 때는 제대로 돌아갔는데, 왜 Github Actions에서는 돌아가지 않은 것일까?

다시 ChatGPT에 찾아가 질문하였다.

GitHub Actions에서 gh issue edit 명령어를 분리해서 실행할 때는 제대로 동작하지만, 한 명령어로 실행할 때 문제가 발생하는 이유는 다음과 같은 몇 가지 가능성이 있습니다:

  1. 명령어 인자 처리 문제: gh issue edit 명령어는 여러 인자를 받는 방식에 있어 차이가 있을 수 있습니다. 명령어를 함께 실행할 때 인자 처리가 예상과 다르게 이루어질 수 있습니다.
  2. 환경 변수의 문제: GitHub Actions에서 환경 변수가 올바르게 전달되지 않거나, 명령어 실행 시 환경 변수가 다르게 해석될 수 있습니다.
  3. 각 명령어를 별도로 실행할 때는 각 명령어가 독립적으로 실행되며, 이는 환경 변수나 다른 문제의 영향을 덜 받을 수 있습니다:
  4. 분리된 명령어로 실행할 때 성공했기 때문에, 이 방식이 GitHub Actions 환경에서 안정적으로 동작하는 것으로 보입니다. 특정 환경에서 단일 명령어로 실행하는 것이 제대로 동작하지 않을 수 있으므로, 분리된 명령어로 유지하는 것이 좋습니다.

아하, 독립적으로 실행하는 것이 환경 변수나 다른 문제의 영향을 덜 받을 수 있구나.

ChatGPT 에게 앞으로 비슷한 질문을 받게 된다면, 명령어를 분리해서 작성해보라는 조언도 같이 해달라고 코멘트를 적으며, 어설프게 내 심기(?)를 건드렸던 버그에서 해방되었다.

--

--