이 가이드는 GitHub Actions를 사용하여 TestPyPI 및 PyPI에 자동으로 배포하는 방법을 설명합니다.
**Trusted Publishing (OIDC)**을 사용하면:
- ✅ API 토큰 불필요
- ✅ 보안 강화 (자격 증명 노출 없음)
- ✅ 태그 푸시 시 자동 배포
- ✅ 수동 배포도 가능
- https://test.pypi.org/account/register/ 접속
- 계정 생성 및 이메일 인증
-
TestPyPI 로그인 후 이동: https://test.pypi.org/manage/account/publishing/
-
"Pending publishers" 섹션으로 스크롤
-
"Add a new pending publisher" 클릭
-
다음 정보 입력:
필드 값 PyPI Project Name code-trajectoryOwner SynTaekRepository name code-trajectory-mcpWorkflow name publish.ymlEnvironment name testpypi -
"Add" 버튼 클릭
💡 Pending Publisher란?
아직 존재하지 않는 프로젝트를 위한 사전 승인입니다. 첫 배포 시 자동으로 일반 Publisher로 전환됩니다.
- API 토큰 생성: https://pypi.org/manage/account/token/
- 로컬에서 수동 배포:
uv build uv pip install twine twine upload dist/*
-
PyPI 로그인 후 프로젝트로 이동: https://pypi.org/manage/project/code-trajectory/settings/publishing/
-
"Add a new publisher" 클릭
-
다음 정보 입력:
필드 값 Owner SynTaekRepository name code-trajectory-mcpWorkflow name publish.ymlEnvironment name pypi -
"Add" 버튼 클릭
# Pre-release 태그 생성
git tag v0.1.2-beta.1
git push origin v0.1.2-beta.1
# GitHub에서 Release 생성 (Pre-release 체크)# 정식 릴리스 태그 생성
git tag v0.1.2
git push origin v0.1.2
# GitHub에서 Release 생성 (Pre-release 체크 해제)- GitHub 저장소로 이동
- Actions 탭 클릭
- "Publish to PyPI" 워크플로우 선택
- "Run workflow" 클릭
- 배포 대상 선택:
testpypi- 테스트 환경pypi- 프로덕션 환경
graph LR
A[Git Tag Push] --> B{Release Type?}
B -->|Pre-release| C[TestPyPI]
B -->|Stable| D[PyPI]
E[Manual Trigger] --> F{Target?}
F -->|testpypi| C
F -->|pypi| D
C --> G[Build & Test]
D --> G
G --> H{Tests Pass?}
H -->|Yes| I[Publish]
H -->|No| J[Fail]
워크플로우는 자동으로 다음을 수행합니다:
-
빌드 단계
- ✅ 코드 체크아웃
- ✅ Python 3.14 설치
- ✅ 의존성 설치
- ✅ 테스트 실행 (pytest)
- ✅ 린팅 검사 (ruff, pyrefly)
- ✅ 패키지 빌드
-
배포 단계
- ✅ Trusted Publishing (OIDC) 사용
- ✅ TestPyPI 또는 PyPI에 업로드
- ✅ 자동 버전 관리
- 프로젝트 페이지: https://test.pypi.org/project/code-trajectory/
- 설치 테스트:
uv pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ code-trajectory
- 프로젝트 페이지: https://pypi.org/project/code-trajectory/
- 설치:
pip install code-trajectory # 또는 uv pip install code-trajectory
원인: Pending Publisher가 설정되지 않았거나 정보가 일치하지 않음
해결:
- TestPyPI에서 Pending Publisher 설정 확인
- Workflow name이
publish.yml인지 확인 - Environment name이
testpypi인지 확인
원인: GitHub Environment가 설정되지 않음
해결:
- GitHub 저장소 → Settings → Environments
testpypi및pypienvironment 추가- Protection rules 설정 (선택사항)
원인: 같은 버전을 재업로드하려고 시도
해결:
pyproject.toml에서 버전 번호 증가- 새 태그 생성 및 푸시
- v0.1.0 - 초기 릴리스
- v0.1.1 - 패치 (버그 수정)
- v0.2.0 - 마이너 (기능 추가)
- v1.0.0 - 메이저 (Breaking Changes)
- v0.1.1-alpha.1 - 알파 버전 (TestPyPI)
- v0.1.1-beta.1 - 베타 버전 (TestPyPI)
- v0.1.1-rc.1 - Release Candidate (TestPyPI)
✅ Trusted Publishing 사용 (추천)
- API 토큰 불필요
- OIDC 기반 인증
- GitHub Actions에 내장
❌ API 토큰 사용 (레거시)
- GitHub Secrets에 저장 필요
- 주기적인 갱신 필요
- 보안 위험 증가