bootc/scripts
gursewak1997 f8bd4576cf Add automated release pipeline for CentOS Stream
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
2026-07-06 16:42:32 -07:00
..
check-upstream-release.sh Add automated release pipeline for CentOS Stream 2026-07-06 16:42:32 -07:00
create-jira.sh Add automated release pipeline for CentOS Stream 2026-07-06 16:42:32 -07:00
create-release-mr.sh Add automated release pipeline for CentOS Stream 2026-07-06 16:42:32 -07:00
README.md Add automated release pipeline for CentOS Stream 2026-07-06 16:42:32 -07:00
test-workflow.sh Add automated release pipeline for CentOS Stream 2026-07-06 16:42:32 -07:00
update-spec.py Add automated release pipeline for CentOS Stream 2026-07-06 16:42:32 -07:00

bootc CentOS Stream Release Automation

This directory contains scripts for automating bootc releases to CentOS Stream.

Overview

The automation runs as a GitLab CI scheduled pipeline (every 6 hours) that:

  1. Checks GitHub for new bootc releases
  2. Creates a JIRA ticket for tracking
  3. Downloads tarballs from GitHub
  4. Updates the spec file and sources
  5. Creates a GitLab Merge Request
  6. OSCI Bot handles CI checks and auto-merges if all tests pass

Architecture

┌─────────────────────────────────────────────┐
│ GitLab Scheduled Pipeline (every 6 hours)  │
└──────────────┬──────────────────────────────┘
               │
               ▼
┌─────────────────────────────────────────────┐
│ check_new_release job                       │
│ → scripts/check-upstream-release.sh         │
│ → Compares GitHub latest vs spec version   │
│ → Outputs: release.env                      │
└──────────────┬──────────────────────────────┘
               │ if NEW_RELEASE=true
               ▼
┌─────────────────────────────────────────────┐
│ create_release_mr job                       │
│ → scripts/create-release-mr.sh              │
│   ├─ Download tarballs from GitHub         │
│   ├─ Create JIRA (scripts/create-jira.sh)  │
│   ├─ Upload sources via centpkg            │
│   ├─ Update spec (scripts/update-spec.py)  │
│   ├─ Commit and push branch                │
│   └─ Create GitLab MR via API              │
└──────────────┬──────────────────────────────┘
               │
               ▼
┌─────────────────────────────────────────────┐
│ OSCI Bot Workflow (automatic)               │
│ → Runs required checks                      │
│ → Auto-approves if tests pass               │
│ → Auto-merges with Red Hat approval         │
└─────────────────────────────────────────────┘

Scripts

check-upstream-release.sh

Polls the GitHub API for the latest bootc release and compares it with the current spec file version.

Usage:

./scripts/check-upstream-release.sh

Output: Creates release.env with:

  • NEW_RELEASE (true/false)
  • VERSION (e.g., "1.5.2")
  • RELEASE_TAG (e.g., "v1.5.2")
  • CURRENT_VERSION (current spec version)

create-release-mr.sh

Main automation script that orchestrates the entire release process.

Prerequisites:

  • release.env must exist (created by check-upstream-release.sh)
  • Environment variables configured (see below)
  • centpkg installed and configured
  • Git credentials set up

What it does:

  1. Downloads tarballs from GitHub releases
  2. Creates JIRA ticket via API
  3. Creates working branch (rebase-X.Y.Z)
  4. Uploads sources to CentOS lookaside cache
  5. Updates spec file (Version, Release, changelog)
  6. Commits and pushes changes
  7. Creates GitLab MR with assignee

Usage:

# Normally run by GitLab CI, but can be run manually:
export VERSION=1.5.2
export RELEASE_TAG=v1.5.2
./scripts/create-release-mr.sh

update-spec.py

Python helper to safely update the spec file.

Usage:

./scripts/update-spec.py <spec_file> <version> <jira_ticket> [author]

Example:

./scripts/update-spec.py bootc.spec 1.5.2 RHEL-104567

