Type something to search...
GitHub Actions로 시작하는 완벽한 CI/CD 파이프라인 자동화

GitHub Actions로 시작하는 완벽한 CI/CD 파이프라인 자동화

수동 배포의 악몽에서 벗어나기

"자, 이제 코딩 끝! 서버에 접속해서 git pull 받고, 의존성 다시 설치하고, 빌드하고, 기존 프로세스 죽이고, 새 프로세스 띄우자."

프로젝트 초기에는 이러한 수동 배포 과정이 크게 번거롭지 않을 수 있습니다. 하지만 서비스가 커지고 팀원이 늘어나면서 하루에도 수십 번씩 코드가 통합되고 배포되어야 한다면 어떨까요? 사람이 매번 수동으로 테스트하고 서버에 접속하여 스크립트를 치는 과정은 필연적으로 **휴먼 에러(실수)**를 유발하며, 개발자가 온전히 개발에만 집중할 수 없게 만듭니다.

이러한 문제를 해결하고 개발 주기를 자동화하여 생산성을 극대화하는 실천 방법론이 바로 **CI/CD(지속적 통합 / 지속적 배포)**입니다. 그리고 이 CI/CD를 가장 쉽고 강력하게 구축할 수 있는 도구 중 하나가 GitHub Actions입니다.

CI/CD란 무엇인가?

CI (Continuous Integration - 지속적 통합)

여러 개발자가 작성한 코드를 중앙 리포지토리(예: GitHub의 main 브랜치)에 정기적으로, 그리고 자주 통합하는 것을 의미합니다. 성공적인 CI의 핵심은 코드가 병합될 때마다 자동화된 빌드와 테스트가 실행되어, 새로운 코드가 기존 시스템을 망가뜨리지 않았는지(Regression) 즉각적으로 검증하는 것입니다.

CD (Continuous Delivery/Deployment - 지속적 제공/배포)

CI를 통과한, 즉 검증이 완료된 코드를 실제 프로덕션 환경(서버)이나 스테이징 환경에 **자동으로 릴리즈(배포)**하는 과정입니다. 사용자는 개발자가 푸시한 최신 기능을 별도의 긴 대기 시간 없이 거의 실시간으로 만나볼 수 있게 됩니다.

왜 GitHub Actions 인가?

과거에는 CI/CD를 구축하기 위해 Jenkins, Travis CI, CircleCI 등 별도의 외부 서비스를 연동하고 복잡한 서버 설정을 거쳐야 했습니다. 하지만 GitHub Actions의 등장으로 생태계가 크게 변했습니다.

  1. 완벽한 통합: 코드가 저장된 GitHub 리포지토리 내에서 바로 동작하므로 별도의 서비스 가입이나 연동 과정이 필요 없습니다.
  2. 이벤트 기반 구동: push, pull request 오픈, 특정 브랜치 병합, 주기적 실행(Cron) 등 GitHub 내의 거의 모든 이벤트 트리거에 맞춰 워크플로우 실행할 수 있습니다.
  3. 방대한 오픈소스 액션: 내가 직접 스크립트를 짜지 않아도, AWS 접속, Docker 빌드, 슬랙 알림 등 수많은 동작들이 GitHub Marketplace에 '액션' 단위로 만들어져 있어 블록 조립하듯 가져다 쓰기만 하면 됩니다.
  4. 넉넉한 무료 할당량: 퍼블릭 리포지토리에서는 무제한 무료이며, 프라이빗 리포지토리도 매월 넉넉한 분량(2,000분)의 실행 시간을 무료로 제공합니다.

GitHub Actions 핵심 개념 잡기

설정 파일을 작성하기 전 알아야 할 4가지 주요 구성 요소입니다.

  • Workflow (워크플로우): 전체 자동화 프로세스를 의미합니다. .github/workflows/ 디렉토리에 YAML 파일(.yml) 형태로 작성됩니다.
  • Event (이벤트): 워크플로우를 실행시키는 방아쇠(Trigger)입니다. (예: main 브랜치에 코드가 push 될 때)
  • Job (작업): 워크플로우 안에서 실행되는 독립적인 작업 단위입니다. 하나의 워크플로우는 여러 개의 Job을 가질 수 있으며, 기본적으로는 병렬로 실행됩니다. (예: test-job, deploy-job)
  • Step (스텝): Job 안에서 순차적으로 실행되는 개별 명령어 단위입니다. 쉘 스크립트를 실행(run)하거나, 누군가 만들어둔 액션을 가져다 사용(uses)할 수 있습니다.

