엔지니어링
GitHub Codespaces가 Backend.AI를 만났을 때
그동안 Private Beta 형식으로 운영되던 GitHub Codespaces 기능이 드디어 Team/Organization 사용자에게 정식 개방되었습니다.
GitHub 팀은 이 발표와 동시에 자사의 엔지니어링 팀도 앞으로 GitHub의 개발 환경으로 Codespaces를 전면 사용한다고 발표했습니다. 이번 글에서는 Codespaces가 대체 뭐하는 도구인지, 래블업에서는 Codespaces를 어떻게 활용하고 있는지 간단하게 소개해 드리려 합니다.
Codespaces가 무엇인가요?

Codespaces는 클라우드 환경에서 운용되는 가상의 개발 환경입니다. Codespaces를 실행하면 실행한 GitHub 레포지토리의 내용물이 그대로 클론되고, 실행한 계정에 맞는 Git 인증 정보가 자동으로 시스템에 저장되어 자유롭게 레포지토리와 상호 작용이 가능합니다.
Codespaces의 가장 큰 장점은 유연한 환경 구성이 가능하다는 점입니다. 모든 Codespace가 개별 Azure VM 위에서 돌아가기 때문에 사용자는 설정한 만큼의 자원량을 보장받음과 동시에 개발 환경을 마치 자신의 개인 Linux PC처럼 사용할 수도 있습니다 (Docker도 돌아가요!). 또한 개발 중인 환경을 테스트해보기 위해 외부 네트워크로부터의 접근을 허용할 수도 있습니다.
그러나 일반 VM에 비해 한계도 있는데요,
- x86_64 기반의 VM만 지원합니다.
- GPU 리소스를 사용할 수 없습니다.
- 30분 동안 사용하지 않은 세션은 자동으로 유휴 상태로 진입합니다.
Codespaces 작동 방식 이해하기
위에서 잠깐 언급했듯이, Codespaces는 기본적으로 Azure VM 위에서 돌아갑니다. 다만 실제 Codespaces 환경은 모두 VM 내에 생성된 Docker Container에 설정됩니다.
이는 Codespaces가 Visual Studio Code의 devcontainer 기능에 기초하고 있기 때문으로 추정되는데요, 실제로 Codespaces 실행 시 로그를 보면 devcontainer의 CLI를 사용하는 것을 볼 수 있습니다.
이 devcontainer 기술 덕분에 레포지토리의 메인테이너들은 Codespace 사용자들이 더욱 쉽게 레포지토리에 맞는 개발 환경을 구축하도록 도울 수 있습니다. 이에 관련해서는 아래의 섹션에 더 기술하겠습니다.
이 로그에는 Codespaces가 devcontainer에 기초한다는 것 외에도 몇가지 눈여겨 볼 만한 점이 있습니다.
/workspaces폴더 마운트 Codespace의 모든 사용자 설정은/workspaces파일 내에 저장됩니다. 이/workspaces폴더를 외부 소스에서 마운트하여, Codespace 세션이 종료되도 사용자의 작업물은 그대로 저장됩니다.- 몇 가지 보안 설정들
-cap_add=SYS_PTRACE,-security-opt seccomp=unconfined,-privileged같은 보안 완화 옵션을 통해 Codespace 개발 환경을 실제 Linux VM처럼 사용할 수 있습니다. - Host Network 사용 Docker의 자체 Bridge 네트워크 대신 Docker 호스트의 네트워크 어댑터를 그대로 이용합니다. 이를 통해, 컨테이너에서 오픈한 IP 포트는 호스트의 네트워크에서 접근할 수 있게 됩니다.
Codespaces는 세션 생성 시에 사용자의 계정에서 Codespace 기준 레포지토리에만 접근이 가능한 repo 권한의 Personal Access Token을 자동으로 발급하고, 이를 Codespace 세션에 $GITHUB_TOKEN이라는 환경 변수로 추가합니다. 이는 추후 레포지토리의 git credential helper에서 인증 수단으로 사용됩니다.
나만의 Codespaces 환경 설정하기
Dotfiles: 사용자 단위의 커스터마이징
Dotfiles는 Backend.AI의 Automount vFolder와 유사한 기능입니다. 사용자가 세션을 시작할 때 마다 미리 지정한 파일이나 폴더를 마운트 하고, 개인 환경 구성을 위한 파일을 실행시킬 수 있습니다.
Dotfiles를 사용하기 위해서는 사용자의 GitHub 계정에 dotfiles 라는 레포지토리를 생성해야 합니다. 이후 dotfiles 에 올라간 파일과 폴더들은 다음과 같은 기준으로 Codespace 세션에 추가됩니다.
.(dot) 으로 시작하는 파일/폴더은 세션의$HOME폴더에 마운트됩니다.- install.sh, install, bootstrap.sh, setup, ... 등등의 파일은 세션을 생성할 때 자동으로 실행됩니다 (자동 실행이 가능한 파일명 예약어의 전체 목록은 이곳을 참고하세요). 파일에 executable 권한이 없으면 EPERM 에러와 함께 실행되지 않습니다.
하지만 Dotfiles는 파일을 저장하는 dotfiles 레포지토리가 무조건 퍼블릭 레포지토리여야 한다는 한계가 있습니다. 이럴 때 사용할 수 있는 수단이 Codespaces Secrets 입니다.
Codespaces Secrets 추가하기
Codespaces Secrets는 Codespace 세션을 실행할 때 미리 정의해 놓은 값들을 환경 변수의 형태로 로드할 수 있는 기능입니다. 액세스 토큰, 비밀번호 등의 민감한 정보를 Codespace 내에서 사용해야 할 때 유용합니다.
Secret을 정의할 때는 다음과 같은 제한 사항이 존재합니다.
- Secret의 이름에는 알파벳 대/소문자, 아라비아 숫자, 언더스코어 (_) 문자만 사용할 수 있습니다.
- Secret의 이름은
GITHUB_로 시작할 수 없습니다. - Secret의 이름은 아라비아 숫자로 시작할 수 없습니다.
- Secret의 이름은 알파벳 대/소문자를 구분하지 않습니다.
- Secret은 최대 100개까지 추가가 가능하며, 개별 Secret의 크기는 64 KB를 넘을 수 없습니다.
추가한 Secret은 Codespace 세션 안에서 같은 이름의 환경 변수로 불러올 수 있습니다.
예: API_KEY 라는 Secret을 등록했다면 $API_KEY로 접근이 가능합니다.
devcontainer.json: 프로젝트 단위의 커스터마이징
앞에서 소개한 Dotfiles와 Codespaces Secrets가 Codespace 세션을 실행하는 사용자가 설정할 수 있는 기능이라면, devcontainer.json은 Codespace 세션을 실행하는 레포지토리 단위로 설정이 가능한 개인화 옵션입니다.
{
"name": "GitHub Codespaces (Default)",
"build": {
"dockerfile": "Dockerfile"
},
"settings": { ... },
"remoteUser": "codespace",
"overrideCommand": false,
"mounts": ["source=codespaces-linux-var-lib-docker,target=/var/lib/docker,type=volume"],
"runArgs": [
"--cap-add=SYS_PTRACE",
"--security-opt",
"seccomp=unconfined",
"--privileged",
"--init"
],
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"GitHub.vscode-pull-request-github"
],
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// "oryx build" will automatically install your dependencies and attempt to build your project
"postCreateCommand": "oryx build -p virtualenv_name=.venv --log-file /tmp/oryx-build.log --manifest-dir /tmp || echo 'Could not auto-build. Skipping.'"
}
이 파일은 Codespace 세션 생성 시 기본적으로 사용되는 devcontainer.json 파일의 일부입니다. Devcontainer 이미지, Codespace 세션을 위한 Docker 설정부터, 세션 설정 중에 실행할 수 있는 Shell command까지 다양한 방법으로 프로젝트의 Codespace 세션을 설정할 수 있습니다. devcontainer를 통해 설정 가능한 항목들은 이곳에서 찾아보실 수 있습니다.
GitHub Codespaces로 Backend.AI 개발 시작하기

