Skip to content

Commit

Permalink
Packaging with Traveling Ruby
Browse files Browse the repository at this point in the history
  • Loading branch information
rilla committed Jan 8, 2015
1 parent ee31d61 commit 40663e6
Show file tree
Hide file tree
Showing 9 changed files with 273 additions and 21 deletions.
27 changes: 14 additions & 13 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ source 'https://rubygems.org'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.1.4'
# Use sqlite3 as the database for Active Record
gem 'sqlite3'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.3'
# Use Uglifier as compressor for JavaScript assets
Expand All @@ -22,9 +20,6 @@ gem 'jbuilder', '~> 2.0'
# bundle exec rake doc:rails generates the API under doc/api.
gem 'sdoc', '~> 0.4.0', group: :doc

# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
gem 'spring', group: :development

# Use unicorn as the app server
# gem 'unicorn'

Expand All @@ -34,6 +29,12 @@ gem 'spring', group: :development
# Use debugger
# gem 'debugger', group: [:development, :test]

# ------------------------------------------------------ With native extensions
# These require native extensions.
# Ensure Traveling Ruby provides an appropriate version before bumping.
gem 'bcrypt', '3.1.9'
gem 'sqlite3', '1.3.9'
gem 'nokogiri', '1.6.5'

# --------------------------------------------------------- Dradis dependencies

Expand All @@ -43,21 +44,21 @@ gemspec path: 'engines/frontend'


# Dradis::Plugins manage the list of available / loaded external plugins
if Dir.exists?('../dradis-plugins')
if Dir.exists?('../dradis-plugins') && !ENV['PACKAGING']
gem 'dradis-plugins', path: '../dradis-plugins'
else
gem 'dradis-plugins', github: 'dradis/dradis-plugins'
end

# Dradis::Plugins::Projects lets you backup and restore the repo state
if Dir.exists?('../dradis-projects')
if Dir.exists?('../dradis-projects') && !ENV['PACKAGING']
gem 'dradis-projects', path: '../dradis-projects'
else
gem 'dradis-projects', github: 'dradis/dradis-projects'
end

# Default theme: Snowcrash
if Dir.exists?('../dradis-theme_snowcrash')
if Dir.exists?('../dradis-theme_snowcrash') && !ENV['PACKAGING']
gem 'dradis-theme_snowcrash', path: '../dradis-theme_snowcrash'
else
gem 'dradis-theme_snowcrash', github: 'dradis/dradis-theme_snowcrash'
Expand All @@ -78,8 +79,6 @@ gem 'acts_as_tree', '~> 1.6'

# Manipulate XML
gem 'builder'
gem 'nokogiri'


# Security
gem 'ruby-nmap'
Expand All @@ -89,15 +88,17 @@ gem 'thor', '~> 0.19.1'


# ------------------------------------------------------------------ Test & Dev
# Gems required for testing
gem 'rspec-rails', :group => [:development, :test]
group :development do
gem 'rspec-rails'
gem 'spring'
end unless ENV['PACKAGING']

group :test do
gem 'database_cleaner'
gem 'factory_girl', '~> 2.6.4'
gem 'capybara'
gem 'guard-rspec'
end
end unless ENV['PACKAGING']



Expand Down
17 changes: 9 additions & 8 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ GIT

GIT
remote: git://github.com/dradis/dradis-theme_snowcrash.git
revision: 513f34bbe55533b2ae0860ac4c5a16ccdbec0477
revision: 7693c2596078b30f07ae455e9765676d784373dd
specs:
dradis-theme_snowcrash (3.0.0)
font-awesome-rails (~> 3.2)
Expand Down Expand Up @@ -75,7 +75,7 @@ GEM
acts_as_tree (1.6.1)
activerecord (>= 3.0.0)
arel (5.0.1.20140414130214)
bcrypt (3.1.7)
bcrypt (3.1.9)
bootstrap-sass (2.3.2.2)
sass (~> 3.2)
builder (3.2.2)
Expand Down Expand Up @@ -138,11 +138,11 @@ GEM
treetop (~> 1.4.8)
method_source (0.8.2)
mime-types (1.25.1)
mini_portile (0.6.0)
mini_portile (0.6.2)
minitest (5.3.5)
multi_json (1.10.1)
nokogiri (1.6.2.1)
mini_portile (= 0.6.0)
nokogiri (1.6.5)
mini_portile (~> 0.6.0)
polyglot (0.3.5)
pry (0.10.0)
coderay (~> 1.1.0)
Expand Down Expand Up @@ -207,7 +207,7 @@ GEM
sdoc (0.4.0)
json (~> 1.8)
rdoc (~> 4.0, < 5.0)
simple_form (3.0.2)
simple_form (3.1.0)
actionpack (~> 4.0)
activemodel (~> 4.0)
slop (3.5.0)
Expand Down Expand Up @@ -246,6 +246,7 @@ PLATFORMS

