Files
scripts/python/deployments_graph.py
Dobromir Popov bb9fa824cc script improved
2024-07-16 14:27:05 +03:00

96 lines
3.5 KiB
Python

import yaml
import re
# Load the YAML content from the file
with open('appveyor.yml', 'r') as file:
appveyor_yml = file.read()
# Parsing the YAML content
config = yaml.safe_load(appveyor_yml)
# Extract branches and configurations from the YAML
branches = {}
deployments = {}
inactive_branches = []
inactive_configs = {}
# Extract specific branch configurations
if 'for' in config:
for branch_config in config['for']:
branch_names = branch_config.get('branches', {}).get('only', [])
configurations = branch_config.get('configuration', [])
for branch in branch_names:
if branch not in branches:
branches[branch] = []
branches[branch].extend(configurations)
# Manually add common branches and configurations if not already included
if 'branches' in config:
common_branches = config['branches'].get('only', [])
for branch in common_branches:
if branch not in branches:
branches[branch] = config.get('configuration', [])
# Check for inactive branches and configurations in the comments
lines = appveyor_yml.splitlines()
for i, line in enumerate(lines):
if re.match(r'#\s*-\s*(\w+)', line):
inactive_configs.setdefault(lines[i-1].strip().split()[1], []).append(re.findall(r'#\s*-\s*(\w+)', line)[0].replace('-', '_'))
if line.strip().startswith('#') and i + 2 < len(lines) and 'branches:' in lines[i + 1] and 'only:' in lines[i + 2]:
inactive_branches.append(lines[i + 2].split(':')[1].strip().replace('-', '_'))
# Extract deployment configurations
if 'deploy' in config:
deployments['common'] = config['deploy']
if 'for' in config:
for branch_config in config['for']:
branch_names = branch_config.get('branches', {}).get('only', [])
if 'deploy' in branch_config:
for branch in branch_names:
if branch not in deployments:
deployments[branch] = []
deployments[branch].extend(branch_config['deploy'])
# Generate the Mermaid graph content
mermaid_graph = """
graph TD
A[Common Configuration]
"""
# Add branches to the graph
for branch in branches.keys():
branch_id = branch.replace('-', '_')
mermaid_graph += f" A --> {branch_id}\n"
# Add configurations to the branches
for branch, configs in branches.items():
branch_id = branch.replace('-', '_')
for idx, config in enumerate(configs):
config_id = f"{branch_id}{idx+1}"
mermaid_graph += f" {branch_id} --> {config_id}[{config}]\n"
# Add deployments to the configurations
for deploy in deployments.get(branch, []):
configuration = deploy.get('configuration')
if configuration == config:
service = deploy.get('service', '')
mermaid_graph += f" {config_id} --> {service_id}[{deploy.get('on', {}).get('configuration', '')} on {branch}]\n"
# Highlight inactive branches and configurations with a dotted style
for branch in inactive_branches:
mermaid_graph += f" style {branch} fill:#f96,stroke:#333,stroke-width:2px,stroke-dasharray: 5, 5\n"
for branch, configs in inactive_configs.items():
branch_id = branch.replace('-', '_')
for config in configs:
config_id = f"{branch_id}_{config}"
mermaid_graph += f" style {config_id} fill:#bbf,stroke:#333,stroke-width:2px,stroke-dasharray: 5,5\n"
# Add styles to the graph
mermaid_graph += """
style A fill:#f9f,stroke:#333,stroke-width:2px
"""
# Output the graph
print(mermaid_graph)