Devops/Git

[GitHub Actions] GitHub Actionsμ΄λž€? κ΅¬μ„±μš”μ†Œ 및 Workflows 파일 예제 μ‚΄νŽ΄λ³΄κΈ°

yuri lee 2023. 1. 29. 00:39
λ°˜μ‘ν˜•

Intro

μ•ˆλ…•ν•˜μ„Έμš”. μš”μƒˆ νšŒμ‚¬μ—μ„œ git actions을 톡해 CI/CD λ₯Ό κ΅¬μΆ•ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. git actions 이 무엇이고, κ΅¬μ„±μš”μ†Œ 및 workflows μ›Œν¬ν”Œλ‘œ 파일 μ˜ˆμ œμ— λŒ€ν•΄ 정리해 λ†“μœΌλ©΄ 쒋을 것 κ°™μ•„ 이번 μ‹œκ°„μ—λŠ” Github Actions 에 λŒ€ν•΄ μ•Œμ•„λ³΄λ €κ³  ν•΄μš”.

What is a Git Actions?

GitHub ActionsλŠ” build, test, deployment pipeline 을 μžλ™ν™”ν•  수 μžˆλŠ” CI/CD(연속 톡합 및 지속적인 μ—…λ°μ΄νŠΈ) ν”Œλž«νΌμž…λ‹ˆλ‹€. repository에 λŒ€ν•œ λͺ¨λ“  pull request 을 build 및 testν•˜κ±°λ‚˜ merged pull requests 을 ν”„λ‘œλ•μ…˜μ— λ°°ν¬ν•˜λŠ” μ›Œν¬ν”Œλ‘œλ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

GitHub Actions의 ꡬ성 μš”μ†Œ

pull request 이 μ—΄λ¦¬κ±°λ‚˜ μ΄μŠˆκ°€ μƒμ„±λ˜λŠ” 것과 같은 β€˜event’가 repositoryμ—μ„œ λ°œμƒν•  λ•Œ νŠΈλ¦¬κ±°λ˜λ„λ‘ GitHub Actions β€˜μ›Œν¬ν”Œλ‘œβ€™λ₯Ό ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€. μ›Œν¬ν”Œλ‘œλŠ” 순차적 λ˜λŠ” λ³‘λ ¬λ‘œ 싀행될 수 μžˆλŠ” β€˜μž‘μ—…β€™μ„ ν•˜λ‚˜ 이상 ν¬ν•¨ν•©λ‹ˆλ‹€.

Workflows

μ›Œν¬ν”Œλ‘œ(workflows) λŠ” ν•˜λ‚˜ μ΄μƒμ˜ μž‘μ—…μ„ μ‹€ν–‰ν•˜λŠ” ꡬ성 κ°€λŠ₯ν•œ μžλ™ν™”λœ ν”„λ‘œμ„ΈμŠ€μž…λ‹ˆλ‹€. μ›Œν¬ν”Œλ‘œλŠ” repository에 체크 인된 YAML νŒŒμΌμ—μ„œ μ •μ˜λ˜λ©°, repository의 이벀트둜 트리거될 λ•Œ μ‹€ν–‰λ˜κ±°λ‚˜ μˆ˜λ™μœΌλ‘œ λ˜λŠ” μ •μ˜λœ 일정에 따라 트리거될 수 μžˆμŠ΅λ‹ˆλ‹€. repository의 .github/workflows 디렉터리에 μ •μ˜λ˜λ©° repositoryμ—λŠ” μ—¬λŸ¬ μ›Œν¬ν”Œλ‘œκ°€ μžˆμ„ 수 있으며, 각 μ›Œν¬ν”Œλ‘œλŠ” λ‹€λ₯Έ μž‘μ—… μ„ΈνŠΈλ₯Ό μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ pull request을 λΉŒλ“œ 및 ν…ŒμŠ€νŠΈν•˜λŠ” μ›Œν¬ν”Œλ‘œ, λ¦΄λ¦¬μŠ€κ°€ 생성될 λ•Œλ§ˆλ‹€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ°°ν¬ν•˜λŠ” μ›Œν¬ν”Œλ‘œ 등이 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

Events

μ΄λ²€νŠΈλŠ” μ›Œν¬ν”Œλ‘œ 싀행을 νŠΈλ¦¬κ±°ν•˜λŠ” repository의 νŠΉμ • ν™œλ™μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ repository에 컀밋을 ν‘Έμ‹œν•  λ•Œ GitHubμ—μ„œ ν™œλ™μ΄ μ‹œμž‘λ  수 μžˆμŠ΅λ‹ˆλ‹€. 일정에 따라 μˆ˜λ™μœΌλ‘œ μ›Œν¬ν”Œλ‘œ 싀행을 νŠΈλ¦¬κ±°ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

Jobs

