AngularJS持续部署工具

我一直在尝试使用Codeship和Heroku来连续部署我正在编写的AngularJS应用程序。 该应用程序使用Yeoman创build,并使用凉亭和咕噜声。 起初,我认为这看起来像一个非常好的设置Codeship是免费使用,我很快就能够configuration这个来build立我的AngularJS项目,并提供了在构build后添加部署步骤的能力。 甚至有很多PaaS供应商可供select(Heroku,S3,Google App Engine等)。 但是,我似乎已经成为一个让Heroku上运行的应用程序卡住了。

问题出在这样的事实,即所有的文档都build议我从.gitignore删除/distpath,以便将这个目录发布到Heroku后期构build中。 这主要是从本地机器上谈到向Heroku发布的文档,但是我认为这是所有Codeship正在引擎盖下进行的。 我不想这样做,因为我不相信我应该检查生成输出到源代码pipe理。 /dist文件夹被添加到.gitignore有一个很好的理由。 而且,这种有点让人失望的CI服务器,不如从我的机器上推出最新的版本。

经过一些更多的挖掘后,我发现我可以添加一个postinstall步骤到我的packages.json文件中,例如bower install && grunt build ,它将重新运行Heroku上的构build,从而重新填充所有的bower依赖项(他们想要的其他东西检查源代码pipe理!)和dist目录。

给了这个尝试后,显然我需要在packages.json添加bowergrunt作为依赖关系,这意味着将它们从devDependencies移动到它们应该属于的地方!

所以我现在好像被卡住了 我想要做的就是发布我的构build文物( /dist )依赖项( /bower_components )和将运行该站点的server.js文件。 有没有人知道如何用Heroku和Codeship实现这一点? 或者有人使用不同的工具有任何成功。 我正在寻找一些免费的,我愿意接受,它不会生产稳定(不会扩展到多个服务器等),但现在这是好的,因为我想要做的就是不断地部署应用程序内部testing,并能够与我的团队的非技术成员分享输出,所以我们可以讨论我们想优先考虑的function等。

任何build议将不胜感激。

谢谢

来自Codeship船员的Ahoy,Marko。 您是否已经向我们发送了关于此的应用消息? 我相信我们可以让您的应用程序build立在Codeship上并成功部署到Heroku。

作为一个非常简短的答案,最简单的方法就是在package.json中添加bowergrunt到你的依赖关系。 另一种可能性是使用已经安装的工具查找定制的buildpack。

最后,您还可以在Codeship上运行这些工具,将新安装的文件添加到存储库中,提交更改并将此新提交推送到Heroku。 如果你想使用这个,你可能需要强制推送更改。

随时通过在应用程序的使者(网站的右下angular)与我联系,我很乐意帮助你得到这个工作!

我find了两种方法来使这个工作。

Heroku节点自定义Buildpack

使用mbuchetics Heroku构build包。 一旦它被推送到Heroku,这基本上重build应用程序。

我仍然需要使用一些技巧来完成这项工作。 在Gruntfile.js需要configuration两个新任务heroku:productionheroku:development 。 这是构build包执行来构build应用程序的内容。 我最初只是主要的build任务,但发现buildpack或Heroku有运行jshint的问题,所以最后我复制了build任务,并拿出了我不需要的部分。

packages.json我不得不添加这个:

 "scripts": { "postinstall": "bower cache clean && bower install" } 

这确保了bower_components在Heroku中可用。

优点

这使我可以保持.gitignore文件的完整,以便dist目录中的“二进制文件”和bower_components目录中的依赖文件不会被提交到源代码控制中。

缺点

这基本上是重新构build应用程序,一旦它在Heroku上,我通常喜欢在整个构build和部署pipe道中使用相同的“二进制文件”。 这样我就知道,构build的代码与被testing的代码是相同的,并且与已部署的代码相同。

这也会减慢部署,因为您必须等待应用程序构build两次。

CodeShip自定义脚本部署

不满意的事实,我正在build设我的应用程序两次,我尝试在CodeShip中使用自定义脚本pipe道,而不是现有的Heroku。 该脚本基本上修改了.gitignore文件以允许提交dist文件夹,然后将其推送到Heroku远程(这会使origin远程的代码不受更改影响)。

我结束了以下bash脚本:

 #!/bin/bash gitRemoteName="heroku_$APP_NAME" gitRemoteUrl="git@heroku.com:$APP_NAME.git" # Configure git remote git config --global user.email "you-email@example.com" git config --global user.name "Build" git remote add $gitRemoteName $gitRemoteUrl # Allow dist to be pushed to heroku remote repo echo '!dist' >> .gitignore # Also make sure any other exclusions dont apply to that directory echo '!dist/*' >> .gitignore # Commit build output git add -A . herokuCommitMessage="Build $CI_BUILD_NUMBER for branch $CI_BRANCH. Commited by $CI_COMMITTER_NAME. Commit hash $CI_COMMIT_ID" echo $herokuCommitMessage git commit -m "$herokuCommitMessage" # Must merge the last build in Heroku remote, but always chose new files in merge git fetch $gitRemoteName git merge "$gitRemoteName/master" -X ours -m "Merge last build and overwrite with new build" # Branch is in detached mode so must reference the commit hash to push git push $gitRemoteName $(git rev-parse HEAD):refs/heads/master 

优点

这只需要一个应用程序的构build,并部署相同的二进制文件在testing阶段进行testing。

缺点

我已经使用了这个脚本好几次了,看起来相对稳定。 但是我知道的一个问题是,当一个新的pipe道被创build时, master分支上将没有代码,所以当这个脚本尝试从heroku远程进行合并时,这个脚本会失败。 目前我通过在启动构build之前将master分支初始推向Heroku来解决这个问题,但是我想可能有更好的Git命令可以运行; '只有合并这个分支,如果它已经存在'。

Interesting Posts