Unisquads
로그인
홈
이용약관·개인정보처리방침·콘텐츠정책·© 2026 Unisquads
이용약관·개인정보처리방침·콘텐츠정책
© 2026 Unisquads. All rights reserved.

Github Actions 워크플로우 설계 (r1)

이 문서의 과거 버전 (r1)을 보고 있습니다. 수정일: 2026.02.13 22:20

Github Actions 워크플로우 설계

이름

GitHub Actions 워크플로우

분류

CI/CD, 자동화

플랫폼

GitHub

언어

YAML

주요 구성 요소

워크플로우, 잡, 스텝, 액션

트리거

push, pull request, schedule, webhook 등

상세 구성 및 설정

워크플로우 파일 위치

.github/workflows/ 디렉토리

기본 구조

name, on, jobs

런너

GitHub 호스트 러너, 셀프 호스트 러너

환경 변수 설정

env 키워드 또는 GitHub Secrets

행렬 전략

strategy.matrix를 통한 다중 환경 테스트

아티팩트

actions/upload-artifact, actions/download-artifact

캐싱

actions/cache 액션을 통한 의존성 캐시

컨테이너 작업

jobs.<job_id>.container 설정

서비스 컨테이너

jobs.<job_id>.services 설정

조건부 실행

if 조건문

워크플로우 명령어

:: 구문을 사용한 러너와의 통신

재사용 가능 워크플로우

uses 키워드

인기 액션 마켓플레이스

GitHub Marketplace

1. 개요

GitHub Actions는 GitHub 저장소에서 직접 CI/CD 파이프라인을 구축하고 실행할 수 있는 자동화 플랫폼이다. 코드 푸시, 풀 리퀘스트 생성, 이슈 생성과 같은 저장소 내 이벤트를 트리거로 하여 워크플로우를 자동으로 실행한다. 이를 통해 개발자는 테스트 자동화, 정적 분석, 패키지 빌드, 배포 등의 작업을 코드 기반으로 정의하고 관리할 수 있다.

워크플로우는 YAML 형식의 파일(.github/workflows/ 디렉토리 내)로 작성되며, 저장소와 함께 버전 관리된다. 이는 인프라스트럭처를 코드로 관리하는 IaC 개념과 유사하게, 자동화 과정 자체를 코드화하여 재현성과 협업을 용이하게 한다. GitHub Actions의 핵심 구성 요소는 이벤트 트리거, 러너, 작업, 단계, 그리고 재사용 가능한 코드 단위인 액션이다.

기존의 독립형 CI/CD 도구와 비교했을 때, GitHub Actions는 개발 환경과 긴밀하게 통합된다는 장점이 있다. 개발자는 별도의 서버 구성 없이 GitHub의 호스팅된 가상 머신 또는 자체 호스팅 러너에서 작업을 실행할 수 있다. 이 플랫폼은 JavaScript, Docker, 컨테이너 기술을 활용하여 커스텀 액션을 쉽게 개발하고 공유할 수 있는 생태계를 제공한다.

GitHub Actions의 도입은 소프트웨어 개발 생명주기의 효율성을 높이고, DevOps 문화의 실천을 촉진하는 데 기여한다. 코드 변경 사항에 대한 빠른 피드백 루프를 형성하여 소프트웨어의 품질과 배포 속도를 동시에 개선할 수 있다.

2. 워크플로우 기본 구조

워크플로우는 YAML 형식의 파일(.github/workflows/ 디렉토리에 위치)로 정의되며, 실행을 시작하는 조건, 실행할 작업들, 그리고 작업이 실행될 환경을 기술한다.

워크플로우 실행은 특정 이벤트 트리거에 의해 시작된다. 가장 일반적인 트리거는 코드가 리포지토리에 푸시(push)되거나 풀 리퀘스트(pull request)가 생성될 때이다. 또한 수동으로 실행하거나, 예약된 크론(Cron) 작업, 또는 다른 워크플로우의 완료와 같은 외부 이벤트에 의해서도 트리거될 수 있다. 주요 트리거 이벤트는 다음과 같다.

이벤트

설명

push

특정 브랜치나 태그에 코드가 푸시될 때 실행된다.

pull_request

풀 리퀘스트가 열리거나, 재오픈되거나, 코드가 업데이트될 때 실행된다.

schedule

크론(Cron) 표현식으로 정의된 정해진 시간에 실행된다.

workflow_dispatch

Github 웹 인터페이스나 API를 통해 수동으로 실행한다.

워크플로우는 하나 이상의 작업(Job)으로 구성된다. 작업은 가상 환경 러너에서 실행되는 독립적인 작업 단위이다. 각 작업은 순차적 또는 병렬로 실행되도록 구성할 수 있으며, needs 키워드를 사용해 작업 간 의존성을 정의할 수 있다. 각 작업 내부는 더 작은 실행 단위인 단계(Step)로 나뉜다. 단계는 셸 명령어를 실행하거나, 미리 정의된 액션(Action)을 재사용하는 블록이다.

이 모든 작업과 단계는 러너(Runner) 환경에서 실행된다. 러너는 Github Actions 워크플로우를 실행하는 서버이다. Github에서 호스팅하는 무료 가상 머신(ubuntu-latest, windows-latest, macos-latest 등)을 사용하거나, 자체 호스팅 러너를 특정 하드웨어나 운영체제에 설치해 사용할 수 있다. 러너 환경은 runs-on 키워드로 작업 단위마다 지정한다.

2.1. 이벤트 트리거

이벤트 트리거는 GitHub Actions 워크플로우가 언제 실행될지를 정의하는 규칙이다. 워크플로우 파일의 on 키워드 아래에 하나 이상의 이벤트를 명시하여 구성한다. 가장 일반적인 트리거는 푸시(push)와 풀 리퀘스트(pull request) 이벤트이다. 예를 들어, 특정 브랜치에 코드가 푸시되거나, 풀 리퀘스트가 열리거나, 수정될 때 워크플로우를 자동으로 시작하도록 설정할 수 있다.

트리거는 특정 조건으로 세밀하게 제한할 수 있다. 브랜치, 태그, 파일 경로 패턴을 지정하여 이벤트의 범위를 좁힐 수 있다. 또한 schedule을 사용한 크론(Cron) 표현식 기반의 예약 실행, 저장소에서 발생하는 issues, discussion, release 같은 다양한 웹훅 이벤트, 또는 workflow_dispatch를 통한 수동 트리거도 지원한다. 이를 통해 개발 워크플로우에 맞는 유연한 자동화를 구축할 수 있다.

다음은 일반적인 이벤트 트리거의 예시를 보여주는 표이다.

이벤트 유형

키워드

주요 사용 사례

코드 푸시

push

특정 브랜치(예: main, develop)에 푸시될 때 CI 파이프라인 실행

풀 리퀘스트

pull_request

