phase 0.0.15 → 0.0.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/phase/cli/all.rb +1 -0
- data/lib/phase/cli/build.rb +35 -0
- data/lib/phase/cli/deploy.rb +11 -21
- data/lib/phase/config/deploy.rb +42 -0
- data/lib/phase/config/ipa.rb +42 -0
- data/lib/phase/configuration.rb +7 -14
- data/lib/phase/kit/deploy/build.rb +19 -31
- data/lib/phase/kit/deploy/deployment.rb +6 -21
- data/lib/phase/util/console.rb +1 -0
- data/lib/phase/version.rb +1 -1
- data/lib/phase.rb +3 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4d5af31cbe28ce6b554391603524b7b2e1f09c6
|
4
|
+
data.tar.gz: 0cb46939ed6cd9190d37e8c3ce8ca7687ff7e3dd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8d0c8cfff6a464bd2393ada3cb073bd885d5114098a47444d7f4a73308f2d3328624af311af8cff3c7a01f30647f5bd66760f125d627f08622d0326d00cf186
|
7
|
+
data.tar.gz: 6fff147f369b8c82aea3c31b0bac1948eb6d62cdb144288953f2752c010a679d93ff40636ab5ae7be654852c46d852c89acc46be311359e332e60d68c7048f78
|
data/lib/phase/cli/all.rb
CHANGED
@@ -0,0 +1,35 @@
|
|
1
|
+
module Phase
|
2
|
+
module CLI
|
3
|
+
class Build < Command
|
4
|
+
|
5
|
+
command :build do |c|
|
6
|
+
c.syntax = "phase build <version_number>"
|
7
|
+
|
8
|
+
c.description = <<-EOS.strip_heredoc
|
9
|
+
Builds a new Docker image of the latest committed code on the current branch. Tags the
|
10
|
+
build with <version_number>.
|
11
|
+
EOS
|
12
|
+
|
13
|
+
c.action do |args, options|
|
14
|
+
new(args, options).run
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
attr_reader :version_number
|
19
|
+
|
20
|
+
def initialize(args, options)
|
21
|
+
super
|
22
|
+
|
23
|
+
@version_number = args[0]
|
24
|
+
|
25
|
+
fail "must specify version number" unless version_number
|
26
|
+
end
|
27
|
+
|
28
|
+
def run
|
29
|
+
build = ::Phase::Deploy::Build.new(version_number)
|
30
|
+
build.execute!
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/phase/cli/deploy.rb
CHANGED
@@ -3,12 +3,10 @@ module Phase
|
|
3
3
|
class Deploy < Command
|
4
4
|
|
5
5
|
command :deploy do |c|
|
6
|
-
c.syntax = "phase deploy
|
7
|
-
|
8
|
-
c.option "-e", "--env environment_name", String, "Deploy to this environment."
|
6
|
+
c.syntax = "phase deploy <environment_name> <version_number>"
|
9
7
|
|
10
8
|
c.description = <<-EOS.strip_heredoc
|
11
|
-
Builds and deploys code to the specified
|
9
|
+
Builds and deploys code to the specified <environment_name>, which may be
|
12
10
|
any environment configured in the Phasefile.
|
13
11
|
EOS
|
14
12
|
|
@@ -17,33 +15,25 @@ module Phase
|
|
17
15
|
end
|
18
16
|
end
|
19
17
|
|
20
|
-
attr_reader :version_number
|
18
|
+
attr_reader :env_name, :version_number
|
21
19
|
|
22
20
|
def initialize(args, options)
|
23
21
|
super
|
24
22
|
|
25
|
-
|
23
|
+
fail "must specify both environment and version number" unless args.count >= 2
|
24
|
+
|
25
|
+
@env_name = args[0]
|
26
|
+
@version_number = args[1]
|
26
27
|
|
27
|
-
fail "must specify environment
|
28
|
+
fail "must specify environment" unless env_name
|
28
29
|
fail "must specify version number" unless version_number
|
29
30
|
end
|
30
31
|
|
31
32
|
def run
|
32
|
-
|
33
|
-
|
34
|
-
}
|
35
|
-
|
36
|
-
deployment = case options.env
|
37
|
-
when "sandbox"
|
38
|
-
::Phase::Deploy::SandboxDeployment.new(opts)
|
39
|
-
when "staging"
|
40
|
-
::Phase::Deploy::StagingDeployment.new(opts)
|
41
|
-
when "production"
|
42
|
-
::Phase::Deploy::ProductionDeployment.new(opts)
|
43
|
-
else
|
44
|
-
fail "unknown environment: '#{environment}'"
|
45
|
-
end
|
33
|
+
environment = config.deploy.environments.find { |e| e.name == env_name }
|
34
|
+
fail "unknown environment: '#{env_name}'" unless environment
|
46
35
|
|
36
|
+
deployment = Deploy::Deployment.new(environment, version_tag: version_number)
|
47
37
|
deployment.execute!
|
48
38
|
end
|
49
39
|
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Phase
|
2
|
+
module Config
|
3
|
+
class Deploy
|
4
|
+
|
5
|
+
# @return [Array<Environment>] the configured deployment environments
|
6
|
+
attr_reader :environments
|
7
|
+
|
8
|
+
|
9
|
+
# @return [String] the compact or fully-qualified address of the Docker repository
|
10
|
+
# @example Sample settings
|
11
|
+
# config.deploy.docker_repository = "mycompany/myrepo"
|
12
|
+
# config.deploy.docker_repository = "https://docker.mycompany.com/myrepo"
|
13
|
+
attr_accessor :docker_repository
|
14
|
+
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
@environments = []
|
18
|
+
end
|
19
|
+
|
20
|
+
# Adds a new deployment environment.
|
21
|
+
# @return [Environment] the new environment
|
22
|
+
def environment(name, options = {})
|
23
|
+
@environments << Environment.new(name, options)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
class Environment
|
29
|
+
|
30
|
+
attr_accessor :name, :perform_build, :server_filters
|
31
|
+
|
32
|
+
alias_method :perform_build?, :perform_build
|
33
|
+
|
34
|
+
def initialize(name, options = {})
|
35
|
+
@name = name
|
36
|
+
@perform_build = options.fetch(:build, true)
|
37
|
+
@server_filters = options.fetch(:servers, {})
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Phase
|
2
|
+
module Config
|
3
|
+
class IPA
|
4
|
+
|
5
|
+
# @return [String] the bundle ID prefix
|
6
|
+
# @example Sample setting
|
7
|
+
# config.ipa.bundle_id_prefix = "com.mycompany"
|
8
|
+
attr_accessor :bundle_id_prefix
|
9
|
+
|
10
|
+
|
11
|
+
# @return [String] the directory keypath (e.g. 'prefix' at S3) for storing uploaded files
|
12
|
+
# @example Sample setting
|
13
|
+
# config.ipa.directory_prefix = "somedir/nesteddir"
|
14
|
+
attr_accessor :directory_prefix
|
15
|
+
|
16
|
+
|
17
|
+
# @return [String] the bucket for storing uploaded files
|
18
|
+
# @example Sample setting
|
19
|
+
# config.ipa.bucket_name = "mycompany-enterprise-builds"
|
20
|
+
attr_accessor :bucket_name
|
21
|
+
|
22
|
+
|
23
|
+
# @return [String] the company name to provide with enterprise app installs
|
24
|
+
# @example Sample setting
|
25
|
+
# config.ipa.company_name = "ACME Corp"
|
26
|
+
attr_accessor :company_name
|
27
|
+
|
28
|
+
|
29
|
+
# @return [String] the URL of a full-size (512px x 512px) app icon PNG
|
30
|
+
# @example Sample setting
|
31
|
+
# config.ipa.full_image_url = "https://....png"
|
32
|
+
attr_accessor :full_image_url
|
33
|
+
|
34
|
+
|
35
|
+
# @return [String] the URL of a Springboard-size (72px x 72px) app icon PNG
|
36
|
+
# @example Sample setting
|
37
|
+
# config.ipa.icon_image_url = "https://....png"
|
38
|
+
attr_accessor :icon_image_url
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/phase/configuration.rb
CHANGED
@@ -22,21 +22,14 @@ module Phase
|
|
22
22
|
::SSHKit.config.backend = @backend
|
23
23
|
end
|
24
24
|
|
25
|
-
#
|
26
|
-
# * docker_repository [String]
|
25
|
+
# @see Phase::Config::Deploy
|
27
26
|
def deploy
|
28
|
-
@deploy ||= ::
|
27
|
+
@deploy ||= Config::Deploy.new
|
29
28
|
end
|
30
29
|
|
31
|
-
#
|
32
|
-
# * bundle_id_prefix [String]
|
33
|
-
# * directory_prefix [String]
|
34
|
-
# * bucket_name [String]
|
35
|
-
# * company_name [String]
|
36
|
-
# * full_image_url [String]
|
37
|
-
# * icon_image_url [String]
|
30
|
+
# @see Phase::Config::IPA
|
38
31
|
def ipa
|
39
|
-
@ipa ||= ::
|
32
|
+
@ipa ||= Config::IPA.new
|
40
33
|
end
|
41
34
|
|
42
35
|
def load_phasefile!
|
@@ -45,10 +38,10 @@ module Phase
|
|
45
38
|
end
|
46
39
|
end
|
47
40
|
|
48
|
-
def set_aws_credentials!
|
41
|
+
def set_aws_credentials!(access_key_id = nil, secret_access_key = nil)
|
49
42
|
Fog.credentials = {
|
50
|
-
aws_access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID'),
|
51
|
-
aws_secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY')
|
43
|
+
aws_access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID', access_key_id),
|
44
|
+
aws_secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY', secret_access_key)
|
52
45
|
}
|
53
46
|
end
|
54
47
|
|
@@ -20,24 +20,26 @@ module Phase
|
|
20
20
|
private
|
21
21
|
|
22
22
|
def build_image
|
23
|
-
|
24
|
-
clone_local_repo
|
23
|
+
prepare_build
|
25
24
|
|
26
25
|
shell("docker build -t #{repo_name}:#{version_tag} #{build_dir}") do |status|
|
27
26
|
fail "couldn't build Docker image"
|
28
27
|
end
|
29
28
|
end
|
30
29
|
|
31
|
-
def
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
def clone_local_repo
|
36
|
-
shell("git clone --depth 1 -- file://$(pwd) #{build_dir}") do |status|
|
30
|
+
def clone_local_git_repo
|
31
|
+
current_branch = `git rev-parse --abbrev-ref HEAD`.strip
|
32
|
+
shell("git clone --reference $(pwd) --branch #{current_branch} --depth 1 -- file://$(pwd) #{build_dir}") do |status|
|
37
33
|
fail "couldn't clone local copy of git repository"
|
38
34
|
end
|
39
35
|
end
|
40
36
|
|
37
|
+
def prepare_build
|
38
|
+
remove_stale_build_dir!
|
39
|
+
clone_local_git_repo
|
40
|
+
set_file_modification_timestamps
|
41
|
+
end
|
42
|
+
|
41
43
|
# def tag_image
|
42
44
|
# shell("docker tag #{repo_name}:#{version_tag} #{repo_name}:latest") do |status|
|
43
45
|
# fail "couldn't tag Docker image"
|
@@ -49,35 +51,21 @@ module Phase
|
|
49
51
|
fail "couldn't push #{repo_name}:#{version_tag}"
|
50
52
|
end
|
51
53
|
|
52
|
-
shell("docker push #{repo_name}:latest") do |status|
|
53
|
-
|
54
|
-
end
|
54
|
+
# shell("docker push #{repo_name}:latest") do |status|
|
55
|
+
# fail "couldn't push #{repo_name}:latest"
|
56
|
+
# end
|
55
57
|
end
|
56
58
|
|
57
|
-
def
|
58
|
-
::
|
59
|
+
def remove_stale_build_dir!
|
60
|
+
::FileUtils.rm_rf(build_dir)
|
59
61
|
end
|
60
|
-
end
|
61
|
-
|
62
|
-
|
63
|
-
class SandboxBuild < Build
|
64
|
-
def execute
|
65
|
-
build_image
|
66
|
-
push
|
67
|
-
end
|
68
|
-
|
69
|
-
private
|
70
62
|
|
71
|
-
def
|
72
|
-
|
73
|
-
fail "couldn't build Docker image"
|
74
|
-
end
|
63
|
+
def repo_name
|
64
|
+
::Phase.config.deploy.docker_repository
|
75
65
|
end
|
76
66
|
|
77
|
-
def
|
78
|
-
|
79
|
-
fail "couldn't push #{repo_name}:#{version_tag}"
|
80
|
-
end
|
67
|
+
def set_file_modification_timestamps
|
68
|
+
|
81
69
|
end
|
82
70
|
end
|
83
71
|
|
@@ -2,42 +2,27 @@ module Phase
|
|
2
2
|
module Deploy
|
3
3
|
|
4
4
|
class Deployment
|
5
|
-
attr_reader :options
|
5
|
+
attr_reader :options#, :build
|
6
6
|
|
7
7
|
def initialize(options = {})
|
8
8
|
@options = options
|
9
9
|
end
|
10
10
|
|
11
|
-
def build
|
12
|
-
|
13
|
-
end
|
11
|
+
# def build
|
12
|
+
# @build ||= Build.new(options[:version_tag])
|
13
|
+
# end
|
14
14
|
|
15
15
|
def execute!
|
16
|
-
build.execute!
|
16
|
+
# build.execute!
|
17
17
|
deploy_image
|
18
18
|
end
|
19
19
|
|
20
20
|
private
|
21
21
|
|
22
22
|
def deploy_image
|
23
|
-
system("")
|
23
|
+
system("echo yaaaay")
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
|
28
|
-
class SandboxDeployment < Deployment
|
29
|
-
def build
|
30
|
-
@build ||= SandboxBuild.new(options[:version_tag])
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
|
35
|
-
class StagingDeployment < Deployment
|
36
|
-
end
|
37
|
-
|
38
|
-
|
39
|
-
class ProductionDeployment < Deployment
|
40
|
-
end
|
41
|
-
|
42
27
|
end
|
43
28
|
end
|
data/lib/phase/util/console.rb
CHANGED
data/lib/phase/version.rb
CHANGED
data/lib/phase.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: phase
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piers Mainwaring
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-05-
|
12
|
+
date: 2015-05-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: commander
|
@@ -209,6 +209,7 @@ files:
|
|
209
209
|
- lib/phase/adapters/aws/subnet.rb
|
210
210
|
- lib/phase/cli.rb
|
211
211
|
- lib/phase/cli/all.rb
|
212
|
+
- lib/phase/cli/build.rb
|
212
213
|
- lib/phase/cli/command.rb
|
213
214
|
- lib/phase/cli/deploy.rb
|
214
215
|
- lib/phase/cli/env.rb
|
@@ -218,6 +219,8 @@ files:
|
|
218
219
|
- lib/phase/cli/mosh.rb
|
219
220
|
- lib/phase/cli/ssh.rb
|
220
221
|
- lib/phase/cli/status.rb
|
222
|
+
- lib/phase/config/deploy.rb
|
223
|
+
- lib/phase/config/ipa.rb
|
221
224
|
- lib/phase/configuration.rb
|
222
225
|
- lib/phase/dsl.rb
|
223
226
|
- lib/phase/kit/deploy/build.rb
|
@@ -265,3 +268,4 @@ summary: A simple way to manage cloud instances within a multi-subnet network, l
|
|
265
268
|
test_files:
|
266
269
|
- spec/dsl_spec.rb
|
267
270
|
- spec/spec_helper.rb
|
271
|
+
has_rdoc:
|