dockly 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.cane +3 -0
- data/.gitignore +15 -0
- data/.rspec +3 -0
- data/.ruby-version +1 -0
- data/.travis.yml +7 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +20 -0
- data/README.md +221 -0
- data/Rakefile +19 -0
- data/bin/dockly +8 -0
- data/dockly.gemspec +31 -0
- data/lib/dockly.rb +44 -0
- data/lib/dockly/aws.rb +60 -0
- data/lib/dockly/build_cache.rb +131 -0
- data/lib/dockly/cli.rb +46 -0
- data/lib/dockly/deb.rb +141 -0
- data/lib/dockly/docker.rb +169 -0
- data/lib/dockly/foreman.rb +37 -0
- data/lib/dockly/rake_task.rb +40 -0
- data/lib/dockly/util/git.rb +13 -0
- data/lib/dockly/util/tar.rb +27 -0
- data/lib/dockly/version.rb +3 -0
- data/lib/foreman/cli_fix.rb +9 -0
- data/lib/foreman/export/base_fix.rb +6 -0
- data/spec/dockly/aws_spec.rb +17 -0
- data/spec/dockly/build_cache_spec.rb +144 -0
- data/spec/dockly/deb_spec.rb +238 -0
- data/spec/dockly/docker_spec.rb +216 -0
- data/spec/dockly/foreman_spec.rb +39 -0
- data/spec/dockly_spec.rb +1 -0
- data/spec/fixtures/Procfile +1 -0
- data/spec/fixtures/Rakefile +17 -0
- data/spec/fixtures/not_a_tar-2.txt +1 -0
- data/spec/fixtures/not_a_tar.txt +1 -0
- data/spec/fixtures/tar-2.tar +0 -0
- data/spec/fixtures/test-1.tar +0 -0
- data/spec/fixtures/test-2.tar.gz +0 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/support/vcr.rb +11 -0
- metadata +297 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: fe48214f959251a622ec6458e33b73c9c75b4ac7
|
4
|
+
data.tar.gz: 3788dea01e592c04e702b8892e3b638dfcec2dc1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fcfb39baac628840756bc4f944570bf8b7be9713d3a627841ade18601971b1395848943538b8c48f3a4dcd610423adb03eb84552c887e658aab6fcc3a559de9b
|
7
|
+
data.tar.gz: d9075e08f45a02cfbb101b9e1ef590f43b8e9f7ea0de29aa59f51aa1e9739692b7ad62426e32549f70dd66100a7fc4c547e3e4fafa5c227a848ea1a334bcb11f
|
data/.cane
ADDED
data/.gitignore
ADDED
data/.rspec
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.9.3-p125
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2013 Swipely, Inc.
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,221 @@
|
|
1
|
+
Dockly
|
2
|
+
=======
|
3
|
+
|
4
|
+
`dockly` is a gem made to ease the pain of packaging an application. For this gem to be useful, quite a few assumptions can be made about your stack:
|
5
|
+
|
6
|
+
- You use AWS
|
7
|
+
- You're deploying to a Debian-based system
|
8
|
+
- You want to use [Docker](http://docker.io) for process isolation
|
9
|
+
|
10
|
+
Although only a specific type of repository may be used, these assumptions allow us to define a simple DSL to describe your repository.
|
11
|
+
|
12
|
+
The DSL
|
13
|
+
-------
|
14
|
+
|
15
|
+
The DSL is broken down into multiple objects, all of which conform to a specific format. Each object starts with the name of the section,
|
16
|
+
followed by a name for the object you're creating, and a block for configuration.
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
docker :test_docker do
|
20
|
+
# code here
|
21
|
+
end
|
22
|
+
```
|
23
|
+
|
24
|
+
Each object has an enumeration of valid attributes. The following code sets the `repo` attribute in a `docker` called `test_docker`:
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
docker :test_docker do
|
28
|
+
repo 'an-awesome-repo'
|
29
|
+
end
|
30
|
+
```
|
31
|
+
|
32
|
+
Finally, each object has zero or more valid references to other DSL objects. The following code sets `deb` that references a `docker`:
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
docker :my_docker do
|
36
|
+
repo 'my-repo'
|
37
|
+
end
|
38
|
+
|
39
|
+
deb :my_deb do
|
40
|
+
docker :my_docker
|
41
|
+
end
|
42
|
+
```
|
43
|
+
|
44
|
+
Below is an alternative syntax that accomplishes the same thing:
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
deb :my_deb do
|
48
|
+
docker do
|
49
|
+
repo 'my-repo'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
```
|
53
|
+
|
54
|
+
`docker`
|
55
|
+
--------
|
56
|
+
|
57
|
+
The `docker` DSL is used to define Docker containers. It has the following attributes:
|
58
|
+
|
59
|
+
- `import`
|
60
|
+
- required: `true`
|
61
|
+
- default: `nil`
|
62
|
+
- description: the location (url or S3 path) of the base image to start building from
|
63
|
+
- `git_archive`:
|
64
|
+
- required: `false`
|
65
|
+
- default: `nil`
|
66
|
+
- description: the relative file path of git repo that should be added to the container
|
67
|
+
- `build`
|
68
|
+
- required: `true`
|
69
|
+
- default: `nil`
|
70
|
+
- description: aditional Dockerfile commands that you'd like to pass to `docker build`
|
71
|
+
- `repo`
|
72
|
+
- required: `true`
|
73
|
+
- default: `'dockly'`
|
74
|
+
- description: the repository of the created image
|
75
|
+
- `tag`
|
76
|
+
- required: `true`
|
77
|
+
- default: `nil`
|
78
|
+
- description: the tag of the created image
|
79
|
+
- `build_dir`
|
80
|
+
- required: `true`
|
81
|
+
- default: `./build/docker`
|
82
|
+
- description: the directory of the temporary build files
|
83
|
+
- `package_dir`
|
84
|
+
- required: `true`
|
85
|
+
- default: `/opt/docker`
|
86
|
+
- description: the location of the created image in the Debian package
|
87
|
+
- `timeout`
|
88
|
+
- required: `true`
|
89
|
+
- default: `60`
|
90
|
+
- description: the excon timeout for read and write when talking to docker through docker-api
|
91
|
+
- `build_caches`
|
92
|
+
- required: `false`
|
93
|
+
- default: `[]`
|
94
|
+
- description: a listing of references to build caches to run
|
95
|
+
|
96
|
+
`foreman`
|
97
|
+
---------
|
98
|
+
|
99
|
+
The `foreman` DSL is used to define the foreman export scripts. It has the following attributes:
|
100
|
+
|
101
|
+
- `env`
|
102
|
+
- description: accepts same arguments as `foreman start --env`
|
103
|
+
- `procfile`
|
104
|
+
- required: `true`
|
105
|
+
- default: `'Procfile'`
|
106
|
+
- description: the Procfile to use
|
107
|
+
- `type`
|
108
|
+
- required: `true`
|
109
|
+
- default: `'upstart'`
|
110
|
+
- description: the type of foreman script being defined
|
111
|
+
- `user`
|
112
|
+
- required: `true`
|
113
|
+
- default: `'nobody'`
|
114
|
+
- description: the user the scripts will run as
|
115
|
+
- `root_dir`
|
116
|
+
- required: `false`
|
117
|
+
- default: `'/tmp'`
|
118
|
+
- description: set the root directory
|
119
|
+
- `init_dir`
|
120
|
+
- required: `false`
|
121
|
+
- default: `'/etc/init'`
|
122
|
+
- description: the location of the startup scripts in the Debian package
|
123
|
+
- `prefix`
|
124
|
+
- required: `false`
|
125
|
+
- default: `nil`
|
126
|
+
- description: a prefix given to each command from foreman.
|
127
|
+
must be using https://github.com/adamjt/foreman for this to work
|
128
|
+
|
129
|
+
`deb`
|
130
|
+
-----
|
131
|
+
|
132
|
+
The `deb` DSL is used to define Debian packages. It has the following attributes:
|
133
|
+
|
134
|
+
- `package_name`
|
135
|
+
- required: `true`
|
136
|
+
- default: `nil`
|
137
|
+
- description: the name of the created package
|
138
|
+
- `version`
|
139
|
+
- required: `true`
|
140
|
+
- default: `0.0`
|
141
|
+
- description: the version of the created package
|
142
|
+
- `release`
|
143
|
+
- required: `true`
|
144
|
+
- default: `0`
|
145
|
+
- description: the realese version of the created package
|
146
|
+
- `arch`
|
147
|
+
- required: `true`
|
148
|
+
- default: `x86_64`
|
149
|
+
- description: the intended architecture of the created package
|
150
|
+
- `build_dir`
|
151
|
+
- required: `true`
|
152
|
+
- default: `build/deb`
|
153
|
+
- description: the location of the temporary files on the local file system
|
154
|
+
- `pre_install`, `post_install`, `pre_uninstall`, `post_uninstall`
|
155
|
+
- required: `false`
|
156
|
+
- default: `nil`
|
157
|
+
- description: script hooks for package events
|
158
|
+
- `s3_bucket`
|
159
|
+
- required: `false`
|
160
|
+
- default: `nil`
|
161
|
+
- description: the s3 bucket the package is uploaded to
|
162
|
+
|
163
|
+
In addition to the above attributes, `deb` has the following references:
|
164
|
+
|
165
|
+
- `docker`
|
166
|
+
- required: `false`
|
167
|
+
- default: `nil`
|
168
|
+
- class: `Dockly::Docker`
|
169
|
+
- description: configuration for an image packaged with the deb
|
170
|
+
- `foreman`
|
171
|
+
- required: `false`
|
172
|
+
- default: `nil`
|
173
|
+
- class: `Dockly::Foreman`
|
174
|
+
- description: any Foreman scripts used in the deb
|
175
|
+
|
176
|
+
|
177
|
+
Demo
|
178
|
+
===
|
179
|
+
|
180
|
+
```ruby
|
181
|
+
deb :dockly_package do
|
182
|
+
package_name 'dockly_package'
|
183
|
+
version '1.0'
|
184
|
+
release '1'
|
185
|
+
|
186
|
+
docker do
|
187
|
+
name :dockly_docker
|
188
|
+
tag 'dockly_docker'
|
189
|
+
import 's3://dockly-bucket-name/base-image.tar.gz'
|
190
|
+
git_archive '/app'
|
191
|
+
timeout 120
|
192
|
+
|
193
|
+
build_cache do
|
194
|
+
s3_bucket "dockly-bucket-name"
|
195
|
+
s3_object_prefix "bundle_cache/"
|
196
|
+
hash_command "cd /app && ./script/bundle_hash"
|
197
|
+
build_command "cd /app && ./script/bundle_package"
|
198
|
+
output_dir "/app/vendor/bundle"
|
199
|
+
use_latest true
|
200
|
+
end
|
201
|
+
|
202
|
+
build <<-EOF
|
203
|
+
run cd /app && echo "1.0-1" > VERSION && echo "#{Dockly.git_sha}" >> VERSION
|
204
|
+
EOF
|
205
|
+
# git_sha is available from Dockly
|
206
|
+
end
|
207
|
+
|
208
|
+
foreman do
|
209
|
+
name 'dockly'
|
210
|
+
procfile 'Procfile'
|
211
|
+
prefix 'source /etc/dockly_env '
|
212
|
+
log_dir '/data/logs'
|
213
|
+
user 'ubuntu'
|
214
|
+
end
|
215
|
+
|
216
|
+
s3_bucket 'dockly-bucket-name'
|
217
|
+
# ends up in s3://#{s3_bucket}/#{package_name}/#{git_hash}/#{package_name}_#{version}.#{release}_#{arch}.deb
|
218
|
+
end
|
219
|
+
```
|
220
|
+
|
221
|
+
Copyright (c) 2013 Swipely, Inc. See LICENSE.txt for further details.
|
data/Rakefile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# Copyright Swipely, Inc. All rights reserved.
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift( File.join( File.dirname(__FILE__), 'lib' ) )
|
4
|
+
|
5
|
+
require 'rake'
|
6
|
+
require 'dockly'
|
7
|
+
require 'rspec/core/rake_task'
|
8
|
+
require 'cane/rake_task'
|
9
|
+
|
10
|
+
task :default => [:spec, :quality]
|
11
|
+
|
12
|
+
RSpec::Core::RakeTask.new do |t|
|
13
|
+
t.pattern = 'spec/**/*_spec.rb'
|
14
|
+
t.rspec_opts = '--tag ~docker' if ENV['CI']
|
15
|
+
end
|
16
|
+
|
17
|
+
Cane::RakeTask.new(:quality) do |cane|
|
18
|
+
cane.canefile = '.cane'
|
19
|
+
end
|
data/bin/dockly
ADDED
data/dockly.gemspec
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/dockly/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Swipely, Inc."]
|
6
|
+
gem.email = %w{tomhulihan@swipely.com bright@swipely.com toddlunter@swipely.com}
|
7
|
+
gem.description = %q{Packaging made easy}
|
8
|
+
gem.summary = %q{Packaging made easy}
|
9
|
+
gem.homepage = "https://github.com/swipely/dockly"
|
10
|
+
gem.files = `git ls-files`.split($\)
|
11
|
+
gem.license = 'MIT'
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "dockly"
|
15
|
+
gem.require_paths = %w{lib}
|
16
|
+
gem.version = Dockly::VERSION
|
17
|
+
gem.add_dependency 'clamp', '~> 0.6'
|
18
|
+
gem.add_dependency 'docker-api', '~> 1.5.2'
|
19
|
+
gem.add_dependency 'dockly-util'
|
20
|
+
gem.add_dependency 'excon'
|
21
|
+
gem.add_dependency 'fog', '~> 1.14.0'
|
22
|
+
gem.add_dependency 'foreman'
|
23
|
+
gem.add_dependency 'fpm', '~> 0.4.42'
|
24
|
+
gem.add_dependency 'grit'
|
25
|
+
gem.add_development_dependency 'cane'
|
26
|
+
gem.add_development_dependency 'pry'
|
27
|
+
gem.add_development_dependency 'rake'
|
28
|
+
gem.add_development_dependency 'rspec'
|
29
|
+
gem.add_development_dependency 'vcr'
|
30
|
+
gem.add_development_dependency 'webmock'
|
31
|
+
end
|
data/lib/dockly.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'dockly/util'
|
2
|
+
require 'fog'
|
3
|
+
require 'pry'
|
4
|
+
require 'foreman/cli_fix'
|
5
|
+
require 'foreman/export/base_fix'
|
6
|
+
|
7
|
+
module Dockly
|
8
|
+
end
|
9
|
+
|
10
|
+
require 'dockly/aws'
|
11
|
+
require 'dockly/foreman'
|
12
|
+
require 'dockly/build_cache'
|
13
|
+
require 'dockly/docker'
|
14
|
+
require 'dockly/deb'
|
15
|
+
require 'dockly/util/tar'
|
16
|
+
require 'dockly/util/git'
|
17
|
+
|
18
|
+
module Dockly
|
19
|
+
def setup(file = 'dockly.rb')
|
20
|
+
git_sha rescue 'unknown'
|
21
|
+
Dockly::Deb.instances
|
22
|
+
Dockly::Docker.instances
|
23
|
+
Dockly::Foreman.instances
|
24
|
+
instance_eval(IO.read(file), file)
|
25
|
+
end
|
26
|
+
|
27
|
+
{
|
28
|
+
:deb => Dockly::Deb,
|
29
|
+
:docker => Dockly::Docker,
|
30
|
+
:foreman => Dockly::Foreman
|
31
|
+
}.each do |method, klass|
|
32
|
+
define_method(method) do |sym, &block|
|
33
|
+
klass.new!(:name => sym, &block)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def git_sha
|
38
|
+
@git_sha ||= Dockly::Util::Git.git_sha
|
39
|
+
end
|
40
|
+
|
41
|
+
module_function :setup, :deb, :docker, :foreman, :git_sha
|
42
|
+
end
|
43
|
+
|
44
|
+
require 'dockly/rake_task'
|
data/lib/dockly/aws.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'fog/aws'
|
2
|
+
|
3
|
+
# This module holds the connections for all AWS services used by the gem.
|
4
|
+
module Dockly::AWS
|
5
|
+
extend self
|
6
|
+
|
7
|
+
def service(name, klass)
|
8
|
+
define_method name do
|
9
|
+
if val = instance_variable_get(:"@#{name}")
|
10
|
+
val
|
11
|
+
else
|
12
|
+
instance = klass.new(creds)
|
13
|
+
instance_variable_set(:"@#{name}", instance)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
services << name
|
17
|
+
end
|
18
|
+
|
19
|
+
def services
|
20
|
+
@services ||= []
|
21
|
+
end
|
22
|
+
|
23
|
+
def env_attr(*names)
|
24
|
+
names.each do |name|
|
25
|
+
define_method name do
|
26
|
+
instance_variable_get(:"@#{name}") || ENV[name.to_s.upcase]
|
27
|
+
end
|
28
|
+
|
29
|
+
define_method :"#{name}=" do |val|
|
30
|
+
reset_cache!
|
31
|
+
instance_variable_set(:"@#{name}", val)
|
32
|
+
end
|
33
|
+
|
34
|
+
env_attrs << name
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def env_attrs
|
39
|
+
@env_attrs ||= []
|
40
|
+
end
|
41
|
+
|
42
|
+
def creds
|
43
|
+
attrs = Hash[env_attrs.map { |attr| [attr, public_send(attr)] }].reject { |k, v| v.nil? }
|
44
|
+
if attrs.empty?
|
45
|
+
if ENV['FOG_CREDENTIAL']
|
46
|
+
attrs = {} # let Fog use the env var
|
47
|
+
else
|
48
|
+
attrs = { :use_iam_profile => true }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
attrs
|
52
|
+
end
|
53
|
+
|
54
|
+
def reset_cache!
|
55
|
+
services.each { |service| instance_variable_set(:"@#{service}", nil) }
|
56
|
+
end
|
57
|
+
|
58
|
+
service :s3, Fog::Storage::AWS
|
59
|
+
env_attr :aws_access_key_id, :aws_secret_access_key
|
60
|
+
end
|