DEPENDENCIES
acts_as_tree (~> 1.6)
bcrypt (= 3.1.9)
builder
capybara
coffee-rails (~> 4.0.0)
Expand All @@ -258,14 +259,14 @@ DEPENDENCIES
factory_girl (~> 2.6.4)
guard-rspec
jbuilder (~> 2.0)
nokogiri
nokogiri (= 1.6.5)
rails (= 4.1.4)
rspec-rails
ruby-nmap
sass-rails (~> 4.0.3)
sdoc (~> 0.4.0)
spring
sqlite3
sqlite3 (= 1.3.9)
thor (~> 0.19.1)
turbolinks
uglifier (>= 1.3.0)
2 changes: 2 additions & 0 deletions Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@ require File.expand_path('../config/application', __FILE__)
require 'rake'

Rails.application.load_tasks

load('packaging/rake_rules.rb') unless ENV['PACKAGING']
2 changes: 2 additions & 0 deletions packaging/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
traveling-ruby-*.tar.gz
vendor
3 changes: 3 additions & 0 deletions packaging/bundler-config
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
BUNDLE_PATH: .
BUNDLE_WITHOUT: development
BUNDLE_DISABLE_SHARED_GEMS: '1'
11 changes: 11 additions & 0 deletions packaging/dradis-webapp
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/bin/bash
set -e

# Figure out where this script is located.
SELFDIR="`dirname \"$0\"`"
SELFDIR="`cd \"$SELFDIR\" && pwd`"

cd "$SELFDIR"
. lib/wrapper-common.sh

exec "$SELFDIR/lib/ruby/bin/ruby" -rbundler/setup "$SELFDIR/lib/app/bin/rails" s $*
11 changes: 11 additions & 0 deletions packaging/dradis-worker
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/bin/bash
set -e

# Figure out where this script is located.
SELFDIR="`dirname \"$0\"`"
SELFDIR="`cd \"$SELFDIR\" && pwd`"

cd "$SELFDIR"
. lib/wrapper-common.sh

exec "$SELFDIR/lib/ruby/bin/bundle" exec rake jobs:work $*
199 changes: 199 additions & 0 deletions packaging/rake_rules.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
# For Bundler.with_clean_env
require 'bundler/setup'

PACKAGE_NAME = "dradisframework"
VERSION = "3.0.0"
TRAVELING_RUBY_VERSION = "20141215-2.1.5"

# Must match Gemfile:
SQLITE3_VERSION = "1.3.9"
NOKOGIRI_VERSION = "1.6.5"
BCRYPT_VERSION = "3.1.9"

desc "Package your app"
task :package => ['package:linux:x86', 'package:linux:x86_64', 'package:osx']

namespace :package do
namespace :linux do
task :x86 => [:bundle_install,
# "assets:precompile",
"packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86.tar.gz",
"packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86-sqlite3-#{SQLITE3_VERSION}.tar.gz",
"packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86-nokogiri-#{NOKOGIRI_VERSION}.tar.gz",
"packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86-bcrypt-#{NOKOGIRI_VERSION}.tar.gz"
] do
create_package("linux-x86")
end