Codespaces에서 작동하는 Backend.AI WebUI
래블업 또한 Codespaces의 정식 공개에 대응하여
Codespaces로 Backend.AI를 시작하실 수 있도록 준비중입니다.
{
"name": "Ubuntu",
"postCreateCommand": "bash /workspaces/backend.ai/.devcontainer/bootstrap.sh",
"forwardPorts": [60
22, 8090, 8091]
}
이 devcontainer.json은 Codespace 세션에 Backend.AI의 주요 컴포넌트를 설정하는 역할을 합니다. postCreateCommand에 명시된 bootstrap.sh를 통해 Codespace 환경에 최적화된 Auto-Installer 스크립트를 실행하고, forwardedPorts 옵션을 통해 Backend.AI 클러스터 접근에 필요한 주로 포트를 미리 개방하게 됩니다.
정리
개인적인 생각입니다만, GitHub Codespaces는 그동안 서비스되어 왔던 클라우드 기반의 개발 환경중에 가장 강력한 제품이 될 수 있을 것 같습니다. Visual Studio Code의 거의 모든 기능을 지원하고, 일반 Linux VM과 별반 차이 없는 환경을 구성할 수 있으며, 무엇보다 마이크로소프트라는 든든한 뒷배가 있으니까요.
다만 아직까지는 팀 단위의 계정에서만 Codespaces 기능이 활성화된다는 점은 안타깝습니다. Codespaces를 통해 Backend.AI에 기여하고 싶으시다면 잠시 기다리시는 동안 Backend.AI 오픈소스 기여 가이드를 읽어보시는 것을 추천드립니다!
