
ChatGPT와 Codex를 함께 사용하면서 생각하지 못했던 불편함이 하나 생겼습니다.
둘 다 같은 GitHub 계정을 사용하다 보니 PR 화면에서 역할 구분이 애매했습니다.
혼자 개발하는 사이드 프로젝트이기는 하지만, PR 타임라인만 보면 누가 구현했고 누가 리뷰했는지 전혀 구분되지 않았습니다.
말 그대로 혼자 북 치고 장구 치는 모습이었습니다ㅎㅎ
그래서 이번에 Codex 전용 GitHub 계정을 하나 만들었습니다.
이 글에 나오는 계정명, 저장소명, 경로는 모두 설명을 위한 샘플입니다.
저장소 소유 계정
dev-harbor
Codex 전용 계정
dev-harbor-codex-bot
샘플 저장소
dev-harbor/order-service-lab
설정을 마친 뒤에는 역할이 이렇게 나뉘었습니다.
Codex
→ dev-harbor-codex-bot
→ 코드 구현, Commit, Push, PR 생성
ChatGPT 및 저장소 소유자
→ dev-harbor
→ PR 리뷰, 코멘트, 최종 승인
계정 하나만 추가하면 끝날 줄 알았는데, 설정하면서 알게 된 사실이 하나 있었습니다.
GitHub에서 사용하는 계정 정보는 한 곳에서 결정되지 않았습니다.
Codex가 GitHub에서 작업할 때는 크게 세 가지 계정 정보가 사용됩니다.
| 작업 | 계정을 결정하는 설정 |
|---|---|
| Commit 작성자 | git config user.name, user.email |
| 브랜치 Push 계정 | Git Remote와 SSH 키 |
| PR 생성 및 코멘트 | gh CLI에 로그인된 계정 |
예를 들어 Codex를 봇 계정으로 GitHub에 연결했더라도, 로컬 Git 설정이 기존 사용자로 되어 있으면 Commit 작성자는 여전히 기존 계정으로 표시될 수 있습니다.
반대로 Commit 작성자만 봇으로 바꿔도 Remote가 기존 SSH 키를 사용하면 Push는 기존 사용자 인증으로 처리됩니다.
그래서 아래 세 가지를 모두 봇 계정으로 맞춰야 했습니다.
Commit 작성자
→ dev-harbor-codex-bot
Git Push 인증
→ dev-harbor-codex-bot 전용 SSH 키
PR 생성 및 코멘트
→ dev-harbor-codex-bot의 gh 인증
이 글은 Mac에서 로컬 Codex 앱 또는 CLI를 사용하는 환경을 기준으로 작성했습니다.
제가 구성한 형태는 다음과 같습니다.
Codex 앱 또는 CLI
├─ OpenAI 로그인: 기존 ChatGPT 계정
├─ Git Commit: dev-harbor-codex-bot
├─ Git Push: 봇 전용 SSH 키
└─ PR 생성·코멘트: 봇 계정의 gh 인증
ChatGPT
├─ GitHub 연결: dev-harbor
└─ 역할: PR 리뷰 및 코멘트
저장소
├─ 소유자: dev-harbor
├─ Collaborator: dev-harbor-codex-bot
├─ Codex는 작업 브랜치만 Push
├─ Codex는 Draft PR까지만 생성
└─ 최종 Merge는 저장소 소유자가 진행
Codex의 OpenAI 로그인 계정까지 바꿀 필요는 없었습니다.
Codex가 로컬에서 실행하는 git, ssh, gh 명령의 인증 주체만 봇 계정으로 분리하면 됩니다.
먼저 Codex 전용 GitHub 계정을 새로 만들었습니다.
기존 GitHub 계정과 다른 이메일 주소가 필요합니다.
저는 다음과 같은 형태로 구성했습니다.
기존 사용자 계정
dev-harbor
Codex 전용 계정
dev-harbor-codex-bot
봇 계정에는 다음 설정도 함께 적용했습니다.
계정을 만든 뒤 저장소에 Collaborator로 초대합니다.
Repository
→ Settings
→ Collaborators
→ Add people
샘플 저장소를 기준으로 하면 다음 계정을 초대합니다.
dev-harbor-codex-bot
Codex가 작업 브랜치를 Push하고 PR을 생성해야 하므로 Write 권한을 부여했습니다.
봇 계정에는 필요한 최소 권한만 주는 편이 좋습니다.
PR 생성과 코멘트 작성에는 GitHub CLI인 gh를 사용합니다.
설치 여부를 확인합니다.
gh --version
설치되어 있지 않다면 Homebrew로 설치할 수 있습니다.
brew install gh
gh에 Codex 봇 계정 로그인하기다음 명령으로 GitHub CLI 인증을 시작합니다.
gh auth login \
--hostname github.com \
--git-protocol https \
--web
브라우저가 열리면 반드시 봇 계정으로 로그인되어 있는지 확인합니다.
dev-harbor-codex-bot
기존 사용자 계정으로 로그인되어 있다면 GitHub 계정을 전환하거나, 별도의 브라우저 프로필에서 봇 계정으로 로그인한 뒤 인증합니다.
여러 계정이 등록되어 있다면 봇 계정을 활성화합니다.
gh auth switch \
--hostname github.com \
--user dev-harbor-codex-bot
현재 활성화된 계정을 확인합니다.
gh auth status --hostname github.com
조금 더 확실하게 확인하려면 다음 명령을 사용합니다.
gh api user --jq '.login'
결과는 반드시 다음과 같아야 합니다.
dev-harbor-codex-bot
저는 Codex가 GitHub 작업을 시작하기 전에 이 명령을 항상 실행하도록 설정했습니다.
계정 하나 잘못 선택한 상태로 PR을 만들면 처음 문제로 다시 돌아가니까요ㅎㅎ
기존 사용자 계정의 SSH 키와 분리하기 위해 봇 전용 키를 생성합니다.
mkdir -p ~/.ssh
chmod 700 ~/.ssh
SSH 키를 생성합니다.
ssh-keygen \
-t ed25519 \
-C "dev-harbor-codex-bot" \
-f ~/.ssh/id_ed25519_dev_harbor_codex_bot
Passphrase 입력 화면이 나오면 비밀번호를 설정할 수 있습니다.
Mac Keychain에 키를 등록합니다.
ssh-add --apple-use-keychain \
~/.ssh/id_ed25519_dev_harbor_codex_bot
다음 오류가 발생한다면 SSH Agent부터 실행합니다.
Could not open a connection to your authentication agent
eval "$(ssh-agent -s)"
ssh-add --apple-use-keychain \
~/.ssh/id_ed25519_dev_harbor_codex_bot
생성되는 파일은 두 개입니다.
개인 키
~/.ssh/id_ed25519_dev_harbor_codex_bot
공개 키
~/.ssh/id_ed25519_dev_harbor_codex_bot.pub
GitHub에 등록하는 것은 반드시 .pub이 붙은 공개 키입니다.
개인 키 파일은 외부에 공유하거나 GitHub에 등록하면 안 됩니다.
먼저 현재 gh 계정이 봇인지 다시 확인합니다.
gh api user --jq '.login'
결과:
dev-harbor-codex-bot
정상이라면 다음 명령으로 공개 키를 등록합니다.
gh ssh-key add \
~/.ssh/id_ed25519_dev_harbor_codex_bot.pub \
--type authentication \
--title "MacBook - Codex Bot"
GitHub 웹 화면에서 직접 등록할 수도 있습니다.
Profile
→ Settings
→ SSH and GPG keys
→ New SSH key
공개 키 내용은 다음 명령으로 확인할 수 있습니다.
cat ~/.ssh/id_ed25519_dev_harbor_codex_bot.pub
같은 github.com에 여러 계정을 사용하려면 SSH Host 별칭을 만들어두는 것이 편합니다.
SSH 설정 파일을 엽니다.
nano ~/.ssh/config
기존 내용을 지우지 않고 아래 설정을 추가합니다.
Host github-dev-harbor-codex-bot
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_dev_harbor_codex_bot
IdentitiesOnly yes
AddKeysToAgent yes
UseKeychain yes
설정 파일의 권한도 확인합니다.
chmod 600 ~/.ssh/config
SSH 연결을 테스트합니다.
ssh -T git@github-dev-harbor-codex-bot
정상적으로 연결되면 메시지에 봇 계정명이 표시됩니다.
Hi dev-harbor-codex-bot!
이 별칭 덕분에 일반 GitHub 작업은 기존 SSH 키를 사용하고, 특정 저장소에서만 Codex 봇 계정을 사용할 수 있습니다.
github.com
→ 기존 사용자 계정
github-dev-harbor-codex-bot
→ Codex 봇 계정
프로젝트 저장소로 이동합니다.
cd ~/workspace/order-service-lab
현재 Remote를 확인합니다.
git remote -v
origin을 앞에서 만든 봇 전용 SSH 별칭으로 변경합니다.
git remote set-url origin \
git@github-dev-harbor-codex-bot:dev-harbor/order-service-lab.git
변경 결과를 확인합니다.
git remote -v
정상적인 결과는 다음과 비슷합니다.
origin git@github-dev-harbor-codex-bot:dev-harbor/order-service-lab.git (fetch)
origin git@github-dev-harbor-codex-bot:dev-harbor/order-service-lab.git (push)
여기서 헷갈렸던 부분이 하나 있습니다.
저장소의 소유자는 여전히 기존 계정입니다.
dev-harbor/order-service-lab
다만 해당 저장소에 접근할 때 사용하는 SSH 인증 계정만 봇으로 변경된 것입니다.
dev-harbor-codex-bot
봇 계정이 Collaborator로 등록되어 있기 때문에 작업 브랜치를 Push할 수 있습니다.
Push 계정을 바꿨다고 Commit 작성자까지 자동으로 바뀌지는 않습니다.
Git의 Commit 작성자는 다음 설정으로 결정됩니다.
user.name
user.email
먼저 봇 계정의 GitHub 설정에서 전용 noreply 이메일을 확인합니다.
GitHub
→ Settings
→ Emails
→ Keep my email addresses private
보통 다음과 비슷한 형태입니다.
12345678+dev-harbor-codex-bot@users.noreply.github.com
숫자와 이메일 형식은 계정마다 다르므로 GitHub 화면에 표시된 정확한 값을 사용해야 합니다.
저장소 디렉터리에서 다음 명령을 실행합니다.
cd ~/workspace/order-service-lab
git config --local user.name "dev-harbor-codex-bot"
git config --local user.email \
"12345678+dev-harbor-codex-bot@users.noreply.github.com"
여기서 중요한 것은 --global이 아니라 --local을 사용한다는 점입니다.
git config --local
그래야 이 저장소에서만 봇 계정이 Commit 작성자로 사용되고, 다른 저장소에서는 기존 사용자 정보를 그대로 유지할 수 있습니다.
설정 출처를 확인합니다.
git config --show-origin --get user.name
git config --show-origin --get user.email
정상이라면 .git/config에 저장된 값이 표시됩니다.
file:.git/config dev-harbor-codex-bot
file:.git/config 12345678+dev-harbor-codex-bot@users.noreply.github.com
설정이 끝난 뒤에는 Commit, Push, PR 계정이 모두 제대로 분리됐는지 확인해야 합니다.
cd ~/workspace/order-service-lab
echo "=== Commit identity ==="
git config user.name
git config user.email
echo "=== Git remote ==="
git remote get-url origin
echo "=== GitHub CLI identity ==="
gh api user --jq '.login'
echo "=== Repository permission ==="
gh repo view dev-harbor/order-service-lab \
--json nameWithOwner,viewerPermission
echo "=== SSH identity ==="
ssh -T git@github-dev-harbor-codex-bot
기대하는 결과는 다음과 같습니다.
Commit identity
→ dev-harbor-codex-bot
Git remote
→ git@github-dev-harbor-codex-bot:dev-harbor/order-service-lab.git
GitHub CLI identity
→ dev-harbor-codex-bot
Repository permission
→ WRITE 또는 그 이상의 권한
SSH identity
→ Hi dev-harbor-codex-bot!
실제 브랜치를 원격에 만들지 않고 Push 권한만 검사하려면 --dry-run을 사용할 수 있습니다.
git push --dry-run \
origin \
HEAD:refs/heads/codex/auth-check
--dry-run이기 때문에 실제 원격 브랜치는 생성되지 않습니다.
설정만 믿고 끝내기보다 실제 Draft PR 하나를 만들어 확인하는 편이 안전합니다.
테스트 브랜치를 만듭니다.
git switch -c codex/github-account-test
문서 파일 하나를 추가합니다.
mkdir -p docs
cat > docs/codex-account-test.md <<'EOF'
# Codex GitHub Account Test
Codex bot account authentication test.
EOF
변경 내용을 확인합니다.
git status --short
git diff --check
Commit을 생성합니다.
git add docs/codex-account-test.md
git commit -m "chore: verify Codex bot account"
원격 브랜치로 Push합니다.
git push -u origin HEAD
Draft PR을 생성합니다.
기본 브랜치가 main인 저장소라면 다음처럼 실행합니다.
gh pr create \
--draft \
--base main \
--head "$(git branch --show-current)" \
--title "chore: verify Codex bot account" \
--body "Codex 전용 GitHub 계정의 Commit, Push, PR 인증을 확인합니다."
기본 브랜치가 develop이라면 --base develop로 바꾸면 됩니다.
PR 화면에서 다음 세 가지를 확인했습니다.
Commit 작성자
→ dev-harbor-codex-bot
PR 작성자
→ dev-harbor-codex-bot
리뷰 코멘트 작성자
→ dev-harbor
여기까지 확인되면 계정 분리가 완료된 것입니다.
설정 후 가장 걱정됐던 건 어느 날 인증이 바뀐 상태로 Codex가 작업하는 것이었습니다.
그래서 Codex 작업지시문 첫 부분에 인증 확인 절차를 추가했습니다.
GitHub 작업 전에 아래 계정 검증을 먼저 수행한다.
1. `gh api user --jq '.login'`
- 반드시 `dev-harbor-codex-bot`이어야 한다.
2. `git config user.name`
- 반드시 `dev-harbor-codex-bot`이어야 한다.
3. `git config user.email`
- 반드시 dev-harbor-codex-bot 계정에 등록된 이메일이어야 한다.
4. `git remote get-url origin`
- 반드시 `github-dev-harbor-codex-bot` SSH 별칭을 사용해야 한다.
하나라도 일치하지 않으면 Commit, Push, PR 생성을 중지하고 보고한다.
허용하는 GitHub 작업:
- 작업 브랜치 생성
- Commit
- 작업 브랜치 Push
- Draft PR 생성
- PR 코멘트 작성
금지하는 GitHub 작업:
- main 직접 Push
- develop 직접 Push
- 강제 Push
- PR Merge
- `gh pr merge` 실행
설정이 잘 되어 있다고 가정하지 않고, 매번 실제 계정을 확인하도록 한 것입니다.
조금 번거로워 보여도 자동화가 많아질수록 이런 안전장치가 더 중요하다고 느꼈습니다.
봇 계정에 Write 권한을 부여했기 때문에 저장소 자체에도 안전장치를 추가했습니다.
Repository
→ Settings
→ Branches 또는 Rules
→ Branch protection rule
제가 적용한 기본 원칙은 다음과 같습니다.
main 직접 Push 금지
develop 직접 Push 금지
PR을 통해서만 변경
Codex는 Draft PR까지만 생성
최종 Merge는 저장소 소유 계정만 진행
Codex에게 기능 구현과 PR 생성까지 맡기더라도 최종 Merge 권한은 분리했습니다.
AI가 코드를 만드는 속도와 최종 승인 권한은 별개의 문제라고 생각했기 때문입니다.
지금까지 설명한 방법은 Mac의 로컬 Codex 앱 또는 CLI를 기준으로 합니다.
Codex Cloud는 로컬의 다음 설정을 그대로 사용하지 않습니다.
로컬 gh 인증
로컬 SSH 키
로컬 ~/.ssh/config
저장소별 git config
Codex Cloud에서는 별도의 GitHub 연결 화면에서 봇 계정을 연결해야 합니다.
1. 기존 GitHub 연결 해제
2. 브라우저에서 dev-harbor-codex-bot 로그인
3. GitHub 연결 재설정
4. dev-harbor/order-service-lab 저장소 선택
5. 임시 Draft PR로 실제 작성자 확인
Cloud 연결 후에도 실제 PR 작성자가 원하는 계정으로 표시되는지는 테스트 PR 한 건으로 직접 확인하는 편이 안전합니다.
설정을 끝내고 나니 PR 타임라인이 훨씬 자연스러워졌습니다.
Codex가 구현하고 PR을 생성합니다.
dev-harbor-codex-bot
→ 코드 수정
→ Commit
→ Push
→ Draft PR 생성
그다음 ChatGPT와 제가 기존 소유 계정으로 리뷰합니다.
dev-harbor
→ PR 리뷰
→ 수정 코멘트
→ 최종 승인
수정사항이 생기면 다시 Codex가 반영합니다.
dev-harbor
→ 리뷰 코멘트 작성
dev-harbor-codex-bot
→ 수정 반영
→ Commit
→ Push
dev-harbor
→ 재리뷰
같은 사람이 운영하는 계정들이지만, 역할이 분리되니 작업 기록이 훨씬 명확해졌습니다.
누가 코드를 만들었고, 누가 리뷰했으며, 어떤 피드백으로 코드가 바뀌었는지가 PR 안에 그대로 남았습니다.
처음에는 단순히 PR 작성자와 리뷰 코멘트 작성자를 구분하고 싶었습니다.
그런데 설정하다 보니 GitHub에서 사용하는 계정이 생각보다 여러 곳에서 결정된다는 것도 알게 됐습니다.
Commit 작성자
→ git config
Push 계정
→ SSH 키와 Remote
PR 작성자
→ gh CLI 인증
세 부분을 모두 분리하고 나니 제가 원했던 작업 흐름이 만들어졌습니다.
Codex는 구현한다.
ChatGPT는 리뷰한다.
마지막 승인은 내가 한다.
혼자 진행하는 사이드 프로젝트인데 계정을 하나 분리했을 뿐인데도 작은 개발팀이 생긴 기분이었습니다ㅎㅎ
요즘은 기능을 하나씩 구현하는 것도 재밌지만, 역할을 나누고 작업 흐름을 정리하고 반복되는 과정을 자동화하는 재미가 더 커지고 있습니다.
코드를 만드는 사이드 프로젝트에서, 조금씩 개발팀을 설계하는 사이드 프로젝트로 바뀌고 있는 것 같습니다.