mirror of
https://github.com/livebook-dev/livebook.git
synced 2025-09-13 08:24:22 +08:00
Do not redeploy apps from dir on every node (#2291)
This commit is contained in:
parent
06b553275f
commit
ccf34ba894
3 changed files with 53 additions and 13 deletions
|
@ -333,7 +333,8 @@ defmodule Livebook.Application do
|
|||
|
||||
Livebook.Apps.deploy_apps_in_dir(apps_path,
|
||||
password: Livebook.Config.apps_path_password(),
|
||||
warmup: warmup
|
||||
warmup: warmup,
|
||||
start_only: true
|
||||
)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -22,10 +22,14 @@ defmodule Livebook.Apps do
|
|||
* `:files_source` - a location to fetch notebook files from, see
|
||||
`Livebook.Session.start_link/1` for more details
|
||||
|
||||
* `:start_only` - when `true`, deploys only if the app does not
|
||||
exist already. Defaults to `false`
|
||||
|
||||
"""
|
||||
@spec deploy(Livebook.Notebook.t(), keyword()) :: {:ok, pid()} | {:error, term()}
|
||||
@spec deploy(Livebook.Notebook.t(), keyword()) ::
|
||||
{:ok, pid()} | {:error, :already_started} | {:error, term()}
|
||||
def deploy(notebook, opts \\ []) do
|
||||
opts = Keyword.validate!(opts, warnings: [], files_source: nil)
|
||||
opts = Keyword.validate!(opts, warnings: [], files_source: nil, start_only: false)
|
||||
|
||||
slug = notebook.app_settings.slug
|
||||
name = name(slug)
|
||||
|
@ -41,18 +45,12 @@ defmodule Livebook.Apps do
|
|||
end
|
||||
|
||||
pid ->
|
||||
App.deploy(pid, notebook,
|
||||
warnings: opts[:warnings],
|
||||
files_source: opts[:files_source]
|
||||
)
|
||||
|
||||
{:ok, pid}
|
||||
redeploy_app(pid, notebook, opts)
|
||||
end
|
||||
end)
|
||||
|
||||
pid ->
|
||||
App.deploy(pid, notebook, warnings: opts[:warnings], files_source: opts[:files_source])
|
||||
{:ok, pid}
|
||||
redeploy_app(pid, notebook, opts)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -77,6 +75,15 @@ defmodule Livebook.Apps do
|
|||
end
|
||||
end
|
||||
|
||||
defp redeploy_app(pid, notebook, opts) do
|
||||
if opts[:start_only] do
|
||||
{:error, :already_started}
|
||||
else
|
||||
App.deploy(pid, notebook, warnings: opts[:warnings], files_source: opts[:files_source])
|
||||
{:ok, pid}
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Returns app process pid for the given slug.
|
||||
"""
|
||||
|
@ -166,10 +173,14 @@ defmodule Livebook.Apps do
|
|||
This can be used to warmup apps without deployment. Defaults
|
||||
to `false`
|
||||
|
||||
* `:start_only` - when `true`, deploys only if the app does not
|
||||
exist already. Defaults to `false`
|
||||
|
||||
"""
|
||||
@spec deploy_apps_in_dir(String.t(), keyword()) :: :ok
|
||||
def deploy_apps_in_dir(path, opts \\ []) do
|
||||
opts = Keyword.validate!(opts, [:password, warmup: true, skip_deploy: false])
|
||||
opts =
|
||||
Keyword.validate!(opts, [:password, warmup: true, skip_deploy: false, start_only: false])
|
||||
|
||||
infos = import_app_notebooks(path)
|
||||
|
||||
|
@ -226,7 +237,11 @@ defmodule Livebook.Apps do
|
|||
|
||||
warnings = Enum.map(info.import_warnings, &("Import: " <> &1))
|
||||
|
||||
{:ok, _} = deploy(notebook, warnings: warnings, files_source: info.files_source)
|
||||
deploy(notebook,
|
||||
warnings: warnings,
|
||||
files_source: info.files_source,
|
||||
start_only: opts[:start_only]
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -261,5 +261,29 @@ defmodule Livebook.AppsTest do
|
|||
|
||||
Livebook.App.close(app.pid)
|
||||
end
|
||||
|
||||
@tag :tmp_dir
|
||||
test "skips existing apps when :start_only is enabled", %{tmp_dir: tmp_dir} do
|
||||
app_path = Path.join(tmp_dir, "app.livemd")
|
||||
|
||||
File.write!(app_path, """
|
||||
<!-- livebook:{"app_settings":{"access_type":"public","slug":"app"}} -->
|
||||
|
||||
# App
|
||||
""")
|
||||
|
||||
Livebook.Apps.subscribe()
|
||||
|
||||
Livebook.Apps.deploy_apps_in_dir(tmp_dir)
|
||||
assert_receive {:app_updated, app}
|
||||
|
||||
Livebook.Apps.deploy_apps_in_dir(tmp_dir)
|
||||
assert %{version: 2} = Livebook.App.get_by_pid(app.pid)
|
||||
|
||||
Livebook.Apps.deploy_apps_in_dir(tmp_dir, start_only: true)
|
||||
assert %{version: 2} = Livebook.App.get_by_pid(app.pid)
|
||||
|
||||
Livebook.App.close(app.pid)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Reference in a new issue