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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +2 -2
- data/CLAUDE.md +1 -1
- data/PLUGINS.md +31 -46
- data/bard.gemspec +2 -1
- data/features/ci.feature +1 -0
- data/features/data.feature +1 -0
- data/features/deploy.feature +1 -0
- data/features/deploy_git_workflow.feature +1 -0
- data/features/run.feature +1 -0
- data/features/step_definitions/bard_steps.rb +1 -0
- data/features/support/test_server.rb +3 -3
- data/lib/bard/cli.rb +9 -28
- data/lib/bard/command.rb +9 -88
- data/lib/bard/config.rb +38 -177
- data/lib/bard/copy.rb +28 -82
- data/lib/bard/plugins/data.rb +56 -0
- data/lib/bard/{ci → plugins/deploy/ci}/github_actions.rb +2 -2
- data/lib/bard/{ci → plugins/deploy/ci}/jenkins.rb +1 -1
- data/lib/bard/{ci → plugins/deploy/ci}/local.rb +1 -1
- data/lib/bard/{ci → plugins/deploy/ci}/runner.rb +3 -3
- data/lib/bard/{ci.rb → plugins/deploy/ci.rb} +1 -1
- data/lib/bard/plugins/deploy/ssh_strategy.rb +27 -0
- data/lib/bard/{deploy_strategy.rb → plugins/deploy/strategy.rb} +1 -4
- data/lib/bard/plugins/deploy.rb +240 -0
- data/lib/bard/{git.rb → plugins/git.rb} +6 -3
- data/lib/bard/{github.rb → plugins/github.rb} +2 -2
- data/lib/bard/{deploy_strategy/github_pages.rb → plugins/github_pages/strategy.rb} +3 -4
- data/lib/bard/plugins/github_pages.rb +11 -15
- data/lib/bard/plugins/hurt.rb +12 -4
- data/{install_files → lib/bard/plugins/install}/.github/dependabot.yml +2 -1
- data/{install_files → lib/bard/plugins/install}/.github/workflows/cache-ci.yml +1 -1
- data/{install_files → lib/bard/plugins/install}/.github/workflows/ci.yml +2 -2
- data/lib/bard/plugins/install.rb +7 -3
- data/lib/bard/plugins/open.rb +20 -0
- data/lib/bard/{ping.rb → plugins/ping/check.rb} +4 -4
- data/lib/bard/plugins/ping/target_methods.rb +23 -0
- data/lib/bard/plugins/ping.rb +8 -4
- data/lib/bard/plugins/run.rb +19 -0
- data/lib/bard/plugins/setup.rb +54 -0
- data/lib/bard/plugins/ssh/connection.rb +75 -0
- data/lib/bard/plugins/ssh/copy.rb +95 -0
- data/lib/bard/{ssh_server.rb → plugins/ssh/server.rb} +10 -42
- data/lib/bard/plugins/ssh/target_methods.rb +20 -0
- data/lib/bard/plugins/ssh.rb +10 -0
- data/lib/bard/plugins/url/target_methods.rb +23 -0
- data/lib/bard/plugins/url.rb +1 -0
- data/lib/bard/plugins/vim.rb +5 -4
- data/lib/bard/retryable.rb +25 -0
- data/lib/bard/target.rb +21 -230
- data/lib/bard/version.rb +1 -1
- data/lib/bard.rb +1 -3
- data/spec/acceptance/docker/Dockerfile +1 -1
- data/spec/bard/capability_spec.rb +8 -50
- data/spec/bard/ci/github_actions_spec.rb +1 -1
- data/spec/bard/ci/jenkins_spec.rb +1 -1
- data/spec/bard/ci/runner_spec.rb +3 -3
- data/spec/bard/ci_spec.rb +1 -1
- data/spec/bard/cli/ci_spec.rb +4 -23
- data/spec/bard/cli/data_spec.rb +7 -26
- data/spec/bard/cli/deploy_spec.rb +43 -40
- data/spec/bard/cli/hurt_spec.rb +2 -8
- data/spec/bard/cli/install_spec.rb +4 -10
- data/spec/bard/cli/master_key_spec.rb +5 -19
- data/spec/bard/cli/open_spec.rb +17 -35
- data/spec/bard/cli/ping_spec.rb +10 -25
- data/spec/bard/cli/run_spec.rb +10 -23
- data/spec/bard/cli/setup_spec.rb +10 -27
- data/spec/bard/cli/ssh_spec.rb +10 -25
- data/spec/bard/cli/stage_spec.rb +17 -32
- data/spec/bard/cli/vim_spec.rb +5 -11
- data/spec/bard/command_spec.rb +1 -10
- data/spec/bard/config_spec.rb +68 -116
- data/spec/bard/copy_spec.rb +54 -18
- data/spec/bard/deploy_strategy/ssh_spec.rb +65 -7
- data/spec/bard/deploy_strategy_spec.rb +1 -1
- data/spec/bard/dynamic_dsl_spec.rb +18 -98
- data/spec/bard/git_spec.rb +9 -5
- data/spec/bard/github_spec.rb +1 -1
- data/spec/bard/ping_spec.rb +5 -5
- data/spec/bard/ssh_copy_spec.rb +44 -0
- data/spec/bard/ssh_server_spec.rb +1 -98
- data/spec/bard/target_spec.rb +61 -108
- metadata +50 -124
- data/lib/bard/ci/retryable.rb +0 -27
- data/lib/bard/cli/ci.rb +0 -73
- data/lib/bard/cli/command.rb +0 -26
- data/lib/bard/cli/data.rb +0 -45
- data/lib/bard/cli/deploy.rb +0 -116
- data/lib/bard/cli/hurt.rb +0 -15
- data/lib/bard/cli/install.rb +0 -11
- data/lib/bard/cli/master_key.rb +0 -17
- data/lib/bard/cli/new.rb +0 -101
- data/lib/bard/cli/new_rails_template.rb +0 -197
- data/lib/bard/cli/open.rb +0 -18
- data/lib/bard/cli/ping.rb +0 -12
- data/lib/bard/cli/provision.rb +0 -34
- data/lib/bard/cli/run.rb +0 -26
- data/lib/bard/cli/setup.rb +0 -56
- data/lib/bard/cli/ssh.rb +0 -14
- data/lib/bard/cli/stage.rb +0 -35
- data/lib/bard/cli/vim.rb +0 -8
- data/lib/bard/default_config.rb +0 -35
- data/lib/bard/deploy_strategy/ssh.rb +0 -19
- data/lib/bard/deprecation.rb +0 -19
- data/lib/bard/github_pages.rb +0 -134
- data/lib/bard/plugin.rb +0 -100
- data/lib/bard/plugins/backup.rb +0 -19
- data/lib/bard/plugins/jenkins.rb +0 -6
- data/lib/bard/plugins/new.rb +0 -5
- data/lib/bard/plugins/provision.rb +0 -5
- data/lib/bard/provision/app.rb +0 -10
- data/lib/bard/provision/apt.rb +0 -16
- data/lib/bard/provision/authorizedkeys.rb +0 -25
- data/lib/bard/provision/data.rb +0 -27
- data/lib/bard/provision/deploy.rb +0 -10
- data/lib/bard/provision/http.rb +0 -16
- data/lib/bard/provision/logrotation.rb +0 -30
- data/lib/bard/provision/masterkey.rb +0 -18
- data/lib/bard/provision/mysql.rb +0 -22
- data/lib/bard/provision/passenger.rb +0 -37
- data/lib/bard/provision/repo.rb +0 -72
- data/lib/bard/provision/rvm.rb +0 -22
- data/lib/bard/provision/ssh.rb +0 -79
- data/lib/bard/provision/swapfile.rb +0 -23
- data/lib/bard/provision/user.rb +0 -42
- data/lib/bard/provision.rb +0 -16
- data/lib/bard/server.rb +0 -160
- data/spec/bard/cli/command_spec.rb +0 -50
- data/spec/bard/cli/new_spec.rb +0 -73
- data/spec/bard/cli/provision_spec.rb +0 -42
- data/spec/bard/deprecation_spec.rb +0 -281
- data/spec/bard/github_pages_spec.rb +0 -143
- data/spec/bard/plugin_spec.rb +0 -79
- data/spec/bard/provision/app_spec.rb +0 -33
- data/spec/bard/provision/apt_spec.rb +0 -39
- data/spec/bard/provision/authorizedkeys_spec.rb +0 -40
- data/spec/bard/provision/data_spec.rb +0 -54
- data/spec/bard/provision/deploy_spec.rb +0 -33
- data/spec/bard/provision/http_spec.rb +0 -57
- data/spec/bard/provision/logrotation_spec.rb +0 -34
- data/spec/bard/provision/masterkey_spec.rb +0 -63
- data/spec/bard/provision/mysql_spec.rb +0 -55
- data/spec/bard/provision/passenger_spec.rb +0 -81
- data/spec/bard/provision/repo_spec.rb +0 -208
- data/spec/bard/provision/rvm_spec.rb +0 -49
- data/spec/bard/provision/ssh_spec.rb +0 -242
- data/spec/bard/provision/swapfile_spec.rb +0 -33
- data/spec/bard/provision/user_spec.rb +0 -103
- data/spec/bard/provision_spec.rb +0 -28
- data/spec/bard/server_spec.rb +0 -127
- /data/lib/bard/{ci → plugins/deploy/ci}/state.rb +0 -0
- /data/{install_files → lib/bard/plugins/install}/apt_dependencies.rb +0 -0
- /data/{install_files → lib/bard/plugins/install}/ci +0 -0
- /data/{install_files → lib/bard/plugins/install}/setup +0 -0
- /data/{install_files → lib/bard/plugins/install}/specified_bundler.rb +0 -0
- /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
|
data/spec/bard/provision_spec.rb
DELETED
|
@@ -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
|
data/spec/bard/server_spec.rb
DELETED
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|