概要
前回はシェルスクリプト+ gitlab ci で取得しましたが今回は Python で取得します
GitPython というライブラリを使います
環境
- macOS 14.6.1
- Python 3.11.10
- GitPython 3.1.43
サンプルコード
import re
from dataclasses import dataclass
import git
# Prometheus など各種バージョンを管理するデータクラス
@dataclass
class GitlabAlertVersion:
prometheus_version: str = ""
alertmanager_version: str = ""
node_exporter_version: str = ""
# バージョン情報をファイルに保存します
def save_to_files(self):
with open("prometheus_version.txt", "w") as f:
f.write(self.prometheus_version)
with open("alertmanager_version.txt", "w") as f:
f.write(self.alertmanager_version)
with open("node_exporter_version.txt", "w") as f:
f.write(self.node_exporter_version)
# omnibus-gitlab のリポジトリをクローンしてバージョンを取得するクラス
class GitlabAlertVersionFetcher:
def __init__(self, tag="17.1.6+ee.0"):
self.tag = tag
self.repo_name = "omnibus-gitlab"
self.url = f"https://gitlab.com/gitlab-org/{self.repo_name}.git"
self.file_names = ["prometheus", "alertmanager", "node-exporter"]
# url に記載のリポジトリを取得
# 今回は tag を指定しシャロークローンで取得
def _clone(self) -> git.Repo:
return git.Repo.clone_from(
self.url,
f"./{self.repo_name}",
branch=self.tag,
depth="1",
)
# 指定のファイルを git grep する
def _grep(self, file, repo: git.Repo) -> str:
lines = repo.git.grep(
"Gitlab::Version.new", "--", f"config/software/{file}.rb"
).split("\n")
pattern = r"\d+\.\d+\.\d+"
for line in lines:
match = re.search(pattern, line)
if match:
return match.group(0)
else:
raise ValueError()
# 実行メイン関数
# file_names に定義された各種コンポーネントのバージョンを取得
def run(self) -> GitlabAlertVersion:
gitlab_alert_version = GitlabAlertVersion()
repo = self._clone()
for file in self.file_names:
setattr(
gitlab_alert_version,
f"{file.replace('-', '_')}_version",
self._grep(file, repo),
)
return gitlab_alert_version
if __name__ == "__main__":
fetcher = GitlabAlertVersionFetcher()
version: GitlabAlertVersion = fetcher.run()
print(version)
version.save_to_files()
最後に
GitPython を使うと git コマンドを Python 内で使うことができます
0 件のコメント:
コメントを投稿