Jobs 은 λ™μΌν•œ μ‹€ν–‰κΈ°μ—μ„œ μ‹€ν–‰λ˜λŠ” μ›Œν¬ν”Œλ‘œμ˜ β€˜λ‹¨κ³„β€™ μ§‘ν•©μž…λ‹ˆλ‹€. 각 λ‹¨κ³„λŠ” μ‹€ν–‰λ˜λŠ” μ…Έ 슀크립트 λ˜λŠ” μ‹€ν–‰λ˜λŠ” β€˜Jobsβ€™μž…λ‹ˆ
\β€˜Actions’은 λ³΅μž‘ν•˜μ§€λ§Œ 자주 λ°˜λ³΅λ˜λŠ” νƒœμŠ€ν¬λ₯Ό μˆ˜ν–‰ν•˜λŠ” GitHub Actions ν”Œλž«νΌμš© μ‚¬μš©μž 지정 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μž…λ‹ˆλ‹€.

Action

Actions 을 μ‚¬μš©ν•˜μ—¬ μ›Œν¬ν”Œλ‘œ νŒŒμΌμ— μž‘μ„±ν•˜λŠ” 반볡 μ½”λ“œμ˜ 양을 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€. μž‘μ—…μ€ GitHubμ—μ„œ git 리포지토리λ₯Ό ν’€ν•˜κ±°λ‚˜, λΉŒλ“œ ν™˜κ²½μ— λ§žλŠ” 도ꡬ 체인을 μ„€μ •ν•˜κ±°λ‚˜, cloud provider 에 λŒ€ν•œ 인증을 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Runners

runnerλŠ” 트리거될 λ•Œ μ›Œν¬ν”Œλ‘œλ₯Ό μ‹€ν–‰ν•˜λŠ” μ„œλ²„μž…λ‹ˆλ‹€. 각 μ‹€ν–‰κΈ°λŠ” ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μž‘μ—…μ„ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. GitHub은(λŠ”) μ›Œν¬ν”Œλ‘œλ₯Ό μ‹€ν–‰ν•  Ubuntu Linux, Microsoft Windows, macOS μ‹€ν–‰κΈ°λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

Create an example workflow

1. repository μ—μ„œ μ›Œμ»€ν”Œλ‘œ νŒŒμΌμ„ μ €μž₯ν•  .github/workflows/ 디렉토리λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€.
2. .github/workflows/ λ””λ ‰ν„°λ¦¬μ—μ„œ github-actions.yml μ΄λΌλŠ” μƒˆ νŒŒμΌμ„ λ§Œλ“€κ³  λ‹€μŒ μ½”λ“œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

name: learn-github-actions
run-name: ${{ github.actor }} is learning GitHub Actions
on: [push]
jobs:
  check-bats-version:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '14'
      - run: npm install -g bats
      - run: bats -v

3. λ³€κ²½ λ‚΄μš©μ„ μ»€λ°‹ν•˜κ³  GitHub 리포지토리에 ν‘Έμ‹œν•©λ‹ˆλ‹€.

참고둜, μœ„ νŒŒμΌμ€ 예제일 λΏμž…λ‹ˆλ‹€. μ˜ˆμ‹œλ‘œ SpringBoot + java 11 version κ°œλ°œν™˜κ²½μ—μ„œ workflow 파일 μž‘μ„±μ‹œ ν•΄λ‹Ή μžλ°” 버전을 λͺ…μ‹œν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€.

Understanding the workflow file

name: learn-github-actions

Optional - github repository의 Actions 탭에 ν‘œμ‹œλ˜λŠ” μ›Œμ»€ν”Œλ‘œμ˜ μ΄λ¦„μž…λ‹ˆλ‹€.

run-name: ${{ github.actor }} is learning GitHub Actions

Optional - μ›Œν¬ν”Œλ‘œμ—μ„œ μƒμ„±λœ μ›Œν¬ν”Œλ‘œ μ‹€ν–‰μ˜ μ΄λ¦„μœΌλ‘œ, λ¦¬ν¬μ§€ν† λ¦¬μ˜ "Actions" 탭에 μžˆλŠ” μ›Œν¬ν”Œλ‘œ μ‹€ν–‰ λͺ©λ‘μ— ν‘œμ‹œλ©λ‹ˆλ‹€.

on: [push]

μ›Œν¬ν”Œλ‘œμ˜ 트리거λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€. 이 μ˜ˆμ œμ—μ„œλŠ” push 이벀트λ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ λˆ„κ΅°κ°€κ°€ repository에 λ³€κ²½ λ‚΄μš©μ„ ν‘Έμ‹œν•˜κ±°λ‚˜ pull request 을 병합할 λ•Œλ§ˆλ‹€ μ›Œν¬ν”Œλ‘œ 싀행이 νŠΈλ¦¬κ±°λ©λ‹ˆλ‹€.

