이번에 Github Action workflow 를 작성할 일이 있었는데 아무것도 모르는 상태에서 시작하게 되면서 여러가지 배웠다.. (
1NN 번 돌려보면서
야매로~) chatGPT의 도움도 많이 받았는데 ... 챗지피티가 모든 것을 커버할 순 없더라구요.
그래서 내 기록 차원에서 작성하는 Github Action 워크플로우에 대한 이모저모...
..정리해서 작성 안했음...
( 예제 github repository ) https://github.com/mei-zy/github_action_test
- main 브랜치에 merge 되는 파일들을 체크한다.(job1) 변경된 파일 갯수만큼 job2 를 실행시켜준다.
라는 플로우를 가진 예제 레포지토리다. 쉬워보였는데 흑흑 ..
Event Trigger
내가 필요했던 경우는 main 브랜치에 merge 되었을 때 자동으로 도는 워크플로우를 짜고 싶었는데 기능이 존재한다.
- workflow trigger
name: "automatically workflow"
on:
push:
branches: ["main"]
나는 push 될 때 사용하고 싶고, 대상 브랜치는 main 일 때 automatically workflow 라는 워크플로우가 돌 수 있게 설정했다.
workflow dispatch 를 사용하면 custom 하게 입력을 받을 수도 있다 ..!
Github Checkout code 사용하기
jobs:
check-merged:
runs-on: ["ubuntu-latest"]
steps:
#1. 코드 체크아웃
- name: Checkout code
uses: actions/checkout@v3
with:
fetch-depth: 2
runs-on은 github runner 에 대한 부분을 명시해줄 수 있는데, self-hosted 설정한 runner가 없어서 그냥 깃헙에서 지원해주는 우분투를 사용했습니다.
나는 최신 커밋 기준으로 변경된 파일들의 이름을 찾아야하기 때문에 actions/checkout@v3를 사용했고, 이전 commit 과 현재 commit 을 비교해주기 위해서 fetch-depth
는 2로 설정해주었다. (default 는 1이어서 현재 커밋에 대한 부분만 확인함)
output 설정
다른 job에서도 이용할 수 있는 변수라고 생각하면 편할 것 같다.
FILE_LIST_JSON 이라는 애를 file_list 에 선언해주고, 다른 job 에서 해당 변수를 사용할 수 있도록 상단 output 에 명시해준다.
outputs:
file_list: ${{ steps.detect_change_file_list.outputs.file_list }}
steps:
# 중략
- name : detect changed file
id: detect_change_file_list
run: |
# 중략
echo "::set-output name=file_list::$FILE_LIST_JSON"
해당 변수를 어떤 step 에서 가져오는지 확인하기 위해서 id 값을 설정해주었다 (id 를 설정해주지 않아서 헤맸음...ㅠㅠ)
Matrix 설정
나는 file_list 의 배열 length 만큼 해당 deploy 라는 job 을 돌리고 싶었다.
그래서 의존성 check-merged(job1) 을 심어주기 위해 needs 를 설정해주었고, matrix라는 기능을 설정해주었다.
deploy:
runs-on: ["ubuntu-latest"]
needs: check-merged
strategy:
matrix:
file_path: ${{fromJson(needs.check-merged.outputs.file_list)}}
steps:
- name: test
run: |
echo "${{ matrix.file_path}}"
matrix 기능은 여러 조합의 갯수만큼 해당 Job 을 실행시켜주는데 나는 needs 라는 것을 이용해서 job1에 있는 변수를 끌어와서 사용해주느라 다음과 같이 되어 있는 것이고,
deploy:
runs-on: ["ubuntu-latest"]
needs: check-merged
strategy:
matrix:
version : [12, 14]
다음과 같이 설정해주면, 12 와 14 만큼 실행할 수 있다.
해당 배열의 값을 가져오는 방법은 matrix.version 로 가져올 수 있습니다. (file_path 나 version 은 output 에서 사용한 것과 같이 그냥 변수의 일종)
github action 을 들어가보면 check-merged 에서 2개의 파일들 결과물로 나왔고, 그걸 참고해서 2번의 deploy 작업을 실행시켜주는걸 확인할 수 있었다