desc "Package your app for Linux x86_64"
task :x86_64 => [:bundle_install,
# "assets:precompile",
"packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86_64.tar.gz",
"packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86_64-sqlite3-#{SQLITE3_VERSION}.tar.gz",
"packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86_64-nokogiri-#{NOKOGIRI_VERSION}.tar.gz",
"packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86_64-bcrypt-#{BCRYPT_VERSION}.tar.gz"
] do
create_package("linux-x86_64")
end
end

desc "Package your app for OS X"
task :osx => [:bundle_install,
# "assets:precompile",
"packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-osx.tar.gz",
"packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-osx-sqlite3-#{SQLITE3_VERSION}.tar.gz",
"packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-osx-nokogiri-#{NOKOGIRI_VERSION}.tar.gz",
"packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-osx-bcrypt-#{BCRYPT_VERSION}.tar.gz"
] do
create_package("osx")
end

desc "Install gems to local directory"
task :bundle_install do
puts "\nRunning package:bundle_install..."
if RUBY_VERSION !~ /^2\.1\./
abort "You can only 'bundle install' using Ruby 2.1, because that's what Traveling Ruby uses."
end

puts "\nRecreating tmp directory..."
sh "rm -rf packaging/tmp"
sh "mkdir -p packaging/tmp"
sh "mkdir -p packaging/tmp/engines/core"
sh "mkdir -p packaging/tmp/engines/frontend"

puts "\nInstalling gems..."
sh "cp Gemfile packaging/tmp"
sh "cp engines/core/dradis_core.gemspec packaging/tmp/engines/core"
sh "cp engines/frontend/dradis_frontend.gemspec packaging/tmp/engines/frontend"

Bundler.with_clean_env do
sh "cd packaging/tmp && env BUNDLE_IGNORE_CONFIG=1 NOKOGIRI_USE_SYSTEM_LIBRARIES=1 PACKAGING=1 bundle install --path ../vendor --without development test"
end

puts "\nCleaning up cache and native extensions..."
sh "rm -rf packaging/vendor/*/*/cache/*"
sh "rm -rf packaging/vendor/ruby/*/extensions"
sh "find packaging/vendor/ruby/*/gems -name '*.so' | xargs rm -f"
sh "find packaging/vendor/ruby/*/gems -name '*.bundle' | xargs rm -f"
end

end

file "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86.tar.gz" do
download_runtime("linux-x86")
end

file "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86_64.tar.gz" do
download_runtime("linux-x86_64")
end

file "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-osx.tar.gz" do
download_runtime("osx")
end

file "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86-sqlite3-#{SQLITE3_VERSION}.tar.gz" do
download_native_extension("linux-x86", "sqlite3-#{SQLITE3_VERSION}")
end

file "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86_64-sqlite3-#{SQLITE3_VERSION}.tar.gz" do
download_native_extension("linux-x86_64", "sqlite3-#{SQLITE3_VERSION}")
end

file "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-osx-sqlite3-#{SQLITE3_VERSION}.tar.gz" do
download_native_extension("osx", "sqlite3-#{SQLITE3_VERSION}")
end

file "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86-nokogiri-#{NOKOGIRI_VERSION}.tar.gz" do
download_native_extension("linux-x86", "nokogiri-#{NOKOGIRI_VERSION}")
end

file "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86_64-nokogiri-#{NOKOGIRI_VERSION}.tar.gz" do
download_native_extension("linux-x86_64", "nokogiri-#{NOKOGIRI_VERSION}")
end

file "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-osx-nokogiri-#{NOKOGIRI_VERSION}.tar.gz" do
download_native_extension("osx", "nokogiri-#{NOKOGIRI_VERSION}")
end

file "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86-bcrypt-#{BCRYPT_VERSION}.tar.gz" do
download_native_extension("linux-x86", "bcrypt-#{BCRYPT_VERSION}")
end

file "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86_64-bcrypt-#{BCRYPT_VERSION}.tar.gz" do
download_native_extension("linux-x86_64", "bcrypt-#{BCRYPT_VERSION}")
end

file "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-osx-bcrypt-#{BCRYPT_VERSION}.tar.gz" do
download_native_extension("osx", "bcrypt-#{BCRYPT_VERSION}")
end

