bard 1.9.6 → 2.0.0

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.
Files changed (157) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +2 -2
  3. data/CLAUDE.md +1 -1
  4. data/PLUGINS.md +31 -46
  5. data/bard.gemspec +2 -1
  6. data/features/ci.feature +1 -0
  7. data/features/data.feature +1 -0
  8. data/features/deploy.feature +1 -0
  9. data/features/deploy_git_workflow.feature +1 -0
  10. data/features/run.feature +1 -0
  11. data/features/step_definitions/bard_steps.rb +1 -0
  12. data/features/support/test_server.rb +3 -3
  13. data/lib/bard/cli.rb +9 -28
  14. data/lib/bard/command.rb +9 -88
  15. data/lib/bard/config.rb +38 -177
  16. data/lib/bard/copy.rb +28 -82
  17. data/lib/bard/plugins/data.rb +56 -0
  18. data/lib/bard/{ci → plugins/deploy/ci}/github_actions.rb +2 -2
  19. data/lib/bard/{ci → plugins/deploy/ci}/jenkins.rb +1 -1
  20. data/lib/bard/{ci → plugins/deploy/ci}/local.rb +1 -1
  21. data/lib/bard/{ci → plugins/deploy/ci}/runner.rb +3 -3
  22. data/lib/bard/{ci.rb → plugins/deploy/ci.rb} +1 -1
  23. data/lib/bard/plugins/deploy/ssh_strategy.rb +27 -0
  24. data/lib/bard/{deploy_strategy.rb → plugins/deploy/strategy.rb} +1 -4
  25. data/lib/bard/plugins/deploy.rb +240 -0
  26. data/lib/bard/{git.rb → plugins/git.rb} +6 -3
  27. data/lib/bard/{github.rb → plugins/github.rb} +2 -2
  28. data/lib/bard/{deploy_strategy/github_pages.rb → plugins/github_pages/strategy.rb} +3 -4
  29. data/lib/bard/plugins/github_pages.rb +11 -15
  30. data/lib/bard/plugins/hurt.rb +12 -4
  31. data/{install_files → lib/bard/plugins/install}/.github/dependabot.yml +2 -1
  32. data/{install_files → lib/bard/plugins/install}/.github/workflows/cache-ci.yml +1 -1
  33. data/{install_files → lib/bard/plugins/install}/.github/workflows/ci.yml +2 -2
  34. data/lib/bard/plugins/install.rb +7 -3
  35. data/lib/bard/plugins/open.rb +20 -0
  36. data/lib/bard/{ping.rb → plugins/ping/check.rb} +4 -4
  37. data/lib/bard/plugins/ping/target_methods.rb +23 -0
  38. data/lib/bard/plugins/ping.rb +8 -4
  39. data/lib/bard/plugins/run.rb +19 -0
  40. data/lib/bard/plugins/setup.rb +54 -0
  41. data/lib/bard/plugins/ssh/connection.rb +75 -0
  42. data/lib/bard/plugins/ssh/copy.rb +95 -0
  43. data/lib/bard/{ssh_server.rb → plugins/ssh/server.rb} +10 -42
  44. data/lib/bard/plugins/ssh/target_methods.rb +20 -0
  45. data/lib/bard/plugins/ssh.rb +10 -0
  46. data/lib/bard/plugins/url/target_methods.rb +23 -0
  47. data/lib/bard/plugins/url.rb +1 -0
  48. data/lib/bard/plugins/vim.rb +5 -4
  49. data/lib/bard/retryable.rb +25 -0
  50. data/lib/bard/target.rb +21 -230
  51. data/lib/bard/version.rb +1 -1
  52. data/lib/bard.rb +1 -3
  53. data/spec/acceptance/docker/Dockerfile +1 -1
  54. data/spec/bard/capability_spec.rb +8 -50
  55. data/spec/bard/ci/github_actions_spec.rb +1 -1
  56. data/spec/bard/ci/jenkins_spec.rb +1 -1
  57. data/spec/bard/ci/runner_spec.rb +3 -3
  58. data/spec/bard/ci_spec.rb +1 -1
  59. data/spec/bard/cli/ci_spec.rb +4 -23
  60. data/spec/bard/cli/data_spec.rb +7 -26
  61. data/spec/bard/cli/deploy_spec.rb +43 -40
  62. data/spec/bard/cli/hurt_spec.rb +2 -8
  63. data/spec/bard/cli/install_spec.rb +4 -10
  64. data/spec/bard/cli/master_key_spec.rb +5 -19
  65. data/spec/bard/cli/open_spec.rb +17 -35
  66. data/spec/bard/cli/ping_spec.rb +10 -25
  67. data/spec/bard/cli/run_spec.rb +10 -23
  68. data/spec/bard/cli/setup_spec.rb +10 -27
  69. data/spec/bard/cli/ssh_spec.rb +10 -25
  70. data/spec/bard/cli/stage_spec.rb +17 -32
  71. data/spec/bard/cli/vim_spec.rb +5 -11
  72. data/spec/bard/command_spec.rb +1 -10
  73. data/spec/bard/config_spec.rb +68 -116
  74. data/spec/bard/copy_spec.rb +54 -18
  75. data/spec/bard/deploy_strategy/ssh_spec.rb +65 -7
  76. data/spec/bard/deploy_strategy_spec.rb +1 -1
  77. data/spec/bard/dynamic_dsl_spec.rb +18 -98
  78. data/spec/bard/git_spec.rb +9 -5
  79. data/spec/bard/github_spec.rb +1 -1
  80. data/spec/bard/ping_spec.rb +5 -5
  81. data/spec/bard/ssh_copy_spec.rb +44 -0
  82. data/spec/bard/ssh_server_spec.rb +1 -98
  83. data/spec/bard/target_spec.rb +61 -108
  84. metadata +50 -124
  85. data/lib/bard/ci/retryable.rb +0 -27
  86. data/lib/bard/cli/ci.rb +0 -73
  87. data/lib/bard/cli/command.rb +0 -26
  88. data/lib/bard/cli/data.rb +0 -45
  89. data/lib/bard/cli/deploy.rb +0 -116
  90. data/lib/bard/cli/hurt.rb +0 -15
  91. data/lib/bard/cli/install.rb +0 -11
  92. data/lib/bard/cli/master_key.rb +0 -17
  93. data/lib/bard/cli/new.rb +0 -101
  94. data/lib/bard/cli/new_rails_template.rb +0 -197
  95. data/lib/bard/cli/open.rb +0 -18
  96. data/lib/bard/cli/ping.rb +0 -12
  97. data/lib/bard/cli/provision.rb +0 -34
  98. data/lib/bard/cli/run.rb +0 -26
  99. data/lib/bard/cli/setup.rb +0 -56
  100. data/lib/bard/cli/ssh.rb +0 -14
  101. data/lib/bard/cli/stage.rb +0 -35
  102. data/lib/bard/cli/vim.rb +0 -8
  103. data/lib/bard/default_config.rb +0 -35
  104. data/lib/bard/deploy_strategy/ssh.rb +0 -19
  105. data/lib/bard/deprecation.rb +0 -19
  106. data/lib/bard/github_pages.rb +0 -134
  107. data/lib/bard/plugin.rb +0 -100
  108. data/lib/bard/plugins/backup.rb +0 -19
  109. data/lib/bard/plugins/jenkins.rb +0 -6
  110. data/lib/bard/plugins/new.rb +0 -5
  111. data/lib/bard/plugins/provision.rb +0 -5
  112. data/lib/bard/provision/app.rb +0 -10
  113. data/lib/bard/provision/apt.rb +0 -16
  114. data/lib/bard/provision/authorizedkeys.rb +0 -25
  115. data/lib/bard/provision/data.rb +0 -27
  116. data/lib/bard/provision/deploy.rb +0 -10
  117. data/lib/bard/provision/http.rb +0 -16
  118. data/lib/bard/provision/logrotation.rb +0 -30
  119. data/lib/bard/provision/masterkey.rb +0 -18
  120. data/lib/bard/provision/mysql.rb +0 -22
  121. data/lib/bard/provision/passenger.rb +0 -37
  122. data/lib/bard/provision/repo.rb +0 -72
  123. data/lib/bard/provision/rvm.rb +0 -22
  124. data/lib/bard/provision/ssh.rb +0 -79
  125. data/lib/bard/provision/swapfile.rb +0 -23
  126. data/lib/bard/provision/user.rb +0 -42
  127. data/lib/bard/provision.rb +0 -16
  128. data/lib/bard/server.rb +0 -160
  129. data/spec/bard/cli/command_spec.rb +0 -50
  130. data/spec/bard/cli/new_spec.rb +0 -73
  131. data/spec/bard/cli/provision_spec.rb +0 -42
  132. data/spec/bard/deprecation_spec.rb +0 -281
  133. data/spec/bard/github_pages_spec.rb +0 -143
  134. data/spec/bard/plugin_spec.rb +0 -79
  135. data/spec/bard/provision/app_spec.rb +0 -33
  136. data/spec/bard/provision/apt_spec.rb +0 -39
  137. data/spec/bard/provision/authorizedkeys_spec.rb +0 -40
  138. data/spec/bard/provision/data_spec.rb +0 -54
  139. data/spec/bard/provision/deploy_spec.rb +0 -33
  140. data/spec/bard/provision/http_spec.rb +0 -57
  141. data/spec/bard/provision/logrotation_spec.rb +0 -34
  142. data/spec/bard/provision/masterkey_spec.rb +0 -63
  143. data/spec/bard/provision/mysql_spec.rb +0 -55
  144. data/spec/bard/provision/passenger_spec.rb +0 -81
  145. data/spec/bard/provision/repo_spec.rb +0 -208
  146. data/spec/bard/provision/rvm_spec.rb +0 -49
  147. data/spec/bard/provision/ssh_spec.rb +0 -242
  148. data/spec/bard/provision/swapfile_spec.rb +0 -33
  149. data/spec/bard/provision/user_spec.rb +0 -103
  150. data/spec/bard/provision_spec.rb +0 -28
  151. data/spec/bard/server_spec.rb +0 -127
  152. /data/lib/bard/{ci → plugins/deploy/ci}/state.rb +0 -0
  153. /data/{install_files → lib/bard/plugins/install}/apt_dependencies.rb +0 -0
  154. /data/{install_files → lib/bard/plugins/install}/ci +0 -0
  155. /data/{install_files → lib/bard/plugins/install}/setup +0 -0
  156. /data/{install_files → lib/bard/plugins/install}/specified_bundler.rb +0 -0
  157. /data/{install_files → lib/bard/plugins/install}/specified_ruby.rb +0 -0
