· 6 years ago · Mar 22, 2019, 11:18 PM
1defmodule Release.Tasks do
2 @start_apps [
3 :postgrex,
4 :ecto,
5 :ecto_sql
6 ]
7
8 @app_mods [
9 DockerizeElixir
10 ]
11
12 ########## create db base if it dose not exist ############
13 def create_db do
14 Enum.each(@app_mods, &create_db_for/1)
15 :init.stop()
16 end
17
18 defp create_db_for(mod) do
19 IO.puts("Create DB for #{inspect(mod)}")
20 ## get application
21 app = Application.get_application(mod)
22
23 ## get all ecto repos for this application
24 repos = Application.get_env(app, :ecto_repos, [])
25
26 Enum.each(repos, &ensure_repo_created/1)
27 end
28
29 defp ensure_repo_created(repo) do
30 case repo.__adapter__.storage_up(repo.config) do
31 :ok ->
32 IO.puts("create database success")
33 :ok
34
35 {:error, :already_up} ->
36 IO.puts("database is already up, ignore it")
37 :ok
38
39 {:error, term} ->
40 IO.puts("#{inspect(term)}")
41 {:error, term}
42 end
43 end
44
45 ########## do the migration like: create table, run seeds ############
46 def migrate do
47 Enum.each(@app_mods, &migrate_for/1)
48 :init.stop()
49 end
50
51 defp migrate_for(mod) do
52 ## get application
53 app = Application.get_application(mod)
54
55 IO.puts("Starting dependencies")
56 # Start apps necessary for executing migrations
57 Enum.each(@start_apps, &Application.ensure_all_started/1)
58
59 # Start the Repo(s) for myapp
60 IO.puts("Starting repos")
61 repos = Application.get_env(app, :ecto_repos, [])
62 Enum.each(repos, & &1.start_link(pool_size: 2))
63
64 # Run migrations
65 Enum.each(repos, &run_migrations_for/1)
66
67 # Run seed
68 Enum.each(repos, &run_seeds_for/1)
69 end
70
71 ## Migration for single repo
72 defp run_migrations_for(repo) do
73 app = Keyword.get(repo.config, :otp_app)
74 IO.puts("Running migrations for #{app}")
75 Ecto.Migrator.run(repo, migrations_path(repo), :up, all: true)
76 end
77
78 ## Run seed for single repo
79 defp run_seeds_for(repo) do
80 # Run the seed script if it exists
81 seed_script = seeds_path(repo)
82
83 if File.exists?(seed_script) do
84 IO.puts("Running seed script..")
85 Code.eval_file(seed_script)
86 end
87 end
88
89 defp migrations_path(repo), do: priv_path_for(repo, "migrations")
90 defp seeds_path(repo), do: priv_path_for(repo, "seeds.exs")
91
92 defp priv_path_for(repo, filename) do
93 app = Keyword.get(repo.config, :otp_app)
94 repo_underscore = repo |> Module.split() |> List.last() |> Macro.underscore()
95 priv_dir = "#{:code.priv_dir(app)}"
96 Path.join([priv_dir, repo_underscore, filename])
97 end
98end