Установка закрытых ключей развертывания ssh на Heroku

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

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 / repos / assets / Ошибка проверки ключа хоста. фатальный: удаленный конец неожиданно повесил трубку

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

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

Спасибо!


person Brad Urani    schedule 21.09.2014    source источник
comment
Решите ту же проблему stackoverflow.com/questions/29604202/   -  person Mikko Ohtamaa    schedule 13.04.2015


Ответы (2)


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

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

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

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

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

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

person Aidan    schedule 17.02.2016
comment
Вы дважды сказали, что хотите получить доступ к частным репозиториям во время сборки. Вы имели в виду во время выполнения второго? - person Stéphane; 24.05.2017
comment
Я предполагаю, что первая была связана с временем сборки. Согласно docs переменные конфигурации времени выполнения (например, установленные с помощью heroku config: set) недоступны во время сборки. - person dstdnk; 10.07.2020

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

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

StrictHostKeyChecking no

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

Пример кода на bin/pre_compile, созданного из корневого каталога приложения:

#!/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
person alanjds    schedule 15.07.2017