From 66224a3f3d73a00f399a83d6ff648482e9187090 Mon Sep 17 00:00:00 2001 From: Dan Holly Wells Date: Wed, 26 Oct 2011 23:00:14 -0400 Subject: [PATCH 1/2] Added Dropbox as a deployment strategy. --- CHANGES.md | 4 + betabuilder.gemspec | 7 +- lib/beta_builder/deployment_strategies.rb | 3 +- .../deployment_strategies/dropbox.rb | 135 ++++++++++++++++++ 4 files changed, 146 insertions(+), 3 deletions(-) create mode 100644 lib/beta_builder/deployment_strategies/dropbox.rb diff --git a/CHANGES.md b/CHANGES.md index 7a783b2..923f67f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,7 @@ +## 0.7.4 +* Forked by danhollywells 10/25/11 +* added Dropbox Public folder deployment strategy + ## 0.7.3 * Made the Xcode derived data directory more robust by grepping for the Validate line in the log. diff --git a/betabuilder.gemspec b/betabuilder.gemspec index 6d39b57..3bb1e39 100644 --- a/betabuilder.gemspec +++ b/betabuilder.gemspec @@ -2,14 +2,14 @@ Gem::Specification.new do |s| s.name = %q{betabuilder} - s.version = "0.7.3" + s.version = "0.7.4" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Luke Redpath"] s.date = %q{2011-08-05} s.email = %q{luke@lukeredpath.co.uk} s.extra_rdoc_files = ["README.md", "LICENSE", "CHANGES.md"] - s.files = ["CHANGES.md", "LICENSE", "README.md", "lib/beta_builder/archived_build.rb", "lib/beta_builder/deployment_strategies/testflight.rb", "lib/beta_builder/deployment_strategies/web.rb", "lib/beta_builder/deployment_strategies.rb", "lib/beta_builder.rb", "lib/betabuilder.rb"] + s.files = ["CHANGES.md", "LICENSE", "README.md", "lib/beta_builder/archived_build.rb", "lib/beta_builder/deployment_strategies/testflight.rb", "lib/beta_builder/deployment_strategies/dropbox.rb", "lib/beta_builder/deployment_strategies/web.rb", "lib/beta_builder/deployment_strategies.rb", "lib/beta_builder.rb", "lib/betabuilder.rb"] s.homepage = %q{http://github.com/lukeredpath/betabuilder} s.rdoc_options = ["--main", "README.md"] s.require_paths = ["lib"] @@ -24,16 +24,19 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, ["~> 2.3.1"]) s.add_runtime_dependency(%q, ["~> 1.6.1"]) s.add_runtime_dependency(%q, ["~> 1.4.6"]) + s.add_runtime_dependency(%q, ["~> 1.0.beta"]) else s.add_dependency(%q, ["~> 2.0.0"]) s.add_dependency(%q, ["~> 2.3.1"]) s.add_dependency(%q, ["~> 1.6.1"]) s.add_dependency(%q, ["~> 1.4.6"]) + s.add_dependency(%q, ["~> 1.0.beta"]) end else s.add_dependency(%q, ["~> 2.0.0"]) s.add_dependency(%q, ["~> 2.3.1"]) s.add_dependency(%q, ["~> 1.6.1"]) s.add_dependency(%q, ["~> 1.4.6"]) + s.add_dependency(%q, ["~> 1.0.beta"]) end end diff --git a/lib/beta_builder/deployment_strategies.rb b/lib/beta_builder/deployment_strategies.rb index 24a89f7..022fca0 100644 --- a/lib/beta_builder/deployment_strategies.rb +++ b/lib/beta_builder/deployment_strategies.rb @@ -29,11 +29,12 @@ def prepare private def self.strategies - {:web => Web, :testflight => TestFlight} + {:web => Web, :testflight => TestFlight, :dropbox => Dropbox} end end end require 'beta_builder/deployment_strategies/web' require 'beta_builder/deployment_strategies/testflight' +require 'beta_builder/deployment_strategies/dropbox' diff --git a/lib/beta_builder/deployment_strategies/dropbox.rb b/lib/beta_builder/deployment_strategies/dropbox.rb new file mode 100644 index 0000000..4185929 --- /dev/null +++ b/lib/beta_builder/deployment_strategies/dropbox.rb @@ -0,0 +1,135 @@ +require 'tmpdir' +require 'fileutils' +require 'dropbox_sdk' + +module BetaBuilder + module DeploymentStrategies + class Dropbox < Strategy + DROPBOXURL = 'http://dl.dropbox.com/u/' + def extended_configuration_for_strategy + proc do + def deployment_url + File.join(DROPBOXURL+user_id+deploy_to, ipa_name) + end + def webpage_url + File.join(DROPBOXURL+user_id+deploy_to, "index.html") + end + def manifest_url + File.join(DROPBOXURL+user_id+deploy_to, "manifest.plist") + end + end + end + + def prepare + plist = CFPropertyList::List.new(:file => "pkg/Payload/#{@configuration.app_name}.app/Info.plist") + plist_data = CFPropertyList.native_types(plist.value) + File.open("pkg/dist/manifest.plist", "w") do |io| + io << %{ + + + + + items + + + assets + + + kind + software-package + url + #{@configuration.deployment_url} + + + metadata + + bundle-identifier + #{plist_data['CFBundleIdentifier']} + bundle-version + #{plist_data['CFBundleVersion']} + kind + software + title + #{plist_data['CFBundleDisplayName']} + + + + + + } + end + File.open("pkg/dist/index.html", "w") do |io| + io << %{ + + + + + + Beta Download + + + +
+ +

