Slide 11
Slide 11 text
def clone_repo(repo_url: str, username: str, password: str, target_path: str) ->
None:
"""
BacklogのGitリポジトリをクローンする。
Args:
repo_url (str): クローンするリポジトリのURL(認証情報を除く)
username (str): ユーザー名またはメールアドレス
password (str): パスワード
target_path (str): クローンしたリポジトリを保存するディレクトリのパス
Returns:
None: 関数は直接的な戻り値は持ちませんが、指定されたパスにリポジトリをクローンします。
"""
# 認証情報をURLに組み込むためのURLエンコーディング
quoted_username: str = quote_plus(username)
quoted_password: str = quote_plus(password)
auth_url: str = repo_url.replace(
"https://", f"https://{quoted_username}:{quoted_password}@"
)
# リポジトリをクローン
Repo.clone_from(auth_url, target_path)
急いで書きました
import json
import os
import tempfile
import zipfile
from typing import Any, Dict
from urllib.parse import quote_plus
from git import Repo
def lambda_handler(event: Dict[str, Any], context: Any) -> Dict[str, str]:
"""
AWS Lambda関数。環境変数から取得したGitHubリポジトリのmainブランチをクローンし、Zip圧縮します。
Args:
event (Dict[str, Any]): Lambda関数に渡されるイベントデータ。
context (Any): Lambda実行のコンテキスト情報。この関数では使用していませんが、Lambda標準の引数です。
Returns:
Dict[str, str]: 処理の結果としてHTTPステータスコードとメッセージを含む辞書型のレスポンスを返します。
"""
# 環境変数からリポジトリのURLを取得
repo_url: str = os.getenv("REPO_URL", "")
# 一時ディレクトリを作成し、そこにリポジトリの内容をクローンする
with tempfile.TemporaryDirectory() as tmpdirname:
# 出力するZipファイルのパスを一時ディレクトリ内に設定
output_zip: str = os.path.join(tmpdirname, "source.zip")
# GitPythonを使用してリポジトリをクローン
clone_repo(
repo_url, os.getenv("GIT_USER", ""), os.getenv("GIT_PASS", ""), tmpdirname
)
# Zipファイルを作成し、クローンした内容を追加する
with zipfile.ZipFile(output_zip, "w", zipfile.ZIP_DEFLATED) as zipf:
# tmpdirname内のファイルとディレクトリを走査
for root, dirs, files in os.walk(tmpdirname):
for file in files:
file_path: str = os.path.join(root, file) # ファイルのフルパス
zipf.write(
file_path, os.path.relpath(file_path, start=tmpdirname)
) # 相対パスでZipに追加
return {
"statusCode": "200",
"body": json.dumps("Repository has been cloned and zipped successfully."),
}