我想更新一个环境变量或其他东西来跟踪当前活动的部署时间。有什么方法可以从我在 Heroku 上的应用程序中自动执行此操作,还是我必须将其作为部署脚本的一部分来执行?理想情况下,我想要使用 TDDium for CI 与我一起工作的东西,并让他们在构建通过时为我推送到 Heroku。
3 回答
在 Heroku 上使用环境变量
你可以使用 Heroku 的config-vars。这些实际上只是您通过 Heroku CLI 配置的环境变量。例如,您可以将当前日期存储在名为 DEPLOY_TIMESTAMP 的环境变量中。
heroku config:add DEPLOY_TIMESTAMP=$(date)
然后,您应该能够从应用程序中或从命令行访问此环境变量。可以ENV['DEPLOY_TIMESTAMP']
从 Rails 应用程序或通过解析heroku config
本地项目目录的输出来访问该值。
使用别名自动化
如果你想稍微自动化一下,你可以创建一个 Git 别名来推送到 Heroku 并同时更新 DEPLOY_TIMESTAMP。请注意,您不能覆盖真正的 Git 命令的名称,例如push,但您可以添加自定义操作,例如pushstamp。例如:
git config alias.pushstamp \
'! git push heroku master; heroku config:add DEPLOY_TIMESTAMP=$(date)'
也可以看看
您可以通过查看只读 Heroku 文件系统中文件的时间戳来找到上次部署时间。
您可以通过直接使用 ls 查看这些时间戳来验证这一点。运行示例heroku run rails c
:
irb(main):003:0> puts `ls -la`
total 96
drwx------ 14 u51199 51199 4096 May 14 22:49 .
drwxr-xr-x 15 root root 4096 Mar 20 09:43 ..
drwx------ 10 u51199 51199 4096 May 7 02:12 app
drwx------ 2 u51199 51199 4096 May 7 02:17 bin
drwx------ 2 u51199 51199 4096 Mar 14 22:12 .bundle
drwx------ 5 u51199 51199 4096 May 7 02:12 config
-rw------- 1 u51199 51199 226 May 7 02:12 config.ru
drwx------ 3 u51199 51199 4096 May 7 02:12 db
-rw------- 1 u51199 51199 1138 May 7 02:12 Gemfile
-rw------- 1 u51199 51199 11456 May 7 02:12 Gemfile.lock
-rw------- 1 u51199 51199 542 May 7 02:12 .gitignore
drwx------ 5 u51199 51199 4096 May 7 02:12 lib
drwx------ 2 u51199 51199 4096 May 7 02:17 log
-rw------- 1 u51199 51199 57 May 7 02:12 Procfile
drwx------ 2 u51199 51199 4096 May 7 02:13 .profile.d
drwx------ 3 u51199 51199 4096 May 7 02:17 public
-rw------- 1 u51199 51199 249 May 7 02:12 Rakefile
-rw------- 1 u51199 51199 613 May 7 02:12 README.md
-rw------- 1 u51199 51199 31 May 7 02:12 .rspec
drwx------ 7 u51199 51199 4096 May 7 02:12 spec
drwx------ 3 u51199 51199 4096 May 7 02:18 tmp
drwx------ 6 u51199 51199 4096 May 7 02:13 vendor
因此,如果您想知道您的应用程序上次部署的时间,您可以使用File.mtime
并取回一个真实Time
对象:
irb(main):009:0> File.mtime("app")
=> 2015-05-07 02:12:57 +0000
irb(main):010:0> File.mtime("app").class
=> Time
1. 部署到 Heroku 时没有自动方法,除非您制作部署脚本/任务。(我也在 2012 年 6 月搜索过这个)。我有一个执行部署的 rake 任务,其中一部分设置 GIT_TAG 并且我的网页(rails 中的应用程序布局)将其打印到页面上。
下面是我如何写入 Heroku GIT_TAG 配置变量(使用基于 Rails 的 Rake 任务):
tag = `git describe master --always`.strip
`heroku config:add GIT_TAG=#{tag} --app XXXX`
2. 使用 tddium:tddium 现在支持“构建后挂钩”,我增加了他们的标准版本以在该过程中设置 GIT_TAG。首先阅读并关注http://blog.tddium.com/2012/05/09/heroku-continuous-deployment/并在“post_build_hook”任务中添加一些内容以读取标签并设置 heroku config var,如下所示:
namespace :tddium do
def cmd(c)
system c
end
desc "post_build_hook to deploy to dfc-site-qa"
task :post_build_hook do
...use code verbatim from above URL (https://www.tddium.com/support/reference#customization)
...
current_tag = `git describe master --always`.strip
cmd "heroku config:add GIT_TAG=#{current_tag} --app XXXX" or puts "could not set GIT_TAG to #{current_tag}"
...
end
笔记:
根据需要替换上面的“master”。在我的部署 rake 任务(很高兴分享)中,我允许基于分支或标签进行部署(方便绕过 heroku 仅从 master 部署的愿望)。
要让 tddium 运行您的“post_build_hook”,您必须通过运行以下命令停用部署后 URL:tddium suite --edit
并使用“拉网址”的当前值,但将“推网址”设置为空白(或默认值)。博客链接中未提及此步骤。
在当前构建的 tddium 网页中,您现在将看到 post_deploy_hook 日志文件的链接(在页面的最底部),您可以打开它并查看它是如何进行的(也就是调试您的 rake 任务)。