Blockchain explorer for Ethereum based network and a tool for inspecting and analyzing EVM based blockchains.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
blockscout/apps/explorer/lib/release_tasks.ex

130 lines
2.6 KiB

defmodule Explorer.ReleaseTasks do
@moduledoc """
Release tasks used to migrate or generate seeds.
"""
alias Ecto.Migrator
@start_apps [
:crypto,
:ssl,
:postgrex,
:ecto,
# If using Ecto 3.0 or higher
:ecto_sql
]
def repos do
base_repos_list = [
Explorer.Repo,
Explorer.Repo.Account
]
repos_list =
case System.get_env("CHAIN_TYPE") do
"polygon_edge" -> [Explorer.Repo.PolygonEdge | base_repos_list]
"polygon_zkevm" -> [Explorer.Repo.PolygonZkevm | base_repos_list]
_ -> base_repos_list
end
Application.get_env(:explorer, :ecto_repos, repos_list)
end
def create_and_migrate do
start_services()
create()
run_migrations()
stop_services()
end
def create do
Enum.each(repos(), &create_db_for/1)
end
def migrate(_argv) do
start_services()
run_migrations()
stop_services()
end
def seed(_argv) do
start_services()
run_migrations()
run_seeds()
stop_services()
end
defp start_services do
IO.puts("Starting dependencies..")
# Start apps necessary for executing migrations
Enum.each(@start_apps, &Application.ensure_all_started/1)
# Start the Repo(s) for app
IO.puts("Starting repos..")
# Switch pool_size to 2 for ecto > 3.0
Enum.each(repos(), & &1.start_link(pool_size: 2))
end
defp stop_services do
IO.puts("Success!")
:init.stop()
end
defp create_db_for(repo) do
IO.puts("Create #{inspect(repo)} database if it doesn't exist")
case repo.__adapter__.storage_up(repo.config) do
:ok -> :ok
{:error, :already_up} -> :ok
{:error, term} -> {:error, term}
end
end
defp run_migrations do
Enum.each(repos(), &run_migrations_for/1)
end
defp run_migrations_for(repo) do
app = Keyword.get(repo.config, :otp_app)
IO.puts("Running migrations for #{app}")
migrations_path = priv_path_for(repo, "migrations")
Migrator.run(repo, migrations_path, :up, all: true)
end
defp run_seeds do
Enum.each(repos(), &run_seeds_for/1)
end
# sobelow_skip ["RCE.CodeModule"]
defp run_seeds_for(repo) do
# Run the seed script if it exists
seed_script = priv_path_for(repo, "seeds.exs")
if File.exists?(seed_script) do
IO.puts("Running seed script..")
Code.eval_file(seed_script)
end
end
defp priv_path_for(repo, filename) do
app = Keyword.get(repo.config, :otp_app)
repo_underscore =
repo
|> Module.split()
|> List.last()
|> Macro.underscore()
priv_dir = "#{:code.priv_dir(app)}"
Path.join([priv_dir, repo_underscore, filename])
end
end