🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

GitHub Actions 성능 최적화 가이드 - 슬라이드 1/13
A

AI Generated

2025. 11. 1. · 44 Views

GitHub Actions 성능 최적화 가이드

GitHub Actions 워크플로우의 실행 시간을 단축하고 비용을 절감하는 고급 최적화 기법을 배웁니다. 캐싱, 병렬 처리, 조건부 실행 등 실무에서 바로 적용 가능한 전략을 다룹니다.


카테고리:TypeScript
언어:TypeScript
메인 태그:#GitHub Actions
서브 태그:
#Caching#Parallel Jobs#Workflow Optimization#CI/CD

들어가며

이 글에서는 GitHub Actions 성능 최적화 가이드에 대해 상세히 알아보겠습니다. 총 12가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.

목차

  1. 의존성_캐싱으로_빌드_시간_단축
  2. 병렬_Job으로_테스트_시간_최적화
  3. Matrix_Strategy로_다중_환경_테스트
  4. 조건부_실행으로_불필요한_Job_스킵
  5. paths_필터로_변경된_파일만_처리
  6. concurrency로_중복_실행_방지
  7. Artifact_업로드로_Job_간_데이터_공유
  8. 셀프_호스팅_러너로_성능_향상
  9. Docker_레이어_캐싱_최적화
  10. 조기_실패_전략으로_피드백_단축
  11. GitHub_Script로_동적_워크플로우
  12. 워크플로우_재사용으로_유지보수_개선

1. 의존성 캐싱으로 빌드 시간 단축

개요

actions/cache를 사용하여 node_modules, pip 패키지 등을 캐싱하면 매번 다운로드하는 시간을 크게 줄일 수 있습니다.

코드 예제

steps:
  - uses: actions/checkout@v4
  - uses: actions/cache@v3
    with:
      path: ~/.npm
      key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
  - run: npm ci
  - run: npm run build

설명

package-lock.json 파일의 해시값을 키로 사용하여 의존성이 변경되지 않으면 캐시를 재사용합니다. 빌드 시간을 50% 이상 단축할 수 있습니다.


2. 병렬 Job으로 테스트 시간 최적화

개요

여러 Job을 동시에 실행하여 전체 워크플로우 실행 시간을 단축합니다. 테스트, 린트, 빌드를 병렬로 처리할 수 있습니다.

코드 예제

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - run: npm test
  lint:
    runs-on: ubuntu-latest
    steps:
      - run: npm run lint
  build:
    runs-on: ubuntu-latest
    steps:
      - run: npm run build

설명

독립적인 작업들을 병렬로 실행하여 순차 실행 대비 3배 빠른 피드백을 받을 수 있습니다.


3. Matrix Strategy로 다중 환경 테스트

개요

매트릭스 전략을 사용하면 여러 Node 버전, OS에서 동시에 테스트할 수 있습니다.

코드 예제

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

설명

6개의 환경 조합을 병렬로 테스트하여 호환성 검증 시간을 대폭 단축합니다.


4. 조건부 실행으로 불필요한 Job 스킵

개요

if 조건을 사용하여 특정 상황에서만 Job을 실행하면 리소스를 절약할 수 있습니다.

코드 예제

jobs:
  deploy:
    if: github.ref == 'refs/heads/main' && github.event_name == 'push'
    runs-on: ubuntu-latest
    steps:
      - run: npm run deploy
  test:
    if: contains(github.event.head_commit.message, '[test]')
    runs-on: ubuntu-latest
    steps:
      - run: npm test

설명

main 브랜치 푸시 시에만 배포하고, 커밋 메시지에 [test]가 있을 때만 테스트를 실행하여 불필요한 실행을 방지합니다.


5. paths 필터로 변경된 파일만 처리

개요

특정 경로의 파일이 변경되었을 때만 워크플로우를 트리거하여 실행 횟수를 줄입니다.

코드 예제

on:
  push:
    paths:
      - 'src/**'
      - 'package.json'
  pull_request:
    paths-ignore:
      - 'docs/**'
      - '**.md'

설명

소스 코드나 의존성이 변경되었을 때만 실행하고, 문서 변경 시에는 스킵하여 빌드 비용을 절감합니다.