PR 생성 또는 업데이트 시 빌드 및 테스트 실행

예약 실행

schedule

매일 밤 정기적인 통합 테스트 또는 리포트 생성 실행

수동 실행

workflow_dispatch

관리자가 필요할 때 워크플로우를 수동으로 시작

웹훅 이벤트

issues, release

새 이슈가 생성되거나 릴리스가 게시될 때 작업 실행

이벤트 트리거는 워크플로우의 효율성과 정확성을 결정하는 핵심 요소이다. 불필요한 실행을 방지하고, 필요한 시점에만 자동화가 동작하도록 신중하게 설계해야 한다.

2.2. 작업(Job)과 단계(Step)

워크플로우는 하나 이상의 작업(Job)으로 구성된다. 각 작업은 가상 환경 러너에서 실행되는 독립적인 단위이며, 기본적으로 다른 작업과 병렬로 실행된다. 작업 간에는 의존성을 정의하여 특정 작업이 완료된 후에만 다음 작업이 실행되도록 순서를 제어할 수 있다. 예를 들어, 코드 빌드 작업이 성공해야 테스트 작업이 실행되도록 설정할 수 있다.

각 작업 내부는 순차적으로 실행되는 단계(Step)의 집합이다. 단계는 셸 명령어를 실행하거나, 액션(Action)을 호출하는 기본 단위이다. 액션은 재사용 가능한 코드 조각으로, 복잡한 작업을 캡슐화하여 워크플로우를 단순화한다. 단계는 동일한 작업 내의 러너 환경을 공유하므로, 한 단계에서 생성된 파일을 다음 단계에서 사용할 수 있다.

작업과 단계의 구성은 YAML 파일을 통해 정의된다. 다음은 간단한 예시이다.

구성 요소

키워드

설명

작업 정의

jobs

워크플로우 내 모든 작업을 정의하는 최상위 키

단일 작업

.<job_id> (예: build)

고유한 식별자로 작업을 정의

작업 러너

runs-on

작업이 실행될 러너(Runner) 환경 지정 (예: ubuntu-latest)

작업 단계

steps

해당 작업 내에서 실행될 단계들의 배열

단계 실행

run

셸에서 실행할 명령어

액션 사용

uses

재사용 가능한 액션을 호출

작업은 실패, 성공, 건너뛰기, 취소됨 등의 상태를 가지며, 워크플로우 실행의 전체 결과는 작업들의 상태에 따라 결정된다. 기본적으로 한 작업이 실패하면 해당 작업에 의존하는 후속 작업들은 실행되지 않으며, 워크플로우 실행은 실패로 종료된다.

2.3. 러너(Runner) 환경

GitHub Actions 러너는 워크플로우의 작업(Job)을 실행하는 가상 머신 또는 물리적 머신입니다. 러너는 GitHub에서 호스팅하는 GitHub 호스티드 러너와 사용자가 직접 관리하는 셀프 호스티드 러너로 구분됩니다. GitHub 호스티드 러너는 자동으로 유지 관리되며, Ubuntu Linux, Windows, macOS 운영 체제를 선택할 수 있습니다. 각 환경은 사전 설치된 소프트웨어 패키지 도구를 포함하고 있어, 별도의 설치 과정 없이 바로 빌드, 테스트, 배포 작업을 시작할 수 있습니다.

셀프 호스티드 러너는 사용자가 직접 인프라를 프로비저닝하고 관리합니다. 이는 특정 하드웨어 사양, 운영 체제, 또는 사내 네트워크에 위치한 프라이빗 리포지토리에 접근이 필요한 경우에 유용합니다. 셀프 호스티드 러너를 사용하면 러너 머신의 성능, 보안 정책, 설치된 소프트웨어를 완전히 제어할 수 있습니다. 그러나 사용자는 러너 머신의 유지보수, 보안 업데이트, 가용성에 대한 책임을 져야 합니다.

러너 환경은 워크플로우 파일의 runs-on 키워드를 통해 지정합니다. GitHub 호스티드 러너를 사용할 경우, 운영 체제 레이블을 사용합니다. 셀프 호스티드 러너를 사용하려면 사용자가 정의한 레이블을 지정해야 합니다. 단일 작업은 하나의 러너에서만 실행되지만, 매트릭스 전략을 활용하면 여러 러너 환경에서 병렬로 작업을 실행할 수 있습니다.

러너 유형

장점

단점

GitHub 호스티드 러너

관리 부담 없음, 자동 업데이트, 다양한 OS 제공, 즉시 사용 가능

사용 시간 제한[1], 하드웨어 사양 사용자 지정 불가

셀프 호스티드 러너

하드웨어/소프트웨어 완전 제어, 프라이빗 네트워크 접근 가능, 사용 시간 제한 없음

인프라 설치 및 유지보수 필요, 보안 관리 책임, 확장성 관리 필요

3. 워크플로우 설계 패턴

워크플로우 설계 패턴은 CI/CD 파이프라인을 효율적이고 유지보수 가능하게 구성하기 위한 반복 가능한 구조를 제공한다. 일반적인 패턴으로는 CI/CD 파이프라인 구성, 매트릭스 빌드 전략, 그리고 의존성 관리와 캐싱이 있다. 이러한 패턴을 적용하면 여러 환경에서의 테스트, 빌드 시간 단축, 그리고 작업 간의 명확한 의존성 정의가 가능해진다.

CI/CD 파이프라인 구성은 코드 변경에서부터 배포까지의 단계를 자동화하는 흐름을 설계하는 것이다. 일반적으로 lint, test, build, deploy 단계를 순차적 또는 병렬적으로 배치한다. 각 단계는 별도의 작업(Job)으로 구성되며, needs 키워드를 사용하여 선행 작업의 성공 여부에 따라 실행 여부를 결정한다. 이를 통해 빌드 실패 시 불필요한 배포 작업이 실행되는 것을 방지할 수 있다.

매트릭스 빌드 전략은 strategy.matrix를 사용하여 단일 작업 정의로 여러 조합의 러너 환경을 동시에 테스트하는 방법이다. 주로 여러 Node.js 버전, 운영체제 플랫폼, 또는 애플리케이션 구성 변수를 조합하여 호환성을 검증하는 데 사용된다. 아래는 간단한 예시이다.

Node.js 버전

운영체제

18.x

ubuntu-latest

20.x

ubuntu-latest

20.x

windows-latest

의존성 관리와 캐싱은 워크플로우 실행 성능을 크게 향상시키는 핵심 패턴이다. npm, Yarn, pip, Gradle 등의 패키지 관리자 의존성은 매번 새로 설치하기보다 캐싱하여 재사용한다. GitHub Actions는 actions/cache 액션을 제공하여 특정 키로 의존성 디렉토리를 캐싱하고, 이후 워크플로우 실행에서 캐시 히트가 발생하면 복원한다. 캐시 키는 lock 파일의 해시를 포함시켜 의존성이 변경될 때만 새 캐시가 생성되도록 설계하는 것이 일반적이다.

