대상 | 난이도 |
---|---|
PR 에서 댓글로 소통하는 깃헙 액션을 고민하는 분 | 🫐 Blueprint (참고하면서 개발하기 좋음) |
참고: 결과물만 보고 싶은 경우 PR #42 링크를 확인하십시오
2년전에 (2021년) 사이드 프로젝트에서 깃헙 액션을 작업한 적이 있었습니다.
그때는 PR이 올라오면 base 브랜치가 develop 일 때 깃헙액션이 돌도록 했는데 문제는 커밋을 푸시할때마다 매번 테스트가 돌다보니 깃헙 액션 사용가능 시간을 불필요하게 많이 소모하는 문제가 있었습니다.
규모가 큰 앱도 아니었고 실제 깃헙 액션도 10-20분 정도 걸렸기 때문에, 매달 무료로 제공되는 2000분 (약 33시간)이면 마음껏 사용해도 되지 않나하고 생각할 수 있습니다.
하지만 운영체제 버전 마다 소모하는 사용시간의 크기가 다릅니다. 이 중 macOS 는 x10 만큼 소모합니다. 출처 링크
즉 테스트 한번에 100-200분을 소모하게 되고 최악의 경우 테스트 10번 돌리면 그 달의 사용가능한 깃헙액션 시간을 다 소진하게 됩니다. 실제로 전부 소진했다는 메일을 자주 받았었습다.
이번에 사이드 프로젝트 앱의 2.0 버전 작업을 하면서 깃헙 액션 작업도 새로 하게 되었고 매번 불필요하게 액션이 돌지 않고 필요할 때 돌릴 수 있도록 issue-comment
로 트리거 하는 방식을 생각했습니다.
커멘트로 깃헙 액션 작동시키는 스크립트 작성하는 방법은 cozzin 님이 작성한 블로그 포스트을 참고하였기 때문에 이 문서에서 스크립트 작성에 대한 부분은 가볍게 다루고 마주했던 문제를 자세하게 알아보도록 하겠습니다.
구상한 스펙은 다음과 같습니다.
항목 | 스펙 | 비고 |
---|---|---|
운영체제 | macOS | |
Xcode | 15.0 | #Preview 매크로를 컴파일할 수 있어야 하기 때문. |
iOS | 16.0 & 17.0 | 최소 지원 버전 & 최신 버전 |
트리거 시점 | /깃헙 + (원하는 액션) | 예: /깃헙 ios17 앱 빌드 |
자동화 하려는 항목은 다음과 같았습니다.
이슈에 댓글을 작성했거나, 댓글을 수정했을 때 깃헙 액션이 트리거 하려면 다음과 같이 작성합니다.
on:
issue_comment:
types: [created, edited]
타입 | 설명 |
---|---|
created | 댓글이 생성된 경우 |
edited | 댓글을 수정한 경우 |
댓글에 특정 키워드가 포함되었을 때만 액션을 수행하도록 다음과 같이 작성합니다.
jobs:
build:
if: github.event.issue.pull_request &&
contains(github.event.comment.body, '/깃헙') &&
contains(github.event.comment.body, 'ios17 앱 빌드')
조건문 | 설명 |
---|---|
github.event.issue.pull_request | pull request 에 대한 이벤트인가 |
contains(github.event.comment.body, '/깃헙') | 댓글 내용에 /깃헙 가 포함되었는가 |
contains(github.event.comment.body, 'ios17 앱 빌드') | 댓글 내용에 ios17 앱 빌드 가 포함되었는가 |
댓글에 키워드가 포함되어있어서 액션을 시작하는 경우 다음과 같이 github-script
를 사용하여 액션을 실행한다고 댓글로 알려줄 수 있습니다.
# iOS17 빌드 응답 커멘트
- name: Add Build comment
uses: actions/github-script@v5
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: 'iOS 17.0 iPhone 15 Pro 에서 앱타겟을 빌드합니다.'
})
github-script
를 사용 시 github-token
을 넣어주면 이어서 작성한 script
를 수행할 수 있습니다. github-token
에는 ${{secrets.GITHUB_TOKEN}}
이라고 값을 넣어주면 됩니다. script
에는 github.reset.issues
의 createComment
명령어를 사용하여 body
에 댓글 내용을 작성해줄 수 있습니다.
빌드에 성공했다면 2.4 와 동일한 방식으로 성공했다는 메세지를 댓글로 알려줄 수 있습니다.
빌드에 실패했거나, 액션 수행 중 실패가 발생한 경우 step 에 if
옵션에 failure()
를 넣어주면 실패한 경우에만 동작하는 step 을 만들 수 있습니다.
# 빌드 실패시 커멘트
- name: Notify failure
uses: actions/github-script@v5
with:
...
if: failure()
작업 결과물은 PR #42 에서 확인 가능합니다.
분명 스크립트는 잘 작성했는데 커멘트로 트리거가 되지 않는 현상이 있었고 원인은 다음과 같았습니다.
"Note: This event will only trigger a workflow run if the workflow file is on the default branch."
출처 | docs.github.com
issue-comment
트리거는 default branch 기반으로 돌아가기 때문에 아직 yaml
파일이 default branch 에 머지되지 않은 시점에서 issue-comment
트리거 시도를 해도 default branch 에는 트리거할 액션이 정의되어 있지 않아서 동작하지 않습니다.
이는 다음과 같은 방법으로 해결하였습니다.
테스트 할때는 PR 브랜치로 default branch를 (1)임시로 변경하고, 확인이 끝나면 팀원들에게 공유 후 default branch (2)복구
스크립트에 테스트가 최신 Xcode 버전에서 돌아가도록 작성했는데, Xcode15 가 아닌, Xcode14.2 (심지어 14.3 도 아닌) 으로 돌아가는 문제가 있었습니다.
macos-latest
를 사용하는 경우 맥OS 에 Applications 폴더에는 Xcode_14.2.app 까지만 설치되어 있어서 발생한 문제였습니다.
이는 다음과 같은 방법으로 해결하였습니다.
Looks like you need to use macos-13, not macos-latest.
link
build:
- runs-on: macOS-latest
+ runs-on: macos-15
steps:
- name: Setup Xcode version
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '15.0'
#Preview
매크로 빌드를 위해 Xcode15 환경이 필요했으며 iOS 17 외에도 iOS16 버전의 시뮬레이터에서도 앱타겟을 빌드하고 싶었습니다. 하지만 iOS 16 버전으로 앱타겟을 빌드 시도하면 다음과 같은 에러와 함께 액션일 실패하였습니다.
"Tests must be run on a concrete device"
그래서 액션이 수행될 때 사용가능한 시뮬레이터 리스트(xcrun xctrace list devices
)를 확인해보았고 iOS17 버전의 시뮬레이터만 목록에 있음을 확인하였습니다.
액션 수행 중 하위 버전의 시뮬레이터를 설치하는 방법이 있으나 소모시간 너무 길고, 특히 macOS 는 깃헙 액션 사용시간이 10배로 적용되기 때문에 최선의 방법은 아니라고 생각하여 아직 해결하지 못한 문제로 남아있습니다.