def create_package(target)
puts "\nCreating package #{ target }..."

package_dir = "#{PACKAGE_NAME}-#{target}"

puts "\nRecreating #{package_dir} directory..."
sh "rm -rf #{package_dir}"
sh "mkdir #{package_dir}"
sh "mkdir -p #{package_dir}/lib/app"

puts "\nCopying app..."
sh "cp -r config.ru Rakefile Thorfile dradis bin app config lib public spec db vendor #{package_dir}/lib/app/"
sh "rm -rf #{package_dir}/lib/app/vendor/cache #{package_dir}/lib/app/db/*.sqlite3"

puts "\nPreparing database..."
sh "cp config/database.yml.template config/database.yml"
sh "RAILS_ENV=production thor dradis:setup:configure"
sh "RAILS_ENV=production thor dradis:setup:migrate"
sh "RAILS_ENV=production thor dradis:reset:database"
sh "RAILS_ENV=production thor dradis:setup:seed"
sh "cp db/production.sqlite3 #{package_dir}/lib/app/db/"

puts "\nCopying ruby..."
sh "mkdir #{package_dir}/lib/ruby"
sh "tar -xzf packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-#{target}.tar.gz -C #{package_dir}/lib/ruby"

puts "\nCopying wrapper scripts and vendor files..."
sh "cp packaging/wrapper-common.sh #{package_dir}/lib"
sh "cp packaging/dradis-webapp packaging/dradis-worker #{package_dir}"
sh "cp -pR packaging/vendor #{package_dir}/lib/"

puts "\nCopying gems..."
sh "cp packaging/tmp/Gemfile packaging/tmp/Gemfile.lock #{package_dir}/lib/vendor/"
sh "rm -rf packaging/tmp"
sh "mkdir -p #{package_dir}/lib/vendor/engines"
sh "cp -r engines/core #{package_dir}/lib/vendor/engines"
sh "cp -r engines/frontend #{package_dir}/lib/vendor/engines"

# Temporarily disable RedCloth
# TODO: Remove when RedCloth packages are available
File.write(f = "#{package_dir}/lib/vendor/engines/frontend/dradis_frontend.gemspec", File.read(f).gsub("s.add_dependency 'RedCloth'","# s.add_dependency 'RedCloth'"))
File.write("#{package_dir}/lib/vendor/engines/frontend/lib/redcloth.rb", "class RedCloth;def initialize(*args);end;end")

sh "mkdir #{package_dir}/lib/vendor/.bundle"
sh "cp packaging/bundler-config #{package_dir}/lib/vendor/.bundle/config"
sh "tar -xzf packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-#{target}-sqlite3-#{SQLITE3_VERSION}.tar.gz " +
"-C #{package_dir}/lib/vendor/ruby"
sh "tar -xzf packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-#{target}-nokogiri-#{NOKOGIRI_VERSION}.tar.gz " +
"-C #{package_dir}/lib/vendor/ruby"
sh "tar -xzf packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-#{target}-bcrypt-#{BCRYPT_VERSION}.tar.gz " +
"-C #{package_dir}/lib/vendor/ruby"

puts "\nPacking..."
unless ENV['DIR_ONLY']
sh "tar -czf #{package_dir}.tar.gz #{package_dir}"
sh "rm -rf #{package_dir}"
end
end

def download_runtime(target)
puts "\nDownloading runtime #{ target }"
sh "cd packaging && curl -L -O --fail " +
"http://d6r77u77i8pq3.cloudfront.net/releases/traveling-ruby-#{TRAVELING_RUBY_VERSION}-#{target}.tar.gz"
end

def download_native_extension(target, gem_name_and_version)
puts "\nDownloading native extension #{ target }"
sh "curl -L --fail -o packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-#{target}-#{gem_name_and_version}.tar.gz " +
"http://d6r77u77i8pq3.cloudfront.net/releases/traveling-ruby-gems-#{TRAVELING_RUBY_VERSION}-#{target}/#{gem_name_and_version}.tar.gz"
end
Loading

0 comments on commit 40663e6

Please sign in to comment.