我正在为凤凰应用程序使用酿酒厂进行热代码升级。我用它来创建应用程序的版本。
def project do
{result, _exit_code} = System.cmd("git", ["rev-parse", "HEAD"])
git_sha = String.slice(result, 0, 7)
[app: :evercam_media,
version: "1.0.1-a#{git_sha}",
elixir: "~> 1.7",
elixirc_paths: elixirc_paths(Mix.env),
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
compilers: [:phoenix] ++ Mix.compilers,
aliases: aliases(),
deps: deps()]
end这会创建版本,但该版本不适用于热代码升级,并且会破坏relup文件。当我进行版本控制时,比如1.0.1、1.0.2和1.0.3。然后,热代码部署工作良好。但有什么办法能让这件事充满活力吗?
我正在使用酿酒厂部署到远程服务器。
更新:
我正在使用酿酒厂进行部署,但是除非它们是1.0.1或1.0.2或1.0.3,否则自动版本无法工作。我已经尝试了下面的答案。同时也包括git describe --tags。但酿酒厂只使用两个版本,然后每次使用过去的版本来创建新的版本。
发布于 2018-08-29 07:25:43
git_sha的问题是它没有被订购。假设下一个版本的数字比上一个版本大,只需简单的字母数字排序即可。对于sha,情况并非如此。
你可以用日期来达到这个目的。例句:
git log -1 --date=raw --format=%cd
#⇒ 1535467693 +0200 # seconds since epoch现在让我们来点灵丹妙药:
{epoch, _} = System.cmd("git", ~w|log -1 --date=raw --format=%cd|)
[sec, tz] =
epoch
|> String.split(~r/\s+/, trim: true)
|> Enum.map(&String.to_integer/1)
#⇒ [1527769224, 200]
sec + tz * 36 # * 60 * 60 / 100
#⇒ 1527776424上面的数字一直在增长。
Sidenote:尽可能使用内部二进制模式匹配而不是String.slice/3:
{<<git_sha::binary-size(8), _rest::binary>>, _exit_code} =
System.cmd("git", ["rev-parse", "HEAD"])
#⇒ {"556c53987eb55c82ffb6925f9f56eae5de01c119\n", 0}
git_sha
#⇒ "556c5398"发布于 2018-08-29 15:25:02
下面是我为应用程序使用的方法,最终将其构建为一个版本化的生产RPM。当构建在一个干净的标签上时,版本就是标签名。否则,版本将包含自上次标记以来的短提交散列和提交计数。
它还支持通过在项目的根目录中包含一个版本文件来覆盖自动版本控制。
# mix.exs
defmodule MyApp.Mixfile do
use Mix.Project
@default_version "v1.0.0-default"
def project do
[
app: :my_app,
version: version(),
elixir: "~> 1.6",
# ...
]
end
# ...
defp version do
# Build the version number from Git.
# It will be something like 1.0.0-beta1 when built against a tag, and
# 1.0.0-beta1+18.ga9f2f1ee when built against something after a tag.
with {:ok, string} <- get_version(),
[_, version, commit] <- Regex.run(~r/(v[\d\.]+(?:\-[a-zA-Z]+\d*)?)(.*)/, String.trim(string)) do
String.replace(version, ~r/^v/, "") <> (commit |> String.replace(~r/^-/, "+") |> String.replace("-", "."))
else
other ->
IO.puts("Could not get version. error: #{other}")
@default_version
end
end
defp get_version do
case File.read("VERSION") do
{:error, _} ->
case System.cmd("git", ["describe"]) do
{string, 0} -> {:ok, string}
{error, errno} -> {:error, "Could not get version. errno: #{inspect errno}, error: #{inspect error}"}
end
ok -> ok
end
end
end发布于 2018-08-29 10:04:57
无论您所需要的只是使交付愉快,您可以为此使用传递配置。只需在您的.deliver/config中放置下面一行
AUTO_VERSION=commit-count+git-revision+branch-unless-masterhttps://stackoverflow.com/questions/52071347
复制相似问题