在Heroku上安装专用ssh部署密钥



我正在创建一个node.js应用程序,该应用程序用作Github的web挂钩,当推送更改时,它将自动部署特定的私有回购。为了使webhook应用程序尽可能高效,我想在部署时将私有repo克隆并拉入我的webhook的Heroku实例中的临时目录,这样当webhook启动时,我只需要"git pull"即可获得最新更新并部署它们。在部署webhook应用程序时(使用package.json或Procfile)运行shell脚本很容易,但在运行git命令之前,我必须安装专用部署密钥。目前私钥和公钥都在我的webhook repo中(我知道,我知道,一旦我让它工作起来,我会做得更好),所以我尝试通过将其添加到我的shell脚本中来安装它(这里建议)

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

但我得到了:

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

公钥已被添加为我提取的回购中的部署密钥,因此我的问题是:

  • 我是否在正确的目录中安装私钥
  • 私钥文件必须有一个特定的名称吗
  • 这种方法是否可行/推荐
  • 如果没有,最好的选择是什么

谢谢!

如果你想在构建期间访问私有存储库,那么这个构建包是最好的选择:

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

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

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

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

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

可以使用"预编译挂钩"将部署密钥放在$HOME/.ssh/id_rsa上,Heroku的构建包将很乐意在编译阶段使用它下载您的私有内容。

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

StrictHostKeyChecking no

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

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

最新更新