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필드
저긴 딱봐도 알겠지만 무슨환경에서 돌릴거냐 이런거임.
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은 아예 실행이 안된다.