AngularJS 持续部署工具

AngularJS Continuous Deployment Tools

我一直在尝试使用 Codeship 和 Heroku 来持续部署我目前编写的 AngularJS 应用程序。该应用程序是使用 Yeoman 创建的,并使用了 bower 和 g运行t。最初我认为这似乎是一个非常好的设置,因为 Codeship 是免费使用的,我很快就能配置它来构建我的 AngularJS 项目,它提供了在构建后添加部署步骤的能力。甚至有许多 PaaS 提供商可供选择(Heroku、S3、Google App Engine 等)。但是,我似乎有点无法在 Heroku 上将应用程序设置为 运行。

问题的起因是所有文档都建议我从 .gitignore 中删除 /dist 路径,以便将此目录发布到 Heroku post 构建。这主要来自讨论从本地机器发布到 Heroku 的文档,但我认为这就是 Codeship 在幕后所做的一切。我不想这样做,因为我认为我不应该将构建输出检查到源代码管理中。 /dist 文件夹被添加到 .gitignore 是有充分理由的。此外,这种方式在某种程度上破坏了拥有 CI 服务器的意义,因为我还不如从我的机器上推送最新版本。

经过更多的挖掘,我发现我可以在我的 packages.json 文件中添加一个 post 安装步骤,例如 bower install && grunt build 这将重新 运行在 Heroku 上构建,因此重新填充所有 bower 依赖项(他们希望我签入源代码管理的其他东西!)和 dist 目录。

尝试之后,很明显我需要添加 bowergrunt 作为 packages.json 中的依赖项,这意味着将它们从 devDependencies 中移出才是他们应该属于的地方!

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

如有任何建议,我们将不胜感激。

谢谢

嗨,这里是 Codeship 团队的 Marko。您是否已经向我们发送了关于此的应用内消息?我相信我们可以让您的应用程序在 Codeship 上构建并成功部署到 Heroku。

作为一个非常简短的答案,获得此 运行ning 的最简单方法是将 bowergrunt 添加到 [ 中的依赖项中=22=]。另一种可能性是寻找已安装两个工具的自定义构建包。

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

请随时通过应用内信使(网站右下角)与我联系,我很乐意帮助您完成这项工作!

我找到了两种方法来实现它。

Heroku 节点自定义构建包

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

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

同样在 packages.json 中,我不得不添加:

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

这确保了 bower_components 在 Heroku 中可用。

优点

这让我可以完整地保留 .gitignore 文件,这样 dist 目录中的 'binaries' 和 bower_components 目录中的依赖项就不会被提交到源代码管理。

缺点

这基本上是在 Heroku 上重新构建应用程序,我通常更喜欢在整个构建和部署管道中使用相同的 'binaries'。这样我就知道构建的代码是相同的,测试的代码是相同的,部署的代码也是相同的。

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

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

优点

这只需要构建一次应用程序并部署在测试阶段测试过的相同二进制文件。

缺点

这个脚本我用了好几次了,感觉比较稳定。但是,我知道的一个问题是,当创建新管道时,master 分支上将没有代码,因此该脚本在尝试从 heroku 远程执行合并时失败。目前我通过在开始构建之前将 master 分支初始推送到 Heroku 来解决这个问题,但我想可能有更好的 Git 命令我可以 运行的线; 'only merge this branch if it already exists'.