예제: Node.js 프로젝트 테스트 자동화 (CI) 워크플로우

간단한 React나 Node.js 프로젝트에서 코드가 Push될 때마다 자동으로 npm 패키지를 설치하고 테스트 코드를 실행하는 ci.yml 예제입니다.

# .github/workflows/ci.yml
name: Node.js CI

# 언제 실행될 것인가? (Event)
on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build-and-test:
    # 어떤 환경(OS)에서 실행할 것인가?
    runs-on: ubuntu-latest

    steps:
    # 1. 현재 리포지토리의 코드를 가상 환경으로 가져옵니다. (Checkout)
    - name: Checkout repository
      uses: actions/checkout@v3

    # 2. Node.js 환경을 세팅합니다.
    - name: Setup Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '18.x'
        cache: 'npm' # npm 캐싱을 통해 다음 빌드 속도를 단축합니다.

    # 3. 의존성 패키지 설치
    - name: Install dependencies
      run: npm ci

    # 4. 린트(Lint) 검사 및 테스트 실행
    - name: Run lint and tests
      run: |
        npm run lint
        npm run test

마무리

위의 YAML 코드를 프로젝트 최상위 폴더의 .github/workflows/ 안에 저장하고 커밋하여 Push해 보세요. GitHub 리포지토리의 'Actions' 탭으로 이동하면 워크플로우가 빙글빙글 돌며 우분투 가상 환경에서 당신의 코드를 열심히 테스트하고 있는 마법 같은 광경을 볼 수 있습니다.

CI가 완벽하게 구축되었다면, 다음 단계는 이 코드를 AWS EC2나 Vercel과 같은 서버로 전송하는 배포(CD) 파이프라인을 추가하는 것입니다. GitHub Actions를 통해 지루하고 반복적인 수작업에서 벗어나, 창조적인 코드 작성에 더 많은 시간을 투자해 보시기 바랍니다!

Related Post

도커(Docker) 완벽 가이드: 초보자를 위한 컨테이너 기술 입문 및 활용법

도커(Docker) 완벽 가이드: 초보자를 위한 컨테이너 기술 입문 및 활용법

도커(Docker)란 무엇인가? 최근 몇 년간 소프트웨어 개발과 배포 환경에서 가장 혁신적인 변화를 이끌어낸 기술 중 하나가 바로 '도커(Docker)'입니다. 도커는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다. 도커는 소프트웨어를 '컨테이너(Container)'라는 표준화된 유닛으로 패키징하며, 이 컨테이너에

쿠버네티스(Kubernetes) 완벽 이해: 도커를 넘어선 컨테이너 오케스트레이션

쿠버네티스(Kubernetes) 완벽 이해: 도커를 넘어선 컨테이너 오케스트레이션

쿠버네티스(Kubernetes)란 무엇인가? 도커(Docker)가 단일 컨테이너의 생성과 관리를 혁신했다면, 쿠버네티스(Kubernetes, 줄여서 k8s)는 수십, 수백 개의 컨테이너를 대규모로 배포, 확장, 관리하는 과정을 자동화해주는 '컨테이너 오케스트레이션(Container Orchestration)' 도구입니다. 구글(Google)에서 자

Git 브랜치 전략 완벽 가이드: Git Flow부터 GitHub Flow까지

Git 브랜치 전략 완벽 가이드: Git Flow부터 GitHub Flow까지

협업의 필수품, Git 브랜치 전략 소프트웨어 개발 프로젝트에서 여러 명의 개발자가 동시에 코드를 작성하다 보면 필연적으로 충돌과 혼란이 발생합니다. "누가 언제 이 코드를 수정했지?", "배포 나갈 안정적인 버전은 어디에 있지?" 이러한 문제를 해결하기 위해 필수적으로 사용하는 도구가 바로 Git(깃)입니다. Git의 강력한 기능 중 하나는 바