3.1. CI/CD 파이프라인 구성

CI/CD 파이프라인은 소프트웨어 개발 수명 주기에서 코드 변경 사항을 자동으로 빌드, 테스트, 배포하는 일련의 과정을 의미한다. GitHub Actions를 사용하면 저장소 내 .github/workflows 디렉토리에 YAML 파일을 작성하여 이러한 파이프라인을 쉽게 구성할 수 있다. 일반적인 파이프라인은 코드 푸시나 풀 리퀘스트 생성과 같은 이벤트에 의해 트리거되며, 연속적인 작업들의 흐름으로 설계된다.

기본적인 CI/CD 파이프라인은 보통 다음과 같은 단계를 포함한다.

1. 코드 체크아웃: 워크플로우의 첫 번째 단계로, actions/checkout 액션을 사용하여 저장소의 코드를 러너 환경에 가져온다.

2. 의존성 설치 및 빌드: 프로젝트에 필요한 패키지나 라이브러리를 설치하고, 소스 코드를 컴파일하거나 번들링한다. 이 단계에서 캐싱을 활용하면 실행 시간을 크게 단축할 수 있다.

3. 테스트 실행: 단위 테스트, 통합 테스트, 정적 분석 등을 실행하여 코드 품질과 정확성을 검증한다.

4. 배포: 모든 테스트가 통과하면, 지정된 환경(예: 스테이징, 프로덕션)에 애플리케이션을 배포한다. 배포는 조건부로 실행되도록 구성하는 것이 일반적이다[2].

파이프라인을 구성할 때는 작업 간의 의존성을 명확히 정의해야 한다. 예를 들어, 배포 작업은 반드시 테스트 작업의 성공에 의존하도록 설정한다. 또한, 서로 다른 브랜치나 태그에 따라 다른 파이프라인을 실행하도록 조건문을 사용할 수 있다. 매트릭스 빌드 전략을 결합하면 여러 런타임 버전이나 운영체제에 대해 병렬로 빌드 및 테스트를 수행하는 효율적인 파이프라인을 만들 수 있다.

3.2. 매트릭스 빌드 전략

매트릭스 빌드 전략은 단일 워크플로우 정의를 통해 여러 구성 조합을 병렬로 테스트하거나 빌드하는 GitHub Actions의 기능이다. 이 전략은 strategy.matrix 키워드를 사용하여 정의하며, 주로 다양한 운영체제, 언어 버전, 애플리케이션 프레임워크 버전 등에 걸쳐 소프트웨어의 호환성을 검증하는 데 활용된다. 하나의 작업이 매트릭스에 정의된 각 조합에 대해 자동으로 복제되어 실행되므로, 수동으로 여러 개의 유사한 작업을 작성하는 번거로움을 줄여준다.

매트릭스는 YAML 파일 내에서 배열 형태로 정의한다. 예를 들어, Node.js 애플리케이션을 Ubuntu, macOS, Windows 환경에서 각각 다른 버전으로 테스트하는 구성은 다음과 같다.

```yaml

jobs:

test:

runs-on: ${{ matrix.os }}

strategy:

matrix:

os: [ubuntu-latest, macos-latest, windows-latest]

node-version: [14, 16, 18]

```

위 예시에서 test 작업은 os와 node-version 두 변수의 모든 조합(3x3=9가지)에 대해 독립적으로 실행된다. 각 작업 인스턴스 내에서는 ${{ matrix.os }}와 ${{ matrix.node-version }} 변수를 통해 현재 조합의 값을 참조할 수 있다.

매트릭스 전략을 사용할 때는 몇 가지 고려 사항이 있다. 첫째, 의존성 캐싱을 효과적으로 구성해야 한다. 서로 다른 매트릭스 조합이 동일한 캐시 키를 공유하지 않도록 matrix.os와 matrix.node-version을 캐시 키의 일부로 포함시키는 것이 일반적이다. 둘째, 특정 조합에서의 실패가 전체 작업을 실패로 처리되도록 기본 설정되어 있으나, strategy.fail-fast 옵션을 false로 설정하면 다른 조합의 실행을 계속 진행할 수 있다. 또한, include 키워드를 사용하여 기본 매트릭스에 추가 조합을 삽입하거나, exclude 키워드로 특정 조합을 제외시킬 수 있다[3].

이 전략은 테스트 범위를 확장하면서도 구성 관리의 복잡성을 크게 낮춘다. 결과적으로 개발자는 보다 포괄적인 CI/CD 파이프라인을 유지보수 부담 없이 구축할 수 있게 된다.

3.3. 의존성 관리와 캐싱

의존성 관리는 Github Actions 워크플로우의 효율성과 신뢰성을 결정하는 핵심 요소이다. Node.js의 npm, Python의 pip, Java의 Maven과 같은 패키지 매니저를 사용하는 프로젝트에서는 매번 워크플로우가 실행될 때마다 모든 의존성을 원격 저장소에서 새로 다운로드하게 된다. 이는 네트워크 대역폭을 소모하고, 전체 실행 시간을 크게 증가시키는 주요 원인이다.

이 문제를 해결하기 위해 Github Actions는 actions/cache[4]를 비롯한 캐싱 메커니즘을 제공한다. 이 액션은 워크플로우 실행 간에 지정된 디렉토리나 파일을 캐시하여 재사용할 수 있게 한다. 캐시는 워크플로우가 실행되는 러너 환경의 로컬 스토리지를 활용하며, 캐시 키를 기반으로 저장하고 검색한다. 일반적인 캐싱 전략은 아래와 같다.

캐시 대상 (예시)

캐시 키 예시

복원 키 예시

npm 패키지 (node_modules)

npm-${{ hashFiles('package-lock.json') }}

npm-

pip 패키지 (__pycache__)

pip-${{ hashFiles('requirements.txt') }}

pip-

Maven 종속성 (.m2)

maven-${{ hashFiles('pom.xml') }}

maven-

캐시 키는 의존성 파일(package-lock.json, requirements.txt 등)의 해시값을 포함시켜, 파일 내용이 변경될 때만 새 캐시가 생성되도록 설계한다. 복원 키는 캐시 키와 정확히 일치하지 않는 경우, 접두사를 기준으로 대체 캐시를 찾는 데 사용된다.

효과적인 캐싱 설계는 빌드 시간을 수 분에서 수십 초 단위로 단축시킬 수 있다. 그러나 캐시는 영구적이지 않으며, 일정 기간 동안 접근하지 않거나 저장 용량 제한에 도달하면 자동으로 삭제될 수 있다[5]. 따라서 캐시에만 의존하기보다는, 캐시가 존재하지 않을 때도 정상적으로 의존성을 설치할 수 있는 워크플로우를 구성하는 것이 중요하다.

