2016-07-14 3 views
0

У меня есть эта задача Rake, которая работает локально:Heroku Rake задача не работает сценарий оболочки

namespace :backup_to_s3 do 
    task run: :environment do 
    puts "Started S3 backup" 
    # create .pgpass so we don't have to enter the password 
    entry = "#{ENV['RDS_DB_HOSTNAME']}:*:*:#{ENV['RDS_DB_SUPER_USERNAME']}:#{ENV['RDS_DB_SUPER_PASSWORD']}" 
    `echo '#{entry}' > ~/.pgpass; 
    chmod 0600 ~/.pgpass; 
    bash backup_to_s3.sh` 
    puts "Finished S3 backup" 
    end 
end 

Обратите внимание, что она делает вызов, чтобы запустить скрипт. Вот что сценарий оболочки:

#!/bin/bash 

backupTime=`date +%Y%m%d-%H:%M` 
S3Bucket=$S3_BUCKET_NAME 
RDSHostname=$RDS_DB_HOSTNAME 
RDSUsername=$RDS_DB_SUPER_USERNAME 
RDSDatabaseName=$RDS_DB_NAME 

pg_dump -Fc ${RDSDatabaseName} -h ${RDSHostname} -U ${RDSUsername} --no-password | gzip -9 | \ 
s3cmd put - s3://${S3Bucket}/postgres.${RDSDatabaseName}.dump.${backupTime}.gz 

Как я сказал, что это все работает локально, а операторы puts лесозаготовительные работы. На Heroku задача выполняется, но операторы puts выполняются немедленно, что указывает на то, что системные вызовы и сценарий оболочки не запускаются.

Я смущен, почему это не работает!

UPDATE 7/15

Я обнаружил, что вы можете установить переменную окружения PGPASSWORD и избежать создания файла .pgpass. Задача Rake по-прежнему не выполняет сценарий оболочки.

ответ

0

Heroku не предоставляет вам традиционный виртуальный частный сервер, поэтому я не предполагаю, что у вас есть доступ к записи в домашний каталог. Очень вероятно, что при создании файла .pgpass вы можете получить отказ в разрешении.

Попробуйте помечать файл в каталоге tmp/ вашего рельса.

+0

Спасибо, что ответили Китом. Это то, что я думал, что проблема была вначале, но я запустил «heroku run bash», чтобы получить приглашение оболочки, и выполнил мою задачу рейка с помощью 'rake backup_to_s3: run'. Затем я запускал 'cat ~/.pgpass', который дал правильный результат, поэтому кажется, что он правильно записывает файл, и он длится, по крайней мере, в течение времени, которое я трачу в этом сеансе оболочки. – garrettqmartin8