Jekyll Private
프라이빗/퍼블릭 레포지토리 분리로 안전한 블로그 운영하기
블로그를 만들어놓고 보니 한 가지 고민이 생겼습니다. Jekyll 소스 파일들을 모두 공개 레포지토리에 올려둬야 하는데, 개인적인 설정이나 초안, 민감한 정보들까지 모두 공개되는 게 마음에 걸렸어요. GitHub Pages는 계속 사용하고 싶고, 다른 호스팅 서비스로 옮기고 싶지도 않고…
그래서 프라이빗 레포지토리에서 개발하고 퍼블릭 레포지토리로 자동 배포하는 시스템을 구축했습니다!
문제 상황과 해결 전략
기존 방식의 문제점
일반적인 Jekyll + GitHub Pages 사용 방식:
username/username.github.io (Public Repository)
├── _posts/ # 포스트들이 모두 공개
├── _drafts/ # 초안까지 공개
├── _config.yml # 개인 설정 공개
├── Gemfile # 의존성 정보 공개
└── ... # 모든 소스 코드 공개
문제점들:
- 초안이나 개인적인 메모도 모두 공개
- API 키나 개인 설정이 노출될 수 있음
- 실험적인 코드나 임시 파일들도 공개
- 개발 과정이 모두 노출되어 부담스러움
해결 전략
이중 레포지토리 시스템을 구축해서 개발과 배포를 분리합니다:
[Private] blog-source → [Public] username.github.io
├── 소스 파일들 ├── 빌드된 HTML 파일들
├── 초안과 메모 ├── CSS, JS 파일들
├── 개인 설정 ├── 이미지 파일들
└── GitHub Actions └── 배포용 파일들만
1단계: 프라이빗 소스 레포지토리 생성
레포지토리 구조 설계
먼저 프라이빗 레포지토리를 만들고 Jekyll 소스를 모두 옮겨둡니다:
blog-source/ (Private Repository)
├── _posts/ # 발행된 포스트
├── _drafts/ # 초안 (비공개)
├── _private/ # 개인 메모, 아이디어
│ ├── ideas.md
│ ├── todo.md
│ └── private-notes/
├── _config.yml # 개인 설정
├── _config-production.yml # 배포용 설정 (분리)
├── .github/
│ └── workflows/
│ └── deploy.yml # 자동 배포 스크립트
├── .gitignore
├── Gemfile
└── README.md
배포용 설정 파일 분리
개인 설정과 배포용 설정을 분리해서 관리합니다:
# _config.yml (개발용 - 프라이빗)
title: "개발자 블로그"
email: my-private-email@example.com
description: "Jekyll과 GitHub Pages로 만든 블로그"
# 개발 환경 설정
url: "http://localhost:4000"
baseurl: ""
# 개인 설정들
author:
name: "내 이름"
email: "private@email.com"
social:
github: "my-username"
# 비공개 플러그인이나 설정
plugins:
- jekyll-admin # 로컬에서만 사용
- jekyll-compose
# 개발용 컬렉션
collections:
drafts:
output: true
private:
output: false # 비공개 컬렉션
# _config-production.yml (배포용 - 퍼블릭으로 복사됨)
title: "개발자 블로그"
description: "Jekyll과 GitHub Pages로 만한 블로그"
# 프로덕션 환경 설정
url: "https://username.github.io"
baseurl: ""
# 최소한의 공개 정보만
author:
name: "블로거"
# 배포용 플러그인만
plugins:
- jekyll-feed
- jekyll-sitemap
- jekyll-seo-tag
# 비공개 컬렉션 제외
exclude:
- _private/
- _drafts/
- Gemfile
- Gemfile.lock
- node_modules/
- .sass-cache/
2단계: GitHub Actions 워크플로우 구성
프라이빗 레포지토리에 push하면 자동으로 빌드하고 퍼블릭 레포지토리에 배포하는 스크립트를 만듭니다.
Personal Access Token 생성
- GitHub Settings → Developer settings → Personal access tokens
- “Generate new token” 클릭
- 필요한 권한 선택:
repo
(전체 레포지토리 권한)workflow
(GitHub Actions 권한)
- 생성된 토큰을 복사해서 보관
레포지토리 시크릿 설정
프라이빗 레포지토리의 Settings → Secrets and variables → Actions에서:
DEPLOY_TOKEN
: 위에서 생성한 Personal Access TokenTARGET_REPO
: 배포할 퍼블릭 레포지토리 (예:username/username.github.io
)
GitHub Actions 워크플로우 작성
# .github/workflows/deploy.yml
name: Build and Deploy to GitHub Pages
on:
push:
branches: [main]
workflow_dispatch:
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: 📥 소스 코드 체크아웃
uses: actions/checkout@v4
with:
fetch-depth: 0 # 전체 히스토리 가져오기
- name: 💎 Ruby 환경 설정
uses: ruby/setup-ruby@v1
with:
ruby-version: "3.1"
bundler-cache: true
- name: 📦 의존성 설치
run: |
bundle install
- name: 🔧 Jekyll 빌드 (배포용 설정 사용)
run: |
# 배포용 설정으로 빌드
bundle exec jekyll build --config _config.yml,_config-production.yml
# 빌드 결과 확인
echo "빌드 완료. 파일 목록:"
ls -la _site/
- name: 🚀 퍼블릭 레포지토리에 배포
uses: peaceiris/actions-gh-pages@v3
with:
personal_token: $
external_repository: $
publish_branch: main
publish_dir: ./_site
commit_message: "Deploy: $"
user_name: "github-actions[bot]"
user_email: "github-actions[bot]@users.noreply.github.com"
- name: ✅ 배포 완료 알림
run: |
echo "🎉 배포가 완료되었습니다!"
echo "블로그 주소: https://username.github.io"
echo "커밋 메시지: $"
고급 워크플로우 (선택사항)
더 세밀한 제어가 필요한 경우:
# .github/workflows/deploy-advanced.yml
name: Advanced Build and Deploy
on:
push:
branches: [main]
paths-ignore:
- "README.md"
- "_private/**"
schedule:
- cron: "0 0 * * 0" # 매주 일요일 자동 빌드
jobs:
build-and-deploy:
runs-on: ubuntu-latest
env:
JEKYLL_ENV: production
steps:
- name: 📥 체크아웃
uses: actions/checkout@v4
- name: 💎 Ruby 설정
uses: ruby/setup-ruby@v1
with:
ruby-version: "3.1"
bundler-cache: true
- name: 🔍 변경된 파일 확인
id: changes
run: |
if git diff --name-only $ $ | grep -E '\.(md|html|yml|css|scss|js)$'; then
echo "content_changed=true" >> $GITHUB_OUTPUT
else
echo "content_changed=false" >> $GITHUB_OUTPUT
fi
- name: 📦 의존성 설치 및 업데이트
run: |
bundle install
bundle update
- name: 🧹 빌드 전 정리
run: |
# 이전 빌드 결과 제거
rm -rf _site
# 임시 파일 정리
find . -name ".DS_Store" -delete
find . -name "Thumbs.db" -delete
- name: 🔧 Jekyll 빌드
run: |
# 배포용 설정으로 빌드
bundle exec jekyll build \
--config _config.yml,_config-production.yml \
--verbose \
--trace
# 빌드 검증
if [ ! -f "_site/index.html" ]; then
echo "❌ 빌드 실패: index.html이 생성되지 않았습니다."
exit 1
fi
echo "✅ 빌드 성공!"
- name: 🔍 빌드 결과 검증
run: |
echo "📊 빌드 결과 통계:"
echo "- HTML 파일: $(find _site -name "*.html" | wc -l)개"
echo "- CSS 파일: $(find _site -name "*.css" | wc -l)개"
echo "- JS 파일: $(find _site -name "*.js" | wc -l)개"
echo "- 이미지 파일: $(find _site -type f \( -name "*.jpg" -o -name "*.png" -o -name "*.gif" \) | wc -l)개"
echo "- 전체 크기: $(du -sh _site | cut -f1)"
- name: 🚀 배포
if: steps.changes.outputs.content_changed == 'true'
uses: peaceiris/actions-gh-pages@v3
with:
personal_token: $
external_repository: $
publish_branch: main
publish_dir: ./_site
commit_message: |
Deploy: $
- Build time: $
- Commit: $
user_name: "github-actions[bot]"
user_email: "github-actions[bot]@users.noreply.github.com"
force_orphan: true # 히스토리 정리
- name: 📧 배포 결과 알림 (선택사항)
if: always()
run: |
if [ $ == 'success' ]; then
echo "✅ 배포 성공!"
echo "🌐 블로그: https://username.github.io"
else
echo "❌ 배포 실패!"
fi
3단계: 퍼블릭 레포지토리 설정
배포 대상인 퍼블릭 레포지토리는 간단히 설정합니다:
username.github.io/ (Public Repository)
├── index.html # 빌드된 파일들만
├── assets/
├── posts/
├── about/
└── ... # 소스 코드는 없음
README.md 작성
퍼블릭 레포지토리의 README.md:
# 개발자 블로그
이 레포지토리는 Jekyll로 빌드된 정적 사이트입니다.
## 📖 블로그 주소
https://username.github.io
## 🔧 기술 스택
- Jekyll (Static Site Generator)
- GitHub Pages (Hosting)
- GitHub Actions (CI/CD)
## 📝 포스트 작성
이 레포지토리는 자동 배포된 결과물입니다.
포스트 작성이나 수정은 프라이빗 소스 레포지토리에서 진행됩니다.
## 🤝 기여하기
오타나 오류를 발견하시면 이슈로 알려주세요!
---
⚡ Powered by Jekyll & GitHub Actions
4단계: 워크플로우 테스트 및 최적화
로컬에서 배포 테스트
# 프라이빗 레포지토리에서
git clone https://github.com/username/blog-source.git
cd blog-source
# 의존성 설치
bundle install
# 로컬 빌드 테스트
bundle exec jekyll build --config _config.yml,_config-production.yml
# 빌드 결과 확인
ls -la _site/
# GitHub에 푸시해서 자동 배포 테스트
git add .
git commit -m "feat: 자동 배포 시스템 테스트"
git push origin main
배포 상태 모니터링
GitHub Actions 탭에서 배포 진행 상황을 실시간으로 확인할 수 있습니다:
- 빌드 로그 확인: 각 단계별 실행 결과
- 오류 디버깅: 실패 시 상세 오류 메시지
- 배포 시간 측정: 성능 최적화 참고
이점과 주의사항
이 시스템의 장점
- 개인정보 보호: 소스 코드와 개인 설정 비공개
- 자유로운 실험: 실험적 코드나 초안 안전하게 관리
- 자동화: 푸시만 하면 자동 빌드 및 배포
- 버전 관리: 소스와 배포본 분리된 히스토리 관리
- 유연성: 배포 전 추가 처리나 검증 가능
주의사항
- 토큰 관리: Personal Access Token 보안 주의
- 빌드 시간: GitHub Actions 사용 한도 고려
- 디버깅: 빌드 실패 시 로그 확인 필요
- 동기화: 두 레포지토리 간 일관성 유지
다음 단계
이제 안전하고 효율적인 블로그 배포 시스템이 완성되었습니다!
다음으로 고려할 수 있는 개선사항들:
- CDN 연결로 성능 최적화
- 자동 SEO 검증 추가
- 배포 실패 시 알림 시스템
- 다중 환경 배포 (스테이징/프로덕션)
프라이빗/퍼블릭 분리 시스템으로 마음 편히 블로그를 운영해보세요. 궁금한 점이나 개선 아이디어가 있다면 댓글로 공유해 주세요!
참고 자료: