fulmar 1.8.0 → 1.8.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2d20b737b6af1583286258dc2f016a9e513efb35
4
- data.tar.gz: 9b422f9364ec4c4ce227734bf0fb01efe5faf2ac
3
+ metadata.gz: b3a5a9c3fcc0eac8bf2f866acb574bc6e26b3daf
4
+ data.tar.gz: b37c35df4992fa35e0b98338b8306d87da6b95b2
5
5
  SHA512:
6
- metadata.gz: f86764318b194d621a9259ed8b08b39bc647a3a3a7c03e9ea7721829220da70e95d2a36e3f063920890bd39e1b4a8c5a61b45c1bef3ab3a7b0d024122bb46004
7
- data.tar.gz: 55a2081e314963646e7c22d4db62d4118b001f3ea6a7643c6dae3364a29fe0a72a4b050840829bfcbdb4bb5fbc5b4eb361f05bdbb971990229333e13344e0a49
6
+ metadata.gz: d1f91dc05ce99316148331c754ef94b195667f77d7a66736fdc335d13101b5b65e04c388252a85dee7065e46f4b88cb9f8180e317a660b9c5955a37f902e40df
7
+ data.tar.gz: 6d02384db532a177e53890693f17e33764be59bcec4dc19d4479cbda553dcddbc1a75798110809ad72ef0e94ebf5fe5d6708a2db8014295ab13dca50c5e0aac3
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,5 @@
1
+ AllCops:
2
+ Include:
3
+ - '**/Fulmarfile'
4
+ Metrics/LineLength:
5
+ Max: 120
data/.travis.yml ADDED
@@ -0,0 +1,12 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0
5
+ - 2.1
6
+ - 2.2
7
+ - ruby-head
8
+ before_install: gem install bundler -v 1.10.6
9
+ matrix:
10
+ fast_finish: true
11
+ allow_failures:
12
+ - rvm: ruby-head
data/Gemfile CHANGED
@@ -2,3 +2,13 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in fulmar.gemspec
4
4
  gemspec
5
+
6
+ group :test do
7
+ gem 'rake'
8
+ gem 'rspec'
9
+ gem 'fakefs', require: 'fakefs/safe'
10
+ end
11
+
12
+ group :test, :development do
13
+ gem 'rubocop', require: false
14
+ end
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Fulmar
2
2
 
