선택 심화수업 후 자습

재사용과 팀 도입

두 회차에서 만든 구조를 다음 프로젝트와 팀 전체에 쓰려면 세 가지가 더 필요하다. 오래 유지할 기준을 둘 문서 위치, 사람이 반복하던 작업을 대신하는 자동화, 같은 형식으로 시작하게 하는 양식이다. 이 페이지는 도입 순서와 각 단계에서 먼저 확인할 점을 정리하고, 수업에서 웹으로 처리한 작업의 CLI 방법을 덧붙인다.

위키와 docs 폴더

위키(Wiki) 또는 저장소의 docs/ 폴더에는 오래 유지할 기준을 둔다. 업무 상태는 이슈와 Project에만 두고 위키에 다시 적지 않는다.

문서내용
Product brief제품 목표, 대상 사용자, 출시 목표
Scope마일스톤별 포함·제외 범위
Working agreementsStatus 네 단계, 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본문 파일과 등록 스크립트다시 실행해도 중복 없이 기존 업무를 보존하는가
2Project 기본 워크플로(Workflows)이슈 종료·재개와 Status가 의도대로 연결되는가
3조건에 맞는 이슈 자동 추가(Auto-add)저장소와 라벨 필터가 실제 업무만 고르는가
4Project 템플릿, 이슈 양식, PR 양식다음 프로젝트를 같은 규칙으로 시작할 수 있는가
5GitHub 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로 닫는다이슈 하나에 구현과 검증이 함께 남는다

PR과 이슈 연결

주간 리포트 자동 게시

사전 리포트를 매주 같은 시각에 운영 이슈에 올리려면 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 라벨과 같은 기능이 아니다.
Discussionsgh discussion create결론이 정해지지 않은 의사결정 토론. 결론에서 나온 실행 업무는 담당자가 있는 이슈로 연결한다.
InsightsProject 화면의 InsightsStatus 분포와 시간에 따른 변화. 보관하거나 삭제한 항목은 추적되지 않을 수 있으므로 시작·종료 기록을 따로 유지한다.
Project 복사gh project copy 번호 --source-owner 나 --target-owner 조직 --title 새이름표준 필드와 보기를 다음 프로젝트에 재사용할 때. 항목(이슈)은 복사되지 않는다.
여러 저장소의 PRgh search prs --owner 조직 --merged-at ">=2026-10-08"저장소가 여러 개인 팀의 주간 병합 목록
나에게 온 요청gh status내게 할당된 이슈, 리뷰 요청, 멘션을 저장소 구분 없이 확인

이슈 편집, Discussion 생성, Insights, Project 복사

팀에 적용하는 순서

  1. 첫 프로젝트는 저장소 하나, Project 하나, Status 네 단계, Priority 세 등급으로 시작한다.
  2. 첫 스프린트 회고에서 실제로 조회한 정보와 한 번도 쓰지 않은 필드를 구분해 정리한다. 쓰지 않은 필드는 지운다.
  3. PR 연결 규칙(제목의 업무 키, 본문의 Closes 또는 Refs)을 개발 담당과 합의하고 PR 양식을 설치한다.
  4. 사전 리포트를 두 스프린트 동안 수동으로 만들고, 리포트의 절 중 회의에서 실제로 쓴 절만 남긴다.
  5. 다음 프로젝트에서 키트의 backlog.tsv와 양식을 재사용한 뒤, 여러 저장소 통합과 정기 리포트 자동화로 확장한다.
  6. 3회차의 지표(EVM, 확률 예측)는 Estimate와 Actual 기록 규칙을 두 스프린트 동안 지킨 뒤에 도입한다. 기록이 빠진 상태의 지표는 실제와 다른 결론을 낸다.