From f945f95ca6edda88472190bbba14b3fd2ddee6de Mon Sep 17 00:00:00 2001 From: kminoda <44218668+kminoda@users.noreply.github.com> Date: Tue, 23 Aug 2022 12:43:18 +0900 Subject: [PATCH] ci: add a new workflow to update sync-param-files.yaml automatically (#75) * feat add update-sync-param-files github action Signed-off-by: kminoda * debug Signed-off-by: kminoda * apply pre-commit Signed-off-by: kminoda * reflected comments Signed-off-by: kminoda * refactored python file Signed-off-by: kminoda * ci(pre-commit): autofix * simplified python script Signed-off-by: kminoda * ci(pre-commit): autofix * simplified python script Signed-off-by: kminoda * pre-commit applied Signed-off-by: kminoda * do not update when the source already exists Signed-off-by: kminoda * remove unnecessary import Signed-off-by: kminoda * not in Signed-off-by: kminoda * checkout@v1 -> checkout@v3 * fix comment Signed-off-by: kminoda * simplified python script Signed-off-by: kminoda * ci(pre-commit): autofix * rename a variable Signed-off-by: kminoda * ci(pre-commit): autofix * isolate src2dst calculation as a function Signed-off-by: kminoda * ci(pre-commit): autofix * debugged Signed-off-by: kminoda * debugging Signed-off-by: kminoda * debugging Signed-off-by: kminoda * debugging Signed-off-by: kminoda * debugging Signed-off-by: kminoda * ci(pre-commit): autofix * debugged? Signed-off-by: kminoda * updated python script with miyake-san's suggestion + minor fix Signed-off-by: kminoda * applied pre-commit Signed-off-by: kminoda * removed sorted function Signed-off-by: kminoda * resolve pre-commit Signed-off-by: kminoda * added pip3 install GitPython action Signed-off-by: kminoda Signed-off-by: kminoda Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .github/update-sync-param-files.py | 80 +++++++++++++++++++ .../workflows/update-sync-param-files.yaml | 54 +++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 .github/update-sync-param-files.py create mode 100644 .github/workflows/update-sync-param-files.yaml diff --git a/.github/update-sync-param-files.py b/.github/update-sync-param-files.py new file mode 100644 index 0000000000000..707909cdd186c --- /dev/null +++ b/.github/update-sync-param-files.py @@ -0,0 +1,80 @@ +import argparse +import dataclasses +from pathlib import Path +from typing import List +from typing import Optional + +import git + +""" +This module updates `sync-param-files.yaml` based on the launch parameter files in `autoware.universe`. +""" + +REPO_NAME = "autowarefoundation/autoware.universe" +REPO_URL = f"https://github.com/{REPO_NAME}.git" +CLONE_PATH = Path("/tmp/autoware.universe") + + +@dataclasses.dataclass +class FileSyncConfig: + source: str + dest: str + replace: Optional[bool] = None + delete_orphaned: Optional[bool] = None + pre_commands: Optional[str] = None + post_commands: Optional[str] = None + + +def create_tier4_launch_sync_configs(tier4_launch_package_path: Path) -> List[FileSyncConfig]: + launch_package_name = tier4_launch_package_path.name + launch_config_path = tier4_launch_package_path / "config" + + sync_configs = [] + for param_file_path in tier4_launch_package_path.glob("config/**/*.param.yaml"): + relative_param_file_path = param_file_path.relative_to(launch_config_path) + + source = param_file_path.relative_to(CLONE_PATH) + dest = Path("autoware_launch/config") / launch_package_name / relative_param_file_path + + sync_configs.append(FileSyncConfig(str(source), str(dest))) + + return sync_configs + + +def dump_sync_config(section_name: str, sync_configs: List[FileSyncConfig]) -> List[str]: + indent = 4 * " " + lines = [f"{indent}# {section_name}\n"] + for sync_config in sync_configs: + lines.append(f"{indent}- source: {sync_config.source}\n") + lines.append(f"{indent} dest: {sync_config.dest}\n") + lines.append("\n") + return lines + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("sync_param_files_path", type=Path, help="path to sync-param-files.yaml") + args = parser.parse_args() + + # Clone Autoware + if not CLONE_PATH.exists(): + git.Repo.clone_from(REPO_URL, CLONE_PATH) + + # Create sync config for tier4_*_launch + tier4_launch_package_paths = sorted( + CLONE_PATH.glob("launch/tier4_*_launch"), key=lambda p: p.name + ) + tier4_launch_sync_configs_map = { + p.name: create_tier4_launch_sync_configs(p) for p in tier4_launch_package_paths + } + + # Create sync-param-files.yaml + with open(args.sync_param_files_path, "w") as f: + f.write(f"- repository: {REPO_NAME}\n") + f.write(" files:\n") + for section_name, sync_config in tier4_launch_sync_configs_map.items(): + f.writelines(dump_sync_config(section_name, sync_config)) + + +if __name__ == "__main__": + main() diff --git a/.github/workflows/update-sync-param-files.yaml b/.github/workflows/update-sync-param-files.yaml new file mode 100644 index 0000000000000..fbce54b07f1b8 --- /dev/null +++ b/.github/workflows/update-sync-param-files.yaml @@ -0,0 +1,54 @@ +name: update-sync-param-files + +on: + schedule: + - cron: 0 0 * * * + workflow_dispatch: + +jobs: + update-sync-param-files: + runs-on: ubuntu-latest + steps: + - name: Generate token + id: generate-token + uses: tibdex/github-app-token@v1 + with: + app_id: ${{ secrets.APP_ID }} + private_key: ${{ secrets.PRIVATE_KEY }} + + - name: Check out repository + uses: actions/checkout@v3 + + - name: Install GitPython + run: | + pip3 install GitPython + shell: bash + + - name: Generate sync-param-files.yaml + run: | + python3 .github/update-sync-param-files.py .github/sync-param-files.yaml + + - name: Create PR + id: create-pr + uses: peter-evans/create-pull-request@v4 + with: + token: ${{ steps.generate-token.outputs.token }} + base: ${{ github.event.repository.default_branch }} + branch: update-sync-param-files + title: "chore: update sync-param-files.yaml" + commit-message: "chore: update sync-param-files.yaml" + body: ${{ steps.create-pr-body.outputs.body }} + + - name: Check outputs + run: | + echo "Pull Request Number - ${{ steps.create-pr.outputs.pull-request-number }}" + echo "Pull Request URL - ${{ steps.create-pr.outputs.pull-request-url }}" + shell: bash + + - name: Enable auto-merge + if: ${{ steps.create-pr.outputs.pull-request-operation == 'created' }} + uses: peter-evans/enable-pull-request-automerge@v2 + with: + token: ${{ steps.generate-token.outputs.token }} + pull-request-number: ${{ steps.create-pr.outputs.pull-request-number }} + merge-method: squash