git/gitAction

gitHub Actions / basic & template

부엉이사장 2024. 9. 10. 14:36
Introduction
깃헙액션에 대한 개념과 기본적인 사용방법을 포스팅 하려고 한다.

 

 

 

# 깃헙 액션이 뭐하는 걸까?

CICD툴이라고 하는데 그냥 단순하게 github에서 컴퓨터 하나받아서 코드 실행환경 주는거라 생각하면 될듯.

이게 뭔말이냐면, github에서 특정 이벤트 발생할때, 어떤 명령어들을 실행해줘~ 이런 느낌이라고 해야할까

람다같은 느낌인데 github action은 github에 종속된 특정 이벤트가 트리거가 될경우만 실행시키는 코드? 라고 생각하면 된다.

이걸로 CICD를 구현할 수 있는데, 예를들어 깃헙에 push를 하면 build후에 배포해줘 이런거를 구현 할 수 있다.

 

 

 

 

# 사용방법

- 일단 github repository를 하나 만들자. 

이렇게 githubaction이라는 repository를 하나 만들었고 vs 코드에서 폴더랑 연결해놨다

 

 

- action이랑 연결하기

레포지토리에 들어가면 actions탭이 있는데 클릭

 

 

새로운 workflow를 만든다고 하자

이 만들 워크플로우 당 하나의 github actions의 VM이 프로비저닝된다고 보면 됨

그럼 저런 창이 뜨는데 저 main.yml파일을 작성할수 있게 되는데

이  yaml파일이 이 VM에서 어떤 명령들? 을 할지 설정할 수 있는거다. 

일단 commit changes를 눌러보자

 

그럼 해당 repository에 /.github/workflow/main.yml파일이 하나 생긴다.

 

vs코드에서 pull로 떙겨오면

저렇게 해당 디렉토리 파일들이 다운받아진다.

 

 

- workflow를 작성해보자

name: gogo

on:
  workflow_dispatch:

jobs:
  muzzi-job:
    runs-on: ubuntu-latest
    steps:
      - name: say hello muzzi
        run: echo "Hello muzzi"

난 대충 이런 워크플로우를 만들었다.

 

이 워크플로우는 gogo라는 이름을 가지고 있고,

아래의 jobs를 실행해줄거다.

job은 우분투환경에서 해줄거고

say hello muzzi라는 스텝, 즉 커맨드를 실행시켜줄거임.

 

이걸 push해보고 깃헙웹에서 다시 actions탭을 가보면

이렇게 해당 워크플로우가 만들어졌다.

클릭해서 확인해보면

이렇게 생겼는데 저 버튼을 눌러서 workflow를 실행한다고 해보면,

이렇게 노란 gogo가 뜨고

초록색으로 변한다.

이상없이 실행됐따는 얘기임.

만약 에러떴다면 빨간색 x가 뜬다.

클릭해서 들어가보면

무찌잡이 성공적으로 실행된걸 볼 수 있다.

무찌잡도 클릭해서 보면

우리가 넣어놨떤 echo Hello muzzi가 잘 실행되서 잘 찍힌걸 볼 수 있음.

즉 우리가 이 github actions VM에 리눅스 명령어를 쳐서 넣은거다.

 

 

# 워크플로우 두개도 가능할까?

가능하다.

이렇게 gogo2이름을 갖는 워크플로우를 만들고 얘는 dori한테 hello하고 인사해주는 워크플로우다.

이 상태에서 커밋을 하면,

이렇게 만든 gogo2워크플로우도 생기게 된다.

 

 

 

 

# yaml양식을 뜯어볼까?

name: gogo

on:
  workflow_dispatch:

jobs:
  muzzi-job:
    runs-on: ubuntu-latest
    steps:
      - name: say hello muzzi
        run: echo "Hello muzzi"

- name 필드는 해당 workflow의 이름을 짓는곳이다.

 

 

- on에는 workflow_dispatch이라고 적혀있는데, 트리거를 적는곳이다. 

 

 

Triggering a workflow - GitHub Docs

How to automatically trigger GitHub Actions workflows

docs.github.com

이게 공식문서고 workflow_dispatch얘는 위에 포스팅한 방법에서 github 웹에서 직접 버튼을 눌러서 워크플로우를 실행하는 방식으로 테스트 할 수 있는거다. 

보통은 push할때, CICD를 하니까 push트리거를 많이 사용한다.

협업같은곳에선 merge나 pull등 아니면 브랜치 관리 등등에서도 다양하게 사용될듯

 

공식문서에서 따온건데 이런식으로 여러개 가져올 수도 있음.

뭐 자세한건 필요할떄 찾아보면 된다

 

- jobs

아까 사진을 다시 가져와서

저렇게 한 워크플로우에 들어있는 커맨드 묶음? 을 한 job이라고 하는듯.

 

name: gogo

on:
  workflow_dispatch:

