Github Actions를 작동시키기 위한 yml파일 작성 방법이다.
이 포스팅에서는 자주 사용되는 요소에 대해서만 다루고, 자세한 예시는 다음 Docs에 나와있다.
Workflow syntax for GitHub Actions - GitHub Docs
About YAML syntax for workflows Workflow files use YAML syntax, and must have either a .yml or .yaml file extension. If you're new to YAML and want to learn more, see "Learn YAML in Y minutes." You must store workflow files in the .github/workflows directo
docs.github.com
1. Example
다음은 repository에 있는 Dockerfile을 통해 빌드를 하고, dockerhub에 push하는 예제이다.
name: Master Branch Build And Push DockerHub
on:
push:
branches:
- master
env:
DOCKERHUB_USERNAME: jhkimdocker
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Login to Dockerhub
uses: docker/login-action@v1
with:
username: ${{env.DOCKERHUB_USERNAME}}
password: ${{secrets.DOCKERHUB_TOKEN}}
- name: DB Container Build and Push
uses: docker/build-push-action@v2
with:
file: ./DB_container/Dockerfile
push: true
tags: jhkimdocker/capstone_db_image:${{secrets.VERSION}}
1. name
workflow의 이름을 지정한다.
2. on
on은 이벤트를 담당하는 구문으로, 다양한 이벤트를 통해 workflow를 활성화 시킬 수 있다.
on은 이벤트, 타입, 필터등을 조합하여 다양한 실행 조건을 만들 수 있다.
on에서 자주 사용하는 이벤트 목록은 다음과 같다.
- push
- fork
- pull_request
- scshedule
이 외에도 다양한 이벤트들이 있지만 자주 사용되는 다음 이벤트 들을 다뤄본다.
2.1 on.push
push시 trigger된다.
2.1.1 on.push.[branches, branches-ignore]
특정 브랜치가 push 되었을때 실행될 조건이다. 사용방법은 다음과 같다.
on:
push:
branches:
- master
- 'release/**'
다음과 같이 설정하게 되면, master 브랜치가 push되거나 ‘release/’로 시작되는 브랜치가 push될 경우 해당 workflow가 실행되게 된다.
branches-ignore 를 사용하게 되면 해당 브랜치가 push되었을때 workflow의 실행을 무시한다.
2.1.2 on.push.[tags, tags-ignore]
특정 태그가 push 되었을때 실행될 조건이다.
사용 방법은 다음과 같다.
on:
push:
tags:
- 'v1.0.**'
v1.0.n 라는 태그가 push될 경우 해당 workflow가 실행되게 된다.
tags-ignore를 사용하게 되면 해당 태그가 push되었을때 workflow의 실행을 무시한다.
2.1.3 on.push.[paths, paths-ignore]
특정 파일이 push될경우 실행될 조건이다.
사용 방법은 다음과 같다.
on:
push:
paths:
- '**.xml'
특정 xml파일이 push되게 되면 해당 workflow가 실행되게 된다.
paths-ignore를 사용하게 되면 해당 파일이 push될경우 workflow의 실행이 무시된다
2.2 on.fork
fork 되었을때 workflow가 실행되며 사용법은 다음과 같다.
on:
fowk
2.3 on.pull_request
PR 관련 이벤트가 있을경우 실행된다.
2.3.1 on.pull_request.types
PR의 타입을 지정하여 PR관련 특정 이벤트가 일어날 경우 workflow의 실행을 트리거한다.
사용가능한 타입중 자주 사용되는 타입은 다음과 같다.
- opened
- closed
- edited
- responsed
등 타입은 하나이상 사용이 가능하다.
on:
pull_request:
types: [opened, closed]
PR이 생긴경우, PR이 닫힌경우에 실행되는 이벤트이다.
2.4 on.scshedule
특정 스케쥴에 따라 실행되는 이벤트다.
시간은 posix cron syntax로 설정할 수 있다.
사용법은 다음과 같다.
crontab
The crontab utility shall create, replace, [UP] or edit a user's crontab entry; a crontab entry is a list of commands and the times at which they shall be executed. The new crontab entry can be input by specifying file or input from standard input if n
pubs.opengroup.org
on:
scshedule:
- cron: '5 * * * *
매일 매시 5분에 실행되는 이벤트다.
3. env
워크플로우 내에서 사용할 환경변수를 설정할 수 있다.
env:
TEST1: thisistest
선언한 환경변수는 ${env.TEST1}의 형태로 사용 가능하다.
4. jobs
jobs는 workflow내 수행될 job이라는 단위를 선언하는 구문이다.
4.1 jobs.{job_id}
job을 생성한다.
4.1.1 jobs.{job_id}.name
job의 이름을 생성한다.
jobs:
fist_job:
name: this is first job
run: echo "hello world"
second_job:
name: this is second job
run: echo "hello world2"
job_id가 first_job와 second_job인 두개의 job을 생성했다.
두 job의 이름은 각각 this is (first, second) job 이다.
4.1.2 jobs.{job_id}.needs
job들간 의존성을 지정한다.
jobs:
build:
name: build
run: echo "build!!"
deploy:
needs: [build]
name: deploy
run: echo "depoly!!"
다음과 같이 설정하게 되면 deploy는 build job에 의존성을 가지게 되고, build job이 끝나야 deploy job이 실행될 수 있다.
4.1.3 jobs.{job_id}.runs-on
실행될 base host를 지정한다. 사용 가능한 목록중 일부는 다음과 같다.
- windows-latest
- ubuntu-latest
- macos-latest
jobs:
build:
runs-on: ubuntu-latest
name: build
4.1.4 jobs.{job_id}.env
job 내부에서 사용할 환경변수를 지정한다.
4.1.5 jobs.{job_id}.steps
steps는 job에서 실행할 일련의 작업이다.
4.1.5.1 jobs.{job_id}.steps.shell
아래서 다룬 run 명령을 실행할 쉘을 지정한다. 지정할 수 있는 쉘은 다음과 같다.
- yml(default) (non-window yml shell)
- python (python command shell)
- cmd (window cmd)
- powershell (window power shell)
4.1.5.2 jobs.{job_id}.steps.run
실행시킬 명령을 지정한다. 여러줄 명령은 다음과 같이 한다.
run: |
echo "hello world!"
ls
echo $(pwd)
4.1.6 jobs.{job_id}.steps.name
step의 이름을 지정한다.
4.1.7 jobs.{job_id}.steps.uses
action을 실행할 수 있다. action은 자신이 만들수도, 이미 제공되는 action을 사용할 수도 있다.
jobs:
job1:
runs-on: ubuntu-latest
name: job1
env:
FOO: this is foo!
steps:
- name: this is first step
run: echo $FOO
- name: this is second step
run: echo "hello world!"
- name: third step
uses: actions/checkout@v3
첫번째 step에서는 FOO 환경변수를 echo하고,
두번째 step에서는 "hello world!"를 echo하고
세번째 step에서는 github actions로 제공된 checkout@v3 를 실행한다.