agama/devel/branch2obs.sh
Martin Vidner c6bcfeea9d fix: branch2obs.sh: run workflows even if local repo has multiple remotes
add an explicit -R/--repo option to gh, like the other invocations do,
otherwise it fails with:
> Starting GitHub Action obs-staging-live.yml...
> X No default remote repository has been set. To learn more about the default repository, run: gh repo set-default --help
> please run `gh repo set-default` to select a default remote repository.
2026-04-20 14:06:56 +02:00

251 lines
8.3 KiB
Bash
Executable file

#! /usr/bin/bash
# This script configures autosubmission from a GitHub branch to an OBS project.
# Works with the original project and with forks as well.
usage () {
echo "Usage: $0 [options]"
echo
echo "Options:"
echo " -a - keep all original build archs (default: build only x86_64)"
echo " -b <branch|tag> - source git branch or tag (default: current git branch)"
echo " -p <project> - target OBS project (based on the git branch)"
echo " -t - keep all original build targets (default: disable Leap 16.0)"
echo " -c - cleanup (delete) all obsolete projects, exclusive option,"
echo " all other options are ignored"
echo " -o - print obsolete projects, similar to -c but only print"
echo " the projects instead of deleting them"
echo " -h - print this help"
}
# process command line arguments
while getopts ":ab:chop:t" opt; do
case ${opt} in
a)
ALL_ARCHS=true
;;
b)
branch="${OPTARG}"
;;
c)
CLEANUP=true
;;
o)
OBSOLETE=true
;;
p)
PROJECT="${OPTARG}"
;;
t)
ALL_TARGETS=true
;;
h)
usage
exit 0
;;
:)
echo "ERROR: Missing argument for option -${OPTARG}"
echo
usage
exit 1
;;
?)
echo "ERROR: Invalid option -${OPTARG}"
echo
usage
exit 1
;;
esac
done
# check if all needed tools are installed
tools=(git gh jq osc)
for tool in "${tools[@]}"; do
if ! command -v "$tool" >/dev/null 2>&1; then
echo "Tool \"$tool\" is not installed, please run \"sudo zypper install $tool\""
exit 1
fi
done
# check if osc is authenticated
osc_user=$(osc user | sed "s/^\([^:]*\):.*$/\\1/")
if [ -z "$osc_user" ]; then
echo "ERROR: Cannot read the osc user, please configure osc"
exit 1
fi
# check if gh is authenticated
if ! gh auth status --active > /dev/null 2>&1; then
echo "ERROR: Not logged into a GitHub account"
echo "Run \"gh auth login\" to log into your GitHub account"
exit 1
fi
repo_slug=$(gh repo view --json nameWithOwner -q ".nameWithOwner")
if [ -n "$CLEANUP" ] || [ -n "$OBSOLETE" ]; then
if [ "$repo_slug" = "agama-project/agama" ]; then
# the upstream repository
prefix="systemsmanagement:Agama:branches"
else
# a fork
prefix="home:${osc_user}:Agama:branches"
fi
echo "Scanning obsolete projects..."
# find the matching projects
mapfile -t obs_projects < <(osc search --substring --project "$prefix" | grep "$prefix" | grep -v "^matches for")
# count the obsolete projects for the final summary
counter=0
for project in "${obs_projects[@]}"; do
# remove the prefix to get the related Git branch
branch_name=$(echo -n "$project" | sed -e "s/^$prefix://")
if ! git ls-remote --exit-code --heads origin "$branch_name" > /dev/null; then
if [ -n "$CLEANUP" ]; then
echo "Deleting obsolete project $project..."
# recursive remote delete (allows deleting a non-empty project)
osc rdelete --recursive --force --message "Deleting obsolete project" "$project"
config=$(gh -R "$repo_slug" variable get OBS_PROJECTS 2> /dev/null)
if [ -n "$config" ]; then
# remove the mapping for the deleted project
echo "$config" | jq "del(.[\"$branch_name\"])" | gh -R "$repo_slug" variable set OBS_PROJECTS
fi
else
echo "Found obsolete project: $project"
fi
((counter++))
fi
done
# print a summary
echo "Found $counter obsolete projects"
# cleanup and check are exclusive options, finish the script
exit 0
fi
# git branch from the command line or the current git branch
BRANCH=${branch-$(git rev-parse --abbrev-ref HEAD)}
echo "Git branch: $BRANCH"
# is this repository a GitHub fork?
if [ "$repo_slug" = "agama-project/agama" ]; then
if [ -z "$PROJECT" ]; then
if [ "$BRANCH" = "master" ]; then
PROJECT="systemsmanagement:Agama:Devel"
else
PROJECT="systemsmanagement:Agama:branches:${BRANCH}"
fi
fi
else
echo "GitHub fork detected"
# check if OBS_USER and OBS_PASSWORD are defined in a fork
gh_obs_user=$(gh -R "$repo_slug" variable get OBS_USER 2> /dev/null)
if [ -z "$gh_obs_user" ]; then
echo "ERROR: OBS_USER variable is not defined in the GitHub configuration"
echo "Run this command to configure your OBS user name:"
echo " gh -R \"$repo_slug\" variable set OBS_USER --body \"$osc_user\""
exit 1
fi
if ! gh -R "$repo_slug" secret list 2> /dev/null | grep -q OBS_PASSWORD; then
echo "ERROR: OBS password is not defined in the GitHub configuration"
echo "Run this command to configure your OBS password:"
echo " gh -R \"$repo_slug\" secret set OBS_PASSWORD"
exit 1
fi
if [ -z "$PROJECT" ]; then
PROJECT="home:${osc_user}:Agama:branches:${BRANCH}"
fi
fi
echo "OBS project: $PROJECT"
echo
# check if the project already exists
if osc ls "$PROJECT" > /dev/null 2>&1; then
echo "Project $PROJECT already exists, not branching"
else
echo "Creating project $PROJECT..."
# packages to branch
packages=(agama agama-installer agama-auto agama-products agama-web-ui rubygem-agama-yast)
for pkg in "${packages[@]}"; do
echo "Branching package $pkg"
# branch the package
osc branch --nodevelproject systemsmanagement:Agama:Devel "$pkg" "$PROJECT" > /dev/null
# detach branch so the package is not updated when the original package changes,
# this also avoids possible conflicts
osc detachbranch "$PROJECT" "$pkg"
done
# disable building on aarch64, ppc64le, i586 and s390x, usually not needed
if [ "$ALL_ARCHS" != true ]; then
echo "Disabling build on aarch64, i586, ppc64le and s390x"
osc meta prj "$PROJECT" | \
sed "/<arch>aarch64<\/arch>/d;/<arch>i586<\/arch>/d;/<arch>ppc64le<\/arch>/d;/<arch>s390x<\/arch>/d;" | \
osc meta prj -F - "$PROJECT"
fi
# disable Leap 16.0 target
if [ "$ALL_TARGETS" != true ]; then
echo "Disabling openSUSE Leap 16.0 build target"
osc meta prj "$PROJECT" | \
sed 's#</description>#</description><build><disable repository="openSUSE_Leap_16.0"/><disable repository="images_Leap_16.0"/></build>##' | \
osc meta prj -F - "$PROJECT"
fi
# disable building the agama-installer-Leap image for Tumbleweed, that does not work
osc meta pkg "$PROJECT" agama-installer-Leap | \
sed 's#</package>#<build><disable repository="images"/></build></package>##' | \
osc meta pkg -F - "$PROJECT" agama-installer-Leap
# enable publishing of the built packages and images (delete the disabled publish section)
echo "Enable publishing of the build results"
osc meta prj "$PROJECT" | sed "/^\s*<publish>\s*$/,/^\s*<\/publish>\s*$/d" | \
osc meta prj -F - "$PROJECT"
echo "Set project description"
url=$(gh repo view --json url --jq .url)
osc meta prj "$PROJECT" |
sed -e "s#<url>.*</url>#<url>$url/tree/$BRANCH</url>#" \
-e "s#<title>.*</title>#<title>Agama from Git</title>#" \
-e "s#<description>.*</description>#<description>This project contains the latest packages built from repository $repo_slug, branch \"$BRANCH\".</description>#" | \
osc meta prj -F - "$PROJECT"
fi
# configure OBS_PROJECTS GitHub variable
projects=$(gh -R "$repo_slug" variable get OBS_PROJECTS 2> /dev/null)
if [ -z "$projects" ]; then
# fallback to empty JSON if not defined yet
projects="{}"
fi
# insert the mapping for the new branch
echo "$projects" | jq ". += { \"$BRANCH\" : \"$PROJECT\" } " | gh -R "$repo_slug" variable set OBS_PROJECTS
# to really synchronize the GitHub content with OBS trigger the autosubmission jobs if the remote
# brach already exists or print the instructions for later
workflows=(obs-staging-live.yml obs-staging-products.yml obs-staging-rust.yml obs-staging-service.yml obs-staging-web.yml)
if git ls-remote --exit-code --heads origin "$BRANCH" > /dev/null; then
for workflow in "${workflows[@]}"; do
echo "Starting GitHub Action $workflow..."
gh -R "$repo_slug" workflow run "$workflow" --ref "$BRANCH"
done
else
echo "After creating the remote branch trigger the submission actions on the web"
echo "or run these commands:"
echo
for workflow in "${workflows[@]}"; do
echo " gh -R \"$repo_slug\" workflow run \"$workflow\" --ref \"$BRANCH\""
done
fi
echo
echo "Git branch \"$BRANCH\" is now automatically submitted to OBS project \"$PROJECT\""