🔧 DevOps

GitHub

깃허브

세계 최대 코드 호스팅 플랫폼. GitHub Actions으로 CI/CD 제공.

상세 설명

GitHub는 Git 저장소를 호스팅하고 협업 기능을 제공하는 세계 최대의 코드 호스팅 플랫폼입니다. 2008년에 설립되어 2018년 Microsoft에 인수되었으며, 전 세계 1억 명 이상의 개발자가 사용합니다. 오픈소스 프로젝트의 중심지이자 현대 소프트웨어 개발의 핵심 도구입니다.

핵심 기능

  • Git 저장소 호스팅: 공개/비공개 저장소 무제한 제공
  • Pull Request: 코드 리뷰와 병합 워크플로우
  • GitHub Actions: 내장 CI/CD 파이프라인
  • Issues & Projects: 이슈 트래킹과 프로젝트 관리
  • GitHub Copilot: AI 기반 코드 자동완성
  • GitHub Pages: 정적 웹사이트 호스팅
  • GitHub Packages: 패키지 레지스트리(npm, Docker 등)

GitHub 협업 워크플로우

  • Fork: 다른 저장소의 복사본을 내 계정에 생성
  • Clone: 로컬에 저장소 복사
  • Branch: 기능 브랜치 생성
  • Commit & Push: 변경사항 커밋 및 원격에 푸시
  • Pull Request: 병합 요청 및 코드 리뷰
  • Merge: 승인 후 메인 브랜치에 병합

코드 예제

GitHub Actions - CI/CD 워크플로우

# .github/workflows/ci.yml
name: CI Pipeline

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

env:
  NODE_VERSION: '20'

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ env.NODE_VERSION }}
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run linter
        run: npm run lint

      - name: Run tests
        run: npm test -- --coverage

      - name: Upload coverage
        uses: codecov/codecov-action@v3
        with:
          token: ${{ secrets.CODECOV_TOKEN }}

  build:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ env.NODE_VERSION }}
          cache: 'npm'

      - run: npm ci
      - run: npm run build

      - name: Upload build artifacts
        uses: actions/upload-artifact@v4
        with:
          name: build
          path: dist/

  deploy:
    needs: build
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    environment: production
    steps:
      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          name: build
          path: dist

      - name: Deploy to production
        run: |
          # 배포 스크립트
          echo "Deploying to production..."

Docker 이미지 빌드 및 푸시

# .github/workflows/docker.yml
name: Docker Build & Push

on:
  push:
    tags: ['v*']

jobs:
  docker:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write

    steps:
      - uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ghcr.io/${{ github.repository }}
          tags: |
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}

      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

자동 릴리스 생성

# .github/workflows/release.yml
name: Release

on:
  push:
    tags: ['v*']

jobs:
  release:
    runs-on: ubuntu-latest
    permissions:
      contents: write

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Generate changelog
        id: changelog
        uses: orhun/git-cliff-action@v2
        with:
          config: cliff.toml
          args: --latest --strip header

      - name: Create Release
        uses: softprops/action-gh-release@v1
        with:
          body: ${{ steps.changelog.outputs.content }}
          draft: false
          prerelease: ${{ contains(github.ref, 'alpha') || contains(github.ref, 'beta') }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Pull Request 템플릿

<!-- .github/PULL_REQUEST_TEMPLATE.md -->
## 변경 사항
-

## 관련 이슈
Closes #

## 체크리스트
- [ ] 테스트 코드 작성
- [ ] 문서 업데이트
- [ ] 로컬에서 테스트 완료

## 스크린샷 (UI 변경 시)

실무 대화 예제

주니어 개발자
"Jenkins 파이프라인 관리가 힘든데, GitHub Actions로 옮기면 어떤 점이 좋아요?"
시니어 개발자
"GitHub Actions는 저장소와 완전히 통합되어 있어서 별도 서버 관리가 필요 없어요. YAML로 워크플로우를 정의하고 저장소에 같이 커밋하니까 버전 관리도 되고요. 무엇보다 Marketplace에 수천 개의 재사용 가능한 Action이 있어서 대부분의 작업을 몇 줄로 끝낼 수 있어요."
주니어 개발자
"비용은 어떤가요? 무료로 사용할 수 있나요?"
시니어 개발자
"공개 저장소는 무료이고, 비공개 저장소도 월 2,000분(Free 플랜)까지 무료예요. 그 이상이면 유료 플랜이 필요하지만, 대부분의 중소 프로젝트는 무료 범위에서 충분해요. Self-hosted runner를 쓰면 무제한 무료이고요."

주의사항

Secrets 관리

API 키, 비밀번호를 코드에 직접 작성하지 마세요. GitHub Secrets에 저장하고 `${{ secrets.SECRET_NAME }}`으로 참조하세요.

Branch Protection

main 브랜치에 직접 푸시를 방지하려면 Branch protection rules를 설정하세요. 필수 리뷰어, 상태 체크 통과 등을 강제할 수 있습니다.

Actions 실행 시간

GitHub Actions는 실행 시간에 따라 요금이 청구됩니다. 불필요한 트리거를 줄이고, 캐싱을 활용하세요.

공개 저장소 주의

공개 저장소의 Actions 로그는 누구나 볼 수 있습니다. 민감한 정보가 로그에 출력되지 않도록 주의하세요.

더 배우기