Link didn't work?
+ Make sure you're visiting this page on your device, not your computer.

+ + + } + end + end + + + def deploy + puts "Uploading build to Dropbox..." + + if @configuration.dry_run + puts '** Dry Run - No action here! **' + return + end + begin + session = DropboxSession.deserialize(File.read('build/dropbox_saved_session.txt')) + session.get_request_token + rescue Exception => e + session = DropboxSession.new(@configuration.consumer_key, @configuration.consumer_secret) + session.get_request_token + # Make the user log in and authorize this token + authorize_url = session.get_authorize_url + puts "AUTHORIZING", authorize_url + `open "#{authorize_url}"` + puts "Please visit that web page and hit 'Allow', then hit Enter here." + STDIN.gets + session.get_access_token + File.open('build/dropbox_saved_session.txt', 'w') do |f| + f.puts session.serialize + end + end + + client = DropboxClient.new(session, :dropbox) + # puts "linked account:", client.account_info().inspect + puts "Almost there..." + file = open('pkg/dist/index.html') + response1 = client.put_file("/Public#{@configuration.deploy_to}/index.html", file, overwrite=true) + # puts "uploaded:", response1.inspect + puts "Just a few more seconds..." + file = open('pkg/dist/manifest.plist') + response2 = client.put_file("/Public#{@configuration.deploy_to}/manifest.plist", file, overwrite=true) + # puts "uploaded:", response2.inspect + puts "It's really close now..." + file = open("pkg/dist/#{@configuration.ipa_name}") + response3 = client.put_file("/Public#{@configuration.deploy_to}/#{@configuration.ipa_name}", file, overwrite=true) + # puts "uploaded:", response3.inspect + puts "Done!" + + end + + end + end +end From 3d52517109deb37072d580757faeb34389529cc6 Mon Sep 17 00:00:00 2001 From: Dan Holly Wells Date: Wed, 26 Oct 2011 23:00:14 -0400 Subject: [PATCH 2/2] Added Dropbox as a deployment strategy. --- CHANGES.md | 4 + README.md | 17 +++ betabuilder.gemspec | 7 +- lib/beta_builder/deployment_strategies.rb | 3 +- .../deployment_strategies/dropbox.rb | 140 ++++++++++++++++++ 5 files changed, 168 insertions(+), 3 deletions(-) create mode 100644 lib/beta_builder/deployment_strategies/dropbox.rb diff --git a/CHANGES.md b/CHANGES.md index 7a783b2..923f67f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,7 @@ +## 0.7.4 +* Forked by danhollywells 10/25/11 +* added Dropbox Public folder deployment strategy + ## 0.7.3 * Made the Xcode derived data directory more robust by grepping for the Validate line in the log. diff --git a/README.md b/README.md index 1f55b05..75d91ed 100644 --- a/README.md +++ b/README.md @@ -131,6 +131,23 @@ You will to configure betabuilder to use the `web` deployment strategy with some The `deploy_to` setting specifies the URL that your app will be published to. The `remote_host` setting is the SSH host that will be used to copy the files to your server using SCP. Finally, the `remote_directory` setting is the path to the location to your server that files will be uploaded to. You will need to configure any virtual hosts on your server to make this work. +## Deploying to Dropbox + +BetaBuilder now supports deploying to your Dropbox /Public folder. Below is an example configuration block. + +config.deploy_using(:dropbox) do |c| + c.user_id = "XXXXXX" + c.open_browser_when_done = true + c.consumer_key = "XXXXXXXXXXX" #see https://www.dropbox.com/developers/apps for keys + c.consumer_secret = "XXXXXXXXXXX" + c.deploy_to = "/dropbox/path/to/deployment" +end + +`user_id` is your dropbox UserID +`open_browser_when_done` will launch safari on successful deployment +`consumer_key` and `consumer_secret` Create these values at https://www.dropbox.com/developers/apps +`deploy_to` Path within your /Public folder to deploy + ## License This code is licensed under the MIT license. diff --git a/betabuilder.gemspec b/betabuilder.gemspec index 6d39b57..3bb1e39 100644 --- a/betabuilder.gemspec +++ b/betabuilder.gemspec @@ -2,14 +2,14 @@ Gem::Specification.new do |s| s.name = %q{betabuilder} - s.version = "0.7.3" + s.version = "0.7.4" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Luke Redpath"] s.date = %q{2011-08-05} s.email = %q{luke@lukeredpath.co.uk} s.extra_rdoc_files = ["README.md", "LICENSE", "CHANGES.md"] - s.files = ["CHANGES.md", "LICENSE", "README.md", "lib/beta_builder/archived_build.rb", "lib/beta_builder/deployment_strategies/testflight.rb", "lib/beta_builder/deployment_strategies/web.rb", "lib/beta_builder/deployment_strategies.rb", "lib/beta_builder.rb", "lib/betabuilder.rb"] + s.files = ["CHANGES.md", "LICENSE", "README.md", "lib/beta_builder/archived_build.rb", "lib/beta_builder/deployment_strategies/testflight.rb", "lib/beta_builder/deployment_strategies/dropbox.rb", "lib/beta_builder/deployment_strategies/web.rb", "lib/beta_builder/deployment_strategies.rb", "lib/beta_builder.rb", "lib/betabuilder.rb"] s.homepage = %q{http://github.com/lukeredpath/betabuilder} s.rdoc_options = ["--main", "README.md"] s.require_paths = ["lib"] @@ -24,16 +24,19 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, ["~> 2.3.1"]) s.add_runtime_dependency(%q, ["~> 1.6.1"]) s.add_runtime_dependency(%q, ["~> 1.4.6"]) + s.add_runtime_dependency(%q, ["~> 1.0.beta"]) else s.add_dependency(%q, ["~> 2.0.0"]) s.add_dependency(%q, ["~> 2.3.1"]) s.add_dependency(%q, ["~> 1.6.1"]) s.add_dependency(%q, ["~> 1.4.6"]) + s.add_dependency(%q, ["~> 1.0.beta"]) end else s.add_dependency(%q, ["~> 2.0.0"]) s.add_dependency(%q, ["~> 2.3.1"]) s.add_dependency(%q, ["~> 1.6.1"]) s.add_dependency(%q, ["~> 1.4.6"]) + s.add_dependency(%q, ["~> 1.0.beta"]) end end diff --git a/lib/beta_builder/deployment_strategies.rb b/lib/beta_builder/deployment_strategies.rb index 24a89f7..022fca0 100644 --- a/lib/beta_builder/deployment_strategies.rb +++ b/lib/beta_builder/deployment_strategies.rb @@ -29,11 +29,12 @@ def prepare private def self.strategies - {:web => Web, :testflight => TestFlight} + {:web => Web, :testflight => TestFlight, :dropbox => Dropbox} end end end require 'beta_builder/deployment_strategies/web' require 'beta_builder/deployment_strategies/testflight' +require 'beta_builder/deployment_strategies/dropbox' diff --git a/lib/beta_builder/deployment_strategies/dropbox.rb b/lib/beta_builder/deployment_strategies/dropbox.rb new file mode 100644 index 0000000..dddb3d7 --- /dev/null +++ b/lib/beta_builder/deployment_strategies/dropbox.rb @@ -0,0 +1,140 @@ +require 'tmpdir' +require 'fileutils' +require 'dropbox_sdk' + +module BetaBuilder + module DeploymentStrategies + class Dropbox < Strategy + DROPBOXURL = 'http://dl.dropbox.com/u/' + def extended_configuration_for_strategy + proc do + def deployment_url + File.join(DROPBOXURL+user_id+deploy_to, ipa_name) + end + def webpage_url + File.join(DROPBOXURL+user_id+deploy_to, "index.html") + end + def manifest_url + File.join(DROPBOXURL+user_id+deploy_to, "manifest.plist") + end + end + end + + def prepare + plist = CFPropertyList::List.new(:file => "pkg/Payload/#{@configuration.app_name}.app/Info.plist") + plist_data = CFPropertyList.native_types(plist.value) + File.open("pkg/dist/manifest.plist", "w") do |io| + io << %{ + + + + + items + + + assets + + + kind + software-package + url + #{@configuration.deployment_url} + + + metadata + + bundle-identifier + #{plist_data['CFBundleIdentifier']} + bundle-version + #{plist_data['CFBundleVersion']} + kind + software + title + #{plist_data['CFBundleDisplayName']} + + + + + + } + end + File.open("pkg/dist/index.html", "w") do |io| + io << %{ + + + + + + Beta Download + + + +
+ +

