netlify는 배포하기가 참 쉽다. 배포할 리포지토리 브랜치를 연결만 해주면 되기 때문이다. 그런데, 서브모듈로 비공개로 설정된 리포지토리를 연결해야한다면?

netlify에서 비공개 repository 연결하기

원래 하던대로 배포를 하면 분명히 오류가 난다. 그 이유는 배포하면서 build할 때, 비공개된 리포지토리에 접근한 권한이 없기 때문이다.
이 블로그의 경우 blog-contents 리포지토리를 따로 분리하여 블로그의 컨텐츠 원본파일을 비공개로 관리한다.

Deploy log를 살펴보면 다음과 같다.

3:21:39 AM: Error checking out submodules: Submodule 'contents' (https://github.com/사용자/프로젝트) registered for path 'contents'
Cloning into '/opt/build/repo/서브모듈'...
fatal: could not read Username for 'https://github.com': No such device or address
fatal: clone of 'https://github.com/사용자/프로젝트' into submodule path '/opt/build/repo/contents' failed
Failed to clone 'contents'. Retry scheduled

netlify Deploy key 받기

Deploy Key는 SSH키 형식이다. SSH키는 공개된 키와 비공개 키 두개가 한쌍으로 이루어져있다. 즉, 이 두개의 키가 맞아야 권한이 주어지는 형태이다. netlify에서 deploy키를 생성하는데, 비공개키는 netlify에 저장되고(우리는 볼 수 없다) 공개 키를 제공한다.

이 공개된 키를 비공개 리포지토리에 넣어주면, build할 때 키가 서로 맞기 때문에 접근할 권한이 주어지는 것이다.

  1. netlfiy 로그인 후, 해당 배포 항목의 Settings
  2. Build & deploy 항목에서 Deploy key에 보면 길고 긴 키가 발급되어있다. (새로운 키를 발급받고 싶다면 Gernate public deploy key 클릭)

deploy key

netlfiy Deploy key 발급

  1. 위의 ssh-rsa로 시작하는 것이 deploy key이다. 이 키가 서브모듈 접근을 허락 해주는 것이다! ssh부터 끝까지 복사하여 깃허브로 이동한다.

Github에 Deploy key 등록하기

  1. 서브모듈 리포지토리 Settings > Deploy keys에서 Add deploy key로 추가!
  2. Title은 자유롭게 적고, key에 3에서 복사해온 키를 전부붙여넣기. 읽기만 가능하도록 Allow write access는 체크하지 않기. Add key 버튼 눌러 키 등록 완료.
    github deploy key

    github 서브모듈 리포지토리에 발급받은 key 등록

  3. 올바르게 등록되고 deploy했다면 아래처럼 초록색으로 표시된다.
    github deploy key result

    올바르게 키가 사용된 모습

추가: 그래도 안된다면? 서브모듈의 url 형태를 변경해보자.

잘 배포되다가 새로운 포스팅 후 갑자기 배포가 안되기 시작했다. Deploy log 형태는 처음 오류와 같았다.

fatal: could not read Username for 'https://github.com': No such device or address
fatal: clone of 'https://github.com/사용자/서브모듈' into submodule path '/opt/build/repo/contents' failed
Failed to clone 'contents'. Retry scheduled

같은 오류를 해결한 방법으로 다시 안되다니... 🤦‍♀️
어쨌든 해결해야하니, 몇가지 방법을 시도해보았다.

  1. Deploy Key 재발행, 재등록 → 실패

    • 같은 방법으로 Deploy Key를 새로 발급받아 github repository에 재등록 했으나 배포되지 않고 실패.
    • 심지어 github에서는 Deploy key가 사용되지 않았다고 표시.
  2. Clear cache and deploy site → 실패

    • Trigger deploy 버튼 중, 캐시 삭제 후 배포 버튼으로 시도했으나 실패.
  3. submodule url format을 SSH로 변경 → 해결✨

    • .gitmodules파일에서 비공개 서브모듈 url부분을 ssh 형태(git@github.com:사용자/리포지토리.git)로 변경한다.
    .gitmodules
    [submodule "서브모듈이름"]
      path = 서브모듈이름
      url = git@github.com:사용자/리포지토리.git

    ssh

    github에서 ssh 주소 찾기

    • netlify docs을 살펴보면 다음과 같은 문장이 있어서 SSH 형태로 변경해보았다.

      If the repository is private, or if you prefer to use ssh format (for example, git@github.com:owner/project.git), you will need to follow the instructions below to generate a deploy key in Netlify and add it to the submodule repository settings.

      만약 리포지토리가 비공개거나, ssh 형식을 사용하는 것을 선호한다면, deploy key를 Netlify에서 발급받고 서브모듈 리포지토리 설정에서 등록해야한다.

    • 기존에 잘 작동하기도 했고... docs에서도 또는(or)으로 표현하고 있으므로, 서브모듈 리포지토리가 비공개라고해서 무조건 ssh형태로 써야하는 것은 아닌 것 같다. 기존 주소를 갑자기 읽지 못하는 상황에서, format을 바꿔주니 서브모듈 읽는 것을 다시 새롭게 시도했던 것이 아닐까 추측한다.

마무리

어렵진 않지만, 정리해두면 좋을것 같아서...

Reference & Learn More

netlifycommunity: How do I access private repositories in the build environment?
netlify docs Deploy keys

Comments