首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实现灵丹妙药应用程序自动版本控制的最佳方法

实现灵丹妙药应用程序自动版本控制的最佳方法
EN

Stack Overflow用户
提问于 2018-08-29 07:00:20
回答 4查看 957关注 0票数 1

我正在为凤凰应用程序使用酿酒厂进行热代码升级。我用它来创建应用程序的版本。

代码语言:javascript
运行
复制
  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。但酿酒厂只使用两个版本,然后每次使用过去的版本来创建新的版本。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-08-29 07:25:43

git_sha的问题是它没有被订购。假设下一个版本的数字比上一个版本大,只需简单的字母数字排序即可。对于sha,情况并非如此。

你可以用日期来达到这个目的。例句:

代码语言:javascript
运行
复制
git log -1 --date=raw --format=%cd
#⇒ 1535467693 +0200 # seconds since epoch

现在让我们来点灵丹妙药:

代码语言:javascript
运行
复制
{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

代码语言:javascript
运行
复制
{<<git_sha::binary-size(8), _rest::binary>>, _exit_code} =
  System.cmd("git", ["rev-parse", "HEAD"])
#⇒ {"556c53987eb55c82ffb6925f9f56eae5de01c119\n", 0}
git_sha
#⇒ "556c5398"
票数 2
EN

Stack Overflow用户

发布于 2018-08-29 15:25:02

下面是我为应用程序使用的方法,最终将其构建为一个版本化的生产RPM。当构建在一个干净的标签上时,版本就是标签名。否则,版本将包含自上次标记以来的短提交散列和提交计数。

它还支持通过在项目的根目录中包含一个版本文件来覆盖自动版本控制。

代码语言:javascript
运行
复制
# 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
票数 2
EN

Stack Overflow用户

发布于 2018-08-29 10:04:57

无论您所需要的只是使交付愉快,您可以为此使用传递配置。只需在您的.deliver/config中放置下面一行

代码语言:javascript
运行
复制
AUTO_VERSION=commit-count+git-revision+branch-unless-master
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52071347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档