phase 0.0.15 → 0.0.16
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.
- 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:
|