4. 액션(Action) 활용

액션은 GitHub Actions 워크플로우 내에서 특정 작업을 수행하는 재사용 가능한 단위이다. 공식적으로 제공되는 액션과 커뮤니티에서 개발한 액션을 조합하여 복잡한 자동화 작업을 쉽게 구성할 수 있다. 주요 액션은 GitHub Marketplace에서 검색하고 버전을 지정하여 워크플로우 파일에 참조한다. 액션은 일반적으로 Docker 컨테이너나 JavaScript로 작성되며, 입력 파라미터를 받고 출력 값을 생성할 수 있다.

공식 액션은 actions 조직 아래에서 관리되며, 코드 체크아웃, Docker 빌드, 패키지 레지스트리 배포 등 핵심 기능을 제공한다. 예를 들어, actions/checkout은 저장소 코드를 러너에 가져오는 데 필수적으로 사용된다. 커뮤니티 액션은 개인이나 조직이 개발하여 공유한 것으로, 특정 클라우드 서비스 배포, 테스트 도구 실행, 알림 전송 등 다양한 영역을 커버한다. 커뮤니티 액션을 사용할 때는 신뢰성과 보안을 고려하여 소스 코드와 릴리스 노트를 검토하는 것이 좋다.

커스텀 액션은 팀이나 프로젝트에 특화된 로직을 패키징하여 재사용성을 높이는 방법이다. JavaScript 액션은 의존성이 적고 실행이 빠르며, Docker 컨테이너 액션은 완전한 환경 제어가 필요할 때 적합하다. 커스텀 액션은 별도의 저장소에 개발하고, 태그를 통해 버전을 관리하며 다른 워크플로우에서 참조할 수 있다. 액션의 입력과 출력은 action.yml(또는 action.yaml) 파일에 명시적으로 정의하여 명확한 인터페이스를 제공한다.

액션 유형

주요 특징

사용 예시

컴포지트 액션

단일 리포지토리 내 여러 단계를 하나로 묶음

빌드 전 공통 설정 단계 묶기

JavaScript 액션

Node.js 런타임에서 직접 실행, 빠른 시작

파일 처리, 간단한 스크립트

Docker 컨테이너 액션

컨테이너 환경에서 실행, 완전한 환경 제어

특정 도구나 라이브러리가 필요한 작업

액션을 활용할 때는 특정 버전(예: v2)이나 커밋 SHA를 사용하여 예기치 않은 변경으로부터 워크플로우를 보호하는 것이 좋다. 최신 버전을 자동으로 가리키는 main 브랜치 참조는 지양한다.

4.1. 공식 및 커뮤니티 액션

GitHub Actions에서는 워크플로우를 구성하는 재사용 가능한 단위를 액션이라고 부른다. 액션은 단일 작업을 수행하도록 설계된 스크립트로, 복잡한 작업을 간소화하고 표준화하는 데 핵심적인 역할을 한다. 액션은 크게 GitHub에서 공식적으로 제공하는 공식 액션과, 개발자 커뮤니티가 만들어 공유하는 커뮤니티 액션으로 구분된다.

공식 액션은 actions 조직 아래에 호스팅되며, 주요 언어 및 도구와의 통합, Docker 컨테이너 관리, 워크플로우 아티팩트 처리 등 핵심 기능을 제공한다. 대표적인 예로는 저장소 코드를 체크아웃하는 actions/checkout, Node.js 환경을 설정하는 actions/setup-node, Docker 이미지를 빌드하고 푸시하는 docker/build-push-action 등이 있다. 이러한 액션들은 안정성과 보안이 검증되었으며, 공식 문서에 상세한 사용법이 제공된다.

커뮤니티 액션은 전 세계 개발자들이 GitHub Marketplace를 통해 공유한다. 이는 특정 클라우드 서비스 배포, 테스트 프레임워크 실행, 코드 품질 분석, 알림 전송 등 매우 다양하고 특화된 작업을 지원한다. 예를 들어, AWS에 배포하거나, Slack으로 알림을 보내는 액션들이 여기에 해당한다. 커뮤니티 액션을 사용할 때는 액션의 유지 관리 상태, 별점, 이슈 및 풀 리퀘스트 활동을 확인하여 신뢰성을 판단해야 한다.

액션을 선택하거나 참조할 때는 특정 버전 태그(예: v3)나 커밋 SHA를 명시적으로 지정하는 것이 좋다. 최신 버전(@main 또는 @master)을 사용하면 예기치 않은 변경 사항으로 인해 워크플로우가 중단될 수 있다. 또한, 타사 액션은 잠재적인 보안 위험을 내포할 수 있으므로, 필요한 최소 권한만 부여하고 가능하면 공식 액션을 우선적으로 활용하는 것이 안전하다.

4.2. 커스텀 액션 개발

커스텀 액션은 특정한 요구사항을 충족하거나 반복적인 태스크를 패키징하기 위해 사용자가 직접 개발한 GitHub Actions 구성 요소이다. 공식 또는 커뮤니티 액션으로 해결하기 어려운 독자적인 작업 흐름을 자동화할 때 유용하다. 커스텀 액션은 주로 JavaScript, Docker 컨테이너, 또는 복합적인 Composite Action 세 가지 유형으로 개발된다.

액션의 메타데이터는 action.yml(또는 action.yaml) 파일에 정의된다. 이 파일은 액션의 이름, 설명, 입력(Input) 파라미터, 출력(Output) 값, 그리고 실행 방식을 명시한다. 예를 들어, JavaScript 액션은 runs.using에 node16 또는 node20을 지정하고 진입점 스크립트를 설정한다. Docker 액션은 runs.using에 docker를 지정하고 Dockerfile을 통해 실행 환경을 구축한다.

액션 유형

runs.using 값

주요 특징

JavaScript 액션

node16, node20

빠른 실행, GitHub 호스트 러너의 환경 직접 활용

Docker 컨테이너 액션

docker

완전한 컨테이너 환경 격리, 특정 도구나 의존성 포함 가능

복합 액션

composite

여러 개의 run 명령어를 하나의 액션으로 묶어 관리

개발된 커스텀 액션은 동일한 저장소(Repository) 내에서 상대 경로로 참조하거나, 공개 GitHub 저장소에서 버전 태그(Git Tag)를 통해 사용할 수 있다. 또한 GitHub Marketplace에 게시하여 커뮤니티와 공유하는 것도 가능하다. 액션을 개발할 때는 시크릿(Secret)과 같은 민감한 데이터를 안전하게 처리하고, 입력값에 대한 유효성 검증을 철저히 하는 것이 중요하다.

5. 보안 및 권한 관리

