lobot 0.10.0 → 0.10.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,8 +1,15 @@
1
1
  Description:
2
- Explain the generator
2
+ Lobot is a gem that will help you spin-up, bootstrap, and install Jenkins for CI for your Rails app on Amazon EC2.
3
3
 
4
4
  Example:
5
- rails generate install Thing
5
+ rails generate lobot:install
6
6
 
7
7
  This will create:
8
- what/will/it/create
8
+ chef/ - chef cookbooks in a subfolder
9
+ config/ci.yml - a configuration file for lobot
10
+ script/ci_build.sh - a build script you can use to run your CI build
11
+ config/capistrano/ci.rb - a set of lobot specific Capistrano tasks
12
+
13
+ rails generate lobot:config
14
+
15
+ This will configure config/ci.yml for you
@@ -12,11 +12,11 @@ module Lobot
12
12
  default_app_name = File.basename(Rails.root)
13
13
  config = {
14
14
  'app_name' => default_app_name,
15
- 'app_user' => ENV['USER'],
15
+ 'app_user' => "ci",
16
16
  'git_location' => default_git_location,
17
17
  'basic_auth' => [
18
18
  {
19
- 'username' => "#{default_app_name}_ci"
19
+ 'username' => "ci"
20
20
  }
21
21
  ],
22
22
  'credentials' => {
@@ -35,80 +35,65 @@ module Lobot
35
35
  "github_private_ssh_key_path" => File.expand_path("~/.ssh/id_rsa")
36
36
  }
37
37
 
38
- say "* The name of your application as it will appear in CI"
39
- app_name = ask "Application Name [#{config['app_name']}]: "
38
+ say "* The name of your application as it will appear in CI", :green
39
+ app_name = ask("Application Name [#{config['app_name']}]:", :bold)
40
40
  config['app_name'] = app_name if app_name != ""
41
41
 
42
- say "* The user created to run your CI process"
43
- app_user = ask "Application User [#{config['app_user']}]: "
44
- config['app_user'] = app_user if app_user != ""
45
-
46
- say "* The location of your remote git repository which CI will poll and pull from on changes"
47
- git_location = ask "Git Repository Location [#{config['git_location']}]: "
42
+ say "* The location of your remote git repository which CI will poll and pull from on changes", :green
43
+ git_location = ask("Git Repository Location [#{config['git_location']}]:", :bold)
48
44
  config['git_location'] = git_location if git_location != ""
49
45
 
50
- say "* The username you will use to access the CI web interface"
51
- ci_username = ask "CI Username [#{config['basic_auth'][0]['username']}]: "
46
+ say "* The username you will use to access the CI web interface", :green
47
+ ci_username = ask("CI Username [#{config['basic_auth'][0]['username']}]:", :bold)
52
48
  config['basic_auth'][0]['username'] = ci_username if ci_username != ""
53
49
 
54
- say "* The password you will use to access the Jenkins web interface"
50
+ say "* The password you will use to access the CI web interface", :green
55
51
  while true do
56
- ci_password = ask "Choose a CI password: "
52
+ ci_password = ask("Choose a CI password:", :bold)
57
53
  config['basic_auth'][0]['password'] = ci_password
58
54
  if ci_password == ""
59
- say "Password cannot be blank"
55
+ say "Password cannot be blank", :red
60
56
  else
61
57
  break
62
58
  end
63
59
  end
64
60
 
65
- say <<-EOS
61
+ say (<<-EOS).chop, :green
62
+
66
63
  * See https://aws-portal.amazon.com/gp/aws/developer/account/index.html?ie=UTF8&action=access-key
67
64
  * for access key id and secret access key
68
65
  EOS
69
-
70
66
  while true do
71
- aws_access_key_id = ask "AWS Access Key ID: "
67
+ aws_access_key_id = ask("AWS Access Key ID:", :bold)
72
68
  config['credentials']['aws_access_key_id'] = aws_access_key_id
73
69
  if aws_access_key_id == ""
74
- say "AWS Access Key ID cannot be blank"
70
+ say "AWS Access Key ID cannot be blank", :red
75
71
  else
76
72
  break
77
73
  end
78
74
  end
79
75
 
80
76
  while true do
81
- aws_secret_access_key = ask "AWS Secret Access Key: "
77
+ aws_secret_access_key = ask("AWS Secret Access Key:", :bold)
82
78
  config['credentials']['aws_secret_access_key'] = aws_secret_access_key
83
79
  if aws_secret_access_key == ""
84
- say "AWS Secret Access Key cannot be blank"
80
+ say "AWS Secret Access Key cannot be blank", :red
85
81
  else
86
82
  break
87
83
  end
88
84
  end
89
85
 
90
- say <<-EOS
91
- * See http://aws.amazon.com/ec2/instance-types/ API name values (e.g. m1.large)
92
- EOS
93
- flavor_id = ask "Choose an EC2 instance type [#{config['server']['flavor_id']}]: "
94
- config['server']['flavor_id'] = flavor_id if flavor_id != ""
95
-
96
- security_group = ask "AWS EC2 Security Group Name [#{config['server']['security_group']}]: "
97
- config['server']['security_group'] = security_group if security_group != ""
98
-
99
- ssh_port = ask "Server SSH Port [#{config['server']['ssh_port']}]: "
100
- config['server']['ssh_port'] = ssh_port if ssh_port != ""
101
-
102
- build_command = ask "Build Command: [#{config['build_command']}]: "
86
+ build_command = ask("Build Command: [#{config['build_command']}]:", :bold)
103
87
  config['build_command'] = build_command if build_command != ""
104
88
 
105
- say <<-EOS
89
+ say (<<-EOS).chop, :green
90
+
106
91
  * This should refer to an SSH key pair that you have already generated. You may wish to generate a new key
107
92
  * separate from what you may already be using for github or other systems.
108
93
  * For a tutorial on this see: http://open.bsdcow.org/histerical/tutorials/ssh_pubkey_auth#1.2
109
94
  EOS
110
95
  while true do
111
- id_rsa_path = ask "Path to SSH Private Key for EC2 Access [#{config['ec2_server_access']['id_rsa_path']}]: "
96
+ id_rsa_path = ask("Path to SSH Private Key for EC2 Access [#{config['ec2_server_access']['id_rsa_path']}]:", :bold)
112
97
  config['ec2_server_access']['id_rsa_path'] = id_rsa_path if id_rsa_path != ""
113
98
  if config['ec2_server_access']['id_rsa_path'] != File.expand_path(config['ec2_server_access']['id_rsa_path'])
114
99
  config['ec2_server_access']['id_rsa_path'] = File.expand_path(File.join(ENV['HOME'], '.ssh', config['ec2_server_access']['id_rsa_path']))
@@ -116,23 +101,17 @@ module Lobot
116
101
  if File.exist?(config['ec2_server_access']['id_rsa_path']) && File.exist?("#{config['ec2_server_access']['id_rsa_path']}.pub")
117
102
  break
118
103
  else
119
- say "Unable to find both #{config['ec2_server_access']['id_rsa_path']} and #{config['ec2_server_access']['id_rsa_path']}.pub"
104
+ say "Unable to find both #{config['ec2_server_access']['id_rsa_path']} and #{config['ec2_server_access']['id_rsa_path']}.pub", :red
120
105
  end
121
106
  end
122
107
 
123
- say <<-EOS
124
- * This is an arbitrary label corresponding to the SSH credentials that you just selected
125
- * You may name this anything you like. For example: your project name, hostname or name of the SSH key you just chose
126
- EOS
127
- key_pair_name = ask "AWS EC2 Key Pair Name [#{config['ec2_server_access']['key_pair_name']}]: "
128
- config['ec2_server_access']['key_pair_name'] = key_pair_name if key_pair_name != ""
108
+ say (<<-EOS).chop, :green
129
109
 
130
- say <<-EOS
131
110
  * This needs to refer to an SSH Private Key that has been associated an account that has access to the git
132
111
  * repository you entered above. On github this will be listed here: https://github.com/settings/ssh
133
112
  EOS
134
113
  while true do
135
- github_private_ssh_key_path = ask "Path to SSH Private Key for Github [#{config['github_private_ssh_key_path']}]: "
114
+ github_private_ssh_key_path = ask("Path to SSH Private Key for Github [#{config['github_private_ssh_key_path']}]:", :bold)
136
115
  config['github_private_ssh_key_path'] = github_private_ssh_key_path if github_private_ssh_key_path != ""
137
116
  if config['github_private_ssh_key_path'] != File.expand_path(config['github_private_ssh_key_path'])
138
117
  config['github_private_ssh_key_path'] = File.expand_path(File.join(ENV['HOME'], '.ssh', config['github_private_ssh_key_path']))
@@ -140,12 +119,10 @@ module Lobot
140
119
  if File.exist?(config['github_private_ssh_key_path'])
141
120
  break
142
121
  else
143
- say "Unable to find #{config['github_private_ssh_key_path']}"
122
+ say "Unable to find #{config['github_private_ssh_key_path']}", :red
144
123
  end
145
124
  end
146
125
 
147
-
148
-
149
126
  config_ci = YAML.load_file(Rails.root.join("config/ci.yml")) rescue {}
150
127
  config_ci.merge!(config)
151
128
 
@@ -153,8 +130,10 @@ module Lobot
153
130
  f << config_ci.to_yaml
154
131
  end
155
132
 
156
- say "\n\nconfig/ci.yml configured. To launch your instance run rake ci:server_start."
157
- say "Be sure to push uncommitted changes made by the lobot:install process first."
133
+ say "\n\nconfig/ci.yml configured:\n#{File.read(Rails.root.join('config/ci.yml'))}\n"
134
+ say "You can edit this file to change any additional defaults."
135
+ say "Before continuing, be sure to push uncommitted changes to your git repository.", :red
136
+ say "For next steps, see README.md"
158
137
  end
159
138
  end
160
139
  end
@@ -7,4 +7,5 @@ include_recipe "pivotal_server::curl_devel"
7
7
  include_recipe "pivotal_server::ca_cert"
8
8
  include_recipe "pivotal_server::node_js"
9
9
  include_recipe "pivotal_ci::id_rsa"
10
+ include_recipe "pivotal_ci::fonts"
10
11
  include_recipe "pivotal_ci::jenkins"
@@ -0,0 +1,5 @@
1
+ %w(xorg-x11-fonts-Type1 xorg-x11-fonts-75dpi bitmap-fonts xorg-x11-fonts-ISO8859-1-75dpi xorg-x11-fonts-truetype xorg-x11-fonts-ISO8859-15-75dpi xorg-x11-fonts-ISO8859-15-100dpi xorg-x11-fonts-ISO8859-1-100dpi liberation-fonts dejavu-lgc-fonts).each do |font|
2
+ yum_package font do
3
+ action :install
4
+ end
5
+ end
@@ -10,7 +10,7 @@ credentials:
10
10
  aws_secret_access_key: AWS_SECRET
11
11
  provider: AWS # leave this one
12
12
  server:
13
- flavor_id: m1.large
13
+ flavor_id: m1.large # See http://aws.amazon.com/ec2/instance-types/ API name values
14
14
  security_group: ci_servers
15
15
  name: # run 'rake ci:server_start to populate'
16
16
  instance_id: # run 'rake ci:server_start to populate'
@@ -215,28 +215,43 @@ namespace :ci do
215
215
  ci_conf_location = File.join(Dir.pwd, 'config', 'ci.yml')
216
216
  ci_conf = YAML.load_file(ci_conf_location)
217
217
 
218
- puts "CI Monitor Config:"
219
- puts "\tURL:\t\thttp://#{ci_conf['server']['elastic_ip']}/job/#{ci_conf['app_name']}/rssAll"
220
- puts "\tProject Type:\tHudson/Jenkins"
221
- puts "\tFeed Username:\t#{ci_conf['basic_auth'][0]['username']}"
222
- puts "\tFeed Password:\t#{ci_conf['basic_auth'][0]['password']}"
223
- puts "\t-- Lobot Setup --"
224
- puts "\tEC2 Instance ID:\t#{ci_conf['server']['instance_id']}"
225
- puts "\tEC2 Elastic IP Address:\t#{ci_conf['server']['elastic_ip']}"
226
- puts "\tEC2 Access Key ID:\t#{ci_conf['credentials']['aws_access_key_id']}"
227
- puts "\tEC2 Secret Access Key :\t#{ci_conf['credentials']['aws_secret_access_key']}"
228
- puts ""
229
- puts "CC Menu Config:"
230
- puts "\tURL:\thttp://#{ci_conf['basic_auth'][0]['username']}:#{ci_conf['basic_auth'][0]['password']}@#{ci_conf['server']['elastic_ip']}/cc.xml"
218
+ if ci_conf['server']['elastic_ip']
219
+ puts "CI Monitor Config:"
220
+ puts "\tURL:\t\thttp://#{ci_conf['server']['elastic_ip']}/job/#{ci_conf['app_name']}/rssAll"
221
+ puts "\tProject Type:\tHudson/Jenkins"
222
+ puts "\tFeed Username:\t#{ci_conf['basic_auth'][0]['username']}"
223
+ puts "\tFeed Password:\t#{ci_conf['basic_auth'][0]['password']}"
224
+ puts "\t-- Lobot Setup --"
225
+ puts "\tEC2 Instance ID:\t#{ci_conf['server']['instance_id']}"
226
+ puts "\tEC2 Elastic IP Address:\t#{ci_conf['server']['elastic_ip']}"
227
+ puts "\tEC2 Access Key ID:\t#{ci_conf['credentials']['aws_access_key_id']}"
228
+ puts "\tEC2 Secret Access Key :\t#{ci_conf['credentials']['aws_secret_access_key']}"
229
+ puts ""
230
+ puts "CC Menu Config:"
231
+ puts "\tURL:\thttp://#{ci_conf['basic_auth'][0]['username']}:#{ci_conf['basic_auth'][0]['password']}@#{ci_conf['server']['elastic_ip']}/cc.xml"
232
+ else
233
+ puts "EC2 instance information not available. Did you run rake ci:server_start?"
234
+ end
231
235
  end
232
236
 
233
237
  desc "Run a command with a virtual frame buffer"
234
238
  task :headlessly, :command do |task, args|
235
- exit_code = nil
236
239
  # headless is your friend on linux - http://www.aentos.com/blog/easy-setup-your-cucumber-scenarios-using-headless-gem-run-selenium-your-ci-server
240
+ begin
241
+ Headless
242
+ rescue NameError
243
+ puts "Headless not available, did you add it to your Gemfile?"
244
+ exit 1
245
+ end
246
+ unless args[:command]
247
+ puts "Usage: rake ci:headlessly[command] <additional options>"
248
+ exit 1
249
+ end
250
+ exit_code = 1
237
251
  Headless.ly(:display => 42) do |headless|
238
252
  begin
239
- exit_code = system(args[:command])
253
+ system(args[:command])
254
+ exit_code = $?.exitstatus
240
255
  ensure
241
256
  headless.destroy
242
257
  end
data/lib/lobot/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Lobot
2
- VERSION = "0.10.0"
2
+ VERSION = "0.10.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lobot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.10.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-12 00:00:00.000000000 Z
12
+ date: 2012-04-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fog
@@ -231,6 +231,7 @@ files:
231
231
  - lib/generators/lobot/templates/chef/cookbooks/pivotal_ci/attributes/nginx.rb
232
232
  - lib/generators/lobot/templates/chef/cookbooks/pivotal_ci/libraries/ci_config.rb
233
233
  - lib/generators/lobot/templates/chef/cookbooks/pivotal_ci/recipes/default.rb
234
+ - lib/generators/lobot/templates/chef/cookbooks/pivotal_ci/recipes/fonts.rb
234
235
  - lib/generators/lobot/templates/chef/cookbooks/pivotal_ci/recipes/git_config.rb
235
236
  - lib/generators/lobot/templates/chef/cookbooks/pivotal_ci/recipes/id_rsa.rb
236
237
  - lib/generators/lobot/templates/chef/cookbooks/pivotal_ci/recipes/jenkins.rb