React vs Vue.js: 2024년 프론트엔드 프레임워크 선택 가이드

React vs Vue.js: 2024년 프론트엔드 프레임워크 선택 가이드

프론트엔드 전쟁, 당신의 선택은? 웹 개발에 조금이라도 관심이 있다면 'React(리액트)'와 'Vue.js(뷰)'라는 이름을 한 번쯤은 들어보셨을 것입니다. jQuery 시대가 저물고 모던 웹 애플리케이션(SPA) 시대가 도래하면서, 이 두 라이브러리/프레임워크는 전 세계 프론트엔드 생태계를 양분하며 치열하게 경쟁하고 있습니다. 새로운 프로젝트

웹 사이트 성능 최적화 전략: 로딩 속도가 비즈니스에 미치는 영향

웹 사이트 성능 최적화 전략: 로딩 속도가 비즈니스에 미치는 영향

로딩 속도 1초의 나비효과 "빨리빨리" 민족인 한국인들뿐만 아니라, 전 세계 인터넷 사용자들의 인내심은 갈수록 짧아지고 있습니다. 아마존(Amazon)의 한 연구 결과에 따르면, 웹사이트 로딩 시간이 100ms(0.1초) 지연될 때마다 판매량이 1% 감소한다고 합니다. 구글(Google) 역시 페이지 로딩 시간이 1초에서 3초로 늘어나면 사

파이썬 데이터 분석 기초: Pandas(판다스) 핵심 기능 마스터하기

파이썬 데이터 분석 기초: Pandas(판다스) 핵심 기능 마스터하기

파이썬 데이터 생태계의 엑셀, Pandas 데이터 과학(Data Science)이나 머신러닝 분야에서 파이썬(Python)이 압도적인 1위 언어로 자리 잡을 수 있었던 이유는 무엇일까요? 바로 데이터를 다루는 데 특화된 훌륭한 라이브러리 생태계 덕분입니다. 그 생태계의 가장 중심에 서 있는 핵심 라이브러리가 바로 **Pandas(판다스)**입니다.

AWS EC2 입문: 나만의 첫 클라우드 서버 구축하기

AWS EC2 입문: 나만의 첫 클라우드 서버 구축하기

나만의 서버가 필요해! 프로그래밍을 공부하고 첫 웹 애플리케이션을 만들었을 때의 기쁨은 이루 말할 수 없습니다. 하지만 내 컴퓨터의 로컬 호스트(localhost:3000)에서만 작동한다면 반쪽짜리 완성에 불과하겠죠. 전 세계 누구나 접속할 수 있도록 하려면 항상 켜져 있고 인터넷에 연결된 컴퓨터, 즉 **서버(Server)**가 필요합니다. 과

TypeScript 101: 자바스크립트에 '안전벨트' 채우기

TypeScript 101: 자바스크립트에 '안전벨트' 채우기

