Deploy to Digital Ocean

This commit is contained in:
Hakan Ensari 2015-03-09 11:25:11 +00:00
parent 94b355e560
commit 14985cf3e8
14 changed files with 85 additions and 46 deletions

3
.gitignore vendored
View File

@ -1,3 +1,6 @@
.bundle .bundle
.env
bin bin
log
tmp
vendor vendor

3
.pryrc Normal file
View File

@ -0,0 +1,3 @@
Pry.config.editor = 'vim'
require './config/environment'
puts "Loading #{App.env}"

View File

@ -1,11 +1,4 @@
deploy:
provider: heroku
api_key:
secure: KfNLOG7IsAno2IQ3R9DikQ7nVhAGbYQitf6NbJo1jzA7eu/rKNAmqYoJyaNuwEoAd8Dwz98PtQEJb3DmAhtX3xJgZC1BKNPMh9s0NCQO03OsD7cRbyqeyJFgxSH+p+yKC3nILmaxTSLPji3w+h3Qg+Lu1SA+Q6KmxxeajUUSThc=
app: fixer
on:
repo: hakanensari/fixer-io
rvm: rvm:
- 2.2.0 - 2.2.1
before_script: before_script:
- psql -c 'create database fixer_test;' -U postgres - psql -c 'create database fixer_test;' -U postgres

View File

@ -1,11 +1,11 @@
source 'http://rubygems.org' source 'http://rubygems.org'
ruby '2.2.0' ruby '2.2.1'
gem 'fixer' gem 'fixer'
gem 'rollbar' gem 'rollbar'
gem 'newrelic_rpm' gem 'newrelic_rpm'
gem 'librato-rack' gem 'pry'
gem 'rake' gem 'rake'
gem 'sequel_pg' gem 'sequel_pg'
gem 'sinatra-jsonp' gem 'sinatra-jsonp'

View File

@ -1,59 +1,56 @@
GEM GEM
remote: http://rubygems.org/ remote: http://rubygems.org/
specs: specs:
aggregate (0.2.2)
axiom-types (0.1.1) axiom-types (0.1.1)
descendants_tracker (~> 0.0.4) descendants_tracker (~> 0.0.4)
ice_nine (~> 0.11.0) ice_nine (~> 0.11.0)
thread_safe (~> 0.3, >= 0.3.1) thread_safe (~> 0.3, >= 0.3.1)
coderay (1.1.0)
coercible (1.0.0) coercible (1.0.0)
descendants_tracker (~> 0.0.1) descendants_tracker (~> 0.0.1)
descendants_tracker (0.0.4) descendants_tracker (0.0.4)
thread_safe (~> 0.3, >= 0.3.1) thread_safe (~> 0.3, >= 0.3.1)
equalizer (0.0.9) equalizer (0.0.9)
faraday (0.9.0)
multipart-post (>= 1.2, < 3)
fixer (0.5.0) fixer (0.5.0)
nokogiri (~> 1.5) nokogiri (~> 1.5)
ice_nine (0.11.1) ice_nine (0.11.1)
kgio (2.9.2) kgio (2.9.3)
librato-metrics (1.5.0) method_source (0.8.2)
aggregate (~> 0.2.2)
faraday (~> 0.7)
multi_json
librato-rack (0.4.5)
librato-metrics (~> 1.1)
mini_portile (0.6.2) mini_portile (0.6.2)
minitest (5.5.0) minitest (5.5.1)
multi_json (1.10.1) multi_json (1.11.0)
multipart-post (2.0.0) newrelic_rpm (3.10.0.279)
newrelic_rpm (3.9.9.275) nokogiri (1.6.6.2)
nokogiri (1.6.5)
mini_portile (~> 0.6.0) mini_portile (~> 0.6.0)
pg (0.18.0) pg (0.18.1)
pry (0.10.1)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
rack (1.6.0) rack (1.6.0)
rack-protection (1.5.3) rack-protection (1.5.3)
rack rack
rack-test (0.6.2) rack-test (0.6.3)
rack (>= 1.0) rack (>= 1.0)
raindrops (0.13.0) raindrops (0.13.0)
rake (10.4.2) rake (10.4.2)
rollbar (1.3.1) rollbar (1.4.4)
multi_json (~> 1.3) multi_json (~> 1.3)
sequel (4.18.0) sequel (4.20.0)
sequel_pg (1.6.11) sequel_pg (1.6.11)
pg (>= 0.8.0) pg (>= 0.8.0)
sequel (>= 3.39.0) sequel (>= 3.39.0)
shotgun (0.9) shotgun (0.9.1)
rack (>= 1.0) rack (>= 1.0)
sinatra (1.4.5) sinatra (1.4.5)
rack (~> 1.4) rack (~> 1.4)
rack-protection (~> 1.4) rack-protection (~> 1.4)
tilt (~> 1.3, >= 1.3.4) tilt (~> 1.3, >= 1.3.4)
sinatra-cross_origin (0.3.2) sinatra-cross_origin (0.3.2)
sinatra-jsonp (0.4.3) sinatra-jsonp (0.4.4)
multi_json (~> 1.8) multi_json (~> 1.8)
sinatra (~> 1.0) sinatra (~> 1.0)
slop (3.6.0)
thread_safe (0.3.4) thread_safe (0.3.4)
tilt (1.4.1) tilt (1.4.1)
unicorn (4.8.3) unicorn (4.8.3)
@ -72,9 +69,9 @@ PLATFORMS
DEPENDENCIES DEPENDENCIES
fixer fixer
librato-rack
minitest minitest
newrelic_rpm newrelic_rpm
pry
rack-test rack-test
rake rake
rollbar rollbar

