[BASIC #3] GitHub Actions 핵심 문법 완벽 가이드

2025. 9. 23. 14:24·CI&CD/GitHub Actions

0. 들어가며

[BASIC #2]에서 첫 번째 워크플로우를 작성하고 실행해보았다. 이번 포스팅에서는 GitHub Actions의 핵심 문법을 체계적으로 정리하겠다. 모든 문법을 외울 필요는 없지만, 자주 사용되는 패턴은 익혀두면 실무에서 매우 유용하다.


1. 워크플로우 기본 구조

1.1. 가장 기본적인 형태 (name, on, jobs, runs-on, steps)

name: Workflow Name

on: [push]

jobs:
  job-id:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: echo "Hello World"

1.2. 각 요소의 역할

요소  설명  필수 여부
name 워크플로우 이름 선택
on 트리거 이벤트 필수
jobs 실행할 Job들 필수
jobs.<job_id> Job의 고유 식별자 필수
runs-on 실행 환경 필수
steps 실행할 Step들 필수

2. Event (트리거) 상세

2.1. 단일 이벤트

on: push

2.2. 여러 이벤트

on: [push, pull_request]

2.3. 세부 조건 지정

on:
  push:
    branches:
      - main
      - develop
    paths:
      - 'src/**'
      - '!**.md'  # 마크다운 파일 제외
  pull_request:
    branches:
      - main
    types:
      - opened
      - synchronize
      - reopened

2.4. 주요 이벤트 종류

이벤트  설명
push 코드 push 시
pull_request PR 생성/수정 시
schedule cron으로 정기 실행
workflow_dispatch 수동 실행
release 릴리스 생성 시
issues 이슈 생성/수정 시
watch 스타(Star) 누를 시

2.5. Schedule 예시 (cron)

on:
  schedule:
    # 매일 오전 9시 (UTC) → 한국 시간 오후 6시
    - cron: '0 9 * * *'
    # 매주 월요일 오전 3시
    - cron: '0 3 * * 1'

cron 표현식: 분 시 일 월 요일


3. Runner (실행 환경)

3.1. GitHub 호스팅 러너

jobs:
  ubuntu-job:
    runs-on: ubuntu-latest  # 최신 Ubuntu
  windows-job:
    runs-on: windows-latest  # 최신 Windows Server
  macos-job:
    runs-on: macos-latest    # 최신 macOS

3.2. 특정 버전 지정

runs-on: ubuntu-20.04  # Ubuntu 20.04
runs-on: windows-2019  # Windows Server 2019
runs-on: macos-11      # macOS 11 (Big Sur)

3.3. Self-hosted Runner

runs-on: self-hosted
# 또는 라벨로 지정
runs-on: [self-hosted, linux, x64]

4. Job과 Step 상세

4.1. 여러 Job 정의

jobs:
  build: # 단순 job name
    runs-on: ubuntu-latest
    steps:
      - run: echo "Building..."

  test: # 단순 job name
    runs-on: ubuntu-latest
    steps:
      - run: echo "Testing..."

  deploy: # 단순 job name
    runs-on: ubuntu-latest
    steps:
      - run: echo "Deploying..."

기본적으로 모든 Job은 병렬 실행된다.

4.2. Job 간 의존성 설정 (needs)

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - run: echo "Building..."

  test:
    needs: build  # build가 성공해야 실행
    runs-on: ubuntu-latest
    steps:
      - run: echo "Testing..."

  deploy:
    needs: [build, test]  # build와 test가 모두 성공해야 실행
    runs-on: ubuntu-latest
    steps:
      - run: echo "Deploying..."

4.3. Step에서 사용할 수 있는 것들

① uses: Action 사용

steps:
  - uses: actions/checkout@v4
  - uses: actions/setup-node@v4
    with:
      node-version: '18'

② run: Shell 명령어 실행

steps:
  - run: echo "Hello World"
  - run: |
      npm install
      npm run build
  - run: |
      if [ -f "file.txt" ]; then
        echo "File exists"
      fi

③ name: Step 이름 지정

steps:
  - name: Print current time
    run: date
  - name: Install dependencies
    run: npm install

5. Action 사용법

5.1. Action이란?

Action은 재사용 가능한 코드 블록이다. 복잡한 작업을 간단하게 사용할 수 있도록 패키징되어 있다.

5.2. 주요 공식 Action

Action  설명
actions/checkout 저장소 코드 가져오기
actions/setup-node Node.js 설치
actions/setup-java Java 설치
actions/setup-python Python 설치
actions/upload-artifact 빌드 결과물 업로드
actions/download-artifact 빌드 결과물 다운로드
actions/cache 의존성 캐싱

5.3. 버전 지정

# 주요 버전 (권장)
- uses: actions/checkout@v4

# 특정 커밋
- uses: actions/checkout@a81bbbf

# 브랜치
- uses: actions/checkout@main

# 도커 이미지
- uses: docker://alpine:3.8

5.4. Marketplace에서 Action 찾기

GitHub Marketplace(https://github.com/marketplace?type=actions)에서 수많은 Action을 찾을 수 있다.

인기 Action 예시:

  • docker/build-push-action: Docker 이미지 빌드 및 Push
  • aws-actions/configure-aws-credentials: AWS 인증 설정
  • google-github-actions/auth: GCP 인증 설정
  • slackapi/slack-github-action: Slack 알림

6. 환경 변수

6.1. Workflow 레벨 환경 변수

env:
  GLOBAL_VAR: "모든 Job에서 사용 가능"

jobs:
  job1:
    runs-on: ubuntu-latest
    steps:
      - run: echo $GLOBAL_VAR

6.2. Job 레벨 환경 변수

jobs:
  job1:
    runs-on: ubuntu-latest
    env:
      JOB_VAR: "이 Job에서만 사용 가능"
    steps:
      - run: echo $JOB_VAR

6.3. Step 레벨 환경 변수

steps:
  - name: Step with env
    env:
      STEP_VAR: "이 Step에서만 사용 가능"
    run: echo $STEP_VAR

6.4. 환경 변수 사용하기

steps:
  - run: |
      echo "값 출력: $MY_VAR"
      echo "값 출력: ${MY_VAR}"
    env:
      MY_VAR: hello

7. Context (컨텍스트) 변수

7.1. Context란?

GitHub Actions에서 미리 정의된 변수들을 Context라고 한다. ${{ context.property }} 형태로 사용한다.

7.2. 주요 Context

Context  설명  예시
github GitHub 관련 정보 ${{ github.repository }}
env 환경 변수 ${{ env.MY_VAR }}
secrets 비밀 값 ${{ secrets.API_KEY }}
runner Runner 정보 ${{ runner.os }}
job 현재 Job 정보 ${{ job.status }}
steps Step 출력값 ${{ steps.step_id.outputs.result }}

7.3. github Context 예시

steps:
  - run: |
      echo "저장소: ${{ github.repository }}"
      echo "브랜치: ${{ github.ref_name }}"
      echo "커밋 SHA: ${{ github.sha }}"
      echo "액터(실행자): ${{ github.actor }}"
      echo "이벤트 이름: ${{ github.event_name }}"
github 속성  설명
github.repository 소유자/저장소명 (예: octocat/Hello-World)
github.ref_name 브랜치 또는 태그명
github.sha 커밋 SHA
github.actor 워크플로우를 실행한 사용자
github.event_name 트리거된 이벤트 이름
github.workspace Runner의 작업 디렉토리 경로

7.4. secrets Context

민감한 정보는 저장소 Settings > Secrets and variables > Actions에 저장한다.

steps:
  - name: Deploy to server
    env:
      SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
      API_TOKEN: ${{ secrets.API_TOKEN }}
    run: |
      echo "API 토큰으로 배포 실행"
      # 실제 배포 명령어

8. 조건부 실행 (if)

8.1. 기본 조건문

jobs:
  deploy:
    if: github.ref == 'refs/heads/main'  # main 브랜치에서만 실행
    runs-on: ubuntu-latest
    steps:
      - run: echo "배포 중..."

8.2. 다양한 조건 예시

steps:
  # 특정 파일이 변경된 경우에만 실행
  - name: Run only if src 변경
    if: contains(github.event.head_commit.modified, 'src/')
    run: echo "src 파일이 변경됨"

  # 이전 Step이 실패한 경우에만 실행
  - name: Notify on failure
    if: failure()
    run: echo "이전 Step 실패!"

  # 항상 실행 (성공/실패 관계없이)
  - name: Cleanup
    if: always()
    run: echo "정리 작업"

  # 특정 Job의 결과에 따라
  - name: Run if build succeeded
    if: success() && github.ref == 'refs/heads/main'
    run: echo "빌드 성공!"

8.3. 조건 함수

함수  설명
success() 이전 Step이 모두 성공
failure() 이전 Step 중 실패 있음
always() 항상 실행
cancelled() 워크플로우가 취소됨

9. Matrix 전략

9.1. 기본 Matrix

여러 버전, 여러 환경에서 동시에 테스트할 때 사용한다.

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [14, 16, 18]
        os: [ubuntu-latest, windows-latest]
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
      - run: npm test

이 설정은 총 3(node) × 2(os) = 6개의 Job이 병렬 실행된다.

9.2. Matrix 결과 활용

jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest]
        include:
          - os: ubuntu-latest
            build-command: apt-get install
          - os: macos-latest
            build-command: brew install
    steps:
      - run: ${{ matrix.build-command }}

10. 출력값 전달하기

10.1. Step 간 출력값 전달

steps:
  - name: Generate output
    id: generator
    run: echo "result=hello" >> $GITHUB_OUTPUT

  - name: Use output
    run: echo "이전 Step의 출력값: ${{ steps.generator.outputs.result }}"

10.2. Job 간 출력값 전달

jobs:
  job1:
    runs-on: ubuntu-latest
    outputs:
      output1: ${{ steps.step1.outputs.result }}
    steps:
      - name: Step1
        id: step1
        run: echo "result=world" >> $GITHUB_OUTPUT

  job2:
    needs: job1
    runs-on: ubuntu-latest
    steps:
      - run: echo "job1의 출력값: ${{ needs.job1.outputs.output1 }}"

11. 아티팩트 (Artifacts)

11.1. 아티팩트 업로드

빌드 결과물을 저장하고 다음 Job에서 사용하거나 다운로드할 수 있다.

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - run: |
          mkdir dist
          echo "Build result" > dist/output.txt

      - uses: actions/upload-artifact@v3
        with:
          name: build-output
          path: dist/

11.2. 아티팩트 다운로드

jobs:
  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/download-artifact@v3
        with:
          name: build-output
          path: ./downloaded

      - run: cat downloaded/output.txt

12. 정리

이번 포스팅에서는 GitHub Actions의 핵심 문법을 체계적으로 정리해보았다.

구분  주요 내용
Event push, pull_request, schedule, workflow_dispatch
Runner ubuntu-latest, windows-latest, macos-latest
Job needs로 의존성 설정, 병렬 실행
Step uses(Action), run(쉘 명령어)
Context github, secrets, env, runner
조건문 if, success(), failure(), always()
Matrix 여러 버전/환경 동시 테스트
Artifact 빌드 결과물 저장/공유

'CI&CD > GitHub Actions' 카테고리의 다른 글

[ADVANED #1] GitHub Actions에서 Docker 고급 빌드 전략 (Buildx, 캐싱, 보안)  (0) 2026.02.24
[BASIC #5] 실전 프로젝트: Spring Boot 앱 CI/CD 파이프라인 구축하기  (0) 2026.02.24
[BASIC #4] GitHub Actions 변수와 컨텍스트 마스터하기  (0) 2026.02.24
[BASIC #2] 워크플로우 생성 및 실행 실습  (0) 2025.06.24
[BASIC #1] CI/CD 개념부터 GitHub Actions 이해하기 - 이론편  (0) 2025.06.17
'CI&CD/GitHub Actions' 카테고리의 다른 글
  • [BASIC #5] 실전 프로젝트: Spring Boot 앱 CI/CD 파이프라인 구축하기
  • [BASIC #4] GitHub Actions 변수와 컨텍스트 마스터하기
  • [BASIC #2] 워크플로우 생성 및 실행 실습
  • [BASIC #1] CI/CD 개념부터 GitHub Actions 이해하기 - 이론편
h6bro
h6bro
백엔드 개발자의 기술 블로그
  • h6bro
    Jun's Tech Blog
    h6bro
  • 전체
    오늘
    어제
    • 분류 전체보기 (250) N
      • Java (18)
        • Core (9)
        • Design Pattern (9)
      • Spring (80)
        • Core (24)
        • MVC (6)
        • DB (10)
        • JPA (26)
        • Monitoring (3)
        • Security (11)
        • WebSocket (0)
      • Database (33)
        • Redis (15)
        • MySQL (18)
      • MSA (25) N
        • MSA 기본 (11)
        • MSA 아키텍처 (14) N
      • Kafka (30)
        • Core (18)
        • Connect (12)
      • ElasticSearch (11)
        • Search (11)
        • Logging (0)
      • Test (4)
        • k6 (4)
      • Docker (9)
      • CI&CD (10)
        • GitHub Actions (6)
        • ArgoCD (4)
      • Kubernetes (18)
        • Core (12)
        • Ops (6)
      • Cloud Engineering (4)
        • AWS Infrastructure (3)
        • AWS EKS (1)
        • Terraform (0)
      • Project (8)
        • LinkFolio (1)
        • Secondhand Market (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • Cloud Engineering 포스팅 정리
  • 인기 글

  • 태그

    ㅈ
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
h6bro
[BASIC #3] GitHub Actions 핵심 문법 완벽 가이드
상단으로

티스토리툴바