시크릿은 암호, API 키, 인증서와 같은 민감한 데이터를 안전하게 저장하고 워크플로우 내에서 환경 변수로 참조할 수 있도록 하는 기능이다. 시크릿은 저장소 설정, 조직 설정 또는 환경 설정에서 생성하고 관리할 수 있으며, 워크플로우 파일에는 평문으로 노출되지 않는다. 시크릿을 사용할 때는 최소 권한 원칙을 적용하여, 각 작업이 필요한 최소한의 시크릿에만 접근할 수 있도록 제한하는 것이 중요하다. 또한, 시크릿 로깅을 방지하기 위해 run 단계에서 실수로 출력되지 않도록 주의해야 한다.

워크플로우 권한 제어는 Github Actions가 수행할 수 있는 작업의 범위를 제한하는 것을 의미한다. 기본적으로 생성된 퍼블릭 리포지토리의 워크플로우는 읽기 권한을 가지며, 프라이빗 리포지토리의 워크플로우는 쓰기 권한을 가진다. 이는 permissions 키워드를 사용하여 세분화된 권한을 명시적으로 설정함으로써 강화할 수 있다. 예를 들어, contents: read만 허용하거나, 이슈에 대한 쓰기 권한만 부여할 수 있다. 이는 악의적인 풀 리퀘스트로 인해 워크플로우가 실행될 경우 발생할 수 있는 보안 위험을 줄이는 데 도움이 된다.

권한 범위

설명

일반적인 사용 사례

actions

Github Actions의 사용/승인 관리

재사용 가능한 워크플로우 호출

checks

체크 스위트 및 체크 런 생성, 수정

테스트 결과 보고

contents

저장소 코드/파일에 대한 읽기/쓰기

코드 체크아웃, 빌드 아티팩트 업로드

issues

이슈에 대한 읽기/쓰기

자동 이슈 생성 또는 코멘트

pull-requests

풀 리퀘스트에 대한 읽기/쓰기

자동 리뷰 또는 머지

또한, 외부 포크에서 발생하는 풀 리퀘스트에 의해 트리거된 워크플로우는 기본적으로 읽기 권한만 가지며 시크릿에 접근할 수 없다. 이 동작은 저장소 설정에서 변경할 수 있지만, 보안상 위험할 수 있어 신중하게 검토해야 한다. 토큰을 사용하는 경우, 기본 제공되는 GITHUB_TOKEN의 수명은 작업 실행 동안으로 제한되어 상대적으로 안전하지만, 필요한 경우 더 세부적인 권한을 가진 퍼스널 액세스 토큰을 시크릿으로 저장하여 사용할 수도 있다.

5.1. 시크릿(Secret) 관리

Github Actions에서 시크릿(Secret)은 암호, API 키, 인증서와 같은 민감한 데이터를 안전하게 저장하고 워크플로우 내에서 사용하기 위한 메커니즘이다. 시크릿은 저장소 설정 또는 조직 설정에서 생성 및 관리되며, 워크플로우 파일에 직접 하드코딩되는 것을 방지한다. 이는 코드 유출 위험을 줄이고 접근 권한을 세밀하게 제어할 수 있게 한다.

시크릿은 secrets 컨텍스트를 통해 워크플로우의 단계(Step)에서 참조된다. 예를 들어, ${{ secrets.MY_API_KEY }}와 같은 형식으로 사용한다. 시크릿은 환경 변수로 매핑되거나, 특정 액션의 입력값으로 전달될 수 있다. 중요한 점은 시크릿 값이 워크플로우 실행 로그에 출력되지 않도록 설계되어 있다는 것이다. 그러나 의도치 않게 로그에 노출될 수 있는 상황(예: echo 명령어로 출력)을 주의해야 한다.

시크릿 관리의 주요 접근법은 다음과 같다.

관리 수준

설명

권한 범위

저장소 시크릿

특정 저장소에서만 사용 가능.

해당 저장소의 모든 워크플로우.

조직 시크릿

조직 내 여러 저장소에서 공유 가능.

조직 내 선택된 저장소의 워크플로우.

환경 시크릿

특정 배포 환경(예: production, staging)에 연결.

해당 환경을 사용하는 워크플로우 단계.

환경 시크릿을 사용하면 배포 단계에 추가적인 승인 제어를 설정할 수 있어 보안을 강화할 수 있다. 또한 Github Actions는 자동으로 GITHUB_TOKEN이라는 시크릿을 제공하여 저장소에 대한 인증된 접근을 가능하게 한다. 이 토큰의 권한은 워크플로우 파일에서 설정할 수 있다.

5.2. 워크플로우 권한 제어

워크플로우 권한 제어는 GitHub Actions 실행 시 필요한 최소 권한 원칙을 적용하여 보안 위험을 줄이는 것을 목표로 한다. 기본적으로 워크플로우는 저장소의 내용을 읽고, 이슈 트래커 및 풀 리퀘스트에 코멘트를 작성할 수 있는 광범위한 권한을 가진다. 이러한 기본 권한은 permissions 키워드를 사용하여 이벤트별 또는 작업별로 세밀하게 제한할 수 있다.

권한은 read, write, none 중 하나로 설정하며, 특정 스코프에 대해 명시적으로 정의할 수 있다. 주요 권한 스코프는 다음과 같다.

권한 스코프

설명

actions

GitHub Actions 자체(워크플로우 실행, 아티팩트 접근 등) 관련 권한

checks

CI/CD 체크 실행 및 수정 권한

contents

저장소 코드 및 파일에 대한 읽기/쓰기 권한

deployments

배포 생성 및 상태 업데이트 권한

issues

이슈 읽기, 작성, 수정 권한

pull-requests

풀 리퀘스트 읽기, 작성, 수정 및 머지 권한

repository-projects

프로젝트 보드 접근 권한

예를 들어, 단순한 정적 분석 작업은 contents: read 권한만으로 충분하며, 배포 작업에는 contents: read와 deployments: write 권한을 명시적으로 부여한다. 이렇게 하면 악의적인 코드가 저장소에 쓰거나 다른 민감한 작업을 수행하는 것을 방지할 수 있다. 또한, GITHUB_TOKEN의 기본 권한을 전역적으로 제한하려면 조직 또는 저장소 설정에서 "워크플로우의 권한"을 "읽기 권한으로 제한"하도록 변경할 수 있다.

6. 성능 최적화

워크플로우의 실행 시간을 단축하는 것은 개발자의 생산성 향상과 CI/CD 피드백 루프 가속화에 직접적인 영향을 미친다. 가장 효과적인 방법은 불필요한 작업을 제거하고, 가능한 작업을 병렬로 실행하며, 캐싱을 적극적으로 활용하는 것이다. 예를 들어, 의존성 설치 단계는 npm, pip, Maven 같은 패키지 매니저의 캐싱 기능과 GitHub Actions의 actions/cache 액션을 결합해 이전 빌드에서 생성된 캐시를 재사용할 수 있다[6]. 또한, 매트릭스 빌드를 사용해 여러 런타임 버전이나 운영체제에 대한 테스트를 동시에 실행하면 순차적 실행에 비해 전체 시간을 크게 줄일 수 있다.

