실패 후 GitHub 워크플로우 자동 재실행
가끔씩 GitHub Actions 워크플로우가 제멋대로 작동하며 무작위로 실패할 수 있습니다. 시간을 절약하기 위해 이를 자동으로 다시 실행하는 방법을 알아봅시다.
소개
우리는 GitHub Actions를 사랑합니다. 강력하며 무료로 넉넉한 사용량을 제공합니다.
프로젝트가 성장하면서 GitHub Actions 워크플로우에서 실행할 통합 테스트를 점점 더 많이 추가하게 되었습니다. 다른 멋진 프로젝트들처럼, 우리는 각 풀 리퀘스트, 푸시, 릴리스마다 테스트를 실행합니다.
그러나 통합 테스트의 특성상, 가끔 무작위 이유로 워크플로우가 실패할 수 있습니다. 네트워크 문제, 브라우저 문제 등 재현하기 어려운 여러 가지 이유가 있을 수 있습니다.
워크플로우가 실패하면 이를 수동으로 다시 실행해야 합니다. 처음에는 큰 문제는 아니지만, 우리와 같은 고효율 개발자들에게는 여전히 성가신 일입니다.
작동 방법
이 글을 작성하는 시점에서, GitHub Actions는 실패한 워크플로우를 자동으로 다시 실행하는 내장 기능을 제공하지 않습니다. 따라서 이를 달성하기 위해 문제를 나눠서 봅시다.
워크플로우가 실행 중이 아니고 실패했을 때, "다시 실행" 버튼을 클릭하여 수동으로 다시 실행할 수 있습니다. 드롭다운 메뉴가 열리며, 성공한 작업을 건너뛰기 위한 "실패한 작업 다시 실행" 옵션이 표시됩니다.
아이디어는 간단합니다:
- 워크플로우가 실패했을 때를 감지해야 합니다.
- 워크플로우가 완료된 후에 다시 실행 작업을 트리거해야 합니다.
명백히, 같은 워크플로우 내에서 이 작업을 수행할 수는 없습니다. 왜냐하면 실행 중이 아닌 워크플로우는 아무 작업도 할 수 없기 때문입니다. 따라서 이전 워크플로우의 상태를 모니터링하고 다시 실행 작업을 트리거하는 다른 워크플로우가 필요합니다. 이를 아래와 같이 설명할 수 있습니다:
워크플로우 업데이트하기
저장소에 새로운 워크플로우 파일을 생성하세요, 예를 들어 .github/workflows/rerun.yml
:
GitHub CLI 덕분에 두 개의 간단한 명령어로 워크플로우 상태를 쉽게 감시하고 다시 실행할 수 있습니다:
gh run watch
를 사용하여 워크플로우 상태를 감시합니다 (문서 여기에서 확인).gh run rerun
을 사용하여 워크플로우를 다시 실행합니다.--failed
플래그는 실패한 작업만 다시 실행합니다 (문서 여기에서 확인).
실패한 워크플로우의 run_id
만 제공하면 됩니다. 이는 github.run_id
컨텍스트를 사용하여 가능합니다. 예를 들어, 원래의 워크플로우에 다음 스텝을 추가하여 재실행 워크플로우를 트리거할 수 있습니다:
if: failure()
조건은 작업이 실패했을 때만 이 스텝을 트리거합니다. fromJSON(github.run_attempt) < 3
조건은 처음 2번만 재실행합니다. 필요에 따라 숫자를 조정할 수 있습니다.
이 스텝은 gh workflow run
명령을 사용하여 재실행 워크플로우를 트리거합니다. 자세한 내용은 문서를 참조하세요.
보너스: 실패한 브랜치에서 재실행 워크플로우 실행하기
실패한 브랜치에서 기본 브랜치 대신 재실행 워크플로우를 실행하려면, 다음 명령을 사용할 수 있습니다:
github.head_ref
컨텍스트는 풀 리퀘스트일 때 사용되고, 그렇지 않으면 github.ref_name
이 사용됩니다.
크레딧
이 접근 방식의 아이디어는 이 GitHub 논의 댓글에서 처음 나왔습니다.