1회차실습 115–35분

환경과 저장소

명령마다 gildong/launchpad-pm-lab을 직접 입력하면 오타 한 글자로 엉뚱한 저장소에 이슈가 생기거나 “저장소를 찾지 못했다”는 오류가 난다. 반복해서 쓰는 값을 한 번만 정해 두고, 터미널을 닫았다 열어도 다시 불러올 수 있어야 한다. 이 실습은 셸 변수(shell variable)를 정하고 파일에 저장한 뒤 개인 실습 저장소를 만든다.

진행
설명 5분, 시연 5분, 실습 10분
결과
비공개 실습 저장소, pm-lab/env.sh
명령
gh api, gh repo create, gh repo view

모든 명령은 수업 전 준비에서 만든 작업 폴더에서 실행한다. 새 터미널을 열었다면 먼저 작업 폴더로 이동한다.

cd ~/gh-pm-lab

1반복해서 쓸 값을 변수로 정하기

아래 네 줄은 로그인 이름, 저장소 이름, 마일스톤 이름을 변수에 담는다. 마지막 줄은 결과를 화면에 보여 준다.

PM_OWNER=$(gh api user --jq .login)
PM_REPO_NAME="launchpad-pm-lab"
PM_REPO="$PM_OWNER/$PM_REPO_NAME"
PM_MILESTONE="M1 비공개 베타"
echo "$PM_REPO / $PM_MILESTONE"
gildong/launchpad-pm-lab / M1 비공개 베타
변수값쓰이는 곳
PM_OWNER로그인 이름. gh api user가 돌려준 JSON에서 login 값만 꺼낸다.Project 소유자
PM_REPO_NAME저장소 이름Project와 저장소 연결
PM_REPO소유자/저장소 형식의 전체 이름거의 모든 -R 옵션
PM_MILESTONE첫 출시 목표 이름이슈 등록과 조회
회사 프로젝트

조직 저장소에서 운영할 때는 PM_OWNER에 조직 이름을 직접 넣는다. 예: PM_OWNER="launchpad-inc". 조직에서 저장소와 Project를 만들 권한이 있는지 먼저 확인한다.

2실습 저장소 만들기

gh repo create "$PM_REPO" --private --add-readme \
  --description "Launchpad 초기 스프린트 PM 실습"
gh repo view "$PM_REPO" --web
✓ Created repository gildong/launchpad-pm-lab on github.com
  https://github.com/gildong/launchpad-pm-lab
옵션뜻
--private본인과 초대한 사람만 볼 수 있는 저장소로 만든다.
--add-readmeREADME 파일 하나를 넣어 만든다. 기본 브랜치 main이 함께 생긴다.
--description저장소 첫 화면에 보이는 설명이다.
--web결과를 브라우저로 연다.
생성 명령은 한 번만

생성 명령은 최초 설정용이다. 오류가 나면 블록 전체를 다시 실행하지 말고, gh repo view "$PM_REPO"로 저장소가 이미 생겼는지 조회한 뒤 그다음 단계부터 이어 간다. 같은 이름의 저장소가 이미 있으면 PM_REPO_NAME을 다른 이름으로 바꾸고 1단계의 셋째 줄(PM_REPO=...)부터 다시 실행한다.

3변수를 파일에 저장하기

셸 변수는 터미널을 닫으면 사라진다. 2회차는 다른 날 진행하므로 값을 파일에 저장해 둔다.

mkdir -p pm-lab
cat > pm-lab/env.sh <<EOF
PM_OWNER="$PM_OWNER"
PM_REPO_NAME="$PM_REPO_NAME"
PM_REPO="$PM_REPO"
PM_MILESTONE="$PM_MILESTONE"
EOF
cat pm-lab/env.sh
PM_OWNER="gildong"
PM_REPO_NAME="launchpad-pm-lab"
PM_REPO="gildong/launchpad-pm-lab"
PM_MILESTONE="M1 비공개 베타"

이 블록의 <<EOF에는 따옴표가 없다. 따옴표가 없으면 $PM_OWNER 같은 변수가 실제 값으로 바뀐 뒤 저장된다. 반대로 <<'EOF'처럼 따옴표를 붙이면 적은 글자가 그대로 저장된다. 업무 본문처럼 $가 들어갈 수 있는 글은 따옴표를 붙인 형태로 저장한다.

새 터미널에서는 아래 두 줄로 값을 다시 불러온다.

cd ~/gh-pm-lab
source pm-lab/env.sh

pm-lab/env.sh를 잃어버렸다면 아래 입력란에 값을 넣어 같은 파일을 다시 만드는 명령을 얻는다. 입력값은 이 브라우저에만 저장된다.

mkdir -p pm-lab
cat > pm-lab/env.sh <<'EOF'
PM_OWNER="내-로그인"
PM_REPO_NAME="launchpad-pm-lab"
PM_REPO="$PM_OWNER/$PM_REPO_NAME"
PM_MILESTONE="M1 비공개 베타"
EOF
source pm-lab/env.sh

실습 3 이후에 저장하는 이슈 URL 변수는 이 도구가 만들지 않는다. 해당 실습의 저장 명령을 다시 실행한다.

  • 브라우저에서 실습 저장소가 보이고, 저장소 이름 옆에 Private 표시가 있다.
  • 저장소 상단 메뉴에 Issues 탭이 있다.
  • cat pm-lab/env.sh가 네 줄을 보여 준다.
  • 새 터미널에서 source pm-lab/env.sh 후 echo "$PM_REPO"가 저장소 이름을 출력한다.
막히면
증상확인과 해결
echo 결과가 /launchpad-pm-lab처럼 앞부분이 비어 있음PM_OWNER가 비어 있다. gh auth status로 로그인을 확인하고 1단계 첫 줄을 다시 실행한다.
Name already exists on this account같은 이름의 저장소가 있다. 그 저장소를 실습에 쓸지 정하고, 아니면 PM_REPO_NAME을 바꾼다.
PM_REPO_NAME: command not found= 양옆에 공백이 들어갔다. PM_REPO_NAME="launchpad-pm-lab"처럼 붙여 쓴다.
> 표시가 나오고 명령이 끝나지 않음따옴표나 EOF가 닫히지 않았다. Ctrl+C로 취소하고 블록 전체를 다시 붙여넣는다.
HTTP 403 (조직 저장소)조직에서 저장소 생성 권한이 없다. 개인 계정으로 실습하거나 관리자에게 권한을 요청한다.

마치며...

이 실습으로 비공개 저장소 하나와, 그 저장소를 가리키는 변수 파일 pm-lab/env.sh가 생겼다. 실습 2에서는 이 저장소에 출시 목표 두 개와 업무 분류용 라벨을 만든다.