1회차실습 5115–140분

백로그 일괄 등록

업무 다섯 개를 실습 3처럼 하나씩 등록하면 명령 다섯 번, 본문 파일 다섯 개, 붙여넣기 실수의 기회 다섯 번이 생긴다. 다음 프로젝트에서 같은 일을 반복하려면 업무 목록을 파일로 두고 한 번에 등록해야 한다. 다만 같은 명령을 두 번 실행했을 때 업무가 두 개씩 생기면 그 방식은 쓸 수 없다. 이 실습은 실습 키트의 등록 스크립트를 읽고, 미리 보기로 확인한 뒤 실행하고, 다시 실행해도 중복이 생기지 않는지 확인한다.

진행
설명 5분, 스크립트 읽기 5분, 실습 15분
결과
kind:task 업무 6개, 모두 Project에 추가, 키-번호 대응표
명령
bash seed-backlog.sh, gh issue list, gh project item-list

아래는 이 실습의 핵심 명령을 실행한 화면을 재현한 것이다. 화면이 보이면 자동으로 재생되고, 오른쪽 위 버튼으로 다시 볼 수 있다.

cd ~/gh-pm-lab
source pm-lab/env.sh
echo "$PM_REPO / Project $PM_PROJECT"

1등록할 업무 목록

키트의 backlog.tsv는 업무 하나를 한 줄로 적은 표다. 열은 탭으로 구분한다. LP-01은 실습 3에서 이미 만들었으므로 제목이 같으면 새로 만들지 않고 기존 이슈를 쓴다.

키제목영역Priority예시 스프린트
LP-01사전신청 정책을 확정한다productP0Sprint 1
LP-02랜딩 페이지에서 서비스 안내와 신청 버튼을 제공한다designP1Sprint 1
LP-03방문자가 이메일로 사전신청을 완료한다engineeringP0Sprint 1
LP-04운영자가 새 신청을 알림으로 확인한다engineeringP1Sprint 2
LP-05신청 흐름과 예외 상황을 QA로 검증한다qaP0Sprint 2
LP-06비공개 베타 초대 준비를 마친다productP1Sprint 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 foundWindows 메모장 등에서 파일을 저장해 줄 끝 문자가 바뀌었다. 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에서는 웹 화면에서 스프린트 기간을 만들고 이 업무들을 기간별로 나누어 보는 화면을 구성한다.