아래는 이 실습의 핵심 명령을 실행한 화면을 재현한 것이다. 화면이 보이면 자동으로 재생되고, 오른쪽 위 버튼으로 다시 볼 수 있다.
cd ~/gh-pm-lab source pm-lab/env.sh echo "$PM_REPO / Project $PM_PROJECT"
1등록할 업무 목록
키트의 backlog.tsv는 업무 하나를 한 줄로 적은 표다. 열은 탭으로 구분한다. LP-01은 실습 3에서 이미 만들었으므로 제목이 같으면 새로 만들지 않고 기존 이슈를 쓴다.
| 키 | 제목 | 영역 | Priority | 예시 스프린트 |
|---|---|---|---|---|
| LP-01 | 사전신청 정책을 확정한다 | product | P0 | Sprint 1 |
| LP-02 | 랜딩 페이지에서 서비스 안내와 신청 버튼을 제공한다 | design | P1 | Sprint 1 |
| LP-03 | 방문자가 이메일로 사전신청을 완료한다 | engineering | P0 | Sprint 1 |
| LP-04 | 운영자가 새 신청을 알림으로 확인한다 | engineering | P1 | Sprint 2 |
| LP-05 | 신청 흐름과 예외 상황을 QA로 검증한다 | qa | P0 | Sprint 2 |
| LP-06 | 비공개 베타 초대 준비를 마친다 | product | P1 | Sprint 2 |
본문은 issues/LP-02.md처럼 키마다 파일 하나다. 각 본문에는 실습 3의 다섯 부분과 함께 “선행 업무”가 적혀 있다. 예를 들어 LP-03의 선행 업무는 LP-01이다. 본문은 실습 키트 페이지에서 읽을 수 있다.
cat github-pm-starter-kit/backlog.tsv cat github-pm-starter-kit/issues/LP-03.md
2실행하기 전에 스크립트 읽기
스크립트는 실행한 사람의 gh 로그인 권한으로 동작한다. 받은 스크립트는 실행하기 전에 무엇을 읽고 무엇을 쓰는지 확인한다. seed-backlog.sh는 네 단계로 동작한다.
| 단계 | 하는 일 | GitHub에 쓰는가 |
|---|---|---|
| 1 사전 점검 | 저장소, Project, 마일스톤, 라벨, 기존 이슈 제목을 조회한다. 마일스톤이나 라벨이 하나라도 없으면 여기서 멈춘다. | 아니오 |
| 2 실행 계획 | 업무별로 “생성” 또는 “재사용”을 출력하고 y 입력을 기다린다. | 아니오 |
| 3 등록 | 없는 이슈만 만들고, 모든 이슈를 Project에 추가하고, 비어 있는 Priority만 채운다. | 예 |
| 4 결과 | 업무 키와 실제 이슈 번호를 pm-lab/backlog-map.tsv에 저장한다. | 아니오 |
같은 제목의 이슈가 있으면 그 이슈의 본문, 담당자, 마일스톤은 바꾸지 않는다. 따라서 issues/의 파일을 고친 뒤 다시 실행해도 이미 만든 이슈에는 반영되지 않는다. 제목을 바꾸면 다른 업무로 판단해 새 이슈를 만들므로 키와 제목은 바꾸지 않는다.
sed -n '1,25p' github-pm-starter-kit/seed-backlog.sh
3미리 보기
--dry-run은 1단계와 2단계만 실행하고 끝난다. GitHub에는 아무것도 쓰지 않는다.
bash github-pm-starter-kit/seed-backlog.sh "$PM_REPO" "$PM_PROJECT" --dry-run
== 1/4 사전 점검: gildong/launchpad-pm-lab, Project 3 (소유자 gildong) Project: Launchpad 개발과 출시 == 2/4 실행 계획 (6건) 재사용 LP-01 https://github.com/gildong/launchpad-pm-lab/issues/1 생성 LP-02 [LP-02] 랜딩 페이지에서 서비스 안내와 신청 버튼을 제공한다 생성 LP-03 [LP-03] 방문자가 이메일로 사전신청을 완료한다 생성 LP-04 [LP-04] 운영자가 새 신청을 알림으로 확인한다 생성 LP-05 [LP-05] 신청 흐름과 예외 상황을 QA로 검증한다 생성 LP-06 [LP-06] 비공개 베타 초대 준비를 마친다 == --dry-run: GitHub에 아무것도 쓰지 않고 종료한다.
LP-01이 “재사용”이 아니라 “생성”으로 나오면 실습 3의 제목과 키트의 제목이 다르다. 이대로 실행하면 LP-01이 두 개가 된다. gh issue view "$PM_POLICY_URL" --json title로 제목을 확인하고, 웹에서 제목을 [LP-01] 사전신청 정책을 확정한다로 고친 뒤 다시 미리 본다.
4등록
bash github-pm-starter-kit/seed-backlog.sh "$PM_REPO" "$PM_PROJECT"
(1/4, 2/4 출력은 미리 보기와 같다) 계속하려면 y를 입력한다 [y/N]: y == 3/4 이슈 등록과 Project 추가 reused LP-01 #1 Sprint 1 Priority=P0 created LP-02 #2 Sprint 1 Priority=P1 created LP-03 #3 Sprint 1 Priority=P0 created LP-04 #4 Sprint 2 Priority=P1 created LP-05 #5 Sprint 2 Priority=P0 created LP-06 #6 Sprint 2 Priority=P1 == 4/4 완료 업무 키와 이슈 번호 대응표: pm-lab/backlog-map.tsv
LP-01은 실습 3에서 Priority를 비워 두었으므로 이번에 P0이 채워진다. gh가 2.97.0보다 낮으면 Priority 열이 비어 있고 “Priority는 채우지 않는다”는 안내가 나온다. 이 경우 Project 웹 화면의 Priority 열에서 값을 직접 고른다.
5다시 실행해 중복 확인
같은 명령을 다시 실행했을 때 모든 줄이 “재사용”으로 나와야 한다. 미리 보기로 확인한다.
bash github-pm-starter-kit/seed-backlog.sh "$PM_REPO" "$PM_PROJECT" --dry-run
== 2/4 실행 계획 (6건) 재사용 LP-01 https://github.com/gildong/launchpad-pm-lab/issues/1 재사용 LP-02 https://github.com/gildong/launchpad-pm-lab/issues/2 ... 재사용 LP-06 https://github.com/gildong/launchpad-pm-lab/issues/6
중간에 네트워크 오류로 멈춘 경우에도 같은 명령을 다시 실행하면 된다. 이미 만든 이슈는 재사용하고 남은 이슈만 만든다.
6결과 확인
cat pm-lab/backlog-map.tsv gh issue list -R "$PM_REPO" --state all --label "kind:task" --limit 100 gh project item-list "$PM_PROJECT" --owner "$PM_OWNER" --limit 100 --field Priority
key number url action LP-01 1 https://github.com/gildong/launchpad-pm-lab/issues/1 reused LP-02 2 https://github.com/gildong/launchpad-pm-lab/issues/2 created ... LP-06 6 https://github.com/gildong/launchpad-pm-lab/issues/6 created
backlog-map.tsv는 업무 키와 이슈 번호의 대응표다. 이 실습에서는 키와 번호가 같지만, 실습 중에 이슈를 하나 더 만들었다면 LP-03이 #4가 될 수 있다. 이슈 번호가 필요할 때는 번호를 추측하지 않고 이 파일에서 찾는다.
스크립트는 새 이슈의 담당자를 실행한 사람(@me)으로 지정한다. 담당자를 비워 두려면 --no-assign을 붙인다. 등록 후 실제 담당자로 바꾸는 명령은 다음과 같다.
gh issue edit 3 -R "$PM_REPO" --add-assignee dev-lee --remove-assignee "@me"
gh issue list결과에kind:task업무가 6개 있다.- Project 항목 목록에 6개가 모두 있고 PRIORITY 열이 채워져 있다.
- 두 번째 미리 보기에서 6줄 모두 “재사용”이다.
pm-lab/backlog-map.tsv에 키 6개와 이슈 URL이 있다.
막히면
| 증상 | 확인과 해결 |
|---|---|
오류: 아래 항목이 없어 아무것도 만들지 않았다. | 출력된 마일스톤이나 라벨을 실습 2의 명령으로 만든 뒤 다시 실행한다. 이때 GitHub에는 아무것도 생기지 않았다. |
No such file or directory | 작업 폴더 안에 github-pm-starter-kit 폴더가 없다. pwd와 ls로 위치를 확인한다. |
$'\r': command not found | Windows 메모장 등에서 파일을 저장해 줄 끝 문자가 바뀌었다. Git Bash에서 sed -i 's/\r$//' github-pm-starter-kit/*.sh github-pm-starter-kit/backlog.tsv를 실행한다. |
| Project를 조회하지 못했다는 오류 | echo "$PM_PROJECT"가 숫자인지 확인한다. 조직 Project라면 --owner 조직이름을 붙인다. |
| 업무가 7개가 됨 | 제목이 달라 LP-01이 새로 생겼다. 중복된 쪽을 gh issue close 번호 -R "$PM_REPO" --reason "not planned"로 닫고 Project에서도 지운다(웹의 항목 메뉴 Delete from project). |
마치며...
업무 6개가 모두 이슈로 등록되어 Project에 들어갔고, 같은 명령을 다시 실행해도 업무가 늘지 않는다는 것을 확인했다. 실습 6에서는 웹 화면에서 스프린트 기간을 만들고 이 업무들을 기간별로 나누어 보는 화면을 구성한다.