2014-12-12 16 views
6

Có thể lấy khóa duy nhất cho mỗi slug/release từ một dyno đang chạy không? Tôi đã sau này article để thiết lập RAILS_CACHE_ID (ví hết hạn etags sau khi triển khai) nhưng phát hiện ra rằng dynos không còn xuất xưởng với GIT cấu hình (mà gây ra lỗi này):Nhận số phát hành Heroku/Mã phiên bản từ khi chạy Dyno

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

Tôi cũng coi thiết lập nó trong một config/initializers đến Thời gian hiện tại nhưng rõ ràng là sẽ không hoạt động trên nhiều dynos. Bất kỳ ý tưởng?

Trả lời

9

Có một mới (tháng 11 năm 2015) các phòng thí nghiệm đặc trưng mà không chỉ là những gì bạn cần "Dyno siêu dữ liệu" https://devcenter.heroku.com/changelog-items/768

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

Sau đó, trên 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 
+0

Sau khi bật dyno-metadata, tôi đã thêm dòng này vào 'config/application.rb':' ENV ['RAILS_CACHE_ID'] = ENV ['HEROKU_RELEASE_VERSION'] 'vì vậy khi ứng dụng khởi động nó đặt ID bộ nhớ cache cho bản phát hành Heroku phiên bản. Điều này cũng có nghĩa là nó sẽ sử dụng một ID Cache mới khi thay đổi các biến env, nhưng điều đó không nhất thiết là một điều xấu. – Josh

0

Một giải pháp là sử dụng móc trước git để đặt giá trị cấu hình heroku. Kể từ khi nó được thực hiện trước khi đẩy và biên dịch slug, biến cấu hình sẽ có sẵn như là một var ENV để ứng dụng đường ray của bạn.

.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 

Các tập tin trước push.sample có một số tài liệu về các thông số mà móc được gọi với. Tôi đang sử dụng đầu ra chi tiết của git từ xa để xác định ứng dụng nào để đặt giá trị cấu hình. Tùy chọn '-E' cho sed là dành cho Mac OS X - nếu bạn đang sử dụng GNU sed thay thế bằng '-r'.

Một giải pháp khác là sử dụng heroku-api thông qua tập lệnh profile.d để lấy id phát hành duy nhất. Ví dụ này sử dụng curl để lấy id phát hành mới nhất bằng cách sử dụng tiêu đề RANGE. Nó không phải là tham chiếu cam kết nhưng nó sẽ là duy nhất cho mọi bản phát hành, bao gồm cả các lần quay lại và thay đổi cấu hình. Bạn sẽ muốn đặt API_KEY và APP_NAME làm biến cấu hình 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 

Trong ứng dụng đường ray, ENV [ 'RAILS_CACHE_ID'] bây giờ sẽ được thiết lập để id phát hành gần đây nhất. Bạn cũng có thể sử dụng cùng một chiến lược này trong trình khởi tạo đường ray.

+0

Nhờ loại công trình nhưng sẽ không hỗ trợ roll-backs/roll-forwards –

+0

Vâng, đó là một hạn chế khá lớn mà tôi không cân nhắc. Xem câu trả lời được cập nhật cho phiên bản .profile.d –

+0

Cảm ơn bạn đã cập nhật. Tôi đoán giới hạn duy nhất ở đây là nếu API không bao giờ trả lời nó cần phải thử lại thêm logic. Hy vọng rằng Heroku thêm một cách đơn giản hơn để làm điều đó trong tương lai. –

Các vấn đề liên quan