在Heroku上安装私有ssh部署密钥

时间:2014-09-21 17:32:25

标签: heroku github ssh-keys

我正在创建一个node.js应用程序,该应用程序充当Github的Web挂钩,在推送更改时将自动部署某个私有仓库。为了使webhook应用程序尽可能高效,我希望克隆并将私有仓库拉入我webhook的Heroku实例中的临时目录,以便在webhook启动时我只需要' git pull'获取最新更新并部署它们。部署webhook应用程序(使用package.json或Procfile)时,运行shell脚本很容易,但在运行git命令之前,我必须安装私有部署密钥。目前私钥和公钥都在我的webhook repo中(我知道,我知道,一旦我开始工作,我会做得更好)所以我尝试通过将它添加到我的shell脚本来安装它(建议{{3 }})

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

但我得到了:

  

/ tmp / repos / assets /中初始化的空Git存储库   主机密钥验证失败。   致命:远程端意外挂断

公共密钥已作为部署密钥添加到我提供的回购中,所以我的问题是:

  • 我是否将私钥安装在正确的目录中?
  • 私钥文件是否必须具有特定名称?
  • 这种方法是否可行/推荐?
  • 如果不是最佳选择?

谢谢!

2 个答案:

答案 0 :(得分:3)

如果要在构建期间访问私有存储库,那么此buildpack是最佳选择:

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

这允许您使用Github Access Token设置环境变量。在构建过程中,使用访问令牌创建.netrc文件,该文件将允许您访问该用户的任何存储库。

但是,如果您想在构建期间访问私有存储库,例如如果你的web dyno正在进行git操作,那么你可以用包含访问令牌的方式指定存储库URI:

https://your_user:your_token@github.com/ABASystems/abas-engineering.git

这两种方法都允许您在不泄露密码的情况下访问私有git存储库。

答案 1 :(得分:0)

可以使用&#34;预编译钩子&#34;将deployment key放在$HOME/.ssh/id_rsa上,Heroku的buildpack会很乐意使用它在compile phase期间下载您的私人资料。

您需要在要推送的应用上提交部署密钥和ssh configfile,并对钩子进行编码以将其复制到正确的位置。需要注意的是启用未经检查的连接。您的应用的示例.ssh/config

StrictHostKeyChecking no

Some buildpacks有一个特殊的&#34;预编译钩子&#34;,它在编译/下载外部包之前运行。不再记录在Heroku上,但是有点标准存在。这里有一些&#34;替代品&#34; docs:https://deis.com/docs/workflow/applications/using-buildpacks/#compile-hooks。至少Python和NodeJS构建包以这种或那种方式支持它。

bin/pre_compile上的代码示例,从app的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