What it does:

  • Updates Version: field
  • Resets Release: to 1%{?dist}
  • Adds properly formatted changelog entry
  • Preserves spec file formatting

create-jira.sh

Creates a JIRA issue for the release via REST API.

Usage:

export JIRA_API_TOKEN="your-token-here"
./scripts/create-jira.sh <version> [upstream_url]

Example:

./scripts/create-jira.sh 1.5.2
# Outputs: RHEL-104567

Returns: JIRA ticket key (e.g., RHEL-104567) on stdout

GitLab CI/CD Variables

Configure these in Settings → CI/CD → Variables:

Variable Description Type
JIRA_API_TOKEN JIRA API token for bootc-release-bot Masked
GITLAB_API_TOKEN GitLab API token (scope: api, write_repository) Masked
CENTOS_SSH_PRIVATE_KEY SSH private key for centpkg lookaside uploads File, Masked
BOT_EMAIL bootc-release-bot@redhat.com Variable
ASSIGNEE_USER_ID GitLab user ID for MR assignee (e.g., 1234567) Variable

GitLab Schedule Setup

  1. Go to Settings → CI/CD → Schedules
  2. Click New schedule
  3. Configure:
    • Description: "Check for new bootc releases"
    • Interval: Custom → 0 */6 * * * (every 6 hours)
    • Target branch: c10s
    • Active: Yes

Manual Testing

Test the release checker

./scripts/check-upstream-release.sh
cat release.env

Test spec file update

./scripts/update-spec.py bootc.spec 1.5.2 RHEL-TEST-001 "Your Name <your@email.com>"
git diff bootc.spec
git restore bootc.spec  # Undo changes

Test JIRA creation (requires API token)

export JIRA_API_TOKEN="your-token"
./scripts/create-jira.sh 1.5.2

Trigger pipeline manually

  1. Go to CI/CD → Pipelines
  2. Click Run pipeline
  3. Select branch: c10s
  4. Add variable: CI_PIPELINE_SOURCE = web
  5. Click Run pipeline

Troubleshooting

Pipeline fails at check_new_release

  • Verify GitHub API is accessible: curl -s https://api.github.com/repos/containers/bootc/releases/latest | jq .tag_name
  • Check spec file exists and is parseable: rpmspec -q --queryformat='%{version}\n' bootc.spec

Pipeline fails at create_release_mr

  • JIRA creation fails: Check JIRA_API_TOKEN is valid and bot has permissions
    • The automation continues with placeholder RHEL-XXXXX if JIRA fails
  • centpkg upload fails: Check CENTOS_SSH_PRIVATE_KEY is configured correctly
  • Git push fails: Verify bot has Developer role on the GitLab project
  • MR creation fails: Check GITLAB_API_TOKEN has api and write_repository scopes

MR created but not auto-merging

  • Check OSCI Bot comments on the MR for test failures
  • Ensure another Red Hatter approves the MR (required for auto-merge)
  • Review failed tests and fix issues

No new releases detected

Bot Account Setup

The automation uses bootc-release-bot account:

GitLab:

  • Developer role on gitlab.com/redhat/centos-stream/rpms/bootc
  • API token with api and write_repository scopes
  • SSH key for centpkg uploads

JIRA:

  • Account with issue creation permissions in RHEL project
  • API token configured in GitLab CI/CD variables

Git config:

git config user.name "bootc-release-bot"
git config user.email "bootc-release-bot@redhat.com"

Weekly Cadence

With the 6-hour scheduled pipeline, new releases are detected within:

  • Best case: <6 hours after upstream release
  • Average: 3 hours after upstream release
  • Worst case: ~6 hours after upstream release

This ensures the weekly cadence is maintained with minimal manual intervention.

Success Metrics

  • Zero missed upstream releases
  • MRs created within 6 hours of upstream release
  • Auto-merge rate >90% (indicates healthy CI)
  • Manual intervention required <10% of releases

Support

For issues or questions:

  • Check GitLab pipeline logs for detailed error messages
  • Review OSCI Bot comments on MRs for test failures
  • Contact the bootc team for bot account or permission issues