jobs:

github-actions μ›Œν¬ν”Œλ‘œμ—μ„œ μ‹€ν–‰λ˜λŠ” λͺ¨λ“  μž‘μ—…μ„ κ·Έλ£Ήν™” ν•΄μ€λ‹ˆλ‹€.

check-bats-version:

check-bats-versionμ΄λΌλŠ” μž‘μ—…μ„ μ •μ˜ν•©λ‹ˆλ‹€.

  runs-on: ubuntu-latest

Ubuntu Linux 의 μ΅œμ‹  λ²„μ „μ—μ„œ μ‹€ν–‰λ˜λ„λ‘ job 을 κ΅¬μ„±ν•©λ‹ˆλ‹€. 즉, GitHubμ—μ„œ 호슀트된 μƒˆ 가상 λ¨Έμ‹ μ—μ„œ μž‘μ—…μ΄ μ‹€ν–‰λ©λ‹ˆλ‹€.

  steps:

check-bats-version μž‘μ—…μ—μ„œ μ‹€ν–‰λ˜λŠ” λͺ¨λ“  단계λ₯Ό κ·Έλ£Ήν™”ν•©λ‹ˆλ‹€. 이 μ„Ήμ…˜ μ•„λž˜μ— μ€‘μ²©λœ 각 ν•­λͺ©μ€ λ³„λ„μ˜ μž‘μ—… λ˜λŠ” shell script μž…λ‹ˆλ‹€.

 - uses: actions/checkout@v3

uses ν‚€μ›Œλ“œλŠ” 이 λ‹¨κ³„μ—μ„œ actions/checkout μž‘μ—…μ˜ v3λ₯Ό μ‹€ν–‰ν•˜λ„λ‘ μ§€μ •ν•©λ‹ˆλ‹€. 이 μž‘μ—…μ€ repositoryλ₯Ό μ‹€ν–‰κΈ°λ‘œ 체크 μ•„μ›ƒν•˜μ—¬ 슀크립트 λ˜λŠ” μ½”λ“œμ— λŒ€ν•œ 기타 μž‘μ—…(예: λΉŒλ“œ 및 ν…ŒμŠ€νŠΈ 도ꡬ)을 μ‹€ν–‰ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€. μ›Œν¬ν”Œλ‘œκ°€ repository의 μ½”λ“œμ— λŒ€ν•΄ 싀행될 λ•Œλ§ˆλ‹€ 체크 아웃 μž‘μ—…μ„ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    - uses: actions/setup-node@v3
      with:
        node-version: '14'

이 λ‹¨κ³„μ—μ„œλŠ” actions/setup-node@v3 μž‘μ—…μ„ μ‚¬μš©ν•˜μ—¬ μ§€μ •λœ λ²„μ „μ˜ Node.jsλ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€(이 μ˜ˆμ œμ—μ„œλŠ” v14 μ‚¬μš©). μ΄λ ‡κ²Œ ν•˜λ©΄ node 및 npm λͺ…령이 λͺ¨λ‘ PATH에 λ°°μΉ˜λ©λ‹ˆλ‹€.

    - run: npm install -g bats

run ν‚€μ›Œλ“œλŠ” μ‹€ν–‰κΈ°μ—μ„œ λͺ…령을 μ‹€ν–‰ν•˜λ„λ‘ μž‘μ—…μ— μ§€μ‹œν•©λ‹ˆλ‹€. 이 μ˜ˆμ œμ—μ„œλŠ” npm을 μ‚¬μš©ν•˜μ—¬ bats μ†Œν”„νŠΈμ›¨μ–΄ ν…ŒμŠ€νŠΈ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€.

    - run: bats -v

μ΅œμ’…μ μœΌλ‘œ, μ†Œν”„νŠΈμ›¨μ–΄ 버전을 좜λ ₯ν•˜λŠ” 맀개 λ³€μˆ˜μ™€ ν•¨κ»˜ bats λͺ…령을 μ‹€ν–‰ν•©λ‹ˆλ‹€.

Conclusion

이상 GitHub Actions이 무엇이고, κ΅¬μ„±μš”μ†Œ 및 Workflows 파일 예제 μ‚΄νŽ΄λ΄€μŠ΅λ‹ˆλ‹€. μ²˜μŒμ— 보면 λ‚―μ„€μ–΄μ„œ μ–΄λ €μ›Œλ³΄μΌ 수 μžˆλŠ”λ°μš”, ν•˜λ‚˜ ν•˜λ‚˜ λœ»μ„ ν™•μΈν•˜λ©΄ 그리 어렡지 μ•Šμ€ κ°œλ…μΈ 것 κ°™μŠ΅λ‹ˆλ‹€ :)


https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions

λ°˜μ‘ν˜•