AngularJS持续部署工具

Cho*_*c13 7 heroku node.js continuous-deployment angularjs codeship

我一直在尝试使用Codeship和Heroku来持续部署我目前正在编写的AngularJS应用程序.该应用程序是使用Yeoman创建的,并使用bower和grunt.最初我认为这似乎是一个非常好的设置,因为Codeship可以免费使用,我很快就可以配置它来构建我的AngularJS项目,并且它提供了在构建之后添加部署步骤的能力.甚至有许多PaaS提供商可供选择(Heroku,S3,Google App Engine等).然而,我似乎已经变得有点卡住让Heroku上的应用程序运行.

问题始于所有文档都建议我/dist从我的路径中删除路径,.gitignore以便将此目录发布到Heroku post build.这主要来自谈论从本地机器发布到Heroku的文档,但我认为这无论如何都是Codeship所做的.我不想这样做,因为我不相信我应该检查构建输出到源代码控制.该/dist文件夹已添加到.gitignore有充分理由.此外,这种方式在某种程度上打败了CI服务器,因为我可能只是从我的机器上推出最新版本.

在进行了一些挖掘之后,我发现我可以在我的packages.json文件中添加一个postinstall步骤,例如bower install && grunt build,它将重新运行Heroku上的构建,从而重新填充所有的bower依赖项(他们希望我签入源代码的其他内容)控制!)和dist目录.

在试一试后,很明显我需要添加bowergrunt作为依赖项packages.json,这意味着移动devDependencies它们应该属于它们的位置!

所以我现在似乎陷入困境.我想要做的就是发布我的构建artefacts(/dist)依赖项(/bower_components)和server.js将运行该站点的文件.有谁知道如何使用Heroku和Codeship实现这一目标?或者,任何人都可以使用不同的工具取得成功.我正在寻找免费的东西,我愿意接受它不会生产稳定(不会扩展到多个服务器等),但现在这很好,因为我想做的就是不断部署应用程序内部测试,并能够与我的团队的非技术成员分享输出,以便我们可以讨论我们要优先考虑的功能等.

任何建议将不胜感激.

谢谢

Cho*_*c13 2

我找到了两种方法来让它发挥作用。

Heroku 节点自定义构建包

使用mbuchetics Heroku 构建包。这是通过在将应用程序推送到 Heroku 后重新构建应用程序来实现的。

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

另外packages.json我还必须添加以下内容:

"scripts": {
    "postinstall": "bower cache clean && bower install"
}
Run Code Online (Sandbox Code Playgroud)

这确保了它们bower_components在 Heroku 中可用。

优点

这使我能够保持.gitignore文件完好无损,以便dist目录中的“二进制文件”和目录中的依赖项bower_components不会提交到源代码管理中。

缺点

这基本上是在 Heroku 上重新构建应用程序,我通常更喜欢在整个构建和部署管道中使用相同的“二进制文件”。这样我就知道构建的相同代码、测试过的代码以及部署的代码都是相同的。

它还会减慢部署速度,因为您必须等待应用程序构建两次。

CodeShip 自定义脚本部署

由于对构建应用程序两次的事实不满意,我尝试在 CodeShip 中使用自定义脚本管道,而不是预先存在的 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
Run Code Online (Sandbox Code Playgroud)

优点

这仅需要应用程序的单个构建并部署在测试阶段测试的相同二进制文件。

缺点

我已经使用这个脚本很多次了,它看起来相对稳定。然而,我知道的一个问题是,当创建一个新管道时,分支上将没有代码,master因此该脚本在尝试从远程进行合并时会失败heroku。目前,我通过在master开始构建之前将分支初始推送到 Heroku 来解决这个问题,但我想可能有一个更好的 Git 命令我可以运行:“仅合并该分支(如果它已经存在)”。