Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Backlog GitとAWS CodePipelineの連携作戦 - 途中報告

Backlog GitとAWS CodePipelineの連携作戦 - 途中報告

IT系の濃ゆい話をする会#14でLTした試料です。
完成系じゃないけど発表させていただきました。

Satoshi Kaneyasu

April 18, 2024
Tweet

More Decks by Satoshi Kaneyasu

Other Decks in Programming

Transcript

  1. { "before": push前のコミット, "after": push前のコミット, "ref": 参照 "repository": { "url":

    リポジトリのURL, "name": リポジトリ名, "description": リポジトリの説明, }, "commits": [{ "id": コミットのID, "url": コミットのURL, "author": { "email": コミットした人のメールアドレス "name": コミットした人の名前 }, "message": コミットメッセージ, "timestamp": タイムスタンプ, "added": [ 追加されたファイル ], "removed": [ 削除されたファイル ], "modified": [ 修正されたファイル ], }] } Backlog GitのWebhook • https://backlog.com/ja/enterprise-help/userguide/userguide1581/ Pushのタイミングで特定のURLに これらの内容を送れる模様 リポジトリ丸ごと送ることはできないが、 これらを元にCloneすることはできそう
  2. 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."), }
  3. AWS Lambdaのソースのポイント① • GitPythonを使⽤します • ⼀時ディレクトリを作成してそこにクローンします from git import Repo

    途中省略 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 ) この関数は次⾴に書きます
  4. AWS Lambdaのソースのポイント② • LambdaにGitが使えるようになるLayerを追加 • リポジトリURLにID・パスを付与することで、認証を突破 from urllib.parse import quote_plus

    def clone_repo(repo_url: str, username: str, password: str, target_path: str) -> # 認証情報を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)