Link didn't work?
+ Make sure you're visiting this page on your device, not your computer.

+ + + } + end + end + + + def deploy + puts "Uploading build to Dropbox..." + + if @configuration.dry_run + puts '** Dry Run - No action here! **' + return + end + begin + session = DropboxSession.deserialize(File.read('build/dropbox_saved_session.txt')) + session.get_request_token + rescue Exception => e + session = DropboxSession.new(@configuration.consumer_key, @configuration.consumer_secret) + session.get_request_token + # Make the user log in and authorize this token + authorize_url = session.get_authorize_url + puts "AUTHORIZING", authorize_url + `open "#{authorize_url}"` + puts "Please visit that web page and hit 'Allow', then hit Enter here." + STDIN.gets + session.get_access_token + File.open('build/dropbox_saved_session.txt', 'w') do |f| + f.puts session.serialize + end + end + + client = DropboxClient.new(session, :dropbox) + # puts "linked account:", client.account_info().inspect + puts "Almost there..." + file = open('pkg/dist/index.html') + response1 = client.put_file("/Public#{@configuration.deploy_to}/index.html", file, overwrite=true) + # puts "uploaded:", response1.inspect + puts "Just a few more seconds..." + file = open('pkg/dist/manifest.plist') + response2 = client.put_file("/Public#{@configuration.deploy_to}/manifest.plist", file, overwrite=true) + # puts "uploaded:", response2.inspect + puts "It's really close now..." + file = open("pkg/dist/#{@configuration.ipa_name}") + response3 = client.put_file("/Public#{@configuration.deploy_to}/#{@configuration.ipa_name}", file, overwrite=true) + # puts "uploaded:", response3.inspect + puts "Done!" + + puts "#{webpage_url}" + if @configuration.open_browser_when_done + `open "#{webpage_url}"` + end + + end + + end + end +end