Лучший подход для автоматического управления версиями приложения эликсир Феникс - PullRequest
0 голосов
/ 29 августа 2018

Я делаю горячее обновление кода, используя винокурню для приложения Phoenix. Я использовал это для создания версии приложения.

  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. но спиртзавод использует только 2 версии, а затем каждый раз использует предыдущую версию для создания новой версии.

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Все, что вам нужно, чтобы доставить удовольствие, вы можете использовать config доставки для этой цели. Просто вставьте следующую строку в ваш .deliver/config:

AUTO_VERSION=commit-count+git-revision+branch-unless-master
0 голосов
/ 29 августа 2018

Вот подход, который я использую для приложения, которое в конечном итоге получает сборку в качестве версии RPM. Когда построено против чистого тега, версия - это имя вкладки. В противном случае версия включает в себя короткий хэш коммита и количество коммитов с момента последнего тега.

Он также поддерживает отмену автоматического управления версиями путем включения файла VERSION в корневой каталог проекта.

# 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
0 голосов
/ 29 августа 2018

Проблема с 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"
...