【问题标题】:Reflecting Heroku push version within the app在应用程序中反映 Heroku 推送版本
【发布时间】:2012-02-06 05:47:39
【问题描述】:

每次我将我的应用推送到 heroku 时,我都会看到这条线

-----> Launching... done, v43

有没有办法让该版本号出现在应用程序中,以便其他人可以看到该号码?

【问题讨论】:

  • 这是真的,但我的意思是自动:)
  • copy/paste 不是程序员的朋友,自动化才是。请参阅my answer 以使其自动化。
  • 现在有一种方法可以使用 Heroku 实验室功能自动执行此操作,而无需编写任何自定义代码。查看this answer 了解如何实现自动化。
  • 为什么需要进行设置更改?看到我的答案有一个简单的全局解决方案。 stackoverflow.com/questions/8792716/…
  • 如果我的回答也适用于您,而无需额外的编码工作,您也应该将其视为已接受。 stackoverflow.com/a/39140786/2312605我的答案在下面你可以使用链接

标签: git ruby-on-rails-3.1 heroku


【解决方案1】:

现在可以尝试 Roberto 在他的回答中提到的 Heroku 功能,而无需联系 Heroku。它叫做Heroku Labs: Dyno Metadata,你可以通过

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

然后信息作为环境变量可用(在下一次部署时):

~ $ env
HEROKU_APP_ID:                   <some-hash-appId>
HEROKU_APP_NAME:                 example-app
HEROKU_DYNO_ID:                  <some-hash-dynoId>
HEROKU_RELEASE_VERSION:          v42
HEROKU_SLUG_COMMIT:              <some-hash-slugCommit>
HEROKU_SLUG_DESCRIPTION:         Deploy 2c3a0b2
...

我们不需要设置任何配置文件。

【讨论】:

  • 这对我来说是最薄的实现,谢谢!
【解决方案2】:

遵循@jassa 的答案 - 但使用更新的 PlatformAPI

if (app_name = ENV["HEROKU_APP_NAME"]).present? and ENV['HEROKU_API_KEY'].present?
  require 'platform-api'
  heroku = PlatformAPI.connect(ENV['HEROKU_API_KEY'], default_headers: {'Range' => 'version ..; order=desc'})
  released_at_s = heroku.app.info(app_name)['released_at']
  released_at_d = Time.parse(released_at_s).strftime('%Y-%m-%d')
  release = heroku.release.list(app_name).first
  deploy_v = release['description']
  version = release['version']
  ENV['HEROKU_RELEASE_NAME'] = "#{version} (#{deploy_v}) #{released_at_d}"
end

