使用API获取开发语言、框架等的End Of Life(支持终止日期),并将其列为清单

首先

所有事物都有终结。

现在所存在的服务和开发语言,即使被视为理所当然,终究都会面临支持结束 = EOL = 生命周期终止。

endoflife.date 是一个汇总各种产品版本的终止生命周期(EOL)的服务。

 

虽然并非世间所有产品,但我们掌握了270种产品的EOL信息,所以大部分主流产品都有涵盖。

endoflife.date 是一个开源项目,可以通过 GitHub 进行贡献。
https://github.com/endoflife-date/endoflife.date

例如,Elixir 1.10 将于2023年6月19日结束安全支持。

 

如果继续使用已经停止支持的产品或服务,将会带来各种风险。

    • セキュリティホールを塞ぐことが困難になる

 

    • 更新できないため、他の新しい製品との整合性が取れなくなる

 

    OS やブラウザの更新に対応しないため、ある日急に動かなくなり、二度と動かなくなる可能性がある

因此,工程师们需要意识到生命周期结束(EOL),并在技术选择上加以考虑,在运维计划中需要加入版本升级。

我們將使用endoflife.date的API來將各種產品的終止支援日期進行列表化。

 

我们使用的是一如既往的 Livebook。

 

安装

安装 Req 来访问 API,以及安装 KinoExplorer 进行数据分析。

Mix.install([
  {:req, "~> 0.3"},
  {:kino_explorer, "~> 0.1"}
])

请参考以下文章了解有关Explorer的更多信息。

 

进行别名和宏的设置

alias Explorer.DataFrame
alias Explorer.Series
require Explorer.DataFrame

获取产品列表

根据 API 规范获取产品列表。

all_products =
  "https://endoflife.date/api/all.json"
  |> Req.get!()
  |> Map.get(:body)

程序运行结果

["akeneo-pim", "alibaba-dragonwell", "almalinux", "alpine", "amazon-cdk", "amazon-corretto",
 "amazon-eks", "amazon-glue", "amazon-linux", "amazon-neptune", "amazon-rds-mysql",
 "amazon-rds-postgresql", "android", "angular", "angularjs", "ansible", "ansible-core", "antix",
 "apache", "apache-activemq", "apache-airflow", "apache-camel", "apache-cassandra", "apache-groovy",
 "apache-hadoop", "apache-hop", "apache-kafka", "apache-spark", "api-platform", "apple-watch",
 "argo-cd", "artifactory", "azul-zulu", "azure-devops-server", "azure-kubernetes-service", "beats",
 "bellsoft-liberica", "blender", "bootstrap", "cakephp", "centos", "centos-stream", "cfengine",
 "citrix-vad", "clamav", "coldfusion", "composer", "confluence", "consul", "contao", ...]

我们按字母顺序获取了各种产品。

所有产品、所有版本的产品已到达终止生产阶段。

按照 API 规范,获取每个产品的 EOL 信息。

将”product”翻译为”製品”,”cycle”翻译为”バージョン番号”,”eol”翻译为”サポート終了日”。

all_eof =
  all_products
  |> Enum.map(fn product ->
    product
    |> then(&"https://endoflife.date/api/#{&1}.json")
    |> Req.get!()
    |> Map.get(:body)
    |> Enum.map(fn eof ->
      %{
        "product" => product,
        "cycle" => eof["cycle"],
        "eol" => eof["eol"]
      }
    end)
  end)
  |> Enum.concat()

执行结果

[
  %{"cycle" => "7.0", "eol" => "2024-09-30", "product" => "akeneo-pim"},
  %{"cycle" => "6.0", "eol" => "2023-09-30", "product" => "akeneo-pim"},
  %{"cycle" => "5.0", "eol" => "2022-09-30", "product" => "akeneo-pim"},
  ...
  %{"cycle" => "1.27", "eol" => "2024-07-01", "product" => "amazon-eks"},
  %{"cycle" => "1.26", "eol" => "2024-06-01", "product" => "amazon-eks"},
  %{"cycle" => "1.25", "eol" => "2024-05-01", "product" => "amazon-eks"},
  %{"cycle" => "1.24", "eol" => "2024-01-31", ...},
  %{"cycle" => "1.23", ...},
  %{...},
  ...
]

将数据转换成数据框架

为了进行数据分析和表格显示,我们将通过API获得的数据转换为数据框。

eol 从 API 中以字符串形式获取,但为了方便处理,将其转换为日期。

eof_df =
  all_eof
  |> Enum.map(fn eof ->
    Map.update!(eof, "eol", fn value ->
      if is_nil(value) or is_boolean(value) do
        nil
      else
        NaiveDateTime.from_iso8601!("#{value}T00:00:00Z")
      end
    end)
  end)
  |> DataFrame.new()
  |> DataFrame.select(["product", "cycle", "eol"])
スクリーンショット 2023-11-22 16.19.22.png

如果能达到这种状态,搜索和排序也能立即完成。

search.gif

最近即将结束生命周期的搜索

在以下代码中,可以获取在最近180天内即将终止支持的产品版本。

以下是等价的中文表达方式:
使用以下代码,可以获得在过去180天内即将结束支持的产品版本。

range_start = NaiveDateTime.utc_now()
range_end = NaiveDateTime.add(NaiveDateTime.utc_now(), 60 * 60 * 24 * 180)

eof_df
|> DataFrame.filter(eol >= ^range_start and eol <= ^range_end)
|> DataFrame.arrange(eol)
スクリーンショット 2023-11-22 16.23.56.png

如果你发现你正在使用的产品或版本被列出在这里,我们需要制定一些应对方案。

总结

现今有非常多的开发语言和框架在乱发展,版本更新的周期也越来越快。

因此,支持期限也变得相当短,使用它们来构建和运营系统的工程师每天都会被追赶更新。

虽然有些情况很难处理,但至少要意识到什么时候是终止支持。

bannerAds