본문 바로가기

카테고리 없음

Github Action workflow 작성 이모저모..

이번에 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 작업을 실행시켜주는걸 확인할 수 있었다