Heroku应用程序可以自动从GitHub部署

时间:2013-09-05 15:09:09

标签: git heroku github hubot

Heroku是否允许内部的应用程序git clone(例如,通过一个简单的bash脚本)本地远程存储库并推送到其他可用的远程数据库?

我正在考虑编写一个自动(但手动触发)hubot script

要做到这一点,在Heroku上,您应该能够:

  1. 运行命令(例如git
  2. 将克隆的存储库保存在文件系统中
  3. 感谢。

    更新

    基于Benjamin’s answer,我尝试如下,但即使在会话之间,这似乎也不会保留文件。有什么想法吗?

    $ heroku create
    Creating obscure-river-7652... done, stack is cedar
    http://obscure-river-7652.herokuapp.com/ | git@heroku.com:obscure-river-7652.git
    
    $ heroku run --app obscure-river-7652 bash
    Running `bash` attached to terminal... up, run.4427
        $ find .
        .
        $ mkdir -p foobar
        $ touch foobar/README 
        $ find .
        .
        ./foobar
        ./foobar/README
        $ exit
    
    $ heroku run --app obscure-river-7652 bash
    Running `bash` attached to terminal... up, run.5463
        $ find .
        .
    

1 个答案:

答案 0 :(得分:1)

是的,那会有效。 Heroku有一个ephemeral writable filesystem,它允许你从dyno写入数据。但是,当您重新启动dyno或启动新数据时,数据将会消失(因为它是短暂的)。但是,如果你同时拉动和推动,它就不会成为问题。

可能存在的一个问题是设置权限。如果您希望dyno能够访问私有存储库,则必须在Heroku上设置私钥或用户名和密码。

一种方法是使用GitHub deploy keys。设置部署密钥以在Heroku应用程序上使用,并使用私钥设置heroku config:set PRIVATE_KEY=ABCD123...之类的内容。部署密钥也必须出现在您部署到的任何服务器上。这可以在您的Heroku account或服务器上的~/.ssh/authorized_keys中。

然后,有两种方法可以将此密钥放入正在运行的Hubot实例中。

使用初始化程序

创建〜/ .ssh / id_rsa

在您的应用运行之前,请使用初始化程序或其他启动脚本将$PRIVATE_KEY中的数据放入~/.ssh/id_rsa。这可以通过自定义Hubot插件完成,我将研究如何完成。

使用自定义buildpack

在构建时创建〜/ .ssh / id_rsa

对于更高级的设置,您可以使用自定义buildpack在编译期间使用user-env-compile功能,multi buildpack buildpack和inline buildpack将密钥复制到ssh目录中。

启用user-env-compile。

heroku labs:enable user-env-compile

配置您的应用以使用多个buildpack。

heroku config:add BUILDPACK_URL=https://github.com/ddollar/heroku-buildpack-multi.git

将内联buildpack和原始buildpack添加到.buildpacks

cat > .buildpacks << BUILDPACKS
https://github.com/kr/heroku-buildpack-inline.git
https://github.com/heroku/heroku-buildpack-nodejs.git
BUILDPACK

最后,为自定义buildpack创建脚本。

在bin / release中,

echo '--- {}'

在bin / detect

echo 'custom'

在bin / compile

mkdir ~/.ssh
chmod 700 ~/.ssh/
cat > ~/.ssh/id_rsa << KEY
-----BEGIN RSA PRIVATE KEY-----
$PRIVATE_KEY
-----END RSA PRIVATE KEY-----
KEY
chmod 400 ~/.ssh/id_rsa
ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

现在发生的事情是,当您的应用程序被推送到Heroku时,多buildpack将运行内联buildpack。内联buildpack将从bin/{compile,detect,release}运行您的自定义buildpack。此自定义buildpack将$PRIVATE_KEY环境变量复制到~/.ssh/id_rsa并生成公钥。 $PRIVATE_KEY可用,因为已启用user-env-compile功能。最后,multi buildpack运行原始的Node.js buildpack,一切都应该顺利运行。

注意事项

如果您使用此buildpack方法,使用heroku config:set PRIVATE_KEY=mynewkey更新私钥,您的应用将重新启动,但重建。你需要推送一个空提交,如下所示:

git commit -m "Rebuild private key." --allow-empty && git push heroku master

或者等到下次部署Heroku时自动重建密钥。