Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

325 строки
15 KiB

10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
  1. -module(rebar_release_SUITE).
  2. -compile(export_all).
  3. -include_lib("common_test/include/ct.hrl").
  4. -include_lib("eunit/include/eunit.hrl").
  5. all() -> [release,
  6. dev_mode_release,
  7. profile_dev_mode_override_release,
  8. tar,
  9. profile_ordering_sys_config_extend,
  10. profile_ordering_sys_config_extend_3_tuple_merge,
  11. extend_release,
  12. user_output_dir, profile_overlays,
  13. profile_overlay_merge,
  14. overlay_vars].
  15. init_per_testcase(Case, Config0) ->
  16. Config = rebar_test_utils:init_rebar_state(Config0),
  17. Name = rebar_test_utils:create_random_name(atom_to_list(Case)),
  18. AppDir = ?config(apps, Config),
  19. application:load(rebar),
  20. ok = ec_file:mkdir_p(AppDir),
  21. State = rebar_state:new([{base_dir, filename:join([AppDir, "_build"])}]),
  22. rebar_test_utils:create_app(AppDir, Name, "1.0.0", [kernel, stdlib]),
  23. [{name, Name}, {apps, AppDir}, {state, State} | Config].
  24. end_per_testcase(_, Config) ->
  25. meck:unload(),
  26. Config.
  27. release(Config) ->
  28. AppDir = ?config(apps, Config),
  29. Name = ?config(name, Config),
  30. Vsn = "1.0.0",
  31. {ok, RebarConfig} =
  32. file:consult(rebar_test_utils:create_config(AppDir,
  33. [{relx, [{release, {list_to_atom(Name), Vsn},
  34. [list_to_atom(Name)]},
  35. {lib_dirs, [AppDir]}]}])),
  36. rebar_test_utils:run_and_check(
  37. Config, RebarConfig,
  38. ["release"],
  39. {ok, [{release, list_to_atom(Name), Vsn, false}]}
  40. ).
  41. dev_mode_release(Config) ->
  42. AppDir = ?config(apps, Config),
  43. Name = ?config(name, Config),
  44. Vsn = "1.0.0",
  45. {ok, RebarConfig} =
  46. file:consult(rebar_test_utils:create_config(AppDir,
  47. [{relx, [{release, {list_to_atom(Name), Vsn},
  48. [list_to_atom(Name)]},
  49. {lib_dirs, [AppDir]},
  50. {dev_mode, true}]}])),
  51. rebar_test_utils:run_and_check(
  52. Config, RebarConfig,
  53. ["release"],
  54. {ok, [{release, list_to_atom(Name), Vsn, true}]}
  55. ).
  56. profile_dev_mode_override_release(Config) ->
  57. AppDir = ?config(apps, Config),
  58. Name = ?config(name, Config),
  59. Vsn = "1.0.0",
  60. {ok, RebarConfig} =
  61. file:consult(rebar_test_utils:create_config(AppDir,
  62. [{relx, [{release, {list_to_atom(Name), Vsn},
  63. [list_to_atom(Name)]},
  64. {lib_dirs, [AppDir]},
  65. {dev_mode, true}]},
  66. {profiles,
  67. [{ct,
  68. [{relx, [{dev_mode, false}]}]}]}])),
  69. rebar_test_utils:run_and_check(
  70. Config, RebarConfig,
  71. ["as", "ct", "release"],
  72. {ok, [{release, list_to_atom(Name), Vsn, false}]}
  73. ).
  74. tar(Config) ->
  75. AppDir = ?config(apps, Config),
  76. Name = ?config(name, Config),
  77. Vsn = "1.0.0",
  78. {ok, RebarConfig} =
  79. file:consult(rebar_test_utils:create_config(AppDir,
  80. [{relx, [{release, {list_to_atom(Name), Vsn},
  81. [list_to_atom(Name)]},
  82. {lib_dirs, [AppDir]}]}])),
  83. rebar_test_utils:run_and_check(
  84. Config, RebarConfig,
  85. ["tar"],
  86. {ok, [{release, list_to_atom(Name), Vsn, false}, {tar, Name, Vsn}]}
  87. ).
  88. %% Test that the order of release config args is not lost. If it is extend would fail.
  89. extend_release(Config) ->
  90. AppDir = ?config(apps, Config),
  91. Name = ?config(name, Config),
  92. Vsn = "1.0.0",
  93. {ok, RebarConfig} =
  94. file:consult(rebar_test_utils:create_config(AppDir,
  95. [{relx, [{release, {list_to_atom(Name), Vsn},
  96. [list_to_atom(Name)]},
  97. {release, {extended, Vsn, {extend, list_to_atom(Name)}},
  98. []},
  99. {lib_dirs, [AppDir]}]}])),
  100. rebar_test_utils:run_and_check(
  101. Config, RebarConfig,
  102. ["release", "-n", "extended"],
  103. {ok, [{release, extended, Vsn, false}]}
  104. ).
  105. %% Ensure proper ordering of sys_config and extended releases in profiles
  106. profile_ordering_sys_config_extend(Config) ->
  107. AppDir = ?config(apps, Config),
  108. Name = ?config(name, Config),
  109. Vsn = "1.0.0",
  110. TestSysConfig = filename:join(AppDir, "test.config"),
  111. OtherSysConfig = filename:join(AppDir, "other.config"),
  112. ok = file:write_file(TestSysConfig, "[]."),
  113. ok = file:write_file(OtherSysConfig, "[{some, content}]."),
  114. {ok, RebarConfig} =
  115. file:consult(rebar_test_utils:create_config(AppDir,
  116. [{relx, [{release, {list_to_atom(Name), Vsn},
  117. [list_to_atom(Name)]},
  118. {sys_config, OtherSysConfig},
  119. {lib_dirs, [AppDir]}]},
  120. {profiles, [{extended,
  121. [{relx, [
  122. {sys_config, TestSysConfig}]}]}]}])),
  123. rebar_test_utils:run_and_check(
  124. Config, RebarConfig,
  125. ["as", "extended", "release"],
  126. {ok, [{release, list_to_atom(Name), Vsn, false}]}
  127. ),
  128. ReleaseDir = filename:join([AppDir, "./_build/extended/rel/", Name, "releases", Vsn]),
  129. {ok, [[]]} = file:consult(filename:join(ReleaseDir, "sys.config")).
  130. %% test that tup_umerge works with tuples of different sizes
  131. profile_ordering_sys_config_extend_3_tuple_merge(Config) ->
  132. AppDir = ?config(apps, Config),
  133. Name = ?config(name, Config),
  134. Vsn = "1.0.0",
  135. TestSysConfig = filename:join(AppDir, "test.config"),
  136. OtherSysConfig = filename:join(AppDir, "other.config"),
  137. ok = file:write_file(TestSysConfig, "[]."),
  138. ok = file:write_file(OtherSysConfig, "[{some, content}]."),
  139. {ok, RebarConfig} =
  140. file:consult(rebar_test_utils:create_config(AppDir,
  141. [{relx, [{release, {list_to_atom(Name), Vsn},
  142. [list_to_atom(Name)]},
  143. {sys_config, OtherSysConfig},
  144. {lib_dirs, [AppDir]}]},
  145. {profiles, [{extended,
  146. [{relx, [
  147. {release, {extended, Vsn, {extend, list_to_atom(Name)}},
  148. []},
  149. {sys_config, TestSysConfig}]}]}]}])),
  150. rebar_test_utils:run_and_check(
  151. Config, RebarConfig,
  152. ["as", "extended", "release", "-n", Name],
  153. {ok, [{release, list_to_atom(Name), Vsn, false}]}
  154. ),
  155. ReleaseDir = filename:join([AppDir, "./_build/extended/rel/", Name, "releases", Vsn]),
  156. {ok, [[]]} = file:consult(filename:join(ReleaseDir, "sys.config")).
  157. user_output_dir(Config) ->
  158. AppDir = ?config(apps, Config),
  159. Name = ?config(name, Config),
  160. ReleaseDir = filename:join(AppDir, "./_rel"),
  161. Vsn = "1.0.0",
  162. {ok, RebarConfig} =
  163. file:consult(rebar_test_utils:create_config(AppDir,
  164. [{relx, [{release, {list_to_atom(Name), Vsn},
  165. [list_to_atom(Name)]},
  166. {lib_dirs, [AppDir]},
  167. {dev_mode, true}]}])),
  168. rebar_test_utils:run_and_check(
  169. Config, RebarConfig,
  170. ["release", "-o", ReleaseDir],
  171. {ok, []}
  172. ),
  173. RelxState = rlx_state:new("", [], []),
  174. RelxState1 = rlx_state:base_output_dir(RelxState, ReleaseDir),
  175. {ok, RelxState2} = rlx_prv_app_discover:do(RelxState1),
  176. {ok, RelxState3} = rlx_prv_rel_discover:do(RelxState2),
  177. rlx_state:get_realized_release(RelxState3, list_to_atom(Name), Vsn).
  178. profile_overlays(Config) ->
  179. AppDir = ?config(apps, Config),
  180. Name = ?config(name, Config),
  181. Vsn = "1.0.0",
  182. file:write_file(filename:join(AppDir, "dev.file"), "dev.\n"),
  183. file:write_file(filename:join(AppDir, "prod.file"), "prod.\n"),
  184. file:write_file(filename:join(AppDir, "dev.vars"), "{env, \"dev\"}.\n"),
  185. file:write_file(filename:join(AppDir, "prod.vars"), "{env, \"prod\"}.\n"),
  186. {ok, RebarConfig} =
  187. file:consult(rebar_test_utils:create_config(AppDir,
  188. %% Paths are relative, but to cwd in relx, not the project root as
  189. %% seen by rebar3 (in non-test cases, they're the same).
  190. %% Work around by being explicit.
  191. [{relx, [{release, {list_to_atom(Name), Vsn},
  192. [list_to_atom(Name)]},
  193. {overlay_vars, filename:join(AppDir, "dev.vars")},
  194. {overlay, [{mkdir, "randomdir"},
  195. {copy, filename:join(AppDir,"./dev.file"), "profile.file"},
  196. {copy, filename:join(AppDir,"./dev.file"), "{{env}}.file"},
  197. {chmod, 8#00770, "profile.file"}]},
  198. {lib_dirs, [AppDir]}]},
  199. {profiles, [{prod,
  200. [{relx, [
  201. {overlay_vars, filename:join(AppDir, "prod.vars")},
  202. {overlay, [{mkdir, "otherrandomdir"},
  203. {copy, filename:join(AppDir, "./prod.file"), "{{env}}.file"},
  204. {copy, filename:join(AppDir, "./prod.file"), "profile.file"},
  205. {chmod, 8#00770, "profile.file"}]}
  206. ]}]
  207. }]}
  208. ])),
  209. ReleaseDir = filename:join([AppDir, "./_build/prod/rel/", Name]),
  210. rebar_test_utils:run_and_check(
  211. Config, RebarConfig,
  212. ["as", "prod", "release"],
  213. {ok, [{release, list_to_atom(Name), Vsn, false},
  214. {dir, filename:join(ReleaseDir, "otherrandomdir")},
  215. {dir, filename:join(ReleaseDir, "randomdir")}]}
  216. ),
  217. ?assertMatch({ok,[prod]},
  218. file:consult(filename:join(ReleaseDir, "profile.file"))),
  219. ?assertMatch({ok,[prod]},
  220. file:consult(filename:join(ReleaseDir, "prod.file"))),
  221. ok.
  222. profile_overlay_merge (_Config) ->
  223. % when profile and relx overlays both exist, the profile overlays should be
  224. % first, then the relx overlays, all the rest of the config should come
  225. % after, rebar_relx:merge_overlays/1 should do this.
  226. RelxOverlay = [{mkdir, "1_from_relx"}, {mkdir, "2_from_relx"}],
  227. ProfileOverlay = [{mkdir, "0_from_other_profile"}],
  228. OtherConfig = [{other1, config}, {other2, config}],
  229. % test with no overlays
  230. ?assertEqual([{overlay,[]}] ++ OtherConfig,
  231. rebar_relx:merge_overlays(OtherConfig)),
  232. % test with relx only, just move overlays to the top
  233. RelxOnly = OtherConfig ++ [{overlay, RelxOverlay}],
  234. ?assertEqual([{overlay, RelxOverlay}]++OtherConfig,
  235. rebar_relx:merge_overlays(RelxOnly)),
  236. % now test with a profile (profiles end up after relx overlays
  237. ProfilesToMerge = OtherConfig ++
  238. [{overlay, RelxOverlay},
  239. {overlay, ProfileOverlay}],
  240. ?assertEqual([{overlay, ProfileOverlay ++ RelxOverlay}] ++ OtherConfig,
  241. rebar_relx:merge_overlays(ProfilesToMerge)).
  242. overlay_vars(Config) ->
  243. AppDir = ?config(apps, Config),
  244. Name = ?config(name, Config),
  245. Vsn = "1.0.0",
  246. {ok, RebarConfig} =
  247. file:consult(rebar_test_utils:create_config(AppDir,
  248. [{relx, [{release, {list_to_atom(Name), Vsn},
  249. [list_to_atom(Name)]},
  250. {overlay, [
  251. {template, filename:join([AppDir, "config/app.config"]),
  252. "releases/{{release_version}}/sys.config"}
  253. ]},
  254. {overlay_vars, filename:join([AppDir, "config/vars.config"])},
  255. {lib_dirs, [AppDir]}]}
  256. ])),
  257. ok = filelib:ensure_dir(filename:join([AppDir, "config", "dummy"])),
  258. OverlayVars = [{var_int, 1},
  259. {var_string, "\"test\""},
  260. {var_bin_string, "<<\"test\">>"},
  261. {var_tuple, "{t, ['atom']}"},
  262. {var_list, "[a, b, c, 'd']"},
  263. {var_bin, "<<23, 24, 25>>"}],
  264. rebar_test_utils:create_config(AppDir,
  265. filename:join([AppDir, "config", "vars.config"]),
  266. OverlayVars),
  267. AppConfig = [[{var_int, {{var_int}}},
  268. {var_string, {{{var_string}}}},
  269. {var_bin_string, {{{var_bin_string}}}},
  270. {var_tuple, {{{var_tuple}}}},
  271. {var_list, {{{var_list}}}},
  272. {var_bin, {{{var_bin}}}},
  273. {var_profile_string, {{profile_string}}}]], % this comes from `rebar3'
  274. rebar_test_utils:create_config(AppDir,
  275. filename:join([AppDir, "config", "app.config"]),
  276. AppConfig),
  277. rebar_test_utils:run_and_check(
  278. Config, RebarConfig,
  279. ["release"],
  280. {ok, [{release, list_to_atom(Name), Vsn, false}]}),
  281. %% now consult the sys.config file to make sure that is has the expected
  282. %% format
  283. ExpectedSysconfig = [{var_int, 1},
  284. {var_string, "test"},
  285. {var_bin_string, <<"test">>},
  286. {var_tuple, {t, ['atom']}},
  287. {var_list, [a, b, c, 'd']},
  288. {var_bin, <<23, 24, 25>>},
  289. {var_profile_string, 'default'}],
  290. {ok, [ExpectedSysconfig]} = file:consult(filename:join([AppDir, "_build/default/rel",
  291. Name, "releases", Vsn, "sys.config"])).