jobs:
  muzzi-job:
    runs-on: ubuntu-latest
    steps:
      - name: say hello muzzi
        run: echo "Hello muzzi"

  babo-job:
    runs-on: ubuntu-latest
    steps:
      - name: say babo muzzi
        run: echo "babo muzzi"

이렇게 muzzi-job과 babo-job을 만들어서 푸쉬하고 테스트해보면,

 

이렇게 job이 두개 만들어진다.

 

 

- runs-on필드

저긴 딱봐도 알겠지만 무슨환경에서 돌릴거냐 이런거임.

https://docs.github.com/ko/actions/writing-workflows/workflow-syntax-for-github-actions#jobsjob_idruns-on

 

GitHub Actions에 대한 워크플로 구문 - GitHub Docs

 

docs.github.com

얘가 공식문서

리눅스를 자주쓰겠지만 윈도우나 맥도 가능한듯하다.

 

 

- steps필드

name: gogo2

on:
  workflow_dispatch:

jobs:
  dori-job:
    runs-on: ubuntu-latest
    steps:
      - name: say hello dori
        run: echo "Hello dori"

      - name: save bye dori
        run: echo "bye dori"

이런식으로 돌려보면

 

저게 스텝하나씩 뜨게 된다.

커맨드 치는거다 그냥.

 

 

# step은 프로세스가 분리된다~

name: process-separation-example

on:
  workflow_dispatch:

jobs:
  separated-steps:
    runs-on: ubuntu-latest
    steps:
      - name: Step 1 - Set environment variable
        run: |
          export MY_VAR="Hello World"
          echo "Variable set to $MY_VAR"

      - name: Step 2 - Try to access MY_VAR
        run: echo "MY_VAR is $MY_VAR"

이런 workflow를 만들어서 push 했음(사실 gpt가 짜줌)

간단히 첫번째 스텝에서 MY_VAR이라는 환경변수를 지정해주고

두번째 스텝에서 그 환경변수를 참조해보는거다

워크플로우를 돌려보면?

이럴수가, 두번쨰 스텝에서 환경변수 MY_VAR을 참조못한다

 

 

# step하나에 커맨드 여러개 치기.

name: process-separation-example

on:
  workflow_dispatch:

jobs:
  separated-steps:
    runs-on: ubuntu-latest
    steps:
      - name: Step 1 - Set environment variable
        run: |
          export MY_VAR="Hello World"
          echo "Variable set to $MY_VAR"

      - name: Step 2 - Try to access MY_VAR
        run: echo "MY_VAR is $MY_VAR"

위 스텝별로 프로세스 분리되는거 확인할때 yaml양식을 보면

첫번째 step에서 run필드에 |를 썼다.

그리고 밑에 커맨드가 두 줄 있다.

 

이런식으로 하면 된다. 그럼 프로세스 하나에 커맨드를 여러개 칠 수 있다.

 

 

 

# job을 동기화 시키기

job은 병렬로 실행된다.

비동기적으로 실행된다는 뜻이다.

간단한 코드를 만들어보면,

 

name: gogo

on:
  workflow_dispatch:

jobs:
  muzzi-job:
    runs-on: ubuntu-latest
    steps:
      - name: say hello muzzi
        run: echo "Hello muzzi"

  babo-job:
    runs-on: ubuntu-latest
    steps:
      - name: say babo muzzi
        run: echo "babo muzzi"

아까 만들어봤던 이 workflow는

muzzi job과 babo job이 동시에 같이 실행된다는 거다.

 

이걸 동기처리를 해보려면, 

name: gogo

on:
  workflow_dispatch:

jobs:
  muzzi-job:
    runs-on: ubuntu-latest
    steps:
      - name: say hello muzzi
        run: echo "Hello muzzi"

  babo-job:
    runs-on: ubuntu-latest
    needs: [muzzi-job]
    steps:
      - name: say babo muzzi
        run: echo "babo muzzi"

이렇게 babo job필드에 needs필드를 넣어주면 된다.

이 뜻은, babo job은 muzzi job이 실행되고나서 동작시키겠다 라는 뜻임.

 

이 workflow를 push해보고 돌려보면

이렇게 상자가 두개 생긴다.

아까 병렬처리였을떄는 job이 두개라도

이렇게 됬었음

 

 

# 만약 동기처리한 첫번째 job에서 에러가 뜨면?

name: gogo

on:
  workflow_dispatch:

jobs:
  muzzi-job:
    runs-on: ubuntu-latest
    steps:
      - name: say hello muzzi
        run: echoo "Hello muzzi"

  babo-job:
    runs-on: ubuntu-latest
    needs: [muzzi-job]
    steps:
      - name: say babo muzzi
        run: echo "babo muzzi"

에러뜨게 echo를 에츄로 바꿨다.

 

이걸 push해서 돌려보면,

muzzi job에서 에러가 떠서 빨간 x가 됐고, 그이후 실행되어야하는 babo job은 아예 실행이 안된다.