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 등록하기

  1. 먼저 사용자의 컴퓨터나 서버에서 ssh key를 만든다. SSH key를 이용하여 접속하는 방법과 기본 작동 원리를 잘 모르시는 분들은 이전 블로그에서 확인하고 다시 이 블로그를 보면 되겠다.

    $ ssh-keygen -t rsa -b 4096 -f ~/git_ssh

    passphrase를 옵션으로 설정하게되면 git ssh에는 문제가 없지만, 만약 private repo를 Docker Container내에 설치해야하는 경우에는 설정하지 않는 것을 추천한다(그 이유는 필자가 아직 그렇게 처리하는 방법은 찾지 못했기 때문인데 만약 방법을 아는 분이 있다면 Comment를 달아주시면 정말 감사하겠다).

  2. 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 일 것이다.

    git ssh 1

    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의 값을 넣어주는 것이다.

    git ssh 2

참고로 나중에 repo들을 팀별로 권한 부여해야되는게 아니라면 전체 통일된 ssh key를 사용하는 것을 추천한다.

Local or Server에 설정하기

  1. 매번 같은 명령문을 작성하는 수고를 덜기 위해 아래와 같이 구성된 폴더를 만들자.

git ssh 3

여기서 git_ssh_config, setup_ssh_github.sh를 제외한 git_ssh(private key)와 git_ssh.pub은 위에서 작성한 ssh-keygen 명령을 그대로 사용했다면 이미 가지고 있는 파일이다. 만약 -f ~/path/file_name을 달리했다면 해당 파일명으로 된 파일을 지정한 경로에서 찾아오면 된다.

  1. 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
  2. git_ssh_config 이 파일은 편하게 ssh를 사용하기위해 해당 remote host에 대한 정보를 저장하는 것이다. 특히 여러개의 ssh private key를 가진 경우에는 이 방법을 사용해서 서버마다 사용되는 private key의 경로를 명시해야한다.

    Host github.com
      User git
      IdentityFile ~/.ssh/git_ssh.pem

    처럼 작성하면 된다.

  3. 위 1번 에서 구성한 폴더에서 아래 명령문을 실행하면 끝.

    directory$ sh setup_ssh_github.sh
  4. 마지막 4번 명령문을 실행해서

    Hi user_name! You've successfully authenticated, but GitHub does not provide shell access.

    이 출력되면 성공이다.

  5. 이제 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을 쓰기위해 작성한 내용이다.