Как настроить Travis-CI для использования правильного часового пояса для приложения rails?

В моем приложении .rb у меня есть

config.time_zone = "Pacific Time (US & Canada)"

И это правильно работает в разработке/тестировании и производственных серверах. Однако, когда я нажимаю Travis-CI, он, по-видимому, локализуется в UTC, например, вывод I18n.l Time.now.

Есть ли что-то другое в среде Ruby/rails Travis-CI?

Ответ 1

То, как я выполняю настройку часового пояса, находится в разделе before_script файла travis.yml

Они дают вам root-доступ к виртуальной машине, запускающей ваш проект, поэтому вы можете просто установить часовой пояс ОС, который использует ruby:

    before_script:
      - echo 'Canada/Pacific' | sudo tee /etc/timezone
      - sudo dpkg-reconfigure --frontend noninteractive tzdata

Если вы хотите, вы также можете принудительно обновить его, добавив следующее:

      - sudo ntpdate ntp.ubuntu.com

Ответ 2

Это сработало для меня:

before_install:
- export TZ=Australia/Canberra

чтобы убедиться, что это правильно, вы можете вывести дату следующим образом:

- date

Ответ 3

У меня была аналогичная проблема и она была решена.

В процессе разработки мое время +10 GMT.

В Трэвис мое время +11 GMT.

before_script:
  - export TZ=Australia/Melbourne

Я использовал Time Cop gem для проверки времени, зависящего от кода. Вот как я изменил то, что время тоже установлено на Travis.

Вот пример теста:

require 'spec_helper'
context "during the week after 11:00am for Morning Follow Up Call" do
  before do
    valid_prospect_params["treatment_enquiry_form"]["contact_time"] = "10:00 am"
    freeze_time = Time.local(2015, 11, 18, 11, 01, 0)
    change_time(freeze_time)
    post :create_prospect, valid_prospect_params
    reset_time
  end

  it "creates follow up activities" do
    expect(prospect_followup_activities).to eq(3)
  end

  it "creates follow_up_call for the next day in the morning " do
    expect(first_call.scheduled_for.to_s).to  eq("2015-11-19 10:00:00 +1100")
  end
end

Вот как я изменил время на Трэвисе. У меня есть 2 метода.

def change_time(freeze_time)
  if Time.now.strftime("%Z") == "AEDT"
    Timecop.freeze(freeze_time + 1.hours)
  else
    Timecop.freeze(freeze_time)
  end
end

def reset_time
  Timecop.return
end