자바스크립트의 배신 자바스크립트(JavaScript)는 세상에서 가장 널리 쓰이는 언어이자, 매우 유연하고 작성하기 쉬운 언어입니다. 하지만 프로젝트 규모가 커지고 복잡해질수록 그 '유연함'은 종종 개발자의 발목을 잡는 치명적인 독이 되곤 합니다. function addNumbers(a, b) { return a +

백엔드 개발자를 위한 필수 리눅스(Linux) 터미널 명령어 총정리

백엔드 개발자를 위한 필수 리눅스(Linux) 터미널 명령어 총정리

마우스를 버리고 키보드와 친해지기 윈도우(Windows)나 맥(macOS)의 화려한 GUI(그래픽 유저 인터페이스) 환경에 익숙한 상태에서, 처음 AWS EC2 같은 원격 서버에 접속하면 까만 화면에 하얀 글씨만 깜빡이는 터미널 환경(CLI)에 당황하기 십상입니다. 전 세계 웹 서버의 압도적인 다수는 리눅스(Linux) 운영체제로 구동됩니다. 서

생성형 AI 시대, 개발자 프롬프트 엔지니어링 실전 가이드

생성형 AI 시대, 개발자 프롬프트 엔지니어링 실전 가이드

서론: 왜 개발자에게 프롬프트 엔지니어링이 필요한가? 생성형 AI가 코드를 작성하고 버그를 수정하는 시대, 개발자의 역할은 단순히 코드를 '타이핑'하는 것에서 AI와 협업하여 문제를 '설계하고 해결'하는 방향으로 빠르게 진화하고 있습니다. 여기서 가장 중요한 역량으로 떠오른 것이 바로 프롬프트 엔지니어링(Prompt Engineering)

2024년 프론트엔드 생태계 트렌드: 무엇을 배우고 준비해야 할까?

2024년 프론트엔드 생태계 트렌드: 무엇을 배우고 준비해야 할까?

서론: 끊임없이 변화하는 프론트엔드 생태계 웹 개발 분야 중에서도 프론트엔드 생태계는 그 변화의 속도가 눈부시게 빠른 곳입니다. "어제 배운 기술이 오늘 레거시가 된다"는 우스갯소리가 있을 정도로 새로운 프레임워크와 도구들이 끊임없이 쏟아져 나옵니다. 2024년 현재 프론트엔드 개발 트렌드는 단연 **'서버 중심의 렌더링(Server-Side Re

플랫폼 엔지니어링(Platform Engineering): DevOps의 다음 진화 단계

플랫폼 엔지니어링(Platform Engineering): DevOps의 다음 진화 단계

서론: "You build it, you run it"의 역설 아마존의 CTO 베르너 보겔스의 명언 "You build it, you run it"으로 대변되는 DevOps 문화는 개발팀이 서비스의 설계부터 배포, 운영까지 책임짐으로써 출시 속도(Agility)를 높이는 데 크게 기여했습니다. 하지만 클라우드 네이티브 생태계가 극도로 복잡해진 20

클라우드 네이티브 아키텍처 핵심 가이드: MSA부터 쿠버네티스까지

클라우드 네이티브 아키텍처 핵심 가이드: MSA부터 쿠버네티스까지

서론: 왜 모두가 '클라우드 네이티브'를 외칠까? 과거의 IT 환경에서는 서버 장비를 직접 구매하고(On-Premise), 그 위에 거대한 하나의 애플리케이션(Monolithic)을 통째로 올려서 운영했습니다. 하지만 넷플릭스, 아마존, 토스나 배달의민족과 같이 하루에도 수십 번씩 새로운 기능을 배포하고, 트래픽이 폭주해도 끄떡없이 서비스를 유지해

자율형 AI 에이전트(Autonomous AI Agents): 챗봇을 넘어 스스로 '행동'하는 인공지능의 시대

자율형 AI 에이전트(Autonomous AI Agents): 챗봇을 넘어 스스로 '행동'하는 인공지능의 시대

서론: '답변'하는 AI에서 스스로 '행동'하는 AI로 지난 몇 년간 우리가 인공지능(AI)과 상호작용하는 방식은 철저히 대화형(Conversational)이었습니다. 챗GPT(ChatGPT)에 프롬프트를 입력하면 텍스트나 코드를 생성해 주고, 질문을 던지면 답을 줍니다. 하지만 이 단계의 AI는 수동적입니다. 매 단계마다 인간의 지시를 기다려야만

AI 지원 소프트웨어 엔지니어링: 코딩의 규칙이 완전히 다시 쓰여지다

AI 지원 소프트웨어 엔지니어링: 코딩의 규칙이 완전히 다시 쓰여지다

서론: '인간 타자기(Human Typewriter)' 시대의 종말 수십 년 동안 소프트웨어 엔지니어의 전형적인 이미지는 어두운 모니터 앞에서 키보드에 몸을 구부린 채 수천 줄의 구문(Syntax)을 수동으로 입력하고, 빠진 세미콜론(;) 하나를 찾기 위해 밤을 새우며, 스택오버플로우(Stack Overflow)에서 알 수 없는 에러 메시지를 해독