Biên dịch lại sên Heroku mà không cần thay đổi hoặc thay đổi cấu hình


147

Tôi tự hỏi liệu có cách nào để buộc Heroku biên dịch lại con sên mà không đẩy các xác nhận mới và / hoặc cập nhật các biến cấu hình.

Tại sao tôi muốn làm điều này?:

Tôi đang sử dụng ngăn xếp Cedar trên Heroku cho ứng dụng Rails 3.2 và tôi gặp vấn đề với rake assets:precompiletác vụ thất bại (chỉ trong quá trình biên dịch --- sau này nó hoạt động tốt với a heroku run). Tôi rất nghi ngờ điều này là do các biến môi trường nhất định không có sẵn trong thời gian biên dịch sên và tôi nghĩ heroku labs:enable user_env_compiletính năng thử nghiệm sẽ giải quyết điều này.

Tuy nhiên, với user_env_compiletính năng được bật, các thay đổi cấu hình không kích hoạt quá trình biên dịch lại sên và mã của tôi không thay đổi, vì vậy tôi không có bất kỳ cam kết mới nào để đẩy.

Tất nhiên, tôi có thể đẩy một cam kết "giả" bằng một thay đổi nhỏ, đó có lẽ là câu trả lời đơn giản nhất --- nhưng tôi tự hỏi liệu có lệnh heroku nào cho phép tôi biên dịch lại trực tiếp con sên không.

Cảm ơn!


1
Không có gì trong máy khách heroku CLI?
Matt Ball

Không phải là câu trả lời trực tiếp, nhưng sẽ rất khôn ngoan khi ghi lại các thay đổi phụ thuộc như dựa vào các tính năng SAAS, v.v. Lời khuyên của tôi là thêm một mục vào CHANGELOG ở đâu đó đề cập đến bạn bây giờ dựa vào tính năng này và đẩy thay đổi đó để kích hoạt xây dựng lại sên
patcoll

Câu trả lời:


93

Quá trình biên dịch sên được gọi với một móc nối nhận trước git, vì vậy cách duy nhất để biên dịch lại là đẩy một cam kết mới.

Để hoàn thiện, xem bài viết này trên Heroku cho trình biên dịch sên . Nó đã thảo luận về việc sử dụng hook nhận trước để gọi quy trình biên dịch slug dưới tiêu đề Compilation.


23
Cảm ơn câu trả lời của bạn. Đúng là một cái móc nhận trước git biên dịch sên. (xem, ví dụ: devcenter.heroku.com/articles/slug-compiler ). Điều đó không nhất thiết có nghĩa là heroku không (hoặc không thể) cung cấp một cơ chế thay thế để gọi trình biên dịch sên như lệnh heroku CLI. Điều đó nói rằng, không ai đề cập đến một lệnh như vậy, vì vậy tôi cho rằng câu trả lời của bạn là tại chỗ, ít nhất là bây giờ. Cảm ơn!
Nathan

1
@Nathan Có lẽ bạn có thể yêu cầu Heroku hỗ trợ cách kích hoạt quá trình biên dịch slug thông qua Heroku Toolbelt? Nếu họ đi cho nó, thêm một câu trả lời!
kết hợp

7
Bây giờ có một giải pháp. Các Heroku-repo add-on
Refael Ackermann

FYI đối với tôi giải pháp này không hoạt động khi tôi có giá trị ENV mới cho cài đặt trong tệp js được biên dịch vào ứng dụng Rails. Nó đã cam kết một không gian cho tệp js và thúc đẩy để tài sản thực sự biên dịch lại.
Josh Diehl

12
repo:rebuildkhông còn là một lệnh hợp lệ trong trình cắm thêm, như có thể thấy ở đây: github.com/heroku/heroku-repo/commit/
mẹo

234

Cách giải quyết đơn giản nhất bây giờ là đẩy một cam kết trống .

git commit --allow-empty -m "empty commit"
git push heroku master

53
Bạn có thể làm điều này và giữ một lịch sử cam kết sạch bằng cách đẩy mạnh cam kết trước đó sau đó : git reset HEAD~; git push -f heroku master. Bao gồm chi phí thời gian của một triển khai Heroku khác, nhưng lịch sử sạch FTW.
Paul Annesley

2
Chỉ để bổ sung cho bí danh này trong ~/.profilephần thêm của bạn :alias heroku-rebuild="git reset HEAD~; git push -f heroku master" hoặc alias heroku-rebuild="git commit --allow-empty -m 'empty commit' && git push heroku master"vì vậy bạn có thể chỉ cần gõheroku-rebuild
unmultimedio

30

