Skip to content

Commit 081559f

Browse files
authored
Merge pull request #22458 from Homebrew/github-actions-install-bubblewrap
Install Bubblewrap on hosted Ubuntu
2 parents 7efc2be + 54abc17 commit 081559f

2 files changed

Lines changed: 40 additions & 3 deletions

File tree

Library/Homebrew/extend/os/linux/sandbox.rb

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
require "fileutils"
55
require "env_config"
6+
require "utils/github/actions"
67

78
module OS
89
module Linux
@@ -196,9 +197,21 @@ def configuration_command_messages
196197

197198
sig { void }
198199
def configure!
199-
unless bubblewrap_executable
200-
ensure_sandbox_installed!(install_from_tests: true)
201-
unless bubblewrap_executable
200+
unless (bubblewrap = bubblewrap_executable)
201+
if GitHub::Actions.env_set? &&
202+
ENV["RUNNER_ENVIRONMENT"] == "github-hosted" &&
203+
ENV.fetch("ImageOS", "").start_with?("ubuntu")
204+
ohai "Installing Bubblewrap..."
205+
system "sudo", "apt-get", "install", "--yes", "bubblewrap"
206+
reset_state!
207+
bubblewrap = bubblewrap_executable
208+
end
209+
210+
unless bubblewrap
211+
ensure_sandbox_installed!(install_from_tests: true)
212+
bubblewrap = bubblewrap_executable
213+
end
214+
unless bubblewrap
202215
reset_state!
203216
return
204217
end

Library/Homebrew/test/sandbox_linux_spec.rb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,10 @@ def executable_candidate_paths = test_executable_candidate_paths
124124
describe "::configuration_commands" do
125125
let(:sandbox_class) { Class.new(klass) }
126126

127+
around do |example|
128+
with_env(GITHUB_ACTIONS: nil, ImageOS: nil, RUNNER_ENVIRONMENT: nil) { example.run }
129+
end
130+
127131
def expect_sandbox_configuration_command(sandbox_class, assignment, result:)
128132
command = ["sudo", "sysctl", "-w", assignment]
129133

@@ -160,6 +164,26 @@ def expect_sandbox_configuration_command(sandbox_class, assignment, result:)
160164
sandbox_class.configure!
161165
end
162166

167+
it "installs Bubblewrap with apt-get on default GitHub Actions Ubuntu runners" do
168+
expect(sandbox_class).to receive(:bubblewrap_executable)
169+
.twice
170+
.and_return(nil, Pathname("/usr/bin/bwrap"))
171+
expect(sandbox_class).to receive(:ohai).with("Installing Bubblewrap...")
172+
expect(sandbox_class).to receive(:system)
173+
.with("sudo", "apt-get", "install", "--yes", "bubblewrap")
174+
.and_return(true)
175+
expect(sandbox_class).not_to receive(:ensure_sandbox_installed!)
176+
expect(sandbox_class).to receive(:ohai).with("Configuring Bubblewrap...").ordered
177+
expect_sandbox_configuration_command(sandbox_class, "kernel.unprivileged_userns_clone=1", result: true)
178+
expect_sandbox_configuration_command(sandbox_class, "user.max_user_namespaces=28633", result: true)
179+
expect_sandbox_configuration_command(sandbox_class, "kernel.apparmor_restrict_unprivileged_userns=0",
180+
result: false)
181+
182+
with_env(GITHUB_ACTIONS: "true", ImageOS: "ubuntu24", RUNNER_ENVIRONMENT: "github-hosted") do
183+
sandbox_class.configure!
184+
end
185+
end
186+
163187
it "installs Bubblewrap and configures Linux sandbox sysctls" do
164188
expect(sandbox_class).to receive(:bubblewrap_executable)
165189
.twice

0 commit comments

Comments
 (0)