another_brick 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in brick.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1 @@
1
+ (Another) Brick =]
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "another_brick/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "another_brick"
7
+ s.version = AnotherBrick::VERSION
8
+ s.authors = ["Victor Cavalcanti", "Vinicius Higa"]
9
+ s.email = ["victorc.rodrigues@gmail.com", "viniciushiga@gmail.com"]
10
+ s.homepage = "https://github.com/viniciushiga/another_brick"
11
+ s.summary = "Deploy debian packages using bricklayer"
12
+ s.description = "Creates a testing tag, waits for bricklayer to build the debian package and then updates your server"
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.require_paths = ["lib"]
18
+
19
+ s.add_development_dependency "rspec", "~> 2.6"
20
+
21
+ s.add_runtime_dependency "slop", "~> 2.1"
22
+ s.add_runtime_dependency "json", "~> 1.5"
23
+ s.add_runtime_dependency "rest-client", "~> 1.6"
24
+ s.add_runtime_dependency "net-ssh", "~> 2.6.1"
25
+ end
data/bin/brick ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "another_brick"
4
+
5
+ options = Slop.parse help: true do
6
+ on :v, :verbose, "Verbose mode"
7
+ on :b, :bricklayer, "Bricklayer host", true
8
+ on :n, :name, "Project name", true
9
+ on :s, :server, "Deploy server", true
10
+ on :u, :user, "Deploy user", true
11
+ on :m, :max_tries, "Max tries to waiting ssh", optional: true
12
+ on :t, :bricklayer_tries, "Max tries to waiting bricklayer", optional: true
13
+ end
14
+
15
+ AnotherBrick.run!(options.to_hash)
@@ -0,0 +1,84 @@
1
+ module AnotherBrick
2
+ module Bricklayer
3
+ extend self
4
+ SUCCESS = %r{^dpkg-buildpackage: full upload; Debian-native package \(full source is included\)}
5
+ ERROR = %r{^dpkg-buildpackage: error:}
6
+
7
+ def wait_build(tag)
8
+ abort "build not succeeded" unless succeeded? build(tag, project(tag))
9
+ end
10
+
11
+ def succeeded?(build)
12
+ result = ""
13
+
14
+ AnotherBrick.bricklayer_tries.times do
15
+ result = RestClient.get(log_uri % build).lines.to_a.last
16
+ break if result =~ SUCCESS or result =~ ERROR
17
+ sleep 2
18
+ end
19
+
20
+ puts result if AnotherBrick.verbose?
21
+ result =~ SUCCESS
22
+ end
23
+
24
+ def project(tag)
25
+ project = nil
26
+
27
+ AnotherBrick.bricklayer_tries.times do
28
+ project = JSON.parse RestClient.get(project_uri)
29
+ puts "project_: #{project}" if AnotherBrick.verbose?
30
+ break if project["last_tag_testing"] == tag
31
+ project = nil
32
+ sleep 5
33
+ end
34
+
35
+ abort "tag not built" unless project
36
+ puts "project: #{project}" if AnotherBrick.verbose?
37
+ project
38
+ end
39
+
40
+ def build(tag, project)
41
+ build = nil
42
+ done = false
43
+
44
+ AnotherBrick.bricklayer_tries.times do
45
+ builds = JSON.parse RestClient.get(build_uri)
46
+
47
+ builds.reverse.each do |item|
48
+ done = item["version"] == tag.split('_')[1]
49
+ build = item if done
50
+ break if done
51
+ end
52
+
53
+ break if done
54
+ sleep 2
55
+ end
56
+
57
+ abort "build not found for tag #{tag}" unless done
58
+ puts "build: #{build}" if AnotherBrick.verbose?
59
+ build["build"]
60
+ end
61
+
62
+ def base_uri
63
+ "#{AnotherBrick.bricklayer_server}/%s/#{AnotherBrick.package_name}"
64
+ end
65
+
66
+ def project_uri
67
+ (base_uri % "project").tap do |uri|
68
+ puts "project_uri: #{uri}" if AnotherBrick.verbose?
69
+ end
70
+ end
71
+
72
+ def build_uri
73
+ (base_uri % "build").tap do |uri|
74
+ puts "build_uri: #{uri}" if AnotherBrick.verbose?
75
+ end
76
+ end
77
+
78
+ def log_uri
79
+ ("#{base_uri % "log"}/%s").tap do |uri|
80
+ puts "log_uri: #{uri}" if AnotherBrick.verbose?
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,20 @@
1
+ module AnotherBrick
2
+ module Configuration
3
+ attr_accessor :bricklayer_server, :package_name,
4
+ :deploy_server, :deploy_user, :max_tries, :bricklayer_tries
5
+
6
+ def load_configuration(options = {})
7
+ self.bricklayer_server = options[:bricklayer]
8
+ self.package_name = options[:name]
9
+ self.deploy_server = options[:server]
10
+ self.deploy_user = options[:user]
11
+ self.max_tries = (options[:max_tries] || 50).to_i
12
+ self.bricklayer_tries = (options[:bricklayer_tries] || 80).to_i
13
+ @verbose = options[:verbose]
14
+ end
15
+
16
+ def verbose?
17
+ @verbose
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,31 @@
1
+ module AnotherBrick
2
+ module Server
3
+ extend self
4
+
5
+ def deploy(tag)
6
+ Net::SSH.start AnotherBrick.deploy_server, AnotherBrick.deploy_user do |ssh|
7
+ AnotherBrick.max_tries.times do
8
+ exec(ssh, "apt-get update")
9
+ cache_show = exec(ssh, "apt-cache show #{AnotherBrick.package_name}")
10
+ version = tag.split('_')[1]
11
+
12
+ unless cache_show =~ /#{AnotherBrick.package_name}_#{version}_(.*)\.deb/
13
+ sleep 2
14
+ next
15
+ end
16
+
17
+ exec(ssh, "apt-get install --force-yes -y #{AnotherBrick.package_name}")
18
+ break
19
+ end
20
+ end
21
+ end
22
+
23
+ def exec(ssh, command)
24
+ ssh.exec!(command).tap do |result|
25
+ return result unless AnotherBrick.verbose?
26
+ puts command
27
+ puts result
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,39 @@
1
+ module AnotherBrick
2
+ module TestingTag
3
+ extend self
4
+
5
+ def create
6
+ version_tags = `git tag | grep ^v`.lines
7
+ max_major = 0
8
+ max_minor = 0
9
+
10
+ version_tags.each do |version|
11
+ major, minor = strip_version('v', version)
12
+
13
+ if major > max_major
14
+ max_major = major
15
+ max_minor = minor
16
+ elsif major == max_major and minor > max_minor
17
+ max_minor = minor
18
+ end
19
+ end
20
+
21
+ testing_tags = `git tag| grep ^testing_#{max_major}.#{max_minor}`.lines
22
+ build = 0
23
+
24
+ testing_tags.each do |testing|
25
+ major, minor, version = strip_version('testing_', testing)
26
+ build = version + 1 if version >= build
27
+ end
28
+
29
+ tag = "testing_#{max_major}.#{max_minor}.#{build}"
30
+ `git tag #{tag}`
31
+ `git push --tags`
32
+ tag
33
+ end
34
+
35
+ def strip_version(prefix, version)
36
+ version.delete(prefix).split('.').map(&:to_i)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,3 @@
1
+ module AnotherBrick
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,23 @@
1
+ require "slop"
2
+ require "json"
3
+ require "rest_client"
4
+ require "net/ssh"
5
+
6
+ require "another_brick/configuration"
7
+ require "another_brick/bricklayer"
8
+ require "another_brick/testing_tag"
9
+ require "another_brick/server"
10
+ require "another_brick/version"
11
+
12
+ module AnotherBrick
13
+ extend self
14
+ extend Configuration
15
+
16
+ def run!(options = {})
17
+ load_configuration(options)
18
+ TestingTag.create.tap do |testing_tag|
19
+ Bricklayer.wait_build(testing_tag)
20
+ Server.deploy(testing_tag)
21
+ end
22
+ end
23
+ end
metadata ADDED
@@ -0,0 +1,141 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: another_brick
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Victor Cavalcanti
9
+ - Vinicius Higa
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-10-26 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rspec
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ~>
21
+ - !ruby/object:Gem::Version
22
+ version: '2.6'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ~>
29
+ - !ruby/object:Gem::Version
30
+ version: '2.6'
31
+ - !ruby/object:Gem::Dependency
32
+ name: slop
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ~>
37
+ - !ruby/object:Gem::Version
38
+ version: '2.1'
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: '2.1'
47
+ - !ruby/object:Gem::Dependency
48
+ name: json
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.5'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: '1.5'
63
+ - !ruby/object:Gem::Dependency
64
+ name: rest-client
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ~>
69
+ - !ruby/object:Gem::Version
70
+ version: '1.6'
71
+ type: :runtime
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ version: '1.6'
79
+ - !ruby/object:Gem::Dependency
80
+ name: net-ssh
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ~>
85
+ - !ruby/object:Gem::Version
86
+ version: 2.6.1
87
+ type: :runtime
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ~>
93
+ - !ruby/object:Gem::Version
94
+ version: 2.6.1
95
+ description: Creates a testing tag, waits for bricklayer to build the debian package
96
+ and then updates your server
97
+ email:
98
+ - victorc.rodrigues@gmail.com
99
+ - viniciushiga@gmail.com
100
+ executables:
101
+ - brick
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - .gitignore
106
+ - Gemfile
107
+ - README.md
108
+ - Rakefile
109
+ - another_brick.gemspec
110
+ - bin/brick
111
+ - lib/another_brick.rb
112
+ - lib/another_brick/bricklayer.rb
113
+ - lib/another_brick/configuration.rb
114
+ - lib/another_brick/server.rb
115
+ - lib/another_brick/testing_tag.rb
116
+ - lib/another_brick/version.rb
117
+ homepage: https://github.com/viniciushiga/another_brick
118
+ licenses: []
119
+ post_install_message:
120
+ rdoc_options: []
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
126
+ - - ! '>='
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ required_rubygems_version: !ruby/object:Gem::Requirement
130
+ none: false
131
+ requirements:
132
+ - - ! '>='
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ requirements: []
136
+ rubyforge_project:
137
+ rubygems_version: 1.8.23
138
+ signing_key:
139
+ specification_version: 3
140
+ summary: Deploy debian packages using bricklayer
141
+ test_files: []