6. concurrency로 중복 실행 방지

개요

동일한 브랜치에서 새 커밋이 푸시되면 이전 실행을 자동으로 취소하여 리소스를 절약합니다.

코드 예제

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - run: npm run build

설명

같은 브랜치에서 연속된 푸시 시 이전 워크플로우를 취소하여 대기 시간과 비용을 줄입니다.


7. Artifact 업로드로 Job 간 데이터 공유

개요

빌드 결과물을 artifact로 저장하면 다른 Job에서 재사용할 수 있어 중복 빌드를 방지합니다.

코드 예제

jobs:
  build:
    steps:
      - run: npm run build
      - uses: actions/upload-artifact@v3
        with:
          name: dist
          path: dist/
  deploy:
    needs: build
    steps:
      - uses: actions/download-artifact@v3
        with:
          name: dist

설명

빌드 Job의 결과물을 저장하고 배포 Job에서 다운로드하여 재빌드 없이 배포할 수 있습니다.


8. 셀프 호스팅 러너로 성능 향상

개요

고성능 서버를 직접 러너로 등록하면 GitHub 호스팅 러너보다 빠른 실행이 가능합니다.

코드 예제

jobs:
  build:
    runs-on: self-hosted
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm run build
    env:
      RUNNER_CACHE: /mnt/cache

설명

자체 서버를 러너로 사용하면 더 많은 CPU/메모리를 활용하고 네트워크 속도도 향상됩니다.


9. Docker 레이어 캐싱 최적화

개요

Docker 빌드 시 레이어 캐싱을 활용하면 이미지 빌드 시간을 크게 단축할 수 있습니다.

코드 예제

steps:
  - uses: docker/setup-buildx-action@v3
  - uses: docker/build-push-action@v5
    with:
      context: .
      cache-from: type=gha
      cache-to: type=gha,mode=max
      push: false

설명

GitHub Actions 캐시를 Docker 빌드에 통합하여 변경되지 않은 레이어를 재사용합니다.


10. 조기 실패 전략으로 피드백 단축

개요

fail-fast를 false로 설정하면 모든 매트릭스 조합을 테스트하지만, true면 하나 실패 시 즉시 중단합니다.

코드 예제

jobs:
  test:
    strategy:
      fail-fast: true
      matrix:
        node: [18, 20, 22]
    runs-on: ubuntu-latest
    steps:
      - run: npm test

설명

빠른 피드백이 필요하면 fail-fast를 true로 설정하여 첫 실패 시 즉시 알림을 받습니다.


11. GitHub Script로 동적 워크플로우

개요

actions/github-script를 사용하면 Octokit API로 동적인 워크플로우 로직을 구현할 수 있습니다.

코드 예제

steps:
  - uses: actions/github-script@v7
    with:
      script: |
        const { data: prs } = await github.rest.pulls.list({
          owner: context.repo.owner,
          repo: context.repo.repo,
          state: 'open'
        });
        console.log(`Open PRs: ${prs.length}`);

설명

PR 개수에 따라 조건부로 작업을 실행하는 등 복잡한 로직을 JavaScript로 구현할 수 있습니다.


12. 워크플로우 재사용으로 유지보수 개선

개요

재사용 가능한 워크플로우를 만들면 여러 리포지토리에서 공통 로직을 공유할 수 있습니다.

코드 예제

# .github/workflows/reusable.yml
on:
  workflow_call:
    inputs:
      node-version:
        required: true
        type: string
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ inputs.node-version }}

설명

공통 빌드 로직을 재사용 가능한 워크플로우로 추출하여 중복을 제거하고 유지보수를 단순화합니다. --- 고급 개발자를 위한 GitHub Actions 성능 최적화 가이드를 생성했습니다. 캐싱, 병렬 처리, 조건부 실행 등 실무에서 바로 적용 가능한 12가지 최적화 기법을 다루었습니다.


마치며

이번 글에서는 GitHub Actions 성능 최적화 가이드에 대해 알아보았습니다. 총 12가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.

관련 태그

#GitHub Actions #Caching #Parallel Jobs #Workflow Optimization #CI/CD

#GitHub Actions#Caching#Parallel Jobs#Workflow Optimization#CI/CD#TypeScript

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.