1. GitHub Actions 기본 개념
- GitHub Actions란?
- GitHub에서 제공하는 CI/CD 플랫폼
- 빌드, 테스트, 배포를 자동화하는 workflow 생성
- 다양한 운영체제 지원 (Linux, Windows, macOS)
1.1. 핵심 구성 요소
1) Workflows
- YAML 형식으로 작성
.github/workflows디렉토리에 저장- 이벤트 발생 시 자동 실행 또는 스케줄/수동 실행
- 여러 workflow 동시 관리 가능
2) Events
- Workflow를 시작하는 트리거
- 예: push, pull request, issue 생성
- 스케줄, REST API, 수동 트리거도 가능
3) Jobs
- 동일한 runner에서 실행되는 step들의 집합
- 순차 또는 병렬 실행 가능
- 데이터 공유 가능
4) Actions
- 복잡하지만 자주 사용되는 작업을 수행하는 커스텀 응용
- GitHub Marketplace에서 검색 및 사용 가능
- 직접 제작도 가능
5) Runners
- Workflow를 실행하는 서버
- GitHub 제공 가상 머신 또는 자체 호스팅 시스템 사용
- 각 runner는 한 번에 하나의 job 실행
2. 간단한 Workflow 예제
- learn-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@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm install -g bats
- run: bats -v- 주요 키워드
- name: workflow 이름
- run-name: 실행 중인 workflow 이름
- on: 트리거 이벤트
- jobs: job 정의
- runs-on: runner 지정
- steps: 작업 단계
- uses: 사전 정의된 액션 사용
- run: 명령어 수행
3. Starter Workflow
- C/C++ with Make 템플릿 예제
name: C/C++ CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: make
run: make
- name: make check
run: make check4. 고급 기능
4.1. Uses Actions
- GitHub Marketplace:
{owner}/{repo}@{ref}형식 - 로컬 action:
./.github/actions/hello-action - Docker Hub: 공개 도커 이미지
4.2. Artifacts (파일 공유)
jobs:
upload-job:
steps:
- run: expr 1 + 1 > output.log
- uses: actions/upload-artifact@v4
with:
name: output-log-file
path: output.log
download-job:
needs: upload-job
steps:
- uses: actions/download-artifact@v4
with:
name: output-log-file
- run: cat output.log4.3. 환경 변수
env:
DAY_OF_WEEK: Monday # workflow 수준
jobs:
example-job:
env:
Greeting: Hello # job 수준
steps:
- run: echo "$Greeting"
env:
First_Name: Mona # step 수준4.4. Expression
- 문법:
${{ expression }} - 조건부 실행, 변수 지정에 사용
- run: node client.js
if: ${{ success() }}
env:
MY_ENV_VAR: ${{ 1+1 }}4.5. Context
- github: workflow 실행 정보
github.actor: 실행자github.ref: 브랜치/태그
- env: 환경 변수
- job: 현재 job 정보
- steps: step 정보
- runner: runner 정보 (OS 등)
5. Workflow 트리거 상세
-
기본 트리거
on: pushon: pull_requeston: workflow_dispatch(수동)on: workflow_call(다른 workflow에서 호출)on: [push, pull_request](복수)
-
조건부 트리거
on:
issues:
types:
- opened
- labeled
push:
branches:
- main
- 'releases/**'
- '!releases/**-alpha'6. Reusable Workflow
- reusable-workflow.yml (재사용 가능한 workflow)
on:
workflow_call:
inputs:
input1:
required: true
type: string
outputs:
output1:
value: ${{ jobs.example_job.outputs.output1 }}
jobs:
example_job:
outputs:
output1: ${{ steps.step1.outputs.result }}
steps:
- id: step1
run: echo "result=`expr ${{ inputs.input1 }} + 10`" >> $GITHUB_OUTPUT- 호출 방법
jobs:
job1:
uses: jyheo/test3/.github/workflows/reusable-workflow.yml@main
with:
input1: 10
job2:
needs: job1
steps:
- run: echo ${{ needs.job1.outputs.output1 }}7. Cache Dependency
- 기본 캐싱
- uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-build-${{ hashFiles('a-file') }}- setup 액션 활용
- Python:
setup-pythonwithcache: 'pip' - Node:
setup-nodewithcache: 'npm' - Java:
setup-javawithcache: 'gradle'
- Python:
8. Jobs 활용
- 순차 실행
jobs:
job1:
job2:
needs: job1
job3:
needs: [job1, job2]- 조건부 실행
jobs:
production-deploy:
if: github.repository == 'octo-org/octo-repo-prod'- Matrix 전략
jobs:
example_matrix:
strategy:
matrix:
os: [ubuntu-22.04, ubuntu-20.04]
version: [10, 12, 14]
runs-on: ${{ matrix.os }}9. 실습 예제
- Python 프로젝트
str_util.py,test_str_util.py작성requirements.txt에 numpy 추가- Python Application starter workflow 사용
- pip 캐싱으로 실행 시간 단축