View File

@ -1 +1,5 @@
# Fixer.io
[![Travis](https://travis-ci.org/hakanensari/fixer-io.svg)](https://travis-ci.org/hakanensari/fixer-io) [![Travis](https://travis-ci.org/hakanensari/fixer-io.svg)](https://travis-ci.org/hakanensari/fixer-io)
Fixer.io is a JSON API for foreign exchange rates and currency conversion.

View File

@ -1,3 +1,4 @@
Dir.glob('lib/tasks/*.rake').each { |r| import r } require 'rollbar/rake'
task default: %w(db:migrate rates:reload test) Dir.glob('lib/tasks/*.rake').each { |r| import r }
task default: %w(db:migrate rates:load test)

View File

@ -3,7 +3,7 @@ require 'pathname'
module App module App
class << self class << self
attr :logger attr_reader :logger
def env def env
ENV['RACK_ENV'] || 'development' ENV['RACK_ENV'] || 'development'
@ -12,6 +12,10 @@ module App
def root def root
Pathname.pwd Pathname.pwd
end end
def version
`git rev-parse --short HEAD 2>/dev/null`.strip!
end
end end
@logger = Logger.new(STDOUT) @logger = Logger.new(STDOUT)

3
config/schedule.rb Normal file
View File

@ -0,0 +1,3 @@
every :hour do
command "foreman run bundle exec rake rates:update"
end

17
deploy/after_push Executable file
View File

@ -0,0 +1,17 @@
#!/usr/bin/env bash
set -e
oldrev=$1
newrev=$2
run() {
[ -x $1 ] && $1 $oldrev $newrev
}
echo files changed: $(git diff $oldrev $newrev --diff-filter=ACDMR --name-only | wc -l)
umask 002
git submodule sync && git submodule update --init --recursive
run deploy/before_restart
run deploy/restart && run deploy/after_restart

15
deploy/before_restart Executable file
View File

@ -0,0 +1,15 @@
#!/usr/bin/env ruby
oldrev, newrev = ARGV
def run(cmd)
exit($?.exitstatus) unless system "umask 002 && #{cmd}"
end
run "foreman run bundle install --deployment --without development:test"
tasks = []
num_migrations = `git diff #{oldrev} #{newrev} --diff-filter=A --name-only -z db/migrate`.split("\0").size
tasks << "db:migrate" if num_migrations > 0
tasks << "rates:update"
run "foreman run bundle exec rake #{tasks.join(" ")}" if tasks.any?

2
deploy/restart Executable file
View File

@ -0,0 +1,2 @@
#!/usr/bin/env bash
sudo restart fixer 2>/dev/null || sudo start fixer

View File

@ -1,3 +1,4 @@
require 'rollbar/rack'
require 'sinatra' require 'sinatra'
require 'sinatra/cross_origin' require 'sinatra/cross_origin'
require 'sinatra/jsonp' require 'sinatra/jsonp'
@ -6,14 +7,10 @@ require 'snapshot'
configure do configure do
enable :cross_origin enable :cross_origin
set :root, File.expand_path('..', File.dirname(__FILE__))
end end
configure :production do configure :production do
require 'newrelic_rpm' require 'newrelic_rpm'
require 'librato-rack'
use Librato::Rack
end end
helpers do helpers do
@ -32,13 +29,13 @@ helpers do
params[:date] = Date.new(params[:year].to_i, params[:month].to_i, params[:day].to_i) params[:date] = Date.new(params[:year].to_i, params[:month].to_i, params[:day].to_i)
end end
def halt_with_meaningful_response(status, message) def halt_with_message(status, message)
halt status, Yajl::Encoder.encode(error: { status: status, message: message }) halt status, Yajl::Encoder.encode(error: message)
end end
end end
get '/' do get '/' do
jsonp(description: 'Fixer.io is a JSON API for foreign exchange rates and currency conversion', docs: 'http://fixer.io') jsonp(details: 'http://fixer.io', version: App.version)
end end
get '/latest' do get '/latest' do
@ -51,9 +48,9 @@ get %r((?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})) do
end end
not_found do not_found do
halt_with_meaningful_response 404, 'Not found' halt_with_message 404, 'Not found'
end end
error ArgumentError do error ArgumentError do
halt_with_meaningful_response 422, env['sinatra.error'].message.capitalize halt_with_message 422, env['sinatra.error'].message.capitalize
end end

View File

@ -4,8 +4,8 @@ namespace :rates do
require 'fixer' require 'fixer'
end end
desc 'Reload all rates' desc 'Load all rates'
task reload: :setup do task load: :setup do
Currency.dataset.delete Currency.dataset.delete
data = Fixer::Feed.new(:historical) data = Fixer::Feed.new(:historical)
Currency.multi_insert(data.to_a) Currency.multi_insert(data.to_a)