본문 바로가기

Github Actions 1. 자주 사용되는 yml 파일

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_jobsecond_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이 실행될 수 있다.

job 간의 의존관계 build -> deploy

 

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 를 실행한다.