2014-09-21 3 views
3

Я создаю приложение node.js, которое служит веб-крюком для Github, который автоматически разворачивает определенное частное репо при вводе изменений. Чтобы сделать приложение webhook настолько эффективным, насколько это возможно, я хочу клонировать и вытаскивать частное репо во временный каталог в экземпляре Heroku моего веб-хостинга при его развертывании, так что, когда срабатывает webhook, мне нужно только «git pull», чтобы получить последние обновления и развертывания. Достаточно просто запустить сценарий оболочки, когда приложение webhook развернуто (с использованием package.json или Procfile), но прежде чем запускать git-команды, я должен установить закрытый ключ развертывания. В настоящее время частный и открытый ключ находятся в моем реестре webhook (я знаю, я знаю, как только я его заработаю, я сделаю лучше), поэтому я попытался установить его, добавив это в свой сценарий оболочки (который был предложен here)Установка личных ключей ssh ​​для развертывания на Heroku

mkdir /app/.ssh 
cp config/ssh/* /app/.ssh/ 
mkdir /tmp/repos 
git clone --bare ssh://github.com/<username>/<repo>.git /tmp/repos/<repo> 

, но я получаю:

инициализирован пустой репозиторий Git в TMP/хранилищу/активов/ проверки ключа/хоста не удалось. со смертельным исходом: Удалёнными повесил трубку неожиданно

Открытый ключ был добавлен в качестве ключа развертывания в репо я вытягивать, поэтому мои вопросы:

  • Может ли я устанавливать закрытый ключ в правильном каталоге?
  • В личном ключевом файле должно быть определенное имя?
  • Этот подход даже возможен/рекомендуется?
  • Если нет лучшей альтернативы?

Спасибо!

+0

Хит ту же проблему слишком http://stackoverflow.com/questions/29604202/heroku-pulling-from-a-private-git-repository-using-a-custom-ssh-key –

ответ

2

Если вы хотите получить доступ к частным хранилищам во время сборки, то это buildpack лучший вариант:

https://github.com/timshadel/heroku-buildpack-github-netrc

Это позволяет установить переменную окружения с Github Access Token. Во время процесса сборки создается файл .netrc с токеном доступа, который даст вам доступ к любым репозиториям для этого пользователя.

Если вы хотите получить доступ к частным репозиториям во время сборки, например. если ваш веб-дино делает операции GIT, то вы можете указать хранилище URI в пути, который включает в свой маркер доступа:

https://your_user:[email protected]/ABASystems/abas-engineering.git

Оба этих метода позволяют получить доступ к частным GIT репозиториев, не подвергая свой пароль.

+0

Вы сказали дважды: «Если вы хотите получить доступ к приватным репозиториям во время сборки». Вы имели в виду «во время выполнения» для второго? –

0

Есть возможность использовать «предварительную компиляцию крюк», чтобы положить ваши deployment key на $HOME/.ssh/id_rsa и buildpack Heroku будет счастливо использовать его для загрузки личных вещей во время их compile phase.

Вам необходимо будет зафиксировать ключ развертывания и конфигурационный файл ssh в приложении, чтобы он был нажат, и закодируйте крючок, чтобы скопировать его в нужное место. Один из необходимых предостережений - включить непроверенные соединения.Пример .ssh/config для вашего приложения:

StrictHostKeyChecking no 

Some buildpacks имеет специальный «предварительную компиляцию крюк», который работает до компиляции/загрузки внешних пакетов. Больше не документировано на Heroku, но является своего рода стандартом для существования. Вот несколько «альтернативных» документов: https://deis.com/docs/workflow/applications/using-buildpacks/#compile-hooks. По крайней мере, Python и NodeJS buildpacks поддерживают его так или иначе.

Пример кода на bin/pre_compile, поручены от ROOTDIR из приложения:

#!/usr/bin/env bash 
set -eo pipefail 

# The pre_compile hook is run by heroku-buildpack-python 
echo "-----> I'm pre-compile hook" 

# Work around Heroku bug whereby pylibmc isn't availbale during 
# compile phase. See: https://github.com/heroku/heroku-buildpack-python/issues/57 
export MEMCACHE_SERVERS='' MEMCACHIER_SERVERS='' 

if [ -f bin/set_ssh_key ]; then 
    echo "-----> Running set_ssh_key" 
    chmod +x bin/set_ssh_key 
    bin/set_ssh_key 
fi 

echo "-----> Pre-compile done" 

И для bin/set_ssh_key:

#!/usr/bin/env bash 
set -eo pipefail 

if [ -d "$BUILD_DIR/.ssh" ]; then 
    echo "-----> Copying $BUILD_DIR/.ssh over $HOME/.ssh..." 

    if [ ! -d "$HOME/.ssh" ]; then 
     mkdir $HOME/.ssh 
    fi 

    cp -rv $BUILD_DIR/.ssh/* $HOME/.ssh/ 
    echo "  done." 
fi 
Смежные вопросы