위키와 docs 폴더
위키(Wiki) 또는 저장소의 docs/ 폴더에는 오래 유지할 기준을 둔다. 업무 상태는 이슈와 Project에만 두고 위키에 다시 적지 않는다.
| 문서 | 내용 |
|---|---|
| Product brief | 제품 목표, 대상 사용자, 출시 목표 |
| Scope | 마일스톤별 포함·제외 범위 |
| Working agreements | Status 네 단계, Priority 정의, 막힘 기록 형식, PR 연결 규칙 |
| Definition of done | 완료의 세 조건 |
| Decision log | 운영 이슈의 결정 기록 링크 목록 |
| Sprint index | 스프린트별 운영 이슈 링크 목록 |
무료 플랜(Free)의 비공개 저장소에서는 위키를 쓸 수 없다. 위키는 Free 플랜의 공개 저장소, 또는 Pro·Team·Enterprise 플랜의 비공개 저장소에서 쓸 수 있다. 실습 저장소는 비공개이므로 docs/ 폴더를 기본으로 한다. 실습 9의 docs/signup-policy.md가 이 방식의 예다. 위키 제공 범위
위키를 쓸 수 있는 저장소에서는 웹에서 첫 페이지를 만든 뒤 위키 저장소를 따로 복제해 Markdown 파일로 편집할 수 있다. 파일 이름이 페이지 제목이 되고, 기본 브랜치에 push한 변경이 독자에게 보인다.
gh auth setup-git git clone "https://github.com/$PM_REPO.wiki.git" launchpad-wiki
양식 설치
실습 키트의 업무 양식과 PR 양식을 저장소의 .github/ 폴더에 두면, 웹의 New issue 화면에 “업무” 양식이 나타나고 새 PR 본문에 연결 업무 칸이 채워진다. 실습 9에서 복제한 폴더를 쓴다.
cd ~/gh-pm-lab/launchpad-pm-lab git switch main git pull mkdir -p .github/ISSUE_TEMPLATE cp ../github-pm-starter-kit/templates/ISSUE_TEMPLATE/task.yml .github/ISSUE_TEMPLATE/ cp ../github-pm-starter-kit/templates/pull_request_template.md .github/ git add .github git commit -m "chore: 업무 양식과 PR 양식 추가" git push cd ..
개인 실습 저장소라서 기본 브랜치에 바로 push한다. 팀 저장소는 기본 브랜치 보호 규칙이 있는 경우가 많으므로 브랜치와 PR로 올린다. 저장소 템플릿(Repository template)과 Project 템플릿은 별개의 기능이다. 저장소를 복제해도 이슈와 Project 운영 구조는 복제되지 않는다.
순서대로 도입할 자동화
| 단계 | 기능 | 먼저 확인할 점 |
|---|---|---|
| 1 | 본문 파일과 등록 스크립트 | 다시 실행해도 중복 없이 기존 업무를 보존하는가 |
| 2 | Project 기본 워크플로(Workflows) | 이슈 종료·재개와 Status가 의도대로 연결되는가 |
| 3 | 조건에 맞는 이슈 자동 추가(Auto-add) | 저장소와 라벨 필터가 실제 업무만 고르는가 |
| 4 | Project 템플릿, 이슈 양식, PR 양식 | 다음 프로젝트를 같은 규칙으로 시작할 수 있는가 |
| 5 | GitHub Actions와 API | 주간 리포트 작성처럼 반복 비용이 충분히 큰가 |
Project의 Workflows 메뉴에서 “Item closed”일 때 Done으로 바꾸는 규칙 등을 켜고 끌 수 있다. 켠 뒤에는 샘플 이슈 하나를 닫아 실제로 바뀌는지 확인한다. 자동 추가 규칙은 규칙을 켠 뒤에 만들어지거나 갱신된 이슈에만 적용되므로, 그 전부터 있던 이슈는 따로 추가한다. 자동 추가 규칙의 개수는 플랜에 따라 다르다. Project 자동화, 자동 추가
PR 병합과 완료 판정
처음에는 이슈를 자동으로 닫는 규칙보다 조회, 연결, 초기값 설정부터 도입한다. 완료 조건에 병합 이후의 QA가 포함되어 있다면, Closes #번호로 연결한 PR이 병합되는 순간 이슈가 닫혀 QA 전에 완료로 보일 수 있다. 팀 규칙으로 둘 중 하나를 정한다.
| 규칙 | 방법 | 결과 |
|---|---|---|
| QA를 별도 업무로 둔다 | 구현 업무는 Closes로 연결하고, QA 업무(LP-05)는 따로 관리한다 | 구현 완료와 검증 완료가 각각 기록된다 |
| QA 전에는 닫지 않는다 | PR 본문에 Refs #번호를 쓰고, QA 후 gh issue close로 닫는다 | 이슈 하나에 구현과 검증이 함께 남는다 |
주간 리포트 자동 게시
사전 리포트를 매주 같은 시각에 운영 이슈에 올리려면 GitHub Actions를 쓴다. 아래 워크플로는 매주 목요일 09:00(한국 시각)에 실습 키트의 weekly-digest.sh를 실행하고, 저장소 변수 SPRINT_ISSUE에 적힌 운영 이슈 번호에 댓글로 올린다. 키트 폴더가 저장소의 github-pm-starter-kit/에 있다고 가정한 예시다.
name: weekly-digest
on:
schedule:
- cron: "0 0 * * 4" # 매주 목요일 00:00 UTC = 09:00 KST
workflow_dispatch:
permissions:
contents: read
issues: write
pull-requests: read
jobs:
digest:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: 사전 리포트 생성
env:
GH_TOKEN: ${{ github.token }}
run: bash github-pm-starter-kit/weekly-digest.sh "${{ github.repository }}" --days 7 > digest.md
- name: 운영 이슈에 게시
env:
GH_TOKEN: ${{ github.token }}
SPRINT_ISSUE: ${{ vars.SPRINT_ISSUE }}
run: gh issue comment "$SPRINT_ISSUE" -R "${{ github.repository }}" --body-file digest.md
SPRINT_ISSUE는 저장소 Settings → Secrets and variables → Actions → Variables에 운영 이슈 번호로 만든다. 스프린트가 바뀌면 값을 바꾼다.- 워크플로가 받는 기본 토큰(
github.token)은 이 저장소에만 권한이 있고 사용자나 조직의 Project에는 접근하지 못한다. 그래서 위 예시는--project옵션 없이 저장소 절만 만든다. Project 현황까지 넣으려면project권한이 있는 토큰을 저장소 시크릿으로 등록해GH_TOKEN에 넘기는 인증 방식을 따로 설계한다. - 비공개 저장소의 Actions 실행 시간은 플랜의 월간 무료 시간에서 차감된다.
workflow_dispatch가 있으므로 Actions 탭에서 수동으로 한 번 실행해 결과를 먼저 확인한다.
Iteration을 CLI로 배정
Iteration은 이름으로 지정할 수 없고 반복의 ID가 필요하다. ID는 GraphQL API로 조회한다. 사용자 소유 Project 기준이며, 조직 Project는 user(login:)를 organization(login:)으로 바꾼다.
gh api graphql -F number="$PM_PROJECT" -f login="$PM_OWNER" -f query='
query($login: String!, $number: Int!) {
user(login: $login) {
projectV2(number: $number) {
field(name: "Iteration") {
... on ProjectV2IterationField {
configuration { iterations { id title startDate duration } }
}
}
}
}
}' --jq '.data.user.projectV2.field.configuration.iterations[] | "\(.id) \(.title) \(.startDate) \(.duration)일"'
9a1b2c3d Sprint 1 2026-10-12 14일 4e5f6a7b Sprint 2 2026-10-26 14일
출력의 첫 열이 반복 ID다. 끝난 반복은 iterations가 아니라 completedIterations에 들어간다.
gh project item-edit "$PM_PROJECT" --owner "$PM_OWNER" \ --url "$PM_FORM_URL" --field Iteration --iteration-id 4e5f6a7b
그 밖의 심화 기능
| 기능 | 명령 | 쓰는 경우 |
|---|---|---|
| 상위 이슈와 하위 이슈 | gh issue edit 업무번호 --parent 상위번호gh issue edit 상위번호 --add-sub-issue 3,4 | 큰 기능을 하위 업무로 나눌 때. 계층은 목표 이해에 도움이 될 때만 추가한다. |
| 이슈 유형 | gh issue edit 3 --type Task | 조직에 Task, Bug 같은 표준 유형이 정의되어 있을 때. 개인 실습의 kind:task 라벨과 같은 기능이 아니다. |
| Discussions | gh discussion create | 결론이 정해지지 않은 의사결정 토론. 결론에서 나온 실행 업무는 담당자가 있는 이슈로 연결한다. |
| Insights | Project 화면의 Insights | Status 분포와 시간에 따른 변화. 보관하거나 삭제한 항목은 추적되지 않을 수 있으므로 시작·종료 기록을 따로 유지한다. |
| Project 복사 | gh project copy 번호 --source-owner 나 --target-owner 조직 --title 새이름 | 표준 필드와 보기를 다음 프로젝트에 재사용할 때. 항목(이슈)은 복사되지 않는다. |
| 여러 저장소의 PR | gh search prs --owner 조직 --merged-at ">=2026-10-08" | 저장소가 여러 개인 팀의 주간 병합 목록 |
| 나에게 온 요청 | gh status | 내게 할당된 이슈, 리뷰 요청, 멘션을 저장소 구분 없이 확인 |
이슈 편집, Discussion 생성, Insights, Project 복사
팀에 적용하는 순서
- 첫 프로젝트는 저장소 하나, Project 하나, Status 네 단계, Priority 세 등급으로 시작한다.
- 첫 스프린트 회고에서 실제로 조회한 정보와 한 번도 쓰지 않은 필드를 구분해 정리한다. 쓰지 않은 필드는 지운다.
- PR 연결 규칙(제목의 업무 키, 본문의
Closes또는Refs)을 개발 담당과 합의하고 PR 양식을 설치한다. - 사전 리포트를 두 스프린트 동안 수동으로 만들고, 리포트의 절 중 회의에서 실제로 쓴 절만 남긴다.
- 다음 프로젝트에서 키트의
backlog.tsv와 양식을 재사용한 뒤, 여러 저장소 통합과 정기 리포트 자동화로 확장한다. - 3회차의 지표(EVM, 확률 예측)는 Estimate와 Actual 기록 규칙을 두 스프린트 동안 지킨 뒤에 도입한다. 기록이 빠진 상태의 지표는 실제와 다른 결론을 낸다.