Подтвердить что ты не робот

Heroku - отображение хэша текущей фиксации

Я хочу отобразить хеш текущего коммита git в браузере, чтобы команда тестирования (которая не имеет доступа к запускам команд heruko) сможет включить соответствующий хеш фиксации в отчетах об ошибках.

Сначала я попробовал grit, но что-то сломано, и это не работает на Heroku (на местном он отлично работает, я не знаю, почему он терпит неудачу на Heroku).

Итак, я узнал, что на Heroku есть две переменные среды:

ENV["COMMIT_HASH"]
ENV["LAST_COMMIT_BY"]

Но ни один из них не доступен (оба равны нулю).

Я также проверил:

heroku config

Но опять же не установлено.

Есть ли способ получить хэш-информацию? Есть ли способ получить более git информацию, например, например, дату?

4b9b3361

Ответ 1

Во-первых, поскольку heroku "удаляет [s] неиспользуемые файлы, включая каталог .git" во время компиляции slug, вы не сможете выполнить некоторые git изнутри вашего каталога приложений (на дикторе heroku). Это включает в себя такие вещи, как git rev-parse HEAD, который обычно является простым способом получения текущего хэша.

Во-вторых, попытка получить информацию с помощью git ls-remote на dynoko heroku вызовет ssh, и вы увидите сообщения, которые говорят The authenticity of host 'heroku.com (50.19.85.132)' can't be established, так как открытый ключ heroku не установлен на heroku dynos. У вас не будет разрешения на установку открытого ключа heroku.

У вас все еще есть как минимум два варианта.

  • Добавьте post-commit hook, чтобы обновить хеш-значение.

    a) Создайте или отредактируйте файл .git/hooks/post-commit
    b) Добавьте код оболочки script следующим образом:

    hash_name = HEAD_HASH
    hash = $(git rev-parse HEAD)
    echo Установка $hash_name для $hash
    heroku config: set $hash_name = $hash --app yourappname

    (вы можете использовать любой код, который вы хотите для git hooks, это всего лишь один вариант)

    Объяснение:

    • HEAD_HASH - это имя переменной среды heroku. Назовите это, как хотите. Вы просмотрите это в своем основном приложении и отобразите его на странице.
    • git rev-parse HEAD захватывает хэш текущей фиксации HEAD. Настройте эту строку для того, что вы хотите отобразить.


    Теперь, когда вы совершаете фиксации в git, переменная HEAD_HASH env var будет обновляться каждый раз. Это работает, но может быть немного медленным, так как вы будете ждать, когда heroku будет устанавливать env var каждый раз, когда вы совершаете. Если ваше сетевое соединение отсутствует и т.д., Переменная не будет обновляться. Слух, что git 1.8.2 позволит использовать "предварительный толчок", где вы можете поместить этот код.

  • Используйте script для ввода кода

    Вместо ввода git push heroku master для ввода кода вы можете написать оболочку script, которая содержит строки из опции 1. и добавляет git push heroku master в конец. Затем для развертывания кода вы запускаете эту оболочку script. Это обновит HEAD_HASH только до нажатия (а не после каждого git commit), и он прекрасно держит все в одном месте. Вероятно, вы захотите добавить script в свой файл .slugignore.

Ответ 2

Теперь можно попробовать функцию Heroku, о которой Роберто писал в своем ответе, не связавшись с Heroku. Он называется Heroku Labs: Dyno Metadata, и вы можете включить его

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

а затем информация доступна (при следующем развертывании) в качестве переменных среды:

~ $ 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
...

Ответ 3

Начиная с 2015-04-01, SHA Git теперь доступен в процессе сборки как переменная среды SOURCE_VERSION. См.: https://devcenter.heroku.com/changelog-items/630

Обратите внимание, что он недоступен для запущенного приложения только на этапе компиляции. Вы можете добавить настраиваемый buildpack, чтобы записать это в файл, который сохраняется в slug, а затем прочитать файл из вашего приложения.

Я тестирую этот подход и имею экспериментальный buildpack здесь: https://github.com/sreid/heroku-buildpack-sourceversion

Ответ 4

Git > 1.8.2 теперь поддерживает предварительный щелчок, который лучше подходит для нашей usecase. Здесь мой текущий хук script:

#!/bin/sh

remote="$1"
url="$2"

if [[ $url =~ heroku ]] ; then

    if [[ $url =~ staging ]] ; then
        appname=YOUR_APP_NAME_STAGING
    else
        appname=YOUR_APP_NAME
    fi

    hash_name=COMMIT_HASH
    hash=$(git rev-parse HEAD)
    echo Setting $hash_name to $hash
    heroku config:set $hash_name=$hash --app $appname
fi
exit 0

Ответ 5

git ls-remote heroku работает для меня. Я получил это от ответа на дублированный вопрос здесь.

Ответ 6

И у Куликса, и у Джошвы прекрасные ответы. Если вы называете свои пульты heroku git так же, как и соответствующие приложения heroku, у вас может быть еще более короткий и надежный хук .git/hooks/pre-push:

#!/bin/bash

remote="$1"
url="$2"

if [[ $url =~ heroku ]] ; then
    hash_name=COMMIT_HASH
    hash=$(git rev-parse HEAD)
    echo Setting $hash_name to $hash on app $remote
    heroku config:set $hash_name=$hash --app $remote
fi

exit 0

Ответ 7

Heroku имеет новую функциональность для поддержки динамических метаданных, если вы поддерживаете электронную почту, вы, вероятно, можете добавить ее в бета-версию. Здесь место, где его используют Героку:

https://github.com/heroku/fix/blob/6c8ab7a/lib/heroku_dyno_metadata.rb

Дополнительные функции записывают файл JSON в /etc/heroku/dyno - содержимое выглядит следующим образом:

{
   "dyno":{
      "physical_id":"161bfad9-9e83-40b7-b385-78305db2f168",
      "size":1,
      "name":"run.7145"
   },
   "app":{
      "id":null
   },
   "release":{
      "id":50,
      "commit":"2c3a0b24069af49b3de35b8e8c26765c1dba9ff0",
      "description":null
   }
}

.. поэтому release.commit - это поле, в котором вы находитесь.

Ответ 8

Также возможно использовать API Heroku напрямую, если вы используете CI и не имеете доступа к клиенту Heroku.

Это решение, которое я использовал в codeship.com (который предоставляет хэш в среде как $CI_COMMIT_ID:

# you can use `heroku auth:token` to generate this
HEROKU_API_KEY="" 

APP_NAME="glorious-flying-birds"

curl -n -X PATCH "https://api.heroku.com/apps/$APP_NAME/config-vars" \
  -H "Authorization: Bearer $HEROKU_API_KEY" \
  -H "Accept: application/vnd.heroku+json; version=3" \
  -H "Content-Type: application/json" \
  -d "{\"GIT_COMMIT_HASH\": \"$CI_COMMIT_ID\"}"