github action은 github에서 제공해 주는 CI/CD를 가능하게 해주는 툴 중 하나이다.
테스트, 빌드, 배포 등의 다양한 작업들을 자동화하여 처리한다.
자동화된 전체 프로세스를 의미한다.
워크플로우는 하나 이상의 job으로 이루어지며, 이벤트에 의해 트리거 된다.
예를들어 푸시했을때, PR을 통해 merge 됐을 때 등으로 이벤트를 설정할 수 있다.
이벤트는 워크플로우를 트리거하는 활동을 의미한다.
앞서 예를 든 것 처럼 push, pull request 생성, 저장소 dispatch event 등의 활동이 될 수 있다.
다양한 이벤트들
job은 동일한 runner에서 실행되는 일련의 단계를 의미한다.
job은 step으로 이루어진다.
기본적으로 워크플로우 내에서는 여러개의 job들이 병렬적으로 실행될 수 있다.
그리고 이런 job들을 순서대로 실행되도록 설정할 수 있다.
스텝은 job에서 커맨드를 실행하는 독립적인 단위이다.
스텝은 액션이 될 수도, 쉘 명령어가 될 수도 있다.
한 job의 스텝들은 같은 러너에서 돌아가며, 서로 데이터를 공유할 수 있다.
액션은 워크플로우를 구성하는 가장 작은 단위로 독립된 실행 명령을 의미한다.
직접 액션을 만들수도, 커뮤니티에서 생성된 액션을 사용할 수도 있다.
워크플로우에서 액션을 사용하기 위해서는 스텝을 반드시 포함해야 한다.
러너는 Github Action runner application 이 설치된 서버이다.
쉽게 설명하면 러너는 깃허브에서 제공해주는 가상 컴퓨터이고, 사용자는 이 러너를 활용해 job들을 수행할 수 있는 것이다.
github action은 이벤트, job, 스텝을 정의하기 위해 yml 파일을 사용한다.
우선 리포지토리를 하나 생성한다.
Action에 들어가서 워크플로우를 하나 생성해 본다.
# 워크플로우 이름
name: hello-githubAction
# 워크플로우가 트리거 될 이벤트들 명시
on:
# push나 pull request가 일어나면 동작하도록 구현
[push, pull_request]
# 워크플로우에서 실행할 job
jobs:
# job의 이름
testJob:
# job이 돌아갈 환경
runs-on: ubuntu-latest
# job에서 동작할 task들의 모음
steps:
# 오픈소스 커뮤니티의 액션을 사용할 것을 명시
# 이 액션은 로컬 리포지토리의 환경을 러너로 복사하는 액션
- uses: actions/checkout@v2
# task의 이름과 동작시킬 스크립트(한줄짜리)
- name: Run a one-line script
run: echo Hello, world!
# task의 이름과 동작시킬 스크립트(두줄 이상)
- name: Run a multi-line script
run: |
echo Add other actions to build,
echo test, and deploy your project.
yml 파일 생성 및 커밋
Action 탭에서 실제 동작 화면을 확인할 수 있다.
실제로 생성한 리포지토리를 클론한 후 폴더를 살펴보면 yml 파일이 생성된 것을 볼 수 있다.
name: setJobOrder
on: [push, pull_request]
jobs:
job1:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: print order
run: echo 1
job2:
runs-on: ubuntu-latest
# 순서 정의해줌
needs: job1
steps:
- uses: actions/checkout@v2
- name: print order
run: echo 2
순서 정의 안해줬을 때 - 동시에 실행
순서 정의 해줬을 때 - 순차적 실행
워크플로우, 러너 환경, job과 step 등의 정보들을 context라 하고 이 정보들을 활용할 수 있다.
https://docs.github.com/en/actions/learn-github-actions/contexts
name: context
on: [push]
jobs:
one:
runs-on: ubuntu-latest
steps:
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJSON(github) }}
run: echo "$GITHUB_CONTEXT"
- name: Dump job context
env:
JOB_CONTEXT: ${{ toJSON(job) }}
run: echo "$JOB_CONTEXT"
- name: Dump steps context
env:
STEPS_CONTEXT: ${{ toJSON(steps) }}
run: echo "$STEPS_CONTEXT"
- name: Dump runner context
env:
RUNNER_CONTEXT: ${{ toJSON(runner) }}
run: echo "$RUNNER_CONTEXT"
- name: Dump strategy context
env:
STRATEGY_CONTEXT: ${{ toJSON(strategy) }}
run: echo "$STRATEGY_CONTEXT"
- name: Dump matrix context
env:
MATRIX_CONTEXT: ${{ toJSON(matrix) }}
run: echo "$MATRIX_CONTEXT"
위의 예시들 외에도 secret 처리, 환경변수 처리, 다양한 환경에서 동시에 빌드하기(matrix build) 등의 동작을 설정하고 수행시킬 수 있다.
그리고 GithubAction을 활용하여 CI/CD역시 수행할 수 있다.