在 Heroku 上安装私有 ssh 部署密钥
Posted
技术标签:
【中文标题】在 Heroku 上安装私有 ssh 部署密钥【英文标题】:Installing private ssh deploy keys on Heroku 【发布时间】:2014-11-15 16:54:15 【问题描述】:我正在创建一个 node.js 应用程序,该应用程序用作 Github 的 Web 挂钩,它将在推送更改时自动部署某个私有存储库。为了使 webhook 应用程序尽可能高效,我想在部署时克隆私有 repo 并将其拉入 webhook 的 Heroku 实例中的临时目录中,这样当 webhook 触发时,我只需要“git pull”即可获取最新的更新并部署它们。在部署 webhook 应用程序(使用 package.json 或 Procfile)时运行 shell 脚本很容易,但在运行 git 命令之前,我必须安装私有部署密钥。目前私钥和公钥在我的 webhook 存储库中(我知道,我知道,一旦我让它工作我会做得更好)所以我尝试通过将它添加到我的 shell 脚本来安装它(建议 here)
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 存储库 主机密钥验证失败。 致命:远端意外挂断
公钥已作为部署密钥添加到我正在提取的存储库中,所以我的问题是:
我是否将私钥安装在正确的目录中? 私钥文件是否必须具有特定名称? 这种方法是否可行/推荐? 如果不是最好的选择是什么?谢谢!
【问题讨论】:
也遇到了同样的问题***.com/questions/29604202/… 【参考方案1】:如果您想在构建期间访问私有存储库,那么此构建包是最佳选择:
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 存储库。
【讨论】:
您说过两次“如果您想在构建期间访问私有存储库”。您的意思是第二个“在运行时”吗? 我猜第一个是构建时间。根据 heroku docs 运行时配置变量(例如,使用 heroku config:set 设置的变量)在构建时不可用。【参考方案2】:可以使用“预编译钩子”将您的 deployment key 放在 $HOME/.ssh/id_rsa
上,Heroku 的 buildpack 会很乐意在 compile phase 期间使用它来下载您的私有内容。
您需要在要推送的应用上提交部署密钥和 ssh 配置文件,并编写挂钩代码以将其复制到正确的位置。需要注意的一项是启用未经检查的连接。您的应用的示例 .ssh/config
:
StrictHostKeyChecking no
Some buildpacks 有一个特殊的“预编译钩子”,它在外部包的编译/下载之前运行。不再记录在 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
【讨论】:
以上是关于在 Heroku 上安装私有 ssh 部署密钥的主要内容,如果未能解决你的问题,请参考以下文章
在 Heroku 上存储 SSH 密钥以通过 SFTP 将 Rails 应用程序连接到远程
markdown 如何配置ssh配置以使多个私有github依赖关系具有多个部署密钥和自动部署。
使用不同的 SSH 密钥部署私有 EC2 实例(例如 Ec2.pem)和堡垒主机(例如 BastionKey.pem) - AWS VPC