비용 효율화는 특히 퍼블릭 리포지토리에서는 무료 사용량 한도 내에서, 프라이빗 리포지토리에서는 GitHub 요금제에 따른 러너 시간 제한을 고려해야 한다. 자체 호스트 러너를 도입하면 특정 하드웨어 구성을 활용하거나 클라우드 비용을 절감할 수 있다. 워크플로우 설계 시 if 조건문을 사용해 특정 브랜치나 파일 변경이 있을 때만 작업을 실행하도록 필터링하면 불필요한 실행을 방지한다. 예를 들어, 문서만 수정된 커밋에서는 전체 테스트 스위트를 실행하지 않도록 구성할 수 있다.

성능 최적화를 위한 구체적인 접근법은 다음 표와 같이 정리할 수 있다.

최적화 목표

주요 전략

예시 또는 참고 사항

실행 시간 단축

캐싱 활용

actions/cache를 사용한 의존성 캐시, Docker 레이어 캐시

작업 병렬화

매트릭스 빌드, 의존성이 없는 별도의 잡(Job) 분리

증분 빌드

변경된 모듈만 빌드하도록 빌드 도구 설정

비용 효율화

실행 트리거 최적화

paths, paths-ignore를 사용한 파일 변경 필터링

러너 선택

자체 호스트 러너 사용, 더 빠른 하드웨어 환경 선택

작업 단순화

불필요한 아티팩트 업로드/다운로드 제한

이러한 최적화는 지속적인 모니터링을 통해 효과를 측정하고 조정해야 한다. GitHub Actions의 실행 기록과 각 단계별 소요 시간을 분석하여 병목 현상을 찾아내고, 지속적으로 워크플로우 구성을 개선하는 과정이 필요하다.

6.1. 실행 시간 단축

워크플로우 실행 시간을 단축하는 것은 개발 생산성과 비용 효율성을 높이는 핵심 요소이다. 주요 접근법은 불필요한 작업의 제거, 병렬 실행의 극대화, 그리고 캐싱을 통한 중복 계산 방지이다.

최적화 전략

설명

주요 도구/기능

의존성 캐싱

패키지 매니저(npm, pip, Maven 등)의 의존성을 캐싱하여 매번 다운로드하는 시간을 절약한다.

actions/cache 액션

아티팩트 캐싱

빌드 결과물이나 중간 산출물을 캐싱하여 후속 작업에서 재사용한다.

actions/upload-artifact, actions/download-artifact

작업 병렬화

서로 의존성이 없는 작업을 동시에 실행하여 전체 흐름을 단축한다.

워크플로우 파일의 jobs.<job_id>.needs 키 활용

매트릭스 빌드 축소

불필요한 조합을 제외하여 매트릭스 빌드의 범위를 최적화한다.

matrix 설정에서 exclude 또는 조건부 include 사용

필요한 코드만 체크아웃

전체 저장소 히스토리 대신 최신 커밋만 체크아웃하여 시간을 절약한다.

actions/checkout 액션의 fetch-depth 파라미터

구체적인 구현으로는, actions/cache 액션을 사용하여 Node.js 프로젝트의 node_modules 디렉토리를 키값으로 캐싱하는 것이 대표적이다. 캐시 키는 package-lock.json 파일의 해시를 포함시켜 의존성이 변경될 때만 새 캐시가 생성되도록 한다. 또한, Docker 이미지 빌드 시 레이어 캐싱을 활용하거나, 테스트 작업을 여러 개의 독립적인 작업(Job)으로 분할하여 병렬 실행하는 전략도 효과적이다. 마지막으로, 코드 체크아웃 단계에서 fetch-depth: 1 옵션을 설정하면 전체 Git 히스토리를 가져오지 않아 초기 설정 시간을 크게 줄일 수 있다.

6.2. 비용 효율화

GitHub Actions의 사용량은 공개 저장소에는 무료이지만, 비공개 저장소의 경우 월별 무료 사용량을 초과하면 요금이 부과된다[7]. 따라서 워크플로우 설계 시 비용 효율성을 고려하는 것이 중요하다.

비용을 절감하는 주요 방법은 불필요한 워크플로우 실행을 줄이고, 실행 시간을 최소화하는 것이다. 이를 위해 다음과 같은 전략을 적용할 수 있다.

  • 이벤트 트리거 최적화: on: push와 같은 광범위한 트리거 대신, on: pull_request를 특정 브랜치에만 적용하거나, paths와 paths-ignore 필터를 사용하여 코드 변경이 관련된 디렉터리에서만 워크플로우가 실행되도록 제한한다.

  • 작업 분리와 조건부 실행: 모든 작업을 하나의 워크플로우에 묶기보다, 테스트, 빌드, 배포 단계를 분리하고 if 조건을 사용하여 필요할 때만 실행하게 한다. 예를 들어, 문서 수정만 있는 커밋에는 배포 작업이 실행되지 않도록 할 수 있다.

  • 캐싱 활용: 의존성 관리와 캐싱에서 다루듯, actions/cache 액션을 사용하여 npm, pip, Gradle 등의 의존성 패키지나 빌드 결과물을 캐싱하면 매번 새로 설치하거나 빌드하는 시간과 비용을 크게 절약할 수 있다.

실행 환경 선택과 모니터링도 비용 관리에 중요하다. 더 빠른 하드웨어를 사용하면 실행 시간이 단축되어 분 단위 비용이 높아질 수 있지만, 전체 작업 시간이 크게 줄어들어 총비용이 낮아지는 경우가 있다. 적절한 러너(Runner) 환경을 선택하기 위해 주기적으로 워크플로우 실행 시간을 검토해야 한다. 또한 GitHub 제공 러너 대신 자체 호스팅 러너를 사용하면 Actions 시간 사용량을 소모하지 않을 수 있으나, 호스팅 및 유지 관리 비용을 따져봐야 한다. 비용 사용 현상은 GitHub 설정의 'Billing' 섹션에서 상세히 확인할 수 있다.

7. 디버깅과 모니터링

워크플로우 실행 중 발생하는 문제를 식별하고 해결하기 위해 Github Actions는 상세한 실행 로그를 제공합니다. 각 워크플로우 실행 페이지의 'Jobs' 섹션에서 개별 작업(Job)과 단계(Step)의 로그를 실시간으로 확인할 수 있습니다. 로그는 명령어 실행, 환경 변수, 오류 메시지를 포함하며, 특히 set -x와 같은 디버그 명령을 통해 스크립트 실행 흐름을 더 자세히 추적할 수 있습니다. 주요 오류는 일반적으로 빨간색 텍스트로 강조 표시되며, 로그 내에서 직접 검색 기능을 활용해 특정 키워드를 찾을 수 있습니다.

