import os import subprocess import requests BITBUCKET_REPO_OWNER = "aarete" BITBUCKET_REPO_SLUG = "doczy.ai" BB_PIPELINE_BRANCH = os.getenv("BB_PIPELINE_BRANCH", "DEV") BITBUCKET_AUTH_HEADER = os.getenv("BITBUCKET_AUTH_HEADER") from terminal import run_command, prepare_logger, decorate_warn LOGGER = prepare_logger() def check_bitbucket_auth_header(): if os.getenv("BITBUCKET_CI") == "true" and not BITBUCKET_AUTH_HEADER: raise EnvironmentError("Error: BITBUCKET_AUTH_HEADER is not set.") def get_last_successful_commit(module): if os.getenv("BITBUCKET_CI") != "true": rc, result = run_command("git rev-parse HEAD", log_output=True, log_cmd=True, log_prefix=f"[{module}]") return result for commit in subprocess.check_output(["git", "log", "--format=%h", "-n", "30"]).decode().split(): url = f"https://api.bitbucket.org/2.0/repositories/{BITBUCKET_REPO_OWNER}/{BITBUCKET_REPO_SLUG}/commit/{commit}/statuses/" LOGGER.info(f"commit={commit}, url={url}") basic_url_headers = { BITBUCKET_AUTH_HEADER.split(": ")[0]: BITBUCKET_AUTH_HEADER.split(": ")[1] } response = requests.get(url, headers=basic_url_headers).json() LOGGER.debug(f"response={response}") for item in response.get('values', []): name = item['name'] if "security/snyk" in name or "iacbot" in name: continue commit_state = item['state'] ref_name = item['refname'] updated_on = item['updated_on'] LOGGER.info( f"COMMIT={commit}, COMMIT_STATE={commit_state}, REF_NAME={ref_name}, NAME={name}, UPDATED_ON={updated_on}") if commit_state == "SUCCESSFUL" and ref_name.startswith(BB_PIPELINE_BRANCH): return commit return commit def get_changes_output(module, last_successful_commit): if os.getenv("BITBUCKET_CI") == "true": _, result = run_command(f"git diff --dirstat=files,0 {last_successful_commit} | sed -E 's/^[ 0-9.]+% //g'", log_output=True, log_cmd=True, log_prefix=f"[{module}]") return result else: _, result = run_command("git diff --dirstat=files,0 HEAD~1 | sed -E 's/^[ 0-9.]+% //g'", log_output=True, log_cmd=True, log_prefix=f"[{module}]") return result def is_deploy_module(module, dir_prefix): check_bitbucket_auth_header() if os.getenv("IS_DEPLOY_ALL") == "true": return True if os.getenv("SKIP_DEPLOY"): return False if module == os.getenv("MODULE_NAME"): return True elif os.getenv("MODULE_NAME"): return False changes_output = get_changes_output(module, get_last_successful_commit(module)) LOGGER.info(f"changes_output={changes_output}") special_checks = [ ("textract-pipeline/terraform", "textract-pipeline/src"), ] for mod, pattern in special_checks: pattern_found = any(pattern in change for change in changes_output) if module == mod and pattern_found: LOGGER.info(decorate_warn(f"Marking {module} as changed based on the special pattern={pattern}")) return True if f"{dir_prefix}{module}/" in changes_output: return True return False