Cách tiếp cận chung của tôi là làm:

git commit --amend -C HEAD
git push heroku:master -f

Không chắc chắn tôi sẽ làm điều này trong sản xuất mà không chắc chắn, vì về mặt kỹ thuật, nó viết lại cam kết cuối cùng nhưng nó không gây ra bất kỳ vấn đề nào trong lý thuyết. Nó hoàn toàn tốt cho khi bạn đang thử nghiệm mọi thứ trong dàn dựng.

Là một phần thưởng bổ sung vì hầu hết mọi người đều gặp vấn đề khi sử dụng Vim để chỉnh sửa tin nhắn cam kết SHIFT-ZZsẽ nhanh chóng lưu và thoát khỏi tin nhắn cam kết cho bạn mà không thực hiện bất kỳ thay đổi nào đối với nó.

Về một lưu ý liên quan, tôi bị sốc nhẹ Heroku vẫn không có tính năng này. Tôi thường thấy Heroku không triển khai do vấn đề của họ.

Cảm ơn Michael Mior cho ý tưởng sử dụng -C HEADđể tránh mở trình soạn thảo.


2
Hoặc chỉ sử dụng git commit --amend -C HEADđể tránh mở trình soạn thảo và giữ thông điệp cam kết như cũ.
Michael Mior

Cảm ơn @MichaelMior điều này đã làm việc rất tốt cho tôi và không gây rối với lịch sử git nhận thức của tôi.
Phường James

Một điều cần cẩn thận ở đây là nếu bạn có một repo trung tâm khác (ngoài heroku). Nếu vậy, điều này sẽ dẫn đến việc hợp nhất / sao chép cam kết trong lịch sử vào lần tiếp theo nếu bạn đã đẩy cam kết cuối cùng ra.
Nick F

Tại sao điều này lại chống người dùng như vậy?
Lucke

20

Heroku đã phát hành một plugin mà những gì được yêu cầu: https://github.com/heroku/heroku-repo

Để cài đặt nó:

$ heroku plugins:install heroku-repo

Để buộc xây dựng lại:

$ heroku repo:purge_cache -a appname
$ heroku repo:reset -a appname
$ git push heroku

15

Cập nhật: heroku repo: xây dựng lại đã được gỡ bỏ .

Heroku có API xây dựng mà bạn có thể sử dụng, xem: Xây dựng và phát hành bằng API


Bạn có thể sử dụng lệnh repo: xây dựng lại nếu bổ trợ heroku-repo .

heroku repo:rebuild -a appname

https://github.com/heroku/heroku-repo


3
Chỉ nhận xét về chủ đề khác là tốt, nhưng nó đáng để nhắc lại ở đây: Addon heroku-repo trông rất đẹp, nhưng sau khi thử nó, tôi không khuyên bạn nên dùng nó. Có một lỗi xấu: nó bỏ qua cờ --app. Điều này khiến tôi vô tình xây dựng lại môi trường sản xuất của chúng tôi, khi tôi có ý định xây dựng lại dàn dựng. Lỗi này đã được mở chống lại repo trong hơn một năm nay mà không có giải pháp. Tôi đã gỡ cài đặt plugin này.
jasoncrawford

6
Phiên bản hiện tại của heroku-repo không có tiểu ban xây dựng lại
Mike Slinn

Tôi phải đặt lại repo từ xa vì lệnh xây dựng lại không hoạt động
vaibhav jain 19/2/2016

Bạn đã cập nhật và bạn nói rằng nó hoạt động với "API xây dựng" nhưng tôi không thực sự hiểu cách thức hoạt động của nó ... Có ai giúp đỡ không? Tôi có phải gửi yêu cầu POST HTTP đến API để xây dựng lại ứng dụng của mình không? Mà trên? Có một mã thông báo (lý do bảo mật)?
Đầm Pháp


5

Có một plugin heroku cho việc này.

$ heroku plugins:install heroku-releases-retry
Installing plugin heroku-releases-retry... done
$ heroku releases:retry
Retrying v16 on ⬢ murmuring-lowlands-3398... done, v17

3
Điều này sẽ thử lại bản phát hành sau khi phát hành thất bại. Nó sẽ không thử lại một bản dựng thất bại.
Jeremy

-3

Bỏ chi nhánh, sau đó đẩy lại. Không cần sử dụng plugin.

git push heroku :master
git push heroku master

Sẽ dẫn đến "Đẩy bị từ chối, không thể xóa nhánh chính".
skalee

-15

git push --force nên làm việc :)


3
Hmm, tôi nhận được "Mọi thứ cập nhật".
Brad Koch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.