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,103 +0,0 @@
1
- require "spec_helper"
2
- require "bard/provision"
3
- require "bard/provision/user"
4
-
5
- describe Bard::Provision::User do
6
- let(:old_ssh_uri) { double("old_ssh_uri", user: "root", host: "example.com", port: 22) }
7
- let(:new_ssh_uri) { double("new_ssh_uri", user: "deploy", host: "example.com", port: 22) }
8
- let(:server) { double("server", ssh_uri: new_ssh_uri) }
9
- let(:config) { { production: server } }
10
- let(:ssh_url) { "root@example.com" }
11
- let(:provision_server) { double("provision_server", ssh_uri: old_ssh_uri) }
12
- let(:user_provisioner) { Bard::Provision::User.new(config, ssh_url) }
13
-
14
- before do
15
- allow(user_provisioner).to receive(:server).and_return(server)
16
- allow(user_provisioner).to receive(:provision_server).and_return(provision_server)
17
- allow(user_provisioner).to receive(:print)
18
- allow(user_provisioner).to receive(:puts)
19
- allow(user_provisioner).to receive(:system)
20
- end
21
-
22
- describe "#call" do
23
- context "when new user already exists" do
24
- it "skips user creation" do
25
- allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri, user: "deploy").and_return(true)
26
-
27
- expect(provision_server).not_to receive(:run!)
28
-
29
- user_provisioner.call
30
- end
31
- end
32
-
33
- context "when new user doesn't exist but old user works" do
34
- it "creates the new user" do
35
- allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri, user: "deploy").and_return(false)
36
- allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri).and_return(true)
37
-
38
- expected_commands = [
39
- "sudo useradd -m -s /bin/bash deploy",
40
- "sudo usermod -aG sudo deploy",
41
- "echo \"deploy ALL=(ALL) NOPASSWD:ALL\" | sudo tee -a /etc/sudoers",
42
- "sudo mkdir -p ~deploy/.ssh",
43
- "sudo cp ~/.ssh/authorized_keys ~deploy/.ssh/authorized_keys",
44
- "sudo chown -R deploy:deploy ~deploy/.ssh",
45
- "sudo chmod +rx ~deploy"
46
- ].join("; ")
47
-
48
- expect(provision_server).to receive(:run!).with(expected_commands, home: true)
49
-
50
- user_provisioner.call
51
- end
52
-
53
- it "prints status messages during user creation" do
54
- allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri, user: "deploy").and_return(false)
55
- allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri).and_return(true)
56
- allow(provision_server).to receive(:run!)
57
-
58
- expect(user_provisioner).to receive(:print).with("User:")
59
- expect(user_provisioner).to receive(:print).with(" Adding user deploy,")
60
- expect(user_provisioner).to receive(:puts).with(" ✓")
61
-
62
- user_provisioner.call
63
- end
64
- end
65
-
66
- context "when neither old nor new user can SSH" do
67
- it "raises an error" do
68
- allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri, user: "deploy").and_return(false)
69
- allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri).and_return(false)
70
-
71
- expect { user_provisioner.call }.to raise_error("can't ssh in with user deploy or root")
72
- end
73
- end
74
- end
75
-
76
- describe "#ssh_with_user?" do
77
- it "tests SSH connection with specified user" do
78
- expect(user_provisioner).to receive(:system).with("ssh -o ConnectTimeout=2 -p22 deploy@example.com : >/dev/null 2>&1")
79
-
80
- user_provisioner.send(:ssh_with_user?, old_ssh_uri, user: "deploy")
81
- end
82
-
83
- it "uses default user from SSH URI if not specified" do
84
- expect(user_provisioner).to receive(:system).with("ssh -o ConnectTimeout=2 -p22 root@example.com : >/dev/null 2>&1")
85
-
86
- user_provisioner.send(:ssh_with_user?, old_ssh_uri)
87
- end
88
- end
89
-
90
- describe "private methods" do
91
- describe "#new_user" do
92
- it "returns the target user from server SSH URI" do
93
- expect(user_provisioner.send(:new_user)).to eq("deploy")
94
- end
95
- end
96
-
97
- describe "#old_user" do
98
- it "returns the current user from provision server SSH URI" do
99
- expect(user_provisioner.send(:old_user)).to eq("root")
100
- end
101
- end
102
- end
103
- end
@@ -1,28 +0,0 @@
1
- require "spec_helper"
2
- require "bard/provision"
3
-
4
- describe Bard::Provision do
5
- let(:config) { { production: double("production", key: :production) } }
6
- let(:ssh_url) { "user@example.com" }
7
- let(:provision) { Bard::Provision.new(config, ssh_url) }
8
-
9
- describe ".call" do
10
- it "creates a new instance and calls it" do
11
- expect_any_instance_of(Bard::Provision).to receive(:call)
12
- Bard::Provision.call(config, ssh_url)
13
- end
14
- end
15
-
16
- describe "#server" do
17
- it "returns the production server from config" do
18
- expect(provision.send(:server)).to eq(config[:production])
19
- end
20
- end
21
-
22
- describe "#provision_server" do
23
- it "returns server with ssh_url" do
24
- expect(config[:production]).to receive(:with).with(ssh: ssh_url)
25
- provision.send(:provision_server)
26
- end
27
- end
28
- end
@@ -1,127 +0,0 @@
1
- require "bard/server"
2
-
3
- describe Bard::Server do
4
- subject do
5
- described_class.define("tracker", :production) do
6
- ssh "www@tracker.botandrose.com:22022"
7
- path "work/tracker"
8
- ping "tracker.botandrose.com", "www.tracker.botandrose.com"
9
- gateway "www@staging.botandrose.com:22022"
10
- ssh_key "~/.ssh/id_rsa.pub"
11
- env "RAILS_ENV=production"
12
- end
13
- end
14
-
15
- describe "#ssh" do
16
- it "returns the ssh setting" do
17
- expect(subject.ssh).to eq "www@tracker.botandrose.com:22022"
18
- end
19
- end
20
-
21
- describe "#ssh_uri" do
22
- it "exposes the host" do
23
- expect(subject.ssh_uri.host).to eq "tracker.botandrose.com"
24
- end
25
-
26
- it "exposes the user" do
27
- expect(subject.ssh_uri.user).to eq "www"
28
- end
29
-
30
- it "exposes the port" do
31
- expect(subject.ssh_uri.port).to eq 22022
32
- end
33
-
34
- it "has no path" do
35
- expect(subject.ssh_uri.path).to be_empty
36
- end
37
-
38
- it "can specify another field to read from" do
39
- expect(subject.ssh_uri(:gateway).host).to eq "staging.botandrose.com"
40
- end
41
-
42
- it "has no path" do
43
- expect(subject.ssh_uri.path).to be_empty
44
- end
45
- end
46
-
47
- describe "#scp_uri" do
48
- it "exposes the host" do
49
- expect(subject.scp_uri.host).to eq "tracker.botandrose.com"
50
- end
51
-
52
- it "exposes the user" do
53
- expect(subject.scp_uri.user).to eq "www"
54
- end
55
-
56
- it "exposes the port" do
57
- expect(subject.scp_uri.port).to eq 22022
58
- end
59
-
60
- it "includes the path to the project" do
61
- expect(subject.scp_uri.path).to eq "/work/tracker"
62
- end
63
-
64
- it "compiles to an scp:// string" do
65
- expect(subject.scp_uri.to_s).to eq "scp://www@tracker.botandrose.com:22022/work/tracker"
66
- end
67
- end
68
-
69
- describe "#rsync_uri" do
70
- it "works" do
71
- expect(subject.rsync_uri("public/assets")).to eq "www@tracker.botandrose.com:work/tracker/public/assets"
72
- end
73
- end
74
-
75
- describe "#path" do
76
- it "returns the path setting" do
77
- expect(subject.path).to eq "work/tracker"
78
- end
79
-
80
- it "defaults to the project name" do
81
- subject.path nil
82
- expect(subject.path).to eq "tracker"
83
- end
84
- end
85
-
86
- describe "#ping" do
87
- it "returns the ping urls, normalized" do
88
- expect(subject.ping).to eq [
89
- "https://tracker.botandrose.com",
90
- "https://www.tracker.botandrose.com",
91
- ]
92
- end
93
-
94
- it "accepts paths" do
95
- subject.ping "/ping"
96
- expect(subject.ping).to eq ["https://tracker.botandrose.com/ping"]
97
- end
98
-
99
- it "defaults to the ssh value" do
100
- subject.ping nil
101
- expect(subject.ping).to eq ["https://tracker.botandrose.com"]
102
- end
103
-
104
- it "accepts false to disable pings" do
105
- subject.ping false
106
- expect(subject.ping).to eq []
107
- end
108
- end
109
-
110
- describe "#gateway" do
111
- it "returns the gateway setting" do
112
- expect(subject.gateway).to eq "www@staging.botandrose.com:22022"
113
- end
114
- end
115
-
116
- describe "#ssh_key" do
117
- it "returns the ssh_key setting" do
118
- expect(subject.ssh_key).to eq "~/.ssh/id_rsa.pub"
119
- end
120
- end
121
-
122
- describe "#env" do
123
- it "returns the env setting" do
124
- expect(subject.env).to eq "RAILS_ENV=production"
125
- end
126
- end
127
- end
File without changes
File without changes
File without changes