使用API获取开发语言、框架等的End Of Life(支持终止日期),并将其列为清单
首先
所有事物都有终结。
现在所存在的服务和开发语言,即使被视为理所当然,终究都会面临支持结束 = EOL = 生命周期终止。
endoflife.date 是一个汇总各种产品版本的终止生命周期(EOL)的服务。
虽然并非世间所有产品,但我们掌握了270种产品的EOL信息,所以大部分主流产品都有涵盖。
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"])

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

最近即将结束生命周期的搜索
在以下代码中,可以获取在最近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)

如果你发现你正在使用的产品或版本被列出在这里,我们需要制定一些应对方案。
总结
现今有非常多的开发语言和框架在乱发展,版本更新的周期也越来越快。
因此,支持期限也变得相当短,使用它们来构建和运营系统的工程师每天都会被追赶更新。
虽然有些情况很难处理,但至少要意识到什么时候是终止支持。