3
+ [![Build Status](https://travis-ci.org/CORE4/fulmar.svg?branch=master)](https://travis-ci.org/CORE4/fulmar)
4
+
3
5
  Fulmar is a task manager for deployments. It is build on top of rake to use its powerful
4
6
  task system and adds host and environment configuration. It provides methods to easily
5
7
  access the current deployment configuration and simplifies especially file transfers and
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'rspec/core/rake_task'
2
+ require 'rubocop/rake_task'
3
+
4
+ task :default => [:spec]
5
+
6
+ desc 'Run the specs'
7
+ RSpec::Core::RakeTask.new
8
+
9
+ RuboCop::RakeTask.new
data/fulmar.gemspec CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency 'bundler', '~> 1.7'
22
22
 
23
23
  spec.add_runtime_dependency 'rake', '~>10'
24
- spec.add_runtime_dependency 'rugged', '~>0', '<=0.22.1'
24
+ spec.add_runtime_dependency 'rugged', '~> 0.23.0'
25
25
  spec.add_runtime_dependency 'mysql2', '~>0.3'
26
26
  spec.add_runtime_dependency 'fulmar-shell', '~>1', '>=1.4.0'
27
27
  spec.add_runtime_dependency 'ruby_wings', '~>0.1', '>=0.1.1'
@@ -14,10 +14,18 @@ module Fulmar
14
14
  @config.dependencies(env).each_pair do |_key, data|
15
15
  next unless data[:type].blank? || data[:type] == 'git'
16
16
  shell.quiet = true
17
- shell.run "git clone #{data[:source]} #{data[:path]} -q"
18
- shell.last_error.each do |line|
19
- puts line unless line.include? 'already exists and is not an empty directory'
17
+
18
+ if Dir.exist? "#{data[:path]}/.git"
19
+ shell.run 'git fetch -q', in: data[:path]
20
+ else
21
+ shell.run "git clone #{data[:source]} #{data[:path]} -q"
22
+ shell.last_error.each do |line|
23
+ puts line unless line.include? 'already exists and is not an empty directory'
24
+ end
20
25
  end
26
+
27
+ git = Rugged::Repository.new(data[:path])
28
+ checkout(git, data)
21
29
  end
22
30
  end
23
31
 
@@ -26,16 +34,7 @@ module Fulmar
26
34
  next unless data[:type].blank? || data[:type] == 'git'
27
35
  git = Rugged::Repository.new(data[:path])
28
36
 
29
- # Switch to the configured branch/tag/commit
30
- if git.branches.select { |b| b.name.split('/').last == data[:ref] }.any?
31
- checkout_branch(git, data[:ref])
32
- elsif git.tags.map(&:name).include?(data[:ref])
33
- git.checkout("refs/tags/#{data[:ref]}")
34
- elsif data[:ref].match(/^[a-zA-Z0-9]{40}$/) && git.exists?(data[:ref])
35
- git.checkout(data[:ref])
36
- else
37
- fail "Cannot find ref #{data[:ref]} in repo #{data[:path]}"
38
- end
37
+ checkout(git, data)
39
38
 
40
39
  # Pull
41
40
  shell = Fulmar::Infrastructure::Service::ShellService.new data[:path]
@@ -47,11 +46,30 @@ module Fulmar
47
46
 
48
47
  protected
49
48
 
50
- def checkout_branch(git, branch)
49
+ def checkout(git, dependency)
50
+ # Switch to the configured branch/tag/commit
51
+ if git.branches.select { |b| b.name.split('/').last == dependency[:ref] }.any?
52
+ checkout_branch(git, dependency[:ref])
53
+ elsif git.tags.map(&:name).include?(dependency[:ref])
54
+ git.checkout("refs/tags/#{dependency[:ref]}")
55
+ elsif dependency[:ref].match(/^[a-zA-Z0-9]{40}$/) && git.exists?(dependency[:ref])
56
+ git.checkout(dependency[:ref])
57
+ else
58
+ fail "Cannot find ref #{dependency[:ref]} in repo #{dependency[:path]}"
59
+ end
60
+ end
61
+
62
+ def checkout_branch(git, branch, remote = 'origin')
51
63
  if git.branches.collect(&:name).include? branch
52
64
  git.checkout(branch)
53
65
  else
54
- new_branch = git.branches.create(branch.split('/').last, branch)
66
+ remote_branch = git.branches.find do |b|
67
+ b.name == "#{remote}/#{branch}"
68
+ end
69
+
70
+ new_branch = git.branches.create(branch, remote_branch.name)
71
+ new_branch.upstream=(remote_branch)
72
+
55
73
  git.checkout(new_branch)
56
74
  end
57
75
  end
@@ -9,14 +9,17 @@ module Fulmar
9
9
  module CommonHelper
10
10
  attr_accessor :environment
11
11
 
12
+ # @return [Hash]
12
13
  def full_configuration
13
14
  configuration.configuration
14
15
  end
15
16
 
17
+ # @return [Fulmar::Domain::Service::ConfigurationService]
16
18
  def configuration
17
19
  (@_config_service ||= Fulmar::Domain::Service::ConfigurationService.instance)
18
20
  end
19
21
 
22
+ # @return [Fulmar::Domain::Model::Project]
20
23
  def project
21
24
  full_configuration[:project]
22
25
  end
@@ -27,10 +30,12 @@ module Fulmar
27
30
  storage['composer'].execute(command, arguments)
28
31
  end
29
32
 
33
+ # @return [Fulmar::Shell]
30
34
  def local_shell
31
35
  storage['local_shell'] ||= new_shell(configuration[:local_path])
32
36
  end
33
37
 
38
+ # @return [Fulmar::Shell]
34
39
  def remote_shell
35
40
  storage['remote_shell'] ||= new_shell(configuration[:remote_path], configuration.ssh_user_and_host)
36
41
  end
@@ -7,6 +7,7 @@ module Fulmar
7
7
  class SSHConfigService
8
8
  CONFIG_FILE = "#{ENV['HOME']}/.ssh/config"
9
9
  KNOWN_HOST_FILE = "#{ENV['HOME']}/.ssh/known_hosts"
10
+ # @todo: Get rid of this layer (Version 2?)
10
11
  CONFIG_MAP = {
11
12
  hostname: 'Hostname',
12
13
  port: 'Port',
@@ -14,7 +15,9 @@ module Fulmar
14
15
  proxycommand: 'ProxyCommand',
15
16
  checkhostip: 'CheckHostIP',
16
17
  stricthostkeychecking: 'StrictHostKeyChecking',
17
- identityfile: 'IdentityFile'
18
+ identityfile: 'IdentityFile',
19
+ userknownhostfile: 'UserKnownHostsFile',
20
+ loglevel: 'LogLevel'
18
21
  }
19
22
 
20
23
  def initialize(config)
@@ -48,6 +48,12 @@ module Fulmar
48
48
  "rsync #{rsync_command_options.join(' ')} '#{from}/' '#{to}'"
49
49
  end
50
50
 
51
+ # Gets the absolute release path
52
+ # @return [String] the release directory
53
+ def release_path
54
+ @config[:remote_path]
55
+ end
56
+
51
57
  protected
52
58
 
53
59
  # Assembles all rsync command line parameters from the configuration options
@@ -6,6 +6,7 @@ module Fulmar
6
6
  ##
7
7
  # Reverse file lookup in path
8
8
  # @param path [String]
9
+ # @param filename [String]
9
10
  def reverse_file_lookup(path, filename)
10
11
  paths = get_parent_directory_paths(path)
11
12
 
@@ -1,4 +1,4 @@
1
1
  # Provides a global version number
2
2
  module Fulmar
3
- VERSION = '1.8.0'
3
+ VERSION = '1.8.1'
4
4
  end
@@ -0,0 +1,51 @@
1
+ require 'fulmar/service/helper_service'
2
+
3
+ describe Fulmar::Service::HelperService, fakefs: true do
4
+ BASE_PATH = '/srv/fulmar/service/helper_service_spec'
5
+
6
+ def stub_test_files(base_path)
7
+ 4.times do |i|
8
+ path = ''
9
+
10
+ i.times do |n|
11
+ path << "/folder_d#{(n + 1)}"
12
+ end
13
+
14
+ FileUtils.mkdir_p("#{base_path}#{path}")
15
+
16
+ File.open("#{base_path}#{path}/file_d#{(i)}", 'w') do |f|
17
+ f.write 'TEST CONTENT'
18
+ end
19
+ end
20
+ end
21
+
22
+ before(:each) do
23
+ stub_test_files(BASE_PATH)
24
+ end
25
+
26
+ describe '#reverse_file_lookup' do
27
+ it 'should return the path to the file' do
28
+ file = described_class.reverse_file_lookup("#{BASE_PATH}/folder_d1/folder_d2/folder_d3", 'file_d1')
29
+ expect(file).to eq("#{BASE_PATH}/folder_d1/file_d1")
30
+ end
31
+
32
+ it 'should return the path to the file' do
33
+ file = described_class.reverse_file_lookup("#{BASE_PATH}/folder_d1/folder_d2", 'file_d2')
34
+ expect(file).to eq("#{BASE_PATH}/folder_d1/folder_d2/file_d2")
35
+ end
36
+
37
+ ##
38
+ # The file is located in a child directory of the given path
39
+ it 'should return false' do
40
+ file = described_class.reverse_file_lookup("#{BASE_PATH}/folder_d1/folder_d2/folder_d3", 'file_d4')
41
+ expect(file).to eq(false)
42
+ end
43
+
44
+ ##
45
+ # The file does not exist
46
+ it 'should return false' do
47
+ file = described_class.reverse_file_lookup("#{BASE_PATH}/folder_d1/folder_d2", 'file_d9')
48
+ expect(file).to eq(false)
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,84 @@
1
+ require 'fakefs/spec_helpers'
2
+
3
+ Dir.glob(::File.expand_path('../support/*.rb', __FILE__)).each { |f| require_relative f }
4
+
5
+ RSpec.configure do |config|
6
+ config.include FakeFS::SpecHelpers, fakefs: true
7
+
8
+ # rspec-expectations config goes here. You can use an alternate
9
+ # assertion/expectation library such as wrong or the stdlib/minitest
10
+ # assertions if you prefer.
11
+ config.expect_with :rspec do |expectations|
12
+ # This option will default to `true` in RSpec 4. It makes the `description`
13
+ # and `failure_message` of custom matchers include text for helper methods
14
+ # defined using `chain`, e.g.:
15
+ # be_bigger_than(2).and_smaller_than(4).description
16
+ # # => "be bigger than 2 and smaller than 4"
17
+ # ...rather than:
18
+ # # => "be bigger than 2"
19
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
20
+ end
21
+
22
+ # rspec-mocks config goes here. You can use an alternate test double
23
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
24
+ config.mock_with :rspec do |mocks|
25
+ # Prevents you from mocking or stubbing a method that does not exist on
26
+ # a real object. This is generally recommended, and will default to
27
+ # `true` in RSpec 4.
28
+ mocks.verify_partial_doubles = true
29
+ end
30
+
31
+ # The settings below are suggested to provide a good initial experience
32
+ # with RSpec, but feel free to customize to your heart's content.
33
+ =begin
34
+ # These two settings work together to allow you to limit a spec run
35
+ # to individual examples or groups you care about by tagging them with
36
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
37
+ # get run.
38
+ config.filter_run :focus
39
+ config.run_all_when_everything_filtered = true
40
+
41
+ # Allows RSpec to persist some state between runs in order to support
42
+ # the `--only-failures` and `--next-failure` CLI options. We recommend
43
+ # you configure your source control system to ignore this file.
44
+ config.example_status_persistence_file_path = "spec/examples.txt"
45
+
46
+ # Limits the available syntax to the non-monkey patched syntax that is
47
+ # recommended. For more details, see:
48
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
49
+ # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
50
+ # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
51
+ config.disable_monkey_patching!
52
+
53
+ # This setting enables warnings. It's recommended, but in some cases may
54
+ # be too noisy due to issues in dependencies.
55
+ config.warnings = true
56
+
57
+ # Many RSpec users commonly either run the entire suite or an individual
58
+ # file, and it's useful to allow more verbose output when running an
59
+ # individual spec file.
60
+ if config.files_to_run.one?
61
+ # Use the documentation formatter for detailed output,
62
+ # unless a formatter has already been configured
63
+ # (e.g. via a command-line flag).
64
+ config.default_formatter = 'doc'
65
+ end
66
+
67
+ # Print the 10 slowest examples and example groups at the
68
+ # end of the spec run, to help surface which specs are running
69
+ # particularly slow.
70
+ config.profile_examples = 10
71
+
72
+ # Run specs in random order to surface order dependencies. If you find an
73
+ # order dependency and want to debug it, you can fix the order by providing
74
+ # the seed, which is printed after each run.
75
+ # --seed 1234
76
+ config.order = :random
77
+
78
+ # Seed global randomization in this process using the `--seed` CLI option.
79
+ # Setting this allows you to use `--seed` to deterministically reproduce
80
+ # test failures related to randomization by passing the same `--seed` value
81
+ # as the one that triggered the failure.
82
+ Kernel.srand config.seed
83
+ =end
84
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fulmar
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.0
4
+ version: 1.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonas Siegl
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-07-14 00:00:00.000000000 Z
12
+ date: 2015-09-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -45,20 +45,14 @@ dependencies:
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '0'
49
- - - "<="
50
- - !ruby/object:Gem::Version
51
- version: 0.22.1
48
+ version: 0.23.0
52
49
  type: :runtime
53
50
  prerelease: false
54
51
  version_requirements: !ruby/object:Gem::Requirement
55
52
  requirements:
56
53
  - - "~>"
57
54
  - !ruby/object:Gem::Version
58
- version: '0'
59
- - - "<="
60
- - !ruby/object:Gem::Version
61
- version: 0.22.1
55
+ version: 0.23.0
62
56
  - !ruby/object:Gem::Dependency
63
57
  name: mysql2
64
58
  requirement: !ruby/object:Gem::Requirement
@@ -137,10 +131,14 @@ extensions: []
137
131
  extra_rdoc_files: []
138
132
  files:
139
133
  - ".gitignore"
134
+ - ".rspec"
135
+ - ".rubocop.yml"
136
+ - ".travis.yml"
140
137
  - CODE_OF_CONDUCT.md
141
138
  - Gemfile
142
139
  - LICENSE.txt
143
140
  - README.md
141
+ - Rakefile
144
142
  - bin/fulmar
145
143
  - fulmar.gemspec
146
144
  - lib/fulmar/domain/model/project.rb
@@ -180,6 +178,8 @@ files:
180
178
  - lib/fulmar/service/logger_service.rb
181
179
  - lib/fulmar/task_manager.rb
182
180
  - lib/fulmar/version.rb
181
+ - spec/lib/fulmar/service/helper_service_spec.rb
182
+ - spec/spec_helper.rb
183
183
  - test/rsync_with_versions.rb
184
184
  homepage: https://github.com/CORE4/fulmar
185
185
  licenses:
@@ -206,4 +206,6 @@ signing_key:
206
206
  specification_version: 4
207
207
  summary: A deployment task manager.
208
208
  test_files:
209
+ - spec/lib/fulmar/service/helper_service_spec.rb
210
+ - spec/spec_helper.rb
209
211
  - test/rsync_with_versions.rb