문제를 사전에 감지하고 신속하게 대응하기 위해 알림을 설정하는 것이 중요합니다. Github Actions는 워크플로우 실행 결과를 다양한 채널로 통지할 수 있습니다. 기본적으로 실패한 워크플로우 실행에 대한 이메일 알림이 활성화되어 있습니다. 더 나아가, 슬랙(Slack), 마이크로소프트 팀즈(Microsoft Teams), 디스코드(Discord) 등 외부 서비스와의 연동을 위한 공식 및 커뮤니티 액션(Action)을 활용할 수 있습니다. 예를 들어, slackapi/slack-github-action 액션을 사용해 특정 채널에 성공/실패 상태를 보고할 수 있습니다.

모니터링 요소

설명

관련 기능/액션 예시

실행 로그 분석

단계별 상세 출력, 오류 메시지, 환경 정보 확인

워크플로우 실행 UI, actions/upload-artifact[8]

상태 알림

성공, 실패, 취소 등 워크플로우 결과 통보

기본 이메일 알림, 8398a7/action-slack 액션, 웹훅(Webhook)

실행 시간 모니터링

작업 소요 시간 추적 및 병목 현상 식별

GitHub Actions 분석 대시보드, jitterbit/get-changed-files 액션[9]

지속적인 모니터링을 위해 GitHub의 인사이트(Insights) 탭 내 'Actions' 분석 도구를 사용할 수 있습니다. 여기서는 워크플로우 실행 빈도, 평균 실행 시간, 성공률 등의 메트릭을 확인하여 성능 추세를 파악하고 개선점을 도출할 수 있습니다. 또한, if: failure() 조건을 사용해 실패한 작업에 대해서만 디버그 정보를 수집하거나 정리 작업을 수행하는 단계를 추가하는 것도 효과적인 디버깅 전략입니다.

7.1. 로그 분석

워크플로우 실행 중 생성되는 로그는 디버깅과 문제 진단의 핵심 자료이다. Github Actions는 각 워크플로우 실행, 작업(Job), 단계(Step)에 대한 상세한 로그를 실시간으로 제공하며, 웹 인터페이스에서 확인할 수 있다. 로그는 실행 명령어, 표준 출력(stdout), 표준 에러(stderr) 메시지, 그리고 액션(Action)의 내부 동작 정보를 포함한다. 특히 실패한 단계의 로그는 오류 원인을 파악하는 첫 번째 지점이 된다.

로그 분석은 체계적인 접근이 필요하다. 먼저 실패한 작업(Job)의 첫 번째 실패 단계(Step)를 확인하여 근본 원인을 찾는 것이 효율적이다. 로그 내에서 Error, Failed, exit code 1과 같은 키워드를 검색하면 빠르게 문제 지점을 발견할 수 있다. 또한, 러너(Runner) 환경 정보(예: 운영체제, 설치된 소프트웨어 버전)가 로그 시작 부분에 기록되어 환경 차이로 인한 문제를 식별하는 데 도움을 준다.

복잡한 문제의 경우 로그의 세부 출력 수준을 높여야 한다. 워크플로우 파일에서 특정 단계(Step)에 run 명령을 사용할 때 shell 옵션을 설정하거나, 액션(Action)에서 제공하는 디버그 로깅 플래그를 활성화할 수 있다. 예를 들어, run: env 명령을 추가하여 실행 환경의 모든 변수를 덤프하거나, 스크립트 내에 디버그 출력문을 추가하여 변수 값과 실행 흐름을 추적할 수 있다.

분석 대상

확인 내용

일반적인 문제 원인

실행 명령어

입력된 명령어가 정확한가?

오타, 잘못된 경로, 존재하지 않는 파일 참조

종료 코드

프로세스의 종료 코드는 무엇인가?

스크립트 실패, 테스트 실패, 의존성 설치 오류

환경 변수

필요한 시크릿(Secret)이나 변수가 설정되었는가?

시크릿 누락, 변수 값 오류, 스코프 문제

타이밍

어떤 단계에서 시간이 오래 걸리는가?

네트워크 지연, 캐시 미스, 비효율적인 스크립트

액션 로그

사용한 커스텀 또는 서드파티 액션의 내부 로그

액션 버전 호환성 문제, 액션 내부 버그

7.2. 알림 설정

워크플로우 실행 결과에 대한 알림은 CI/CD 파이프라인의 상태를 실시간으로 파악하는 데 필수적이다. 알림은 성공, 실패, 취소 등 다양한 상태에 대해 설정할 수 있으며, 이를 통해 개발 팀은 문제를 신속하게 인지하고 대응할 수 있다. 주요 알림 채널로는 슬랙, 이메일, 마이크로소프트 팀즈, 디스코드 등이 일반적으로 활용된다.

알림을 설정하는 방법은 크게 두 가지이다. 첫째, GitHub Marketplace에서 제공되는 공식 또는 커뮤니티 액션을 사용하는 것이다. 예를 들어, slackapi/slack-github-action 액션을 사용하면 워크플로우의 특정 단계에서 슬랙 채널로 메시지를 보낼 수 있다. 둘째, 워크플로우 파일 내에서 if 조건문과 jobs.<job_id>.steps.continue-on-error 속성을 조합하여 실패 시 특정 알림 단계를 실행하도록 구성하는 방법이다.

알림 채널

주요 액션 예시

설정 포인트

슬랙

slackapi/slack-github-action

작업 성공/실패 시, 특정 단계 종료 후

이메일

dawidd6/action-send-mail

워크플로우 종료 시

마이크로소프트 팀즈

opsdroid/github-actions-for-teams

풀 리퀘스트 이벤트 발생 시

웹훅

distributhor/workflow-webhook

사용자 정의 이벤트 발생 시

알림 내용은 가능한 상황을 명확히 전달해야 한다. 워크플로우 이름, 레포지토리명, 브랜치, 실행 상태(성공/실패), 실행된 작업 목록, 실패한 경우 관련 로그 링크 등을 포함하는 것이 좋다. 특히 실패 알림에는 문제 해결을 위한 컨텍스트를 충분히 제공해야 한다. 또한, 너무 빈번한 알림은 피하고, 실패나 중요한 상태 변경과 같은 핵심 이벤트에 집중하여 알림 피로도를 낮추는 설계가 필요하다.

8. 고급 활용

재사용 가능한 워크플로우는 동일한 워크플로우 로직을 여러 저장소나 프로젝트에서 공유할 수 있게 해주는 기능이다. .github/workflows 디렉토리에 reusable-workflow.yml 파일을 생성하고, on: workflow_call: 이벤트를 사용하여 호출 가능하게 정의한다. 호출 측에서는 uses: 키워드로 해당 워크플로우의 경로를 지정하고, with: 및 secrets:을 통해 입력값과 시크릿을 전달한다. 이를 통해 표준화된 CI/CD 프로세스를 중앙에서 관리하고 유지보수성을 높일 수 있다.

