Loading gitlab_butler/main.py +27 −16 Original line number Diff line number Diff line Loading @@ -17,8 +17,7 @@ LOGGER = Logger(__name__) def to_url(api_url: str) -> str: return api_url[0:-7] if api_url.endswith("/api/v4") else api_url def run() -> None: def generate_parser(): # define command parser parser = argparse.ArgumentParser( prog="gitlab-butler", Loading Loading @@ -96,13 +95,13 @@ def run() -> None: ) parser.add_argument( "--pipelines-keep-per-tag", type=str, type=int, default=int(os.getenv("PIPELINES_KEEP_PER_TAG", "5")), help="number of pipelines to keep per tag (⚠ tag MUST still exist)", ) parser.add_argument( "--pipelines-keep-per-mr", type=str, type=int, default=int(os.getenv("PIPELINES_KEEP_PER_MR", "1")), help="number of pipelines to keep per merge request (⚠ MR MUST still exist)", ) Loading @@ -112,6 +111,26 @@ def run() -> None: default=int(os.getenv("PIPELINES_DELETE_OLDER_THAN", "30")), help="max age (in days) after which pipelines are deleted (unless they are kept by a keep rule)", ) return parser def generate_cfg(args): # build default config cfg = ButlerCfg() cfg.pipelines.delete_older_than = args.pipelines_delete_older_than cfg.pipelines.keep.per_tag.any_tag = args.pipelines_keep_per_tag cfg.pipelines.keep.per_merge_request.any_mr = args.pipelines_keep_per_mr if args.pipelines_keep_per_branch: cfg.pipelines.keep.per_branch.by_name = { branch: int(n) for (branch, n) in [b.split(":") for b in args.pipelines_keep_per_branch] } if args.verbose: print(f"Default configuration: {cfg}") return cfg def run() -> None: # build parser parser = generate_parser() # parse command and args args = parser.parse_args() Loading Loading @@ -169,18 +188,8 @@ def run() -> None: ) print() # build default config cfg = ButlerCfg() cfg.pipelines.delete_older_than = args.pipelines_delete_older_than cfg.pipelines.keep.per_tag.any_tag = args.pipelines_keep_per_tag cfg.pipelines.keep.per_merge_request.any_mr = args.pipelines_keep_per_mr if args.pipelines_keep_per_branch: cfg.pipelines.keep.per_branch = { branch: int(n) for (branch, n) in [b.split(":") for b in args.pipelines_keep_per_branch] } if args.verbose: print(f"Default configuration: {cfg}") # build configuration from args cfg = generate_cfg(args) butler = Butler( Gitlab( Loading Loading @@ -223,3 +232,5 @@ def run() -> None: if len(butler.errors) > 0: exit(128) tests/test_butlercfg.py 0 → 100644 +70 −0 Original line number Diff line number Diff line from gitlab_butler.butlercfg import ButlerCfg from gitlab_butler.main import generate_cfg, generate_parser class TestButlerCfg: def validate_cfg(self, cfg): """ Validate configuration :param cfg: :return: """ assert isinstance(cfg, ButlerCfg) assert isinstance(cfg.enabled, bool) assert isinstance(cfg.pipelines, ButlerCfg.PipelinesCfg) assert isinstance(cfg.pipelines.enabled, bool) assert isinstance(cfg.pipelines.keep, ButlerCfg.PipelinesCfg.KeepCfg) assert isinstance(cfg.pipelines.delete_older_than, int) # branches assert isinstance(cfg.pipelines.keep.per_branch.enabled, bool) assert isinstance(cfg.pipelines.keep.per_branch.default_branch, int) assert isinstance(cfg.pipelines.keep.per_branch.protected_branches, int) assert isinstance(cfg.pipelines.keep.per_branch.any_branch, int) assert isinstance(cfg.pipelines.keep.per_branch.by_name, dict) # tags assert isinstance(cfg.pipelines.keep.per_tag.enabled, bool) assert isinstance(cfg.pipelines.keep.per_tag.any_tag, int) assert isinstance(cfg.pipelines.keep.per_tag.by_name, dict) # mr assert isinstance(cfg.pipelines.keep.per_merge_request.enabled, bool) assert isinstance(cfg.pipelines.keep.per_merge_request.any_mr, int) assert isinstance(cfg.pipelines.keep.per_merge_request.by_status, dict) def test_default_cfg(self): cfg = ButlerCfg() self.validate_cfg(cfg) def test_cfg_with_values(self): cfg = ButlerCfg() cfg.pipelines.delete_older_than = 10 cfg.pipelines.keep.per_tag.any_tag = 10 cfg.pipelines.keep.per_merge_request.any_mr = 10 self.validate_cfg(cfg) def test_build_cfg_from_default_args(self): cfg = generate_cfg(generate_parser().parse_args([])) self.validate_cfg(cfg) def test_build_cfg_from_args_keep_pipelines_per_branch(self): cfg = generate_cfg(generate_parser().parse_args(['--pipelines-keep-per-branch', 'main:10'])) self.validate_cfg(cfg) assert cfg.pipelines.keep.per_branch.by_name == {'main': 10} cfg = generate_cfg(generate_parser().parse_args(['--pipelines-keep-per-branch', 'main:10', '--pipelines-keep-per-branch', 'master:5'])) self.validate_cfg(cfg) assert cfg.pipelines.keep.per_branch.by_name == {'main': 10, 'master': 5} def test_build_cfg_from_args_keep_pipelines_per_tag(self): cfg = generate_cfg(generate_parser().parse_args(['--pipelines-keep-per-tag', '5'])) self.validate_cfg(cfg) assert cfg.pipelines.keep.per_tag.any_tag == 5 def test_build_cfg_from_args_keep_pipelines_per_mr(self): cfg = generate_cfg(generate_parser().parse_args(['--pipelines-keep-per-mr', '5'])) self.validate_cfg(cfg) assert cfg.pipelines.keep.per_merge_request.any_mr == 5 Loading
gitlab_butler/main.py +27 −16 Original line number Diff line number Diff line Loading @@ -17,8 +17,7 @@ LOGGER = Logger(__name__) def to_url(api_url: str) -> str: return api_url[0:-7] if api_url.endswith("/api/v4") else api_url def run() -> None: def generate_parser(): # define command parser parser = argparse.ArgumentParser( prog="gitlab-butler", Loading Loading @@ -96,13 +95,13 @@ def run() -> None: ) parser.add_argument( "--pipelines-keep-per-tag", type=str, type=int, default=int(os.getenv("PIPELINES_KEEP_PER_TAG", "5")), help="number of pipelines to keep per tag (⚠ tag MUST still exist)", ) parser.add_argument( "--pipelines-keep-per-mr", type=str, type=int, default=int(os.getenv("PIPELINES_KEEP_PER_MR", "1")), help="number of pipelines to keep per merge request (⚠ MR MUST still exist)", ) Loading @@ -112,6 +111,26 @@ def run() -> None: default=int(os.getenv("PIPELINES_DELETE_OLDER_THAN", "30")), help="max age (in days) after which pipelines are deleted (unless they are kept by a keep rule)", ) return parser def generate_cfg(args): # build default config cfg = ButlerCfg() cfg.pipelines.delete_older_than = args.pipelines_delete_older_than cfg.pipelines.keep.per_tag.any_tag = args.pipelines_keep_per_tag cfg.pipelines.keep.per_merge_request.any_mr = args.pipelines_keep_per_mr if args.pipelines_keep_per_branch: cfg.pipelines.keep.per_branch.by_name = { branch: int(n) for (branch, n) in [b.split(":") for b in args.pipelines_keep_per_branch] } if args.verbose: print(f"Default configuration: {cfg}") return cfg def run() -> None: # build parser parser = generate_parser() # parse command and args args = parser.parse_args() Loading Loading @@ -169,18 +188,8 @@ def run() -> None: ) print() # build default config cfg = ButlerCfg() cfg.pipelines.delete_older_than = args.pipelines_delete_older_than cfg.pipelines.keep.per_tag.any_tag = args.pipelines_keep_per_tag cfg.pipelines.keep.per_merge_request.any_mr = args.pipelines_keep_per_mr if args.pipelines_keep_per_branch: cfg.pipelines.keep.per_branch = { branch: int(n) for (branch, n) in [b.split(":") for b in args.pipelines_keep_per_branch] } if args.verbose: print(f"Default configuration: {cfg}") # build configuration from args cfg = generate_cfg(args) butler = Butler( Gitlab( Loading Loading @@ -223,3 +232,5 @@ def run() -> None: if len(butler.errors) > 0: exit(128)
tests/test_butlercfg.py 0 → 100644 +70 −0 Original line number Diff line number Diff line from gitlab_butler.butlercfg import ButlerCfg from gitlab_butler.main import generate_cfg, generate_parser class TestButlerCfg: def validate_cfg(self, cfg): """ Validate configuration :param cfg: :return: """ assert isinstance(cfg, ButlerCfg) assert isinstance(cfg.enabled, bool) assert isinstance(cfg.pipelines, ButlerCfg.PipelinesCfg) assert isinstance(cfg.pipelines.enabled, bool) assert isinstance(cfg.pipelines.keep, ButlerCfg.PipelinesCfg.KeepCfg) assert isinstance(cfg.pipelines.delete_older_than, int) # branches assert isinstance(cfg.pipelines.keep.per_branch.enabled, bool) assert isinstance(cfg.pipelines.keep.per_branch.default_branch, int) assert isinstance(cfg.pipelines.keep.per_branch.protected_branches, int) assert isinstance(cfg.pipelines.keep.per_branch.any_branch, int) assert isinstance(cfg.pipelines.keep.per_branch.by_name, dict) # tags assert isinstance(cfg.pipelines.keep.per_tag.enabled, bool) assert isinstance(cfg.pipelines.keep.per_tag.any_tag, int) assert isinstance(cfg.pipelines.keep.per_tag.by_name, dict) # mr assert isinstance(cfg.pipelines.keep.per_merge_request.enabled, bool) assert isinstance(cfg.pipelines.keep.per_merge_request.any_mr, int) assert isinstance(cfg.pipelines.keep.per_merge_request.by_status, dict) def test_default_cfg(self): cfg = ButlerCfg() self.validate_cfg(cfg) def test_cfg_with_values(self): cfg = ButlerCfg() cfg.pipelines.delete_older_than = 10 cfg.pipelines.keep.per_tag.any_tag = 10 cfg.pipelines.keep.per_merge_request.any_mr = 10 self.validate_cfg(cfg) def test_build_cfg_from_default_args(self): cfg = generate_cfg(generate_parser().parse_args([])) self.validate_cfg(cfg) def test_build_cfg_from_args_keep_pipelines_per_branch(self): cfg = generate_cfg(generate_parser().parse_args(['--pipelines-keep-per-branch', 'main:10'])) self.validate_cfg(cfg) assert cfg.pipelines.keep.per_branch.by_name == {'main': 10} cfg = generate_cfg(generate_parser().parse_args(['--pipelines-keep-per-branch', 'main:10', '--pipelines-keep-per-branch', 'master:5'])) self.validate_cfg(cfg) assert cfg.pipelines.keep.per_branch.by_name == {'main': 10, 'master': 5} def test_build_cfg_from_args_keep_pipelines_per_tag(self): cfg = generate_cfg(generate_parser().parse_args(['--pipelines-keep-per-tag', '5'])) self.validate_cfg(cfg) assert cfg.pipelines.keep.per_tag.any_tag == 5 def test_build_cfg_from_args_keep_pipelines_per_mr(self): cfg = generate_cfg(generate_parser().parse_args(['--pipelines-keep-per-mr', '5'])) self.validate_cfg(cfg) assert cfg.pipelines.keep.per_merge_request.any_mr == 5