@@ -1,143 +0,0 @@
1
- require "spec_helper"
2
- require "bard/github_pages"
3
-
4
- describe Bard::GithubPages do
5
- let(:server) { double("server", ping: ["https://example.com"]) }
6
- let(:github_pages) { Bard::GithubPages.new(double) }
7
-
8
- before do
9
- allow(Bard::Git).to receive(:sha_of).and_return("abc123")
10
- allow(Bard::Git).to receive(:current_branch).and_return("main")
11
- allow(github_pages).to receive(:system)
12
- allow(github_pages).to receive(:run!)
13
- allow(github_pages).to receive(:puts)
14
- end
15
-
16
- describe "#deploy" do
17
- it "performs the deployment steps" do
18
- expect(github_pages).to receive(:build_site)
19
- expect(github_pages).to receive(:create_tree_from_build).and_return("tree123")
20
- expect(github_pages).to receive(:create_commit).with("tree123").and_return("commit123")
21
- expect(github_pages).to receive(:commit_and_push).with("commit123")
22
-
23
- github_pages.deploy(server)
24
- end
25
-
26
- it "sets instance variables" do
27
- allow(github_pages).to receive(:build_site)
28
- allow(github_pages).to receive(:create_tree_from_build).and_return("tree123")
29
- allow(github_pages).to receive(:create_commit).and_return("commit123")
30
- allow(github_pages).to receive(:commit_and_push)
31
-
32
- github_pages.deploy(server)
33
-
34
- expect(github_pages.instance_variable_get(:@sha)).to eq("abc123")
35
- expect(github_pages.instance_variable_get(:@build_dir)).to eq("tmp/github-build-abc123")
36
- expect(github_pages.instance_variable_get(:@branch)).to eq("gh-pages")
37
- expect(github_pages.instance_variable_get(:@domain)).to eq("example.com")
38
- end
39
- end
40
-
41
- describe "#build_site" do
42
- it "uses the locked port" do
43
- github_pages.instance_variable_set(:@sha, "abc123")
44
- github_pages.instance_variable_set(:@build_dir, "tmp/github-build-abc123")
45
- github_pages.instance_variable_set(:@domain, "example.com")
46
-
47
- allow(github_pages).to receive(:with_locked_port).and_yield(3005)
48
-
49
- expect(github_pages).to receive(:run!).with(satisfy { |cmd|
50
- cmd.include?("rails s -p 3005") && cmd.include?("http://localhost:3005")
51
- }).ordered
52
-
53
- expect(github_pages).to receive(:run!).with(include("kill")).ordered
54
-
55
- github_pages.send(:build_site)
56
- end
57
- end
58
-
59
- describe "#with_locked_port" do
60
- let(:file_mock) { double("file", close: true) }
61
-
62
- before do
63
- allow(File).to receive(:open).and_return(file_mock)
64
- end
65
-
66
- it "yields the first available port" do
67
- allow(file_mock).to receive(:flock).and_return(true)
68
-
69
- expect(File).to receive(:open).with("/tmp/bard_github_pages_3000.lock", anything, anything)
70
-
71
- yielded_port = nil
72
- github_pages.send(:with_locked_port) { |p| yielded_port = p }
73
- expect(yielded_port).to eq(3000)
74
- end
75
-
76
- it "retries if the first port is locked" do
77
- # 1. Try port 3000
78
- expect(File).to receive(:open).with("/tmp/bard_github_pages_3000.lock", anything, anything).ordered
79
- expect(file_mock).to receive(:flock).with(File::LOCK_EX | File::LOCK_NB).and_return(false).ordered
80
- expect(file_mock).to receive(:close).ordered
81
-
82
- # 2. Try port 3001
83
- expect(File).to receive(:open).with("/tmp/bard_github_pages_3001.lock", anything, anything).ordered
84
- expect(file_mock).to receive(:flock).with(File::LOCK_EX | File::LOCK_NB).and_return(true).ordered
85
-
86
- # 3. Cleanup after yielding
87
- expect(file_mock).to receive(:flock).with(File::LOCK_UN).ordered
88
- expect(file_mock).to receive(:close).ordered
89
-
90
- yielded_port = nil
91
- github_pages.send(:with_locked_port) { |p| yielded_port = p }
92
- expect(yielded_port).to eq(3001)
93
- end
94
-
95
- it "raises an error if no ports are available" do
96
- allow(file_mock).to receive(:flock).and_return(false)
97
-
98
- expect {
99
- github_pages.send(:with_locked_port) {}
100
- }.to raise_error(/Could not find an available port/)
101
- end
102
- end
103
-
104
- describe "#get_parent_commit" do
105
- it "returns the sha of the gh-pages branch" do
106
- github_pages.instance_variable_set(:@branch, "gh-pages")
107
- expect(Bard::Git).to receive(:sha_of).with("gh-pages^{commit}")
108
- github_pages.send(:get_parent_commit)
109
- end
110
- end
111
-
112
- describe "#branch_exists?" do
113
- it "checks if branch exists using git show-ref" do
114
- github_pages.instance_variable_set(:@branch, "gh-pages")
115
- expect(github_pages).to receive(:system).with("git show-ref --verify --quiet refs/heads/gh-pages")
116
- github_pages.send(:branch_exists?)
117
- end
118
- end
119
-
120
- describe "#commit_and_push" do
121
- before do
122
- github_pages.instance_variable_set(:@branch, "gh-pages")
123
- end
124
-
125
- context "when branch exists" do
126
- it "updates the ref and pushes" do
127
- allow(github_pages).to receive(:branch_exists?).and_return(true)
128
- expect(github_pages).to receive(:run!).with("git update-ref refs/heads/gh-pages commit123")
129
- expect(github_pages).to receive(:run!).with("git push -f origin gh-pages:refs/heads/gh-pages")
130
- github_pages.send(:commit_and_push, "commit123")
131
- end
132
- end
133
-
134
- context "when branch doesn't exist" do
135
- it "creates the branch and pushes" do
136
- allow(github_pages).to receive(:branch_exists?).and_return(false)
137
- expect(github_pages).to receive(:run!).with("git branch gh-pages commit123")
138
- expect(github_pages).to receive(:run!).with("git push -f origin gh-pages:refs/heads/gh-pages")
139
- github_pages.send(:commit_and_push, "commit123")
140
- end
141
- end
142
- end
143
- end
@@ -1,79 +0,0 @@
1
- require "bard/plugin"
2
-
3
- RSpec.describe Bard::Plugin do
4
- before do
5
- described_class.reset!
6
- end
7
-
8
- describe ".register" do
9
- it "registers a plugin by name" do
10
- described_class.register :test_plugin
11
-
12
- expect(described_class[:test_plugin]).to be_a(Bard::Plugin)
13
- expect(described_class[:test_plugin].name).to eq :test_plugin
14
- end
15
-
16
- it "accepts a block to configure the plugin" do
17
- described_class.register :test_plugin do
18
- require_file "some/file"
19
- end
20
-
21
- plugin = described_class[:test_plugin]
22
- expect(plugin.instance_variable_get(:@requires)).to include("some/file")
23
- end
24
- end
25
-
26
- describe ".all" do
27
- it "returns all registered plugins" do
28
- described_class.register :plugin1
29
- described_class.register :plugin2
30
-
31
- expect(described_class.all.map(&:name)).to contain_exactly(:plugin1, :plugin2)
32
- end
33
- end
34
-
35
- describe ".reset!" do
36
- it "clears the registry" do
37
- described_class.register :test_plugin
38
-
39
- described_class.reset!
40
-
41
- expect(described_class.all).to be_empty
42
- end
43
- end
44
-
45
- describe "#cli" do
46
- it "stores CLI modules to include" do
47
- described_class.register :test_plugin do
48
- cli "SomeModule", require: "some/module"
49
- end
50
-
51
- plugin = described_class[:test_plugin]
52
- expect(plugin.cli_modules).to include("SomeModule")
53
- end
54
- end
55
-
56
- describe "#target_method" do
57
- it "stores target methods to define" do
58
- block = proc { "value" }
59
- described_class.register :test_plugin do
60
- target_method :custom_method, &block
61
- end
62
-
63
- plugin = described_class[:test_plugin]
64
- expect(plugin.instance_variable_get(:@target_methods)).to have_key(:custom_method)
65
- end
66
- end
67
-
68
- describe "#config_method" do
69
- it "stores config methods to define" do
70
- block = proc { "value" }
71
- described_class.register :test_plugin do
72
- config_method :custom_method, &block
73
- end
74
-
75
- plugin = described_class[:test_plugin]
76
- expect(plugin.instance_variable_get(:@config_methods)).to have_key(:custom_method)
77
- end
78
- end
79
- end
@@ -1,33 +0,0 @@
1
- require "spec_helper"
2
- require "bard/provision"
3
- require "bard/provision/app"
4
-
5
- describe Bard::Provision::App do
6
- let(:config) { { production: double("production") } }
7
- let(:ssh_url) { "user@example.com" }
8
- let(:provision_server) { double("provision_server") }
9
- let(:app) { Bard::Provision::App.new(config, ssh_url) }
10
-
11
- before do
12
- allow(app).to receive(:provision_server).and_return(provision_server)
13
- allow(app).to receive(:print)
14
- allow(app).to receive(:puts)
15
- end
16
-
17
- describe "#call" do
18
- it "runs bin/setup on the server" do
19
- expect(provision_server).to receive(:run!).with("bin/setup")
20
-
21
- app.call
22
- end
23
-
24
- it "prints status messages" do
25
- allow(provision_server).to receive(:run!)
26
-
27
- expect(app).to receive(:print).with("App:")
28
- expect(app).to receive(:puts).with(" ✓")
29
-
30
- app.call
31
- end
32
- end
33
- end
@@ -1,39 +0,0 @@
1
- require "spec_helper"
2
- require "bard/provision"
3
- require "bard/provision/apt"
4
-
5
- describe Bard::Provision::Apt do
6
- let(:config) { { production: double("production") } }
7
- let(:ssh_url) { "user@example.com" }
8
- let(:provision_server) { double("provision_server") }
9
- let(:apt) { Bard::Provision::Apt.new(config, ssh_url) }
10
-
11
- before do
12
- allow(apt).to receive(:provision_server).and_return(provision_server)
13
- allow(apt).to receive(:print)
14
- allow(apt).to receive(:puts)
15
- end
16
-
17
- describe "#call" do
18
- it "updates and installs packages on the server" do
19
- expected_commands = [
20
- %(echo "\\$nrconf{restart} = \\"a\\";" | sudo tee /etc/needrestart/conf.d/90-autorestart.conf),
21
- "sudo apt-get update -y",
22
- "sudo apt-get upgrade -y",
23
- "sudo apt-get install -y curl build-essential"
24
- ].join("; ")
25
-
26
- expect(provision_server).to receive(:run!).with(expected_commands, home: true)
27
-
28
- apt.call
29
- end
30
-
31
- it "prints status messages" do
32
- allow(provision_server).to receive(:run!)
33
- expect(apt).to receive(:print).with("Apt:")
34
- expect(apt).to receive(:puts).with(" ✓")
35
-
36
- apt.call
37
- end
38
- end
39
- end
@@ -1,40 +0,0 @@
1
- require "spec_helper"
2
- require "bard/provision"
3
- require "bard/provision/authorizedkeys"
4
-
5
- describe Bard::Provision::AuthorizedKeys do
6
- let(:config) { { production: double("production") } }
7
- let(:ssh_url) { "user@example.com" }
8
- let(:provision_server) { double("provision_server") }
9
- let(:authorized_keys) { Bard::Provision::AuthorizedKeys.new(config, ssh_url) }
10
-
11
- before do
12
- allow(authorized_keys).to receive(:provision_server).and_return(provision_server)
13
- allow(authorized_keys).to receive(:print)
14
- allow(authorized_keys).to receive(:puts)
15
- end
16
-
17
- describe "#call" do
18
- it "adds authorized keys to the server" do
19
- expect(provision_server).to receive(:run!).at_least(:once).with(/grep -F -q/, home: true)
20
-
21
- authorized_keys.call
22
- end
23
-
24
- it "prints status messages" do
25
- allow(provision_server).to receive(:run!)
26
- expect(authorized_keys).to receive(:print).with("Authorized Keys:")
27
- expect(authorized_keys).to receive(:puts).with(" ✓")
28
-
29
- authorized_keys.call
30
- end
31
- end
32
-
33
- describe "KEYS constant" do
34
- it "should have predefined SSH keys" do
35
- expect(Bard::Provision::AuthorizedKeys::KEYS).to be_a(Hash)
36
- expect(Bard::Provision::AuthorizedKeys::KEYS).not_to be_empty
37
- expect(Bard::Provision::AuthorizedKeys::KEYS.keys.first).to match(/@/)
38
- end
39
- end
40
- end
@@ -1,54 +0,0 @@
1
- require "spec_helper"
2
- require "bard/provision"
3
- require "bard/provision/data"
4
-
5
- describe Bard::Provision::Data do
6
- let(:server) { double("server", key: :production) }
7
- let(:config) { double("config", data: ["uploads", "assets"]) }
8
- let(:ssh_url) { "user@example.com" }
9
- let(:provision_server) { double("provision_server") }
10
- let(:data_provisioner) { Bard::Provision::Data.new(config, ssh_url) }
11
-
12
- before do
13
- allow(data_provisioner).to receive(:server).and_return(server)
14
- allow(data_provisioner).to receive(:config).and_return(config)
15
- allow(data_provisioner).to receive(:provision_server).and_return(provision_server)
16
- allow(data_provisioner).to receive(:print)
17
- allow(data_provisioner).to receive(:puts)
18
- end
19
-
20
- describe "#call" do
21
- it "dumps, transfers, and loads database data" do
22
- expect(server).to receive(:run!).with("bin/rake db:dump")
23
- expect(server).to receive(:copy_file).with("db/data.sql.gz", to: provision_server, verbose: false)
24
- expect(provision_server).to receive(:run!).with("bin/rake db:load")
25
-
26
- allow(server).to receive(:copy_dir)
27
-
28
- data_provisioner.call
29
- end
30
-
31
- it "synchronizes configured data directories" do
32
- allow(server).to receive(:run!)
33
- allow(server).to receive(:copy_file)
34
- allow(provision_server).to receive(:run!)
35
-
36
- expect(server).to receive(:copy_dir).with("uploads", to: provision_server, verbose: false)
37
- expect(server).to receive(:copy_dir).with("assets", to: provision_server, verbose: false)
38
-
39
- data_provisioner.call
40
- end
41
-
42
- it "prints status messages" do
43
- allow(server).to receive(:run!)
44
- allow(server).to receive(:copy_file)
45
- allow(server).to receive(:copy_dir)
46
- allow(provision_server).to receive(:run!)
47
-
48
- expect(data_provisioner).to receive(:print).with("Data:")
49
- expect(data_provisioner).to receive(:puts).with(" ✓")
50
-
51
- data_provisioner.call
52
- end
53
- end
54
- end
@@ -1,33 +0,0 @@
1
- require "spec_helper"
2
- require "bard/provision"
3
- require "bard/provision/deploy"
4
-
5
- describe Bard::Provision::Deploy do
6
- let(:config) { { production: double("production") } }
7
- let(:ssh_url) { "user@example.com" }
8
- let(:provision_server) { double("provision_server") }
9
- let(:deploy) { Bard::Provision::Deploy.new(config, ssh_url) }
10
-
11
- before do
12
- allow(deploy).to receive(:provision_server).and_return(provision_server)
13
- allow(deploy).to receive(:print)
14
- allow(deploy).to receive(:puts)
15
- end
16
-
17
- describe "#call" do
18
- it "runs bin/setup on the server" do
19
- expect(provision_server).to receive(:run!).with("bin/setup")
20
-
21
- deploy.call
22
- end
23
-
24
- it "prints status messages" do
25
- allow(provision_server).to receive(:run!)
26
-
27
- expect(deploy).to receive(:print).with("Deploy:")
28
- expect(deploy).to receive(:puts).with(" ✓")
29
-
30
- deploy.call
31
- end
32
- end
33
- end
@@ -1,57 +0,0 @@
1
- require "spec_helper"
2
- require "bard/provision"
3
- require "bard/provision/http"
4
-
5
- describe Bard::Provision::HTTP do
6
- let(:server) { double("server", ping: ["https://example.com"]) }
7
- let(:config) { { production: server } }
8
- let(:ssh_url) { "user@example.com" }
9
- let(:provision_server) { double("provision_server") }
10
- let(:http) { Bard::Provision::HTTP.new(config, ssh_url) }
11
-
12
- before do
13
- allow(http).to receive(:server).and_return(server)
14
- allow(http).to receive(:provision_server).and_return(provision_server)
15
- allow(provision_server).to receive_message_chain(:ssh_uri, :host).and_return("192.168.1.100")
16
- allow(http).to receive(:print)
17
- allow(http).to receive(:puts)
18
- allow(http).to receive(:system)
19
- end
20
-
21
- describe "#call" do
22
- context "when HTTP test passes" do
23
- it "shows success message" do
24
- allow(http).to receive(:system).and_return(true)
25
-
26
- expect(http).to receive(:puts).with(" ✓")
27
-
28
- http.call
29
- end
30
- end
31
-
32
- context "when HTTP test fails" do
33
- it "shows failure message" do
34
- allow(http).to receive(:system).and_return(false)
35
-
36
- expect(http).to receive(:puts).with(" !!! not serving a rails app from 192.168.1.100")
37
-
38
- http.call
39
- end
40
- end
41
-
42
- it "prints status header" do
43
- allow(http).to receive(:system).and_return(true)
44
-
45
- expect(http).to receive(:print).with("HTTP:")
46
-
47
- http.call
48
- end
49
-
50
- it "tests the correct URL" do
51
- expected_command = /curl -s --resolve example\.com:80:192\.168\.1\.100 http:\/\/example\.com/
52
- expect(http).to receive(:system).with(expected_command)
53
-
54
- http.call
55
- end
56
- end
57
- end
@@ -1,34 +0,0 @@
1
- require "spec_helper"
2
- require "bard/provision"
3
- require "bard/provision/logrotation"
4
-
5
- describe Bard::Provision::LogRotation do
6
- let(:server) { double("server", project_name: "test_app") }
7
- let(:config) { double("config", project_name: "test_app", :[] => server) }
8
- let(:ssh_url) { "user@example.com" }
9
- let(:provision_server) { double("provision_server") }
10
- let(:logrotation) { Bard::Provision::LogRotation.new(config, ssh_url) }
11
-
12
- before do
13
- allow(logrotation).to receive(:server).and_return(server)
14
- allow(logrotation).to receive(:provision_server).and_return(provision_server)
15
- allow(logrotation).to receive(:print)
16
- allow(logrotation).to receive(:puts)
17
- end
18
-
19
- describe "#call" do
20
- it "sets up log rotation config on the server" do
21
- expect(provision_server).to receive(:run!).with(/file=\/etc\/logrotate\.d\/test_app/, quiet: true)
22
-
23
- logrotation.call
24
- end
25
-
26
- it "prints status messages" do
27
- allow(provision_server).to receive(:run!)
28
- expect(logrotation).to receive(:print).with("Log Rotation:")
29
- expect(logrotation).to receive(:puts).with(" ✓")
30
-
31
- logrotation.call
32
- end
33
- end
34
- end
@@ -1,63 +0,0 @@
1
- require "spec_helper"
2
- require "bard/provision"
3
- require "bard/provision/masterkey"
4
-
5
- describe Bard::Provision::MasterKey do
6
- let(:config) { { production: double("production") } }
7
- let(:ssh_url) { "user@example.com" }
8
- let(:provision_server) { double("provision_server") }
9
- let(:master_key) { Bard::Provision::MasterKey.new(config, ssh_url) }
10
-
11
- before do
12
- allow(master_key).to receive(:provision_server).and_return(provision_server)
13
- allow(master_key).to receive(:print)
14
- allow(master_key).to receive(:puts)
15
- end
16
-
17
- describe "#call" do
18
- context "when master.key exists locally" do
19
- before do
20
- allow(File).to receive(:exist?).with("config/master.key").and_return(true)
21
- end
22
-
23
- it "uploads master.key if not present on server" do
24
- allow(provision_server).to receive(:run).with("[ -f config/master.key ]", quiet: true).and_return(false)
25
-
26
- copy_double = double("copy")
27
- expect(Bard::Copy).to receive(:new).with("config/master.key").and_return(copy_double)
28
- expect(copy_double).to receive(:scp_using_local).with(:to, provision_server)
29
-
30
- master_key.call
31
- end
32
-
33
- it "skips upload if master.key already exists on server" do
34
- allow(provision_server).to receive(:run).with("[ -f config/master.key ]", quiet: true).and_return(true)
35
-
36
- expect(Bard::Copy).not_to receive(:new)
37
-
38
- master_key.call
39
- end
40
- end
41
-
42
- context "when master.key doesn't exist locally" do
43
- before do
44
- allow(File).to receive(:exist?).with("config/master.key").and_return(false)
45
- end
46
-
47
- it "skips the upload" do
48
- expect(Bard::Copy).not_to receive(:new)
49
-
50
- master_key.call
51
- end
52
- end
53
-
54
- it "prints status messages" do
55
- allow(File).to receive(:exist?).and_return(false)
56
-
57
- expect(master_key).to receive(:print).with("Master Key:")
58
- expect(master_key).to receive(:puts).with(" ✓")
59
-
60
- master_key.call
61
- end
62
- end
63
- end
@@ -1,55 +0,0 @@
1
- require "spec_helper"
2
- require "bard/provision"
3
- require "bard/provision/mysql"
4
-
5
- describe Bard::Provision::MySQL do
6
- let(:config) { { production: double("production") } }
7
- let(:ssh_url) { "user@example.com" }
8
- let(:provision_server) { double("provision_server") }
9
- let(:mysql) { Bard::Provision::MySQL.new(config, ssh_url) }
10
-
11
- before do
12
- allow(mysql).to receive(:provision_server).and_return(provision_server)
13
- allow(mysql).to receive(:print)
14
- allow(mysql).to receive(:puts)
15
- end
16
-
17
- describe "#call" do
18
- context "when MySQL is not responding" do
19
- it "installs MySQL" do
20
- allow(mysql).to receive(:mysql_responding?).and_return(false)
21
-
22
- expect(provision_server).to receive(:run!).with(/sudo apt-get install -y mysql-server/, home: true)
23
-
24
- mysql.call
25
- end
26
- end
27
-
28
- context "when MySQL is already responding" do
29
- it "skips installation" do
30
- allow(mysql).to receive(:mysql_responding?).and_return(true)
31
-
32
- expect(provision_server).not_to receive(:run!)
33
-
34
- mysql.call
35
- end
36
- end
37
-
38
- it "prints status messages" do
39
- allow(mysql).to receive(:mysql_responding?).and_return(true)
40
-
41
- expect(mysql).to receive(:print).with("MySQL:")
42
- expect(mysql).to receive(:puts).with(" ✓")
43
-
44
- mysql.call
45
- end
46
- end
47
-
48
- describe "#mysql_responding?" do
49
- it "checks if MySQL service is active" do
50
- expect(provision_server).to receive(:run).with("sudo systemctl is-active --quiet mysql", home: true, quiet: true)
51
-
52
- mysql.mysql_responding?
53
- end
54
- end
55
- end