환경별 배포 전략을 구현하기 위해 Github Actions는 environments 기능을 제공한다. 저장소 설정에서 production, staging, development와 같은 환경을 정의하고, 각 환경에 보호 규칙과 시크릿을 별도로 설정할 수 있다. 워크플로우 파일 내에서는 environment: 키를 사용하여 작업이 특정 환경에 배포됨을 명시하고, if: 조건문과 결합하여 브랜치나 태그에 따라 배포 대상을 동적으로 결정한다.

배포 단계

대상 환경

트리거 조건 예시

주요 목적

개발자 테스트

development

push to feature/* 브랜치

빠른 피드백과 통합 테스트

스테이징 검증

staging

pull_request to main 브랜치

사용자 승인 전 최종 검증

프로덕션 배포

production

push of tag v*.*.*

최종 사용자 서비스 제공

이러한 고급 패턴을 적용할 때는 워크플로우의 복잡성과 명확성 사이의 균형을 유지하는 것이 중요하다. 재사용 가능한 워크플로우는 표준화를 촉진하지만, 과도하게 추상화하면 디버깅이 어려워질 수 있다. 환경별 배포는 안전한 릴리스 프로세스를 보장하지만, 각 환경의 인프라와 구성이 일관되게 관리되어야 한다.

8.1. 재사용 가능한 워크플로우

재사용 가능한 워크플로우는 공통된 자동화 작업을 정의하여 여러 저장소나 프로젝트에서 반복적으로 사용할 수 있게 해주는 GitHub Actions의 기능이다. 이를 통해 중복 코드를 제거하고 표준화된 프로세스를 유지 관리하는 데 유리하다. 재사용 가능한 워크플로우는 별도의 YAML 파일로 작성되며, 호출 측 워크플로우에서 uses 키워드를 통해 참조한다. 이는 DRY 원칙을 지키고, 팀 전체의 CI/CD 일관성을 높이는 데 기여한다.

재사용 가능한 워크플로우를 만들기 위해서는 .github/workflows 디렉터리에 YAML 파일을 생성하고, on: workflow_call: 트리거를 사용하여 호출을 받을 수 있도록 정의해야 한다. 입력 매개변수(inputs), 비밀(secrets), 그리고 출력값(outputs)을 정의하여 호출하는 측과 데이터를 주고받을 수 있다. 아래는 간단한 구조의 예시이다.

```yaml

# .github/workflows/reusable-ci.yml

name: Reusable CI Pipeline

on:

workflow_call:

inputs:

node-version:

required: true

type: string

secrets:

npm-token:

required: true

jobs:

build-and-test:

runs-on: ubuntu-latest

steps:

  • uses: actions/checkout@v4

  • uses: actions/setup-node@v4

with:

node-version: ${{ inputs.node-version }}

```

호출 측 워크플로우에서는 다른 저장소의 재사용 가능한 워크플로우도 참조할 수 있다. 이를 통해 조직 내 표준 CI/CD 파이프라인을 중앙에서 관리하고 배포하는 것이 가능해진다. 호출 시 필요한 입력값과 비밀을 전달해야 한다.

```yaml

# 호출하는 워크플로우

name: Main Project CI

on: [push]

jobs:

call-reusable-workflow:

uses: my-org/shared-workflows/.github/workflows/reusable-ci.yml@main

with:

node-version: '18'

secrets:

npm-token: ${{ secrets.NPM_TOKEN }}

```

이 접근 방식은 특히 마이크로서비스 아키텍처 환경이나 다수의 유사한 프로젝트를 관리할 때 강력한 이점을 발휘한다. 공통적인 빌드, 테스트, 보안 스캔, 배포 단계를 하나의 재사용 가능한 워크플로우로 캡슐화하면, 정책 변경 시 중앙 파일 한 곳만 수정하면 모든 관련 프로젝트에 변경 사항이 적용된다. 그러나 과도한 매개변수화는 복잡성을 증가시킬 수 있으므로, 적절한 추상화 수준을 유지하는 것이 중요하다.

8.2. 환경별 배포 전략

환경별 배포 전략은 소프트웨어 개발 수명 주기에서 개발 환경, 테스트 환경, 스테이징 환경, 프로덕션 환경 등 서로 다른 목적의 환경에 코드를 안전하고 효율적으로 전달하기 위한 접근법을 의미한다. GitHub Actions를 사용하면 단일 워크플로우 파일 내에서 조건부 로직과 환경 보호 규칙을 활용하여 이 과정을 자동화할 수 있다.

워크플로우 설계 시 일반적으로 github.ref 컨텍스트를 활용하여 브랜치나 태그를 기준으로 배포 대상을 결정한다. 예를 들어, main 브랜치에 푸시되면 프로덕션 환경으로, develop 브랜치에 푸시되면 스테이징 환경으로 배포하는 전략을 구성할 수 있다. 각 환경은 GitHub 저장소 설정에서 별도로 정의할 수 있으며, 여기에 시크릿 변수나 환경 보호 규칙(예: 특정 리뷰어의 승인 필요, 특정 상태 확인 통과 필수)을 설정하여 배포 안정성을 높인다.

환경 이름

트리거 브랜치/태그

주요 목적

일반적 보호 규칙

development

develop, feature/*

기능 통합 및 초기 테스트

자동 배포, 최소한의 검증

staging

main, release/*

최종 사용자 승인 전 테스트

수동 승인 필요, E2E 테스트 통과

production

태그 (v*), main(직접 푸시)

최종 사용자 서비스

다중 리뷰어 승인, 모든 CI 단계 통과

보다 정교한 전략으로는 카나리 배포나 블루-그린 배포를 구현하는 것이 있다. 이를 위해 워크플로우 내에서 배포 작업을 매트릭스 전략으로 구성하거나, 외부 IaC 도구나 쿠버네티스와 연동하여 트래픽 라우팅을 점진적으로 조정할 수 있다. 성공적인 환경별 배포의 핵심은 각 환경에 맞는 검증 단계(예: 개발 환경에서는 단위 테스트, 스테이징 환경에서는 성능 테스트)를 명확히 정의하고, 롤백 메커니즘을 마련하여 문제 발생 시 신속히 이전 안정 상태로 복구할 수 있도록 하는 것이다.

9. 관련 문서

  • GitHub Docs - GitHub Actions 소개

  • GitHub Docs - 워크플로우 구문

  • GitHub Docs - 워크플로우를 트리거하는 이벤트

  • Microsoft Learn - GitHub Actions를 사용한 CI/CD

  • GitHub 블로그 - GitHub Actions로 지속적 통합 시작하기

  • 위키백과 - 지속적 통합

  • GitHub Marketplace - Actions

리비전 정보

버전r1
수정일2026.02.13 22:20
편집자unisquads
편집 요약AI 자동 생성
히스토리로 돌아가기