ukku 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MzAzM2QyNzNlMmRjZDJlMDA2ZTZlZTkzMTZlNTQ3ODRmYTMxMjdkNQ==
5
+ data.tar.gz: !binary |-
6
+ NDhhNDg0NWVkNWQ5MTA5YzU2NjhiNGQ2OWI5ZWJlYmEzNDgyY2JlMA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ MzFmZWYxMjdkZjM5NGVkNGRhMGY3ZmJjOTY1MGJlNmZiYTdjZGVmMzZiYWVj
10
+ ZjFjZjE1ODg1MDJmNTRhNmU4NzEyNzBiZTYyNjlmMjAxNjQ1NWNjNjE5NjJm
11
+ ZWM3ODgzYmYwZTFhYmMyODIwZDgzYjhiNjA4NTg2NGVjOTRlYmI=
12
+ data.tar.gz: !binary |-
13
+ NjE5NzA2YTNjNzY4MWJhMjk1NDBjMTZkODA4MmVjOTRiMmQ5ZDM2MjRjNmI1
14
+ MmE1YTJlZWZhMmRkODMwMWE2M2NiMzdjZGM0ZjhiNjM3YWVhZDZiNDM2MGE5
15
+ ZjA0MWEwZWNiYjBlMjNlMmVlMmMzNDgxNmYxYTJlMjcyNGQ2NGQ=
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+
4
+ gem 'docopt'
5
+ gem 'rye', '0.9'
6
+ gem 'subprocess'
7
+ gem 'rugged'
@@ -0,0 +1,72 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ ukku (0.1.0)
5
+ gli (= 2.12.2)
6
+ rugged (= 0.21.3)
7
+ rye (= 0.9)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ annoy (0.5.6)
13
+ highline (>= 1.5.0)
14
+ aruba (0.6.1)
15
+ childprocess (>= 0.3.6)
16
+ cucumber (>= 1.1.1)
17
+ rspec-expectations (>= 2.7.0)
18
+ builder (3.2.2)
19
+ childprocess (0.5.5)
20
+ ffi (~> 1.0, >= 1.0.11)
21
+ cucumber (1.3.18)
22
+ builder (>= 2.1.2)
23
+ diff-lcs (>= 1.1.3)
24
+ gherkin (~> 2.12)
25
+ multi_json (>= 1.7.5, < 2.0)
26
+ multi_test (>= 0.1.1)
27
+ diff-lcs (1.2.5)
28
+ docopt (0.5.0)
29
+ drydock (0.6.9)
30
+ ffi (1.9.6)
31
+ gherkin (2.12.2)
32
+ multi_json (~> 1.3)
33
+ gli (2.12.2)
34
+ highline (1.6.21)
35
+ json (1.8.1)
36
+ multi_json (1.10.1)
37
+ multi_test (0.1.1)
38
+ net-scp (1.2.1)
39
+ net-ssh (>= 2.6.5)
40
+ net-ssh (2.9.2)
41
+ rake (10.4.2)
42
+ rdoc (4.2.0)
43
+ json (~> 1.4)
44
+ rspec-expectations (3.1.2)
45
+ diff-lcs (>= 1.2.0, < 2.0)
46
+ rspec-support (~> 3.1.0)
47
+ rspec-support (3.1.2)
48
+ rugged (0.21.3)
49
+ rye (0.9.0)
50
+ annoy
51
+ highline (>= 1.5.1)
52
+ net-scp (>= 1.0.2)
53
+ net-ssh (>= 2.0.13)
54
+ sysinfo (>= 0.7.0)
55
+ storable (0.8.9)
56
+ subprocess (1.2.0)
57
+ sysinfo (0.8.1)
58
+ drydock
59
+ storable
60
+
61
+ PLATFORMS
62
+ ruby
63
+
64
+ DEPENDENCIES
65
+ aruba
66
+ docopt
67
+ rake
68
+ rdoc
69
+ rugged
70
+ rye (= 0.9)
71
+ subprocess
72
+ ukku!
@@ -0,0 +1,44 @@
1
+ require 'rake/clean'
2
+ require 'rubygems'
3
+ require 'rubygems/package_task'
4
+ require 'rdoc/task'
5
+ require 'cucumber'
6
+ require 'cucumber/rake/task'
7
+ Rake::RDocTask.new do |rd|
8
+ rd.main = "README.rdoc"
9
+ rd.rdoc_files.include("README.rdoc","lib/**/*.rb","bin/**/*")
10
+ rd.title = 'Your application title'
11
+ end
12
+
13
+ spec = eval(File.read('ukku.gemspec'))
14
+
15
+ Gem::PackageTask.new(spec) do |pkg|
16
+ end
17
+ CUKE_RESULTS = 'results.html'
18
+ CLEAN << CUKE_RESULTS
19
+ desc 'Run features'
20
+ Cucumber::Rake::Task.new(:features) do |t|
21
+ opts = "features --format html -o #{CUKE_RESULTS} --format progress -x"
22
+ opts += " --tags #{ENV['TAGS']}" if ENV['TAGS']
23
+ t.cucumber_opts = opts
24
+ t.fork = false
25
+ end
26
+
27
+ desc 'Run features tagged as work-in-progress (@wip)'
28
+ Cucumber::Rake::Task.new('features:wip') do |t|
29
+ tag_opts = ' --tags ~@pending'
30
+ tag_opts = ' --tags @wip'
31
+ t.cucumber_opts = "features --format html -o #{CUKE_RESULTS} --format pretty -x -s#{tag_opts}"
32
+ t.fork = false
33
+ end
34
+
35
+ task :cucumber => :features
36
+ task 'cucumber:wip' => 'features:wip'
37
+ task :wip => 'features:wip'
38
+ require 'rake/testtask'
39
+ Rake::TestTask.new do |t|
40
+ t.libs << "test"
41
+ t.test_files = FileList['test/*_test.rb']
42
+ end
43
+
44
+ task :default => [:test,:features]
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+ require 'docopt'
3
+ require 'subprocess'
4
+ require 'rye'
5
+ require 'rugged'
6
+ require 'yaml'
7
+ require 'ukku'
8
+
9
+ doc = <<DOCOPT
10
+ Ukku.
11
+
12
+ Usage:
13
+ ukku configure [-u USER] [-i IDENTITY_FILE] HOST [NAME]
14
+ ukku [--app=NAME] run COMMAND...
15
+
16
+ Arguments:
17
+ HOST Domain or IP of your server.
18
+ NAME A name for the application. Defaults to 'production'.
19
+
20
+ Options:
21
+ -u USER --user=USER User used to connect to your server. Defaults to 'root'.
22
+ -i IDENTITY_FILE The SSH key used to connect to your server. Defaults to '~/.ssh/id_rsa'.
23
+ --app=NAME The name of the application.
24
+
25
+ DOCOPT
26
+
27
+ UKKU_FILE = '.ukku.yml'
28
+
29
+ begin
30
+ # parse args
31
+ args = Docopt::docopt(doc)
32
+
33
+ # execute commands
34
+ ConfigureCommand.new.execute(args) if args['configure']
35
+ RunCommand.new.execute(args) if args['run']
36
+ rescue Exception => e
37
+ puts " ! #{e.message}"
38
+ exit 1
39
+ end
@@ -0,0 +1,6 @@
1
+ When /^I get help for "([^"]*)"$/ do |app_name|
2
+ @app_name = app_name
3
+ step %(I run `#{app_name} help`)
4
+ end
5
+
6
+ # Add more step definitions here
@@ -0,0 +1,15 @@
1
+ require 'aruba/cucumber'
2
+
3
+ ENV['PATH'] = "#{File.expand_path(File.dirname(__FILE__) + '/../../bin')}#{File::PATH_SEPARATOR}#{ENV['PATH']}"
4
+ LIB_DIR = File.join(File.expand_path(File.dirname(__FILE__)),'..','..','lib')
5
+
6
+ Before do
7
+ # Using "announce" causes massive warnings on 1.9.2
8
+ @puts = true
9
+ @original_rubylib = ENV['RUBYLIB']
10
+ ENV['RUBYLIB'] = LIB_DIR + File::PATH_SEPARATOR + ENV['RUBYLIB'].to_s
11
+ end
12
+
13
+ After do
14
+ ENV['RUBYLIB'] = @original_rubylib
15
+ end
@@ -0,0 +1,8 @@
1
+ Feature: My bootstrapped app kinda works
2
+ In order to get going on coding my awesome app
3
+ I want to have aruba and cucumber setup
4
+ So I don't have to do it myself
5
+
6
+ Scenario: App just runs
7
+ When I get help for "ukku"
8
+ Then the exit status should be 0
@@ -0,0 +1,4 @@
1
+ require 'ukku/version.rb'
2
+ require 'ukku/connection.rb'
3
+ require 'ukku/configure_command.rb'
4
+ require 'ukku/run_command.rb'
@@ -0,0 +1,94 @@
1
+ class ConfigureCommand
2
+
3
+ def execute(args)
4
+ host = args['HOST']
5
+ name = args['NAME'] || "production"
6
+ user = args['--user'] || "root"
7
+ identity_file = args['-i']
8
+
9
+ entry = { "host" => host, "user" => user } # the entry to add to UKKU_FILE
10
+ entry["identity_file"] = identity_file if identity_file
11
+
12
+ # check if the entry exists in UKKU_FILE (with different info)
13
+ entry_in_file = load_entry_from_file(name)
14
+ if entry_in_file && !entries_match?(entry_in_file, entry)
15
+ raise "Name '#{name}' already exists, choose a different one"
16
+ end
17
+
18
+ conn = Connection.new(host, user, identity_file)
19
+ server_ready = conn.execute("test -e /usr/bin/gitreceive") == 0
20
+
21
+ if server_ready
22
+ puts "The server is already configured ... skipping"
23
+ else
24
+ configure_server(conn)
25
+ end
26
+
27
+ repo = fetch_repo
28
+ configure_remote(repo, name, "git@#{host}:#{name}")
29
+
30
+ append_entry_to_ukku_file(name, entry) if !entry_in_file
31
+
32
+ append_ukku_file_to_gitignore
33
+
34
+ puts
35
+ puts "Your server is configured! Deploy your application using 'git push #{name} master'"
36
+ end
37
+
38
+ private
39
+ def load_entry_from_file(name)
40
+ if File.exist?(UKKU_FILE)
41
+ data = YAML.load_file(UKKU_FILE)
42
+ data[name]
43
+ end
44
+ end
45
+
46
+ def entries_match?(h1, h2)
47
+ h1.size == h2.size && (h1.keys - h2.keys).empty?
48
+ end
49
+
50
+ def configure_server(conn)
51
+ wget1_command = "wget https://raw.githubusercontent.com/germanescobar/ukku/master/server/bootstrap.sh"
52
+ wget2_command = "wget https://raw.githubusercontent.com/germanescobar/ukku/master/server/run.sh"
53
+ chmod_command = "chmod 755 bootstrap.sh run.sh"
54
+ run_command = "./bootstrap.sh"
55
+ conn.execute "#{wget1_command} && #{wget2_command} && #{chmod_command} && #{run_command}"
56
+ end
57
+
58
+ def fetch_repo
59
+ begin
60
+ Rugged::Repository.new('.')
61
+ rescue Rugged::RepositoryError
62
+ Rugged::Repository.init_at('.')
63
+ end
64
+ end
65
+
66
+ def configure_remote(repo, name, remote_url)
67
+ if repo.remotes[name]
68
+ if repo.remotes[name].url != remote_url
69
+ raise "A remote with name '#{name}' already exists"
70
+ end
71
+ puts "Git remote already configured ... skipping"
72
+ else
73
+ print "Configuring remote repository ... "
74
+ repo.remotes.create(name, remote_url)
75
+ puts "done"
76
+ end
77
+ end
78
+
79
+ def append_entry_to_ukku_file(name, params)
80
+ data = { name => params }
81
+ File.open(UKKU_FILE, 'a') { |f| f.write data.to_yaml }
82
+ end
83
+
84
+ def append_ukku_file_to_gitignore
85
+ if File.read('.gitignore').scan(/.ukku.yml/).length == 0
86
+ print "Adding '#{UKKU_FILE}' to .gitignore ... "
87
+ File.open('.gitignore', 'a') { |f| f.write UKKU_FILE }
88
+ puts "done"
89
+ else
90
+ print "'#{UKKU_FILE}' already in .gitignore ... skipping"
91
+ end
92
+ end
93
+
94
+ end
@@ -0,0 +1,16 @@
1
+ class Connection
2
+ def initialize(host, user, identity_file)
3
+ @host = host
4
+ @user = user
5
+ @identity_file = identity_file
6
+ end
7
+
8
+ def execute(command)
9
+ args = ["ssh", "-t"]
10
+ if @identity_file
11
+ args += ["-i", @identity_file ]
12
+ end
13
+ args += ["#{@user}@#{@host}", "#{command}"]
14
+ Subprocess.check_call(args)
15
+ end
16
+ end
@@ -0,0 +1,32 @@
1
+ class RunCommand
2
+ def execute(args)
3
+ command = args['COMMAND'].join(' ')
4
+
5
+ if !File.exist?(UKKU_FILE)
6
+ raise "No application configured. Run 'ukku configure HOST' first."
7
+ end
8
+
9
+ data = YAML.load_file(UKKU_FILE)
10
+ name, server = data.first
11
+ if name.nil?
12
+ raise "No application configured. Run 'ukku configure <host>' first."
13
+ end
14
+
15
+ if data.length > 1
16
+ if args['--app'].empty?
17
+ raise "No app specified, use the --app NAME option"
18
+ else
19
+ name = args[--app]
20
+ sever = data[name]
21
+ end
22
+ end
23
+
24
+ host = server['host']
25
+ user = server['user']
26
+ identity_file = server['identity_file']
27
+
28
+ puts "Running command '#{command}' on #{host} ..."
29
+ conn = Connection.new(host, user, identity_file)
30
+ conn.execute("./run.sh #{command}")
31
+ end
32
+ end
@@ -0,0 +1,3 @@
1
+ module Ukku
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,14 @@
1
+ require 'test_helper'
2
+
3
+ class DefaultTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ end
7
+
8
+ def teardown
9
+ end
10
+
11
+ def test_the_truth
12
+ assert true
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ require 'test/unit'
2
+
3
+ # Add test libraries you want to use here, e.g. mocha
4
+
5
+ class Test::Unit::TestCase
6
+
7
+ # Add global extensions to the test case class here
8
+
9
+ end
@@ -0,0 +1,23 @@
1
+ # Ensure we require the local version and not one we might have installed already
2
+ require File.join([File.dirname(__FILE__),'lib','ukku','version.rb'])
3
+ spec = Gem::Specification.new do |s|
4
+ s.name = 'ukku'
5
+ s.version = Ukku::VERSION
6
+ s.author = 'Germán Escobar'
7
+ s.email = 'german.escobarc@gmail.com'
8
+ s.homepage = 'http://germanescobar.net/'
9
+ s.platform = Gem::Platform::RUBY
10
+ s.summary = 'Easily deploy your application to your own server using "git push"'
11
+ s.files = `git ls-files`.split("
12
+ ")
13
+ s.require_paths << 'lib'
14
+ s.bindir = 'bin'
15
+ s.executables << 'ukku'
16
+ s.add_development_dependency('rake')
17
+ s.add_development_dependency('rdoc')
18
+ s.add_development_dependency('aruba')
19
+ s.add_runtime_dependency('gli','2.12.2')
20
+ s.add_runtime_dependency('docopt', '0.5.0')
21
+ s.add_runtime_dependency('rye', '0.9')
22
+ s.add_runtime_dependency('rugged', '0.21.3')
23
+ end
@@ -0,0 +1,5 @@
1
+ = ukku
2
+
3
+ Generate this with
4
+ ukku rdoc
5
+ After you have described your command line interface
metadata ADDED
@@ -0,0 +1,158 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ukku
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Germán Escobar
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rdoc
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: aruba
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: gli
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 2.12.2
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 2.12.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: docopt
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 0.5.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 0.5.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rye
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
89
+ version: '0.9'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: '0.9'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rugged
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 0.21.3
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 0.21.3
111
+ description:
112
+ email: german.escobarc@gmail.com
113
+ executables:
114
+ - ukku
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - Gemfile
119
+ - Gemfile.lock
120
+ - Rakefile
121
+ - bin/ukku
122
+ - features/step_definitions/ukku_steps.rb
123
+ - features/support/env.rb
124
+ - features/ukku.feature
125
+ - lib/ukku.rb
126
+ - lib/ukku/configure_command.rb
127
+ - lib/ukku/connection.rb
128
+ - lib/ukku/run_command.rb
129
+ - lib/ukku/version.rb
130
+ - test/default_test.rb
131
+ - test/test_helper.rb
132
+ - ukku.gemspec
133
+ - ukku.rdoc
134
+ homepage: http://germanescobar.net/
135
+ licenses: []
136
+ metadata: {}
137
+ post_install_message:
138
+ rdoc_options: []
139
+ require_paths:
140
+ - lib
141
+ - lib
142
+ required_ruby_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ! '>='
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ required_rubygems_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ! '>='
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ requirements: []
153
+ rubyforge_project:
154
+ rubygems_version: 2.4.1
155
+ signing_key:
156
+ specification_version: 4
157
+ summary: Easily deploy your application to your own server using "git push"
158
+ test_files: []