【讨论】:

    【解决方案3】:

    在使用 JavaScript fetch(以及即将推出的 async/await)的 Node.js 中,您可以使用以下代码(没有推送挂钩!):

    const fetch = require('node-fetch');
    const url = 'https://api.heroku.com/apps/myapp/releases';
    const headers = {
        Accept:        'application/vnd.heroku+json; version=3',
        Authorization: 'Basic '+base64Encode(':'+process.env.HEROKU_API_TOKEN)
    };
    const response = await fetch(url, { headers });
    const releases = await response.json();
    const lastRelease = releases[releases.length-1];
    const version = lastRelease.version;
    const created = lastRelease.created_at;
    

    使用

    function base64Encode(str) {
        return new Buffer(str, 'binary').toString('base64');
    }
    

    注意这需要

    $ heroku config:set HEROKU_API_TOKEN=\`heroku auth:token`.
    

    devcenter.heroku.com/articles/platform-api-reference#release-list

    【讨论】:

      【解决方案4】:

      我正在使用 Codeship,所以我打算将其添加到推送配置中:

      heroku config:add HEROKU_RELEASE_VERSION=$(heroku releases | head -2 | awk 'NR==2' | awk '{print $1}')

      请注意,另一个类似的答案是无效的,因为它正在抓取一些较新的版本(它使用尾部而不是头部)并且它尝试将其设置为两个版本而不是一个版本(即:v100 \n v101)。

      【讨论】:

        【解决方案5】:

        为什么要在每次推送之后依赖运行命令?接受的答案比自己设置配置更糟糕。

        改为添加到您的 Gemfile:

        gem 'heroku-api'
        

        将您的应用名称和 API 密钥添加到 Heroku 配置中:

        $ heroku config:add HEROKU_APP_NAME=myapp HEROKU_API_KEY=bp6ef3a9...
        

        然后在config/initializers/heroku.rb

        unless (app_name = ENV["HEROKU_APP_NAME"]).nil?
          require 'heroku-api'
        
          heroku  = Heroku::API.new(:api_key => ENV["HEROKU_API_KEY"])
          release = heroku.get_releases(app_name).body.last
        
          ENV["HEROKU_RELEASE_NAME"] = release["name"]
        end
        

        最后:

        puts ENV["HEROKU_RELEASE_NAME"]
        => v42
        

        现在它是完全自动化的。您可以忘记它并继续开发您的应用程序。

        【讨论】:

        • 这是一个非常优雅的答案,比恕我直言接受的答案更好。我唯一要改变的是 API 密钥也应该是配置的一部分,而不是硬编码。请记住,这会将您帐户的 API 密钥公开给所有协作者,因此最好为此添加特定的协作者。
        • 一旦我想到这仅在应用程序在 Heroku 上运行时才有效... 呃!我只是通过导航栏上的 ENV["HEROKU_RELEASE_NAME"] 。谢谢!
        • 此解决方案效果很好,但请注意。您必须手动更新 HEROKU_API_KEY。如果您更改 Heroku 帐户的密码,则需要更新 HEROKU_API_KEY 配置变量。今天早上这点我,你会看到“提供的凭据无效”。如果发生这种情况,在启动日志中。
        • 我相信现在已经弃用了,取而代之的是 PlatformAPI
        • 这是一个适用于新平台 API 的版本:heroku = PlatformAPI.connect_oauth(ENV["HEROKU_API_KEY"]) release = heroku.release.list(app_name).last ENV["HEROKU_RELEASE_NAME"] = "v#{release['version']}"
        【解决方案6】:

        每个 push 之后,运行(假设是bash shell):

        heroku config:add rel=$(heroku releases | tail -2 | awk '{print $1}')
        

        然后,您可以从您的应用程序中访问 rel 环境变量。

        或者,如果您想显示推送日期,IMO 代表更有意义的信息:

        heroku config:add rel=$(heroku releases | tail -2 | awk '{print $5,$6,$7}')
        

        或者,我最喜欢的,它包含没有空格的日期和版本:

        heroku config:add rel=$(heroku releases | tail -2 | awk '{print $5"t"$6$7"."$1}')
        

        【讨论】:

        • 并且您需要在每个部署之后执行此操作
        • 这可行,但它会导致您的应用重新启动以应用更改的配置。不是表演停止者,而是需要注意的事情。
        • 添加/更改发布配置变量不会增加发布版本(devcenter.heroku.com/articles/releases)吗?如果是这样,那么 rel 将始终落后一个版本,并且日期将是前一个版本的日期。
        • @Erik 可能。我没有注意到这一点。我可能会将脚本修改为 +1 heroku releases 并改用 $(date)。也就是说,由于它只是配置更改而不是代码更改(并且希望不会更改任何代码路径),因此对于正在运行的代码而言,该版本确实可以被认为是正确的。
        【解决方案7】:

        您可以制作一个 Ruby 文件来执行以下操作:

        require 'heroku'
        
        heroku = Heroku::Client.new('username','password')
        puts heroku.releases('appname')
        

        这会返回一个 JSON 文档,其中包含有关您的部署的大量元数据,包括 SHA、版本号等。

        【讨论】:

          【解决方案8】:

          我遇到了同样的问题,并通过部署 POST HTTP 挂钩解决了问题。基本上逻辑是我在我的应用程序中创建了一个特定的 URL,然后我发布了新值来更新配置变量。

          我是在 Python/Django 中完成的,但我确信同样的逻辑也可以用于其他语言:

          import heroku
          cloud = heroku.from_key(settings.HEROKU_API_KEY)
          app = cloud.apps['mycoolapp']
          latest_release = app.releases[-1]
          app.config['RELEASE'] = latest_release.name
          result['status'] = 200
          

          【讨论】:

            【解决方案9】:

            AFAIK 你只能通过 CLI 获取版本:

            heroku releases --app <YOUR_APP_NAME>
            

            您可以通过应用程序中的 Heroku gem 来执行此操作,但这可能会带来更多麻烦。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-03-15
              • 2011-09-20
              • 2018-12-22
              • 2017-08-04
              • 1970-01-01
              • 2010-12-30
              • 2016-12-04
              • 2017-01-31
              相关资源
              最近更新 更多