About
필자 회사에서 서비스를 마이크로 서비스화하면서 하나의 repository로 관리되던 소스코드들이 여러 repository로 분할되기 시작했다. Web application을 실행하는 대표 repository의 소스코드에서는 나머지 모듈들을 pip install 하는 방식으로 끌어다 사용하는데 문제는 회사의 중요 자산인 코드들은 private repository
로 관리된다는 점이었다.
나머지 일반적인 Python package들은 pip install -r requirements.txt
를 이용해서 설치하고, 나머지 private repository
는
git+ssh://git@github.com/company_user_id/repo_name_0.git
git+ssh://git@github.com/company_user_id/repo_name_1.git
과 같은 형식의 private_requirements.txt
를 따로 만들어서 관리하기 시작했다. 하지만 매번 해당 application을 설치하는 기기마다 SSH 설정을 다시 해야 하는 것은 매우 번거로운 작업이었다. 그래서 반복되는 작업을 shell script로 작성해서 팀원끼리 공유하여 사용하게 되었는데 이 블로그에서는 그 이야기를 하고자 한다.
Github에 SSH key 등록하기
-
먼저 사용자의 컴퓨터나 서버에서 ssh key를 만든다. SSH key를 이용하여 접속하는 방법과 기본 작동 원리를 잘 모르시는 분들은 이전 블로그에서 확인하고 다시 이 블로그를 보면 되겠다.
$ ssh-keygen -t rsa -b 4096 -f ~/git_ssh
passphrase
를 옵션으로 설정하게되면 git ssh에는 문제가 없지만, 만약 private repo를 Docker Container내에 설치해야하는 경우에는 설정하지 않는 것을 추천한다(그 이유는 필자가 아직 그렇게 처리하는 방법은 찾지 못했기 때문인데 만약 방법을 아는 분이 있다면 Comment를 달아주시면 정말 감사하겠다). -
Github에서 Key를 등록하는 방법은 2가지가 있다. 모든 repository에 대해 접근 가능하도록 등록하는 방법과 원하는 repository에만 설정하는 방법이 있다.
2-1. 먼저 모든 repository에 대해 접근 가능하도록 하는 법을 알아보자. https://github.com/settings/keys 로 이동하여
New SSH Key
를 클릭하고, Title과 Key를 넣어준다. 여기서 Title은 사용자가 식별가능하도록 Key의 용도를 적어주면 되겠고, Key에는 위에서 생성한 key의 public key를 넣어주면 된다. 위의 코드를 그대로 작성했다면 키의 이름은git_ssh.pub
일 것이다.2-2. 그 다음은 하나의 repository에만 접근 가능하도록 하는 법이다. https://github.com/git_id/repo_name/settings/keys/ 로 이동하여
Add deploy key
를 클릭하고 2-1에서처럼 Title과 Key를 넣어준다. 역시 여기서 Key는ssh-keygen
을 이용해서 만든 Key 쌍 중key_name.pub
의 값을 넣어주는 것이다.
참고로 나중에 repo들을 팀별로 권한 부여해야되는게 아니라면 전체 통일된 ssh key를 사용하는 것을 추천한다.
Local or Server에 설정하기
- 매번 같은 명령문을 작성하는 수고를 덜기 위해 아래와 같이 구성된 폴더를 만들자.
여기서 git_ssh_config
, setup_ssh_github.sh
를 제외한 git_ssh
(private key)와 git_ssh.pub
은 위에서 작성한 ssh-keygen
명령을 그대로 사용했다면 이미 가지고 있는 파일이다. 만약 -f ~/path/file_name
을 달리했다면 해당 파일명으로 된 파일을 지정한 경로에서 찾아오면 된다.
-
setup_ssh_github.sh
은 아래처럼 작성했다.#!/bin/bash # check if there's .ssh directory in USER's root directory SSH_DIRECTORY=~/.ssh if ! test -d "$SSH_DIRECTORY"; then echo "Directory .ssh doesn not exist." mkdir ~/.ssh fi # move private key into ~/.ssh/ mv ./git_ssh ~/.ssh/git_ssh.pem chmod 400 ~/.ssh/git_ssh.pem # cp git_ssh_config into ~/.ssh/config SSH_CONFIG="$(cat ./git_ssh_config)" echo "$SSH_CONFIG" >> ~/.ssh/config # check if it's connected ssh -T git@github.com # Delete variables unset SSH_CONFIG unset SSH_DIRECTORY
-
git_ssh_config
이 파일은 편하게 ssh를 사용하기위해 해당remote host
에 대한 정보를 저장하는 것이다. 특히 여러개의 ssh private key를 가진 경우에는 이 방법을 사용해서 서버마다 사용되는 private key의 경로를 명시해야한다.Host github.com User git IdentityFile ~/.ssh/git_ssh.pem
처럼 작성하면 된다.
-
위 1번 에서 구성한 폴더에서 아래 명령문을 실행하면 끝.
directory$ sh setup_ssh_github.sh
-
마지막 4번 명령문을 실행해서
Hi user_name! You've successfully authenticated, but GitHub does not provide shell access.
이 출력되면 성공이다.
-
이제
private_requirements.txt
에 필요한 모듈들을 입력하고 install 해보자.# private_requirements.txt git+ssh://git@github.com/company_user_id/repo_name_0.git git+ssh://git@github.com/company_user_id/repo_name_1.git
$ pip install -r private_requirements.txt
문제없이 Clone해오면 성공이다.
Conculusion
혹시라도 더 좋은 방법이 있다면 Comment로 남겨주면 감사하겠다. 이전 블로그와 이번 블로그는 이후에 설명할 Installing Packages from a Private Repo into your Docker Container을 쓰기위해 작성한 내용이다.