从正在运行的Dyno获取Heroku版本号/代码版本

时间:2014-12-12 22:24:23

标签: heroku

是否有可能从正在运行的dyno中获取每个slug / release的唯一键?我正在关注此article以设置RAILS_CACHE_ID(对于部署后的etags到期),但发现dynos不再附带配置GIT(导致此错误):

fatal: Not a git repository (or any parent up to mount point /app)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).

我还考虑将其设置为config/initializers到当前时间,但显然不适用于多个dynos。有什么想法吗?

2 个答案:

答案 0 :(得分:12)

有一个新的(2015年11月)实验室功能可以满足您的需求“Dyno元数据”https://devcenter.heroku.com/changelog-items/768

heroku labs:enable runtime-dyno-metadata -a <app name>

然后在heroku:

~ $ env
HEROKU_APP_ID:                   9daa2797-e49b-4624-932f-ec3f9688e3da
HEROKU_APP_NAME:                 example-app
HEROKU_DYNO_ID:                  1vac4117-c29f-4312-521e-ba4d8638c1ac
HEROKU_RELEASE_VERSION:          v42
HEROKU_SLUG_COMMIT:              2c3a0b24069af49b3de35b8e8c26765c1dba9ff0
HEROKU_SLUG_DESCRIPTION:         Deploy 2c3a0b2

答案 1 :(得分:0)

一种解决方案是使用git pre-push hook来设置heroku配置值。由于它在push和slug编译之前完成,所以config变量将作为rails var提供给你的rails应用程序。

.git/hooks/pre-push:

#!/bin/sh

remote="$1"
url="$2"
while read local_ref local_sha remote_ref remote_sha
do
  if [[ $url =~ heroku ]] ; then
    app=$(git remote show -n $remote | sed -n -E -e 's/[[:space:]]+(Push[[:space:]]+URL)(\/|:).+(:|\/)(.*)\.git$/\4/gp')
    echo Setting RAILS_CACHE_ID to $local_sha on app $app
    heroku config:set RAILS_CACHE_ID=$local_sha --app $app
  fi
done
exit 0

pre-push.sample文件包含一些关于调用钩子的参数的文档。我使用git remote的详细输出来确定在哪个应用程序上设置配置值。 &#39; -E&#39; sed的选项适用于Mac OS X - 如果您使用的是GNU sed,请使用&#39; -r&#39;替换它。

另一种解决方案是通过profile.d脚本使用heroku-api来获取唯一的版本ID。此示例使用curl使用RANGE标头获取最新版本ID。它不是提交引用,但它对每个版本都是唯一的,包括回滚和配置更改。您需要将API_KEY和APP_NAME设置为heroku配置变量。

.profile.d/release.sh

# get release id and set as RAILS_CACHE_ID

# Heroku config variables that need to be set
# API_KEY: heroku api key (get from dashboard or `heroku auth:token`
# APP_NAME: set this to your app_name (this could be hardcoded in the profile.d script but
#           would make it harder to manage apps with multiple environments

res=$(curl -s -H "Accept: application/vnd.heroku+json; version=3"\
              -H "Authorization: Bearer $API_KEY"\
              -H "Range: version ..; order=desc, max=1"\
              -X GET https://api.heroku.com/apps/$APP_NAME/releases)
release_id=$(ruby -rjson -e "j = JSON.parse('$res'); puts j[0]['id']")

export RAILS_CACHE_ID=$release_id

在rails应用程序中,ENV [&#39; RAILS_CACHE_ID&#39;]现在应设置为最新的版本ID。您也可以在rails初始化程序中使用相同的策略。