본문 바로가기
Program Development Tips/GitHub Actions

고급 GitHub Actions: 캐싱, 매트릭스 빌드, 시크릿 관리

by Maccrey Coding 2024. 8. 31.
반응형

 

GitHub Actions는 단순한 CI/CD 도구 이상의 강력한 기능들을 제공합니다.

이번 글에서는 GitHub Actions의 고급 기능들을 활용해 워크플로우를 최적화하고, 다양한 환경에서 테스트를 실행하며, 보안을 강화하는 방법을 알아보겠습니다.

캐싱을 활용해 빌드 시간을 단축하는 방법

빌드 과정에서 동일한 의존성을 반복적으로 다운로드하거나 설치하는 것은 시간이 많이 소요됩니다.

GitHub Actions에서는 캐싱을 통해 이러한 작업을 최적화할 수 있습니다.

예를 들어, Node.js 프로젝트에서 node_modules 디렉토리를 캐싱하는 방법은 다음과 같습니다.

steps:
  - name: Cache Node.js modules
    uses: actions/cache@v2
    with:
      path: node_modules
      key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
      restore-keys: |
        ${{ runner.os }}-node-
  
  - name: Install dependencies
    run: npm install

이렇게 설정하면, 의존성 파일(package-lock.json)이 변경되지 않는 한, 이전 빌드에서 캐싱된 node_modules를 재사용하여 빌드 시간을 크게 단축할 수 있습니다.

매트릭스 빌드를 통해 다양한 환경에서 테스트 실행하기

매트릭스 빌드는 여러 환경에서 동시에 테스트를 실행할 수 있도록 도와줍니다.

이를 통해 다양한 운영체제, 언어 버전 또는 라이브러리 조합에서 코드가 제대로 작동하는지 확인할 수 있습니다.

다음은 Node.js와 Python의 다양한 버전에서 테스트를 실행하는 매트릭스 빌드 예제입니다.

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [14.x, 16.x, 18.x]
        python-version: [3.7, 3.8, 3.9]

    steps:
    - name: Set up Node.js
      uses: actions/setup-node@v2
      with:
        node-version: ${{ matrix.node-version }}

    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: ${{ matrix.python-version }}

    - name: Install dependencies
      run: |
        npm install
        pip install -r requirements.txt

    - name: Run tests
      run: |
        npm test
        pytest

이 매트릭스 빌드는 Node.js의 세 가지 버전과 Python의 세 가지 버전을 조합하여 총 9개의 테스트 환경을 생성합니다.

이를 통해 다양한 환경에서 코드의 호환성을 검증할 수 있습니다.

시크릿 관리와 보안 설정

CI/CD 파이프라인에서는 API 키, 데이터베이스 비밀번호, 환경 변수 등의 중요한 정보(시크릿)를 안전하게 관리하는 것이 필수적입니다. GitHub Actions에서는 시크릿을 안전하게 저장하고, 워크플로우에서 이를 활용할 수 있습니다.

 

시크릿 설정 방법

  1. GitHub 리포지토리에서 Settings > Secrets > Actions로 이동합니다.
  2. 새로운 시크릿을 추가합니다.

시크릿 사용 예제

steps:
  - name: Checkout code
    uses: actions/checkout@v2

  - name: Deploy to AWS
    run: aws s3 sync ./build s3://my-bucket-name
    env:
      AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
      AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

이 방법을 통해 민감한 정보가 노출되지 않도록 하면서, 필요한 시크릿을 안전하게 워크플로우에 전달할 수 있습니다.

워크플로우 간의 의존성 설정 및 재사용 가능한 워크플로우 생성

복잡한 프로젝트에서는 여러 워크플로우가 서로 의존하는 경우가 많습니다. GitHub Actions에서는 워크플로우 간의 의존성을 설정하거나, 재사용 가능한 워크플로우를 정의하여 관리할 수 있습니다.

 

워크플로우 의존성 설정

하나의 워크플로우가 완료된 후 다른 워크플로우가 실행되도록 설정할 수 있습니다. 예를 들어, 빌드가 완료된 후 배포가 이루어지도록 설정할 수 있습니다.

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      # 빌드 작업
  deploy:
    runs-on: ubuntu-latest
    needs: build
    steps:
      # 배포 작업

 

재사용 가능한 워크플로우 생성

다른 리포지토리나 프로젝트에서 사용할 수 있는 재사용 가능한 워크플로우를 만들어, 일관성과 효율성을 높일 수 있습니다.

이는 .github/workflows/ 디렉토리에 워크플로우 파일을 저장하고, 다른 프로젝트에서 이를 호출하여 사용할 수 있습니다.

jobs:
  reusable-workflow:
    uses: owner/repo/.github/workflows/deploy.yml@main
    with:
      environment: production

이 방법을 통해 여러 프로젝트에서 동일한 워크플로우를 재사용할 수 있어 관리가 용이합니다.

 

GitHub Actions의 고급 기능을 활용하면 빌드 시간을 단축하고, 다양한 환경에서 코드를 테스트하며, 보안을 강화할 수 있습니다.

또한, 워크플로우 간의 의존성을 설정하거나 재사용 가능한 워크플로우를 생성함으로써, 더 효율적이고 일관된 CI/CD 파이프라인을 구축할 수 있습니다.

이 가이드를 통해 GitHub Actions의 고급 기능을 활용해 보세요!

 

 

반응형