Implements weekly upstream rebase cadence automation: - GitLab CI scheduled pipeline (every 6 hours) - Automatic GitHub release detection - JIRA ticket creation via API - Spec file updates with changelog - Automated MR creation with OSCI Bot integration - TEST_MODE support for safe testing Scripts: - check-upstream-release.sh: Poll GitHub API for new releases - create-release-mr.sh: Main automation orchestrator - update-spec.py: Safe spec file updater - create-jira.sh: JIRA API client - test-workflow.sh: Local testing utility Documentation: - scripts/README.md: Technical documentation - AUTOMATION-SETUP.md: Step-by-step setup guide
87 lines
2.2 KiB
Python
Executable File
87 lines
2.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Update bootc.spec file with new version and changelog entry
|
|
"""
|
|
|
|
import re
|
|
import sys
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
|
|
|
|
def update_spec(spec_path: str, version: str, jira_ticket: str, author: str = None) -> None:
|
|
"""
|
|
Update spec file with new version and changelog entry.
|
|
|
|
Args:
|
|
spec_path: Path to the spec file
|
|
version: New version number (e.g., "1.5.2")
|
|
jira_ticket: JIRA ticket number (e.g., "RHEL-104567")
|
|
author: Changelog author (default: bootc-release-bot)
|
|
"""
|
|
if author is None:
|
|
author = "bootc-release-bot <bootc-release-bot@redhat.com>"
|
|
|
|
spec_file = Path(spec_path)
|
|
if not spec_file.exists():
|
|
print(f"Error: Spec file not found: {spec_path}", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
content = spec_file.read_text()
|
|
|
|
# Update Version field (preserve spacing)
|
|
content = re.sub(
|
|
r'^(Version:\s+).*',
|
|
rf'\g<1>{version}',
|
|
content,
|
|
flags=re.MULTILINE
|
|
)
|
|
|
|
# Update Release field to 1%{?dist}
|
|
content = re.sub(
|
|
r'^(Release:\s+).*',
|
|
r'\g<1>1%{?dist}',
|
|
content,
|
|
flags=re.MULTILINE
|
|
)
|
|
|
|
# Generate changelog entry
|
|
date_str = datetime.now().strftime('%a %b %d %Y')
|
|
changelog_entry = f"""* {date_str} {author} - {version}-1
|
|
- Update to {version}
|
|
- Resolves: #{jira_ticket}
|
|
|
|
"""
|
|
|
|
# Insert after %changelog line
|
|
content = re.sub(
|
|
r'(%changelog\n)',
|
|
rf'\1{changelog_entry}',
|
|
content
|
|
)
|
|
|
|
# Write back
|
|
spec_file.write_text(content)
|
|
print(f"Updated {spec_path}:")
|
|
print(f" Version: {version}")
|
|
print(f" Release: 1%{{?dist}}")
|
|
print(f" JIRA: {jira_ticket}")
|
|
|
|
|
|
def main():
|
|
if len(sys.argv) < 4:
|
|
print(f"Usage: {sys.argv[0]} <spec_file> <version> <jira_ticket> [author]", file=sys.stderr)
|
|
print(f"Example: {sys.argv[0]} bootc.spec 1.5.2 RHEL-104567", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
spec_path = sys.argv[1]
|
|
version = sys.argv[2]
|
|
jira_ticket = sys.argv[3]
|
|
author = sys.argv[4] if len(sys.argv) > 4 else None
|
|
|
|
update_spec(spec_path, version, jira_ticket, author)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|