[3.2] Backport workflows for prjconf and meta and fixes for tar_scm #78

Merged
nbelouin merged 4 commits from nbelouin/Factory:backport-workflows into 3.2 2025-02-25 15:34:58 +01:00
33 changed files with 556 additions and 319 deletions

View File

@ -0,0 +1,62 @@
name: Build PR in OBS
on:
pull_request_target:
types:
- opened
- reopened
- synchronize
- closed
branches-ignore:
- "devel"
concurrency:
group: ${{ gitea.workflow }}-${{ gitea.ref }}
cancel-in-progress: true
jobs:
sync-pr-project:
name: "Build PR in OBS"
runs-on: tumbleweed
steps:
- name: Setup OSC
run: |
zypper in -y python3-jinja2
mkdir -p ~/.config/osc
cat >~/.config/osc/oscrc <<'EOF'
[general]
apiurl = https://api.opensuse.org
[https://api.opensuse.org]
user=${{ vars.OBS_USERNAME }}
pass=${{ secrets.OBS_PASSWORD }}
EOF
# Waiting on PR to get merged for support in upstream action/checkout action
- uses: 'https://github.com/yangskyboxlabs/action-checkout@sha256'
name: Checkout repository
with:
object-format: 'sha256'
- name: "[if PR is closed] Delete project in OBS"
run: |
if [ "${{ gitea.event.action }}" = "closed" ]; then
PROJECT="$(grep PROJECT .obs/common.py | sed 's/PROJECT = "\(.*\)"/\1/')"
osc rdelete -f -r -m "PR closed" "${PROJECT}:Staging:PR-${{ gitea.event.number }}"
fi
- name: "Setup PR project in OBS"
env:
SCM_URL: ${{ gitea.event.pull_request.head.repo.clone_url }}#${{ gitea.head_ref }}
run: |
if [ "${{ gitea.event.action }}" != "closed" ]; then
PROJECT="$(grep PROJECT .obs/common.py | sed 's/PROJECT = "\(.*\)"/\1/')"
python3 .obs/render_meta.py --pr ${{ gitea.event.number }} --scm-url "${SCM_URL}" | osc meta prj "${PROJECT}:Staging:PR-${{ gitea.event.number }}" -F -
echo "Project created ${PROJECT}:Staging:PR-${{ gitea.event.number }}"
echo "Follow build at: https://build.opensuse.org/project/monitor/${PROJECT}:Staging:PR-${{ gitea.event.number }}"
fi
- env:
GIT_SHA: ${{ gitea.event.pull_request.head.sha }}
name: "Wait for OBS to build the project"
run: |
if [ "${{ gitea.event.action }}" != "closed" ]; then
PROJECT="$(grep PROJECT .obs/common.py | sed 's/PROJECT = "\(.*\)"/\1/')"
export OBS_PROJECT="${PROJECT}:Staging:PR-${{ gitea.event.number }}"
python3 .obs/wait_obs.py
fi

View File

@ -0,0 +1,35 @@
name: Synchronize Project Config
on:
push:
branches-ignore:
- "devel"
paths:
- "_config"
- ".gitea/workflows/sync_config.yaml"
jobs:
sync-prjconf:
name: "Update prjconf in OBS"
runs-on: tumbleweed
steps:
- name: Setup OSC
run: |
mkdir -p ~/.config/osc
cat >~/.config/osc/oscrc <<'EOF'
[general]
apiurl = https://api.opensuse.org
[https://api.opensuse.org]
user=${{ vars.OBS_USERNAME }}
pass=${{ secrets.OBS_PASSWORD }}
EOF
# Waiting on PR to get merged for support in upstream action/checkout action
- uses: 'https://github.com/yangskyboxlabs/action-checkout@sha256'
name: Checkout repository
with:
object-format: 'sha256'
- run: |
PROJECT="$(grep PROJECT .obs/common.py | sed 's/PROJECT = "\(.*\)"/\1/')"
if [ "$(osc meta prjconf "${PROJECT}" | sha256sum)" != "$(cat _config | sha256sum)" ] ; then
osc meta prjconf "${PROJECT}" -F _config
fi

View File

@ -0,0 +1,45 @@
name: Synchronize Project Metadata
on:
push:
branches-ignore:
- "devel"
paths:
- "*" # Will trigger on new directories and changes to files in root of repository
- ".gitea/workflows/sync_meta.yaml"
- ".obs/common.py"
jobs:
sync-prj-meta:
runs-on: tumbleweed
steps:
- name: Setup OSC
run: |
zypper in -y python3-jinja2
mkdir -p ~/.config/osc
cat >~/.config/osc/oscrc <<'EOF'
[general]
apiurl = https://api.opensuse.org
[https://api.opensuse.org]
user=${{ vars.OBS_USERNAME }}
pass=${{ secrets.OBS_PASSWORD }}
EOF
# Waiting on PR to get merged for support in upstream action/checkout action
- uses: 'https://github.com/yangskyboxlabs/action-checkout@sha256'
name: Checkout repository
with:
object-format: 'sha256'
- name: "Update or create OBS Project"
run: |
PROJECT="$(grep PROJECT .obs/common.py | sed 's/PROJECT = "\(.*\)"/\1/')"
set -o pipefail
if meta="$(osc meta prj "${PROJECT}" 2>/dev/null | sha256sum)"; then
new_meta="$(python3 .obs/render_meta.py)"
if [ "${meta}" != "$(echo "${new_meta}" | sha256sum)" ]; then
echo "${new_meta}" | osc meta prj "${PROJECT}" -F -
fi
python3 .obs/sync_packages.py
else
# Create the projects
bash .obs/create_projects.sh
fi

View File

@ -1,5 +1,4 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import yaml
import subprocess import subprocess
import argparse import argparse
import os import os
@ -7,30 +6,6 @@ import os.path
from common import PROJECT, REPOSITORY, BRANCH from common import PROJECT, REPOSITORY, BRANCH
def add_package_to_workflow(name: str):
modified = False
with open(".obs/workflows.yml", "r") as wf_file:
workflows = yaml.safe_load(wf_file)
if not any(
x
for x in workflows["staging_build"]["steps"]
if x["branch_package"]["source_package"] == name
):
workflows["staging_build"]["steps"].append(
{
"branch_package": {
"source_project": PROJECT,
"target_project": f"{PROJECT}:Staging",
"source_package": name,
}
}
)
modified = True
if modified:
with open(".obs/workflows.yml", "w") as wf_file:
yaml.dump(workflows, wf_file)
def add_package_to_project(name: str): def add_package_to_project(name: str):
package_meta = f"""<package name="{name}" project="{PROJECT}"> package_meta = f"""<package name="{name}" project="{PROJECT}">
<title/> <title/>
@ -53,7 +28,6 @@ def add_package(package_name: str):
os.exit(1) os.exit(1)
add_package_to_project(package_name) add_package_to_project(package_name)
add_package_to_workflow(package_name)
def main(): def main():
@ -65,7 +39,7 @@ def main():
add_package(args.package) add_package(args.package)
print("Package created in OBS, you can now push the modified workflow file") print("Package created in OBS !")
if __name__ == '__main__': if __name__ == '__main__':

37
.obs/create_projects.sh Normal file
View File

@ -0,0 +1,37 @@
#!/bin/bash
show_help() {
echo "Usage: $(basename $0) [--internal]"
echo "options:"
echo "-h, --help display this help and exit"
echo "-i, --internal create project as internal"
exit 0
}
while [[ "$#" -gt 0 ]]; do
case $1 in
-h|--help) show_help;;
-i|--internal) internal="--internal" ;;
*) echo "Unknown parameter passed: $1";show_help ;;
esac
shift
done
PROJECT="$(grep PROJECT .obs/common.py | sed 's/PROJECT = "\(.*\)"/\1/')"
EXTRA_OSC_ARGS=""
if [ -n "$internal" ]; then
PROJECT="ISV${PROJECT:3}"
EXTRA_OSC_ARGS="-A https://api.suse.de"
python3 .obs/render_meta.py ${internal} Snapshot | osc ${EXTRA_OSC_ARGS} meta prj "${PROJECT}:Snapshot" -F -
osc ${EXTRA_OSC_ARGS} meta prjconf "${PROJECT}:Snapshot" -F _config
fi
python3 .obs/render_meta.py ${internal} ToTest | osc ${EXTRA_OSC_ARGS} meta prj "${PROJECT}:ToTest" -F -
python3 .obs/render_meta.py ${internal} | osc ${EXTRA_OSC_ARGS} meta prj "${PROJECT}" -F -
osc ${EXTRA_OSC_ARGS} meta prjconf "${PROJECT}:ToTest" -F _config
osc ${EXTRA_OSC_ARGS} meta prjconf "${PROJECT}" -F _config
if [ -z "$internal" ]; then
python3 .obs/sync_packages.py
fi

View File

@ -1,5 +1,4 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import yaml
import subprocess import subprocess
import argparse import argparse
import os import os
@ -8,18 +7,6 @@ import os.path
from common import PROJECT from common import PROJECT
def delete_package_from_workflow(name: str):
with open(".obs/workflows.yml", "r") as wf_file:
workflows = yaml.safe_load(wf_file)
workflows["staging_build"]["steps"] = [
x
for x in workflows["staging_build"]["steps"]
if x["branch_package"]["source_package"] != name
]
with open(".obs/workflows.yml", "w") as wf_file:
yaml.dump(workflows, wf_file)
def delete_package_from_project(name: str): def delete_package_from_project(name: str):
p = subprocess.run(["osc", "rdelete", PROJECT, name, "-m \"Deleted via delete_package.py\"" ], stdout=subprocess.PIPE) p = subprocess.run(["osc", "rdelete", PROJECT, name, "-m \"Deleted via delete_package.py\"" ], stdout=subprocess.PIPE)
print(p.stdout) print(p.stdout)
@ -33,7 +20,6 @@ def delete_package(package_name: str):
os.exit(1) os.exit(1)
delete_package_from_project(package_name) delete_package_from_project(package_name)
delete_package_from_workflow(package_name)
def main(): def main():

62
.obs/render_meta.py Normal file
View File

@ -0,0 +1,62 @@
import argparse
from jinja2 import Template
from common import PROJECT
def render(base_project, subproject, internal, scm_url=None):
version = base_project.rsplit(':', 1)[-1]
context = {
"base_project": subproject == "",
"title": f"SUSE Edge {version} {subproject}".rstrip(),
}
if subproject == "ToTest":
context["project"] = f"{base_project}:ToTest"
context["description"] = (
f"This project doesn't build, it stores a snapshot of SUSE Edge {version} "
"project currently going through the automated test layer"
)
if "Factory" in base_project or internal:
context["release_project"] = f"{base_project}:Snapshot"
elif subproject == "Snapshot":
context["project"] = f"{base_project}:Snapshot"
context["release_project"] = f"{base_project.rsplit(':', 1)[0]}:Containers"
context["for_release"] = True
context["description"] = (
f"This project doesn't build, it stores a snapshot of SUSE Edge {version} "
"project that passed automated test layer"
)
elif subproject == "":
context["project"] = base_project
context["release_project"] = f"{base_project}:ToTest"
else: # PR case direct python call
context["base_project"] = True
context["project"] = f"{base_project}:{subproject}"
if scm_url is not None:
context["scm_url"] = scm_url
with open("_meta") as meta:
template = Template(meta.read())
return template.render(context)
def main():
parser = argparse.ArgumentParser(
prog='ProgramName',
description='What the program does',
epilog='Text at the bottom of help')
parser.add_argument("subproject", default="", choices=["", "ToTest", "Snapshot"], nargs="?")
parser.add_argument("--internal", action="store_true")
parser.add_argument("--pr")
parser.add_argument("--scm-url")
args = parser.parse_args()
base_project = PROJECT.replace("isv", "ISV", 1) if args.internal else PROJECT
print(render(
base_project=base_project,
subproject=args.subproject if args.pr is None else f"Staging:PR-{args.pr}",
internal=args.internal,
scm_url=args.scm_url,
))
if __name__ == "__main__":
main()

View File

@ -9,7 +9,7 @@ from common import PROJECT
def get_obs_packages() -> Set[str]: def get_obs_packages() -> Set[str]:
packages = subprocess.run(["osc", "ls", PROJECT], encoding='utf-8' , capture_output=True) packages = subprocess.run(["osc", "ls", PROJECT], encoding='utf-8' , capture_output=True)
return set(packages.stdout.splitlines()) return { p for p in packages.stdout.splitlines() if ":" not in p }
def get_local_packages() -> Set[str]: def get_local_packages() -> Set[str]:
p = pathlib.Path('.') p = pathlib.Path('.')

83
.obs/wait_obs.py Normal file
View File

@ -0,0 +1,83 @@
import xml.etree.ElementTree as ET
import subprocess
import time
import os
import sys
from collections import Counter
def get_buildstatus(project: str) -> ET.Element:
for _ in range(5):
try:
output = subprocess.check_output(["osc", "pr", "--xml", project])
return ET.fromstring(output)
except subprocess.CalledProcessError:
continue
print("Failed to get buildstatus from OBS")
def do_wait(project:str, commit:str) -> ET.Element:
last_state = None
while True:
time.sleep(5)
status = get_buildstatus(project)
if last_state == status.get("state"):
continue
else:
last_state = status.get("state")
scminfo = { e.text for e in status.findall(".//scminfo") }
if len(scminfo) != 1 or scminfo.pop() != commit:
print("Waiting for OBS to sync with SCM")
continue
if not all([ e.get('state') == "published" and e.get('dirty') is None for e in status.findall("./result")]):
print("Waiting for OBS to finish building")
continue
return status
def print_results(status: ET.Element) -> bool:
results = {}
failed = []
for e in status.findall("./result"):
repo = results.get(e.get("repository"), {})
repo[e.get("arch")] = e
results[e.get("repository")] = repo
for repo in results.keys():
print(f"{repo}:")
depth=1
for arch in results[repo].keys():
counts = Counter()
if repo != "charts":
print(f"\t{arch}:")
depth=2
for package in results[repo][arch].findall("./status"):
if package.get("code") in ["excluded", "disabled"]:
continue
if package.get("code") in ["failed", "unresolvable", "broken"]:
details = package.findtext("details")
if details:
failed.append(f"{package.get('package')} ({arch}): {details}")
else:
failed.append(f"{package.get('package')} ({arch})")
counts[package.get("code")] += 1
for (code, count) in counts.items():
print("\t"*depth, f"{code}: {count}")
failed.sort()
if failed:
print("\nPackages failing: ")
for fail in failed:
print("\t", fail)
return len(failed)
def main():
project = os.environ.get("OBS_PROJECT")
sha = os.environ.get("GIT_SHA")
print(f"Waiting for OBS to build {project} for commit {sha}")
status = do_wait(project, sha)
sys.exit(print_results(status))
if __name__ == "__main__":
main()

View File

@ -1,216 +0,0 @@
staging_build:
filters:
event: pull_request
steps:
- branch_package:
source_package: endpoint-copier-operator
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: endpoint-copier-operator-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: endpoint-copier-operator-chart
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: akri
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: akri-agent-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: akri-chart
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: akri-controller-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: akri-dashboard-extension-chart
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: akri-debug-echo-discovery-handler-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: akri-onvif-discovery-handler-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: akri-opcua-discovery-handler-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: akri-udev-discovery-handler-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: akri-webhook-configuration-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: obs-service-set_version
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: cosign
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: frr-k8s
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: kubectl
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: upgrade-controller
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: nm-configurator
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: kube-rbac-proxy
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: edge-image-builder
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: metallb
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: hauler
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: baremetal-operator
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: cdi-chart
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: metallb-chart
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: sriov-crd-chart
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: upgrade-controller-chart
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: edge-image-builder-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: ironic-ipa-downloader-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: upgrade-controller-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: metal3-chart
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: baremetal-operator-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: sriov-network-operator-chart
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: metallb-controller-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: metallb-speaker-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: ironic-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: cri-tools
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: crudini
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: fakeroot
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: ipcalc
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: autoconf
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: rancher-turtles-airgap-resources-chart
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: rancher-turtles-chart
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: kube-rbac-proxy-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: ironic-ipa-ramdisk
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: kubevirt-dashboard-extension-chart
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: kiwi-builder-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: kubevirt-chart
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: release-manifest-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: frr-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: kubectl-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging
- branch_package:
source_package: frr-k8s-image
source_project: isv:SUSE:Edge:3.2
target_project: isv:SUSE:Edge:3.2:Staging

View File

@ -5,15 +5,6 @@ Contains the definition of the packages built on OBS for the SUSE Edge Solution
This repository is linked to an OBS project: <https://build.opensuse.org/project/show/isv:SUSE:Edge:Factory> This repository is linked to an OBS project: <https://build.opensuse.org/project/show/isv:SUSE:Edge:Factory>
Every directory in this repository represents a package in that OBS project, those should be synced automatically from this repository. Every directory in this repository represents a package in that OBS project, those should be synced automatically from this repository.
## Adding a package
To add a package, first create a directory with your package as you intend it in OBS.
Then run the `.obs/add_package.py` script to create the package in the OBS project and add the required elements to the synchronization workflow.
This script is using the `osc` command behind the scenes, so ensure you have it installed and correctly configured, as well as you have the correct permissions to create a new package in the project.
You will then get asked to push your changes.
## Testing a fork or a development branch ## Testing a fork or a development branch
You can create a project in your home space in OBS, use the same prjconf as the one of "isv:SUSE:Edge:Factory", and copy the repositories part of the metadata (adjust self references). You can create a project in your home space in OBS, use the same prjconf as the one of "isv:SUSE:Edge:Factory", and copy the repositories part of the metadata (adjust self references).
@ -23,16 +14,14 @@ Then add a scmsync stanza to your metadata like this (adjust repository path and
<scmsync>https://src.opensuse.org/suse-edge/Factory#main</scmsync> <scmsync>https://src.opensuse.org/suse-edge/Factory#main</scmsync>
``` ```
This is done automatically for any PR filed against this repository.
## Cutting a release version branch ## Cutting a release version branch
1. Do the appropriate git branch command 1. Do the appropriate git branch command
2. Change the project path in `.obs/common.py` file (e.g. from `isv:SUSE:Edge:Factory` to `isv:SUSE:Edge:3.2`) 2. Change the project path in `.obs/common.py` file (e.g. from `isv:SUSE:Edge:Factory` to `isv:SUSE:Edge:3.2`)
3. Change the branch reference in `.obs/common.py` file (e.g. from `main` to `3.2`) 3. Change the branch reference in `.obs/common.py` file (e.g. from `main` to `3.2`)
4. Edit the `.obs/workflows.yml` file to change the references to the correct projects
5. Commit those changes to the new branch and push the new branch 5. Commit those changes to the new branch and push the new branch
6. Create the base and to-test projects (e.g. `isv:SUSE:Edge:3.2` and `isv:SUSE:Edge:3.2:ToTest`), use the `isv:SUSE:Edge:Factory` projects as example for metadata part
7. Use the prjconf of Factory in all those projects
8. Run the `.obs/sync_packages.py` script to create all the packages in the base project
9. Go take a few cups of coffee/tea/mate/... while waiting for OBS to build everything 9. Go take a few cups of coffee/tea/mate/... while waiting for OBS to build everything
10. Once built do an `osc release` of the project for it to be copied over in the `ToTest` section 10. Once built do an `osc release` of the project for it to be copied over in the `ToTest` section
11. Hand over to QA to test whatever is in `ToTest`. (You can continue to work on the base branch if needed meanwhile) 11. Hand over to QA to test whatever is in `ToTest`. (You can continue to work on the base branch if needed meanwhile)

125
_config Normal file
View File

@ -0,0 +1,125 @@
Prefer: -libqpid-proton10 -python311-urllib3_1
Macros:
%__python3 /usr/bin/python3.11
%registry_url %(echo %{vendor} | cut -d '/' -f 3 | sed 's/build/registry/')
:Macros
%if "%{sub %{lower %_project} 1 14}" != "isv:suse:edge:" || "%{sub %_project 15 21}" == "Factory"
# Here we are in Factory like project so set chart major version to 999
Macros:
%chart_major 999
:Macros
%else
# Here we are in version branch, so set the image prefix and chart major accordingly
Macros:
%project_branch %(echo %{_project} | cut -d ':' -f 4)
%img_prefix %{project_branch}/
%chart_major %(echo %{project_branch} | awk '{split($1,a,"."); print a[1]*100 + a[2]}')
:Macros
%endif
%if %{sub %_project 1 3} == ISV
Macros:
%img_repo registry.suse.com/edge
%chart_repo oci://registry.suse.com/edge
%manifest_repo registry.suse.com/edge
%support_level l3
:Macros
%else
Macros:
%img_repo registry.opensuse.org/isv/suse/edge/containers/images
%manifest_repo registry.opensuse.org/isv/suse/edge/containers/images
%chart_repo oci://registry.opensuse.org/isv/suse/edge/containers/charts
%support_level techpreview
:Macros
%endif
%if "%_repository" == "charts" || "%_repository" == "test_manifest_images"
Macros:
%img_repo %(echo %{registry_url}:%{_project}:images | tr ":" "/" | tr '[:upper:]' '[:lower:]')
%manifest_repo %(echo %{registry_url}:%{_project}:test_manifest_images | tr ":" "/" | tr '[:upper:]' '[:lower:]')
%chart_repo oci://%(echo %{registry_url}:%{_project}:charts | tr ":" "/" | tr '[:upper:]' '[:lower:]')
:Macros
%endif
# Missing deps for testsuite
BuildFlags: excludebuild:autoconf:el
BuildFlags: excludebuild:autoconf:testsuite
# Only build manifest embedding images here
%if "%_repository" == "test_manifest_images"
BuildFlags: onlybuild:edge-image-builder-image
BuildFlags: onlybuild:release-manifest-image
# Exclude the images selected by the following section
# as the standard repository is a dependency
%ifarch aarch64
BuildFlags: excludebuild:baremetal-operator-image
BuildFlags: excludebuild:endpoint-copier-operator-image
BuildFlags: excludebuild:ironic-image
BuildFlags: excludebuild:ironic-ipa-downloader-image
BuildFlags: excludebuild:kube-rbac-proxy-image
BuildFlags: excludebuild:metallb-controller-image
BuildFlags: excludebuild:metallb-speaker-image
%endif
%else
# Only a subset of stack is arm64 ready
%ifarch aarch64
BuildFlags: onlybuild:autoconf
BuildFlags: onlybuild:baremetal-operator
BuildFlags: onlybuild:baremetal-operator-image
BuildFlags: onlybuild:ca-certificates-suse
BuildFlags: onlybuild:cosign
BuildFlags: onlybuild:crudini
BuildFlags: onlybuild:edge-image-builder
BuildFlags: onlybuild:edge-image-builder-image
BuildFlags: onlybuild:endpoint-copier-operator
BuildFlags: onlybuild:endpoint-copier-operator-image
BuildFlags: onlybuild:fakeroot
BuildFlags: onlybuild:hauler
BuildFlags: onlybuild:ipcalc
BuildFlags: onlybuild:ironic-image
BuildFlags: onlybuild:ironic-ipa-downloader-image
BuildFlags: onlybuild:ironic-ipa-ramdisk
BuildFlags: onlybuild:kube-rbac-proxy
BuildFlags: onlybuild:kube-rbac-proxy-image
BuildFlags: onlybuild:metallb
BuildFlags: onlybuild:metallb-controller-image
BuildFlags: onlybuild:metallb-speaker-image
BuildFlags: onlybuild:nm-configurator
%endif
%endif
%if "%_repository" == "images" || "%_repository" == "test_manifest_images"
Prefer: container:sles15-image
Type: docker
Repotype: none
Patterntype: none
BuildEngine: podman
Prefer: sles-release
BuildFlags: dockerarg:SLE_VERSION=15.6
# Publish multi-arch container images only once all archs have been built
PublishFlags: archsync
%endif
%if "%_repository" == "charts" || "%_repository" == "phantomcharts" || "%_repository" == "releasecharts"
Type: helm
Repotype: helm
Patterntype: none
Required: perl-YAML-LibYAML
%endif
%if "%_repository" == "standard"
# for build openstack-ironic-image
BuildFlags: allowrootforbuild
%endif
# Enable reproducible builds
# https://en.opensuse.org/openSUSE:Reproducible_Builds\#With_OBS
Macros:
%source_date_epoch_from_changelog Y
%clamp_mtime_to_source_date_epoch Y
%use_source_date_epoch_as_buildtime Y
%_buildhost reproducible
:Macros

69
_meta Normal file
View File

@ -0,0 +1,69 @@
{#-
This template is rendered by the render_meta.py script
it is not automatically enforced by OBS
-#}
{%- set maintainers = [
"edge-engineering",
] -%}
<project name="{{ project }}">
<title>{{ title }}</title>
{%- if description is defined %}
<description>{{ description }}</description>
{%- else %}
<description/>
{%- endif %}
{%- if scm_url is defined %}
<scmsync>{{ scm_url }}</scmsync>
{%- endif %}
{%- for maintainer in maintainers %}
<person userid="{{ maintainer }}" role="maintainer"/>
{%- endfor %}
{%- if not base_project %}
<build>
<disable/>
<enable repository="charts"/>
<enable repository="test_manifest_images"/>
</build>
<publish>
<disable repository="phantomcharts"/>
</publish>
<repository name="phantomcharts">
<arch>x86_64</arch>
</repository>
{%- endif %}
{%- for repository in ["images", "test_manifest_images"] %}
<repository name="{{ repository }}">
{%- if release_project is defined and repository == "images" %}
<releasetarget project="{{ release_project }}" repository="images" trigger="manual"/>
{%- endif %}
<path project="SUSE:Registry" repository="standard"/>
<path project="SUSE:CA" repository="SLE_15_SP6"/>
<path project="{{ project }}" repository="standard"/>
<arch>x86_64</arch>
<arch>aarch64</arch>
</repository>
{%- endfor %}
<repository name="standard" block="local">
{%- if release_project is defined and not for_release %}
<releasetarget project="{{ release_project }}" repository="standard" trigger="manual"/>
{%- endif %}
<path project="Cloud:OpenStack:2024.2" repository="15.6"/>
<path project="SUSE:SLE-15-SP6:Update" repository="standard"/>
<arch>x86_64</arch>
<arch>aarch64</arch>
</repository>
<repository name="charts"{{ ' rebuild="local"' if not base_project }}>
{%- if release_project is defined and not for_release %}
<releasetarget project="{{ release_project }}" repository="phantomcharts" trigger="manual"/>
{%- endif %}
<path project="{{ project }}" repository="standard"/>
<arch>x86_64</arch>
</repository>
{%- if for_release %}
<repository name="releasecharts" rebuild="local">
<releasetarget project="{{ release_project }}" repository="charts" trigger="manual"/>
<path project="{{ project }}" repository="standard"/>
<arch>x86_64</arch>
</repository>
{%- endif %}
</project>

View File

@ -10,7 +10,9 @@
<service name="cargo_vendor" mode="manual"> <service name="cargo_vendor" mode="manual">
<param name="srcdir">akri</param> <param name="srcdir">akri</param>
</service> </service>
<service name="tar" mode="buildtime" /> <service name="tar" mode="buildtime">
<param name="obsinfo">akri.obsinfo</param>
</service>
<service name="set_version" mode="buildtime" > <service name="set_version" mode="buildtime" >
<param name="fromfile">version.txt</param> <param name="fromfile">version.txt</param>
<param name="regex">^(.*)$</param> <param name="regex">^(.*)$</param>

View File

@ -12,10 +12,8 @@
<param name="without-version">yes</param> <param name="without-version">yes</param>
<param name="versionrewrite-replacement">\1</param> <param name="versionrewrite-replacement">\1</param>
</service> </service>
<service mode="buildtime" name="tar" /> <service mode="buildtime" name="tar">
<service mode="buildtime" name="recompress"> <param name="obsinfo">baremetal-operator.obsinfo</param>
<param name="file">*.tar</param>
<param name="compression">gz</param>
</service> </service>
<service name="go_modules"> <service name="go_modules">
</service> </service>
@ -23,7 +21,7 @@
<param name="file">baremetal-operator.spec</param> <param name="file">baremetal-operator.spec</param>
<param name="var">SOURCE_COMMIT</param> <param name="var">SOURCE_COMMIT</param>
<param name="eval"> <param name="eval">
SOURCE_COMMIT=$(grep commit *.obsinfo | cut -d" " -f2) SOURCE_COMMIT=$(grep commit baremetal-operator.obsinfo | cut -d" " -f2)
</param> </param>
<param name="verbose">1</param> <param name="verbose">1</param>
</service> </service>

View File

@ -22,7 +22,7 @@ Release: 0.8.0
Summary: Implements a Kubernetes API for managing bare metal hosts Summary: Implements a Kubernetes API for managing bare metal hosts
License: Apache-2.0 License: Apache-2.0
URL: https://github.com/metal3-io/baremetal-operator URL: https://github.com/metal3-io/baremetal-operator
Source: baremetal-operator-%{version}.tar.gz Source: baremetal-operator-%{version}.tar
Source1: vendor.tar.gz Source1: vendor.tar.gz
BuildRequires: golang(API) = 1.22 BuildRequires: golang(API) = 1.22
ExcludeArch: s390 ExcludeArch: s390

View File

@ -8,10 +8,8 @@
<param name="versionrewrite-pattern">v(.*)</param> <param name="versionrewrite-pattern">v(.*)</param>
<param name="changesgenerate">enable</param> <param name="changesgenerate">enable</param>
</service> </service>
<service mode="buildtime" name="tar" /> <service mode="buildtime" name="tar">
<service mode="buildtime" name="recompress"> <param name="obsinfo">cosign.obsinfo</param>
<param name="file">*.tar</param>
<param name="compression">gz</param>
</service> </service>
<service mode="buildtime" name="set_version" /> <service mode="buildtime" name="set_version" />
<service name="go_modules"> <service name="go_modules">

View File

@ -24,7 +24,7 @@ Release: 0
Summary: Container Signing, Verification and Storage in an OCI registry Summary: Container Signing, Verification and Storage in an OCI registry
License: Apache-2.0 License: Apache-2.0
URL: https://github.com/rancher-government-carbide/cosign URL: https://github.com/rancher-government-carbide/cosign
Source: cosign-%{version}.tar.gz Source: cosign-%{version}.tar
Source1: vendor.tar.gz Source1: vendor.tar.gz
BuildRequires: golang-packaging BuildRequires: golang-packaging

View File

@ -9,10 +9,8 @@
<param name="versionrewrite-replacement">\1.\2.\3</param> <param name="versionrewrite-replacement">\1.\2.\3</param>
<param name="changesgenerate">enable</param> <param name="changesgenerate">enable</param>
</service> </service>
<service mode="buildtime" name="tar" /> <service mode="buildtime" name="tar">
<service mode="buildtime" name="recompress"> <param name="obsinfo">edge-image-builder.obsinfo</param>
<param name="file">*.tar</param>
<param name="compression">gz</param>
</service> </service>
<service mode="buildtime" name="set_version" /> <service mode="buildtime" name="set_version" />
<service name="go_modules"> <service name="go_modules">

View File

@ -22,7 +22,7 @@ Release: 0
Summary: Edge Image Builder Summary: Edge Image Builder
License: Apache-2.0 License: Apache-2.0
URL: https://github.com/suse-edge/edge-image-builder URL: https://github.com/suse-edge/edge-image-builder
Source: edge-image-builder-%{version}.tar.gz Source: edge-image-builder-%{version}.tar
Source1: vendor.tar.gz Source1: vendor.tar.gz
BuildRequires: golang(API) go1.22 BuildRequires: golang(API) go1.22
BuildRequires: golang-packaging BuildRequires: golang-packaging

View File

@ -12,10 +12,8 @@
<param name="without-version">yes</param> <param name="without-version">yes</param>
<param name="versionrewrite-replacement">\1</param> <param name="versionrewrite-replacement">\1</param>
</service> </service>
<service mode="buildtime" name="tar" /> <service mode="buildtime" name="tar">
<service mode="buildtime" name="recompress"> <param name="obsinfo">endpoint-copier-operator.obsinfo</param>
<param name="file">*.tar</param>
<param name="compression">gz</param>
</service> </service>
<service name="go_modules"> <service name="go_modules">
</service> </service>

View File

@ -22,7 +22,7 @@ Release: 0.2.0
Summary: Implements a Kubernetes API for copying endpoint resources Summary: Implements a Kubernetes API for copying endpoint resources
License: Apache-2.0 License: Apache-2.0
URL: https://github.com/suse-edge/endpoint-copier-operator URL: https://github.com/suse-edge/endpoint-copier-operator
Source: endpoint-copier-operator-%{version}.tar.gz Source: endpoint-copier-operator-%{version}.tar
Source1: vendor.tar.gz Source1: vendor.tar.gz
BuildRequires: golang(API) = 1.20 BuildRequires: golang(API) = 1.20
ExcludeArch: s390 ExcludeArch: s390

View File

@ -12,10 +12,8 @@
<param name="without-version">yes</param> <param name="without-version">yes</param>
<param name="versionrewrite-replacement">\1</param> <param name="versionrewrite-replacement">\1</param>
</service> </service>
<service mode="buildtime" name="tar" /> <service mode="buildtime" name="tar">
<service mode="buildtime" name="recompress"> <param name="obsinfo">frr-k8s.obsinfo</param>
<param name="file">*.tar</param>
<param name="compression">gz</param>
</service> </service>
<service name="go_modules"> <service name="go_modules">
</service> </service>

View File

@ -22,7 +22,7 @@ Release: 0.0.14
Summary: A kubernetes based daemonset that exposes a subset of the FRR API in a kubernetes compliant manner. Summary: A kubernetes based daemonset that exposes a subset of the FRR API in a kubernetes compliant manner.
License: Apache-2.0 License: Apache-2.0
URL: https://github.com/metallb/frr-k8s URL: https://github.com/metallb/frr-k8s
Source: frr-k8s-%{version}.tar.gz Source: frr-k8s-%{version}.tar
Source1: vendor.tar.gz Source1: vendor.tar.gz
BuildRequires: golang(API) = 1.22 BuildRequires: golang(API) = 1.22
ExcludeArch: s390 ExcludeArch: s390

View File

@ -8,10 +8,8 @@
<param name="versionrewrite-pattern">v(.*)</param> <param name="versionrewrite-pattern">v(.*)</param>
<param name="changesgenerate">enable</param> <param name="changesgenerate">enable</param>
</service> </service>
<service mode="buildtime" name="tar" /> <service mode="buildtime" name="tar">
<service mode="buildtime" name="recompress"> <param name="obsinfo">hauler.obsinfo</param>
<param name="file">*.tar</param>
<param name="compression">gz</param>
</service> </service>
<service mode="buildtime" name="set_version" /> <service mode="buildtime" name="set_version" />
<service name="go_modules"> <service name="go_modules">

View File

@ -23,7 +23,7 @@ Release: 0
Summary: Airgap Swiss Army Knife Summary: Airgap Swiss Army Knife
License: Apache-2.0 License: Apache-2.0
URL: https://github.com/hauler-dev/hauler URL: https://github.com/hauler-dev/hauler
Source: hauler-%{version}.tar.gz Source: hauler-%{version}.tar
Source1: vendor.tar.gz Source1: vendor.tar.gz
BuildRequires: golang-packaging BuildRequires: golang-packaging
BuildRequires: cosign BuildRequires: cosign

View File

@ -12,10 +12,8 @@
<param name="without-version">yes</param> <param name="without-version">yes</param>
<param name="versionrewrite-replacement">\1</param> <param name="versionrewrite-replacement">\1</param>
</service> </service>
<service mode="buildtime" name="tar" /> <service mode="buildtime" name="tar" >
<service mode="buildtime" name="recompress"> <param name="obsinfo">kube-rbac-proxy.obsinfo</param>
<param name="file">*.tar</param>
<param name="compression">gz</param>
</service> </service>
<service name="go_modules"> <service name="go_modules">
</service> </service>

View File

@ -22,7 +22,7 @@ Release: 0.18.1
Summary: The kube-rbac-proxy is a small HTTP proxy for a single upstream Summary: The kube-rbac-proxy is a small HTTP proxy for a single upstream
License: Apache-2.0 License: Apache-2.0
URL: https://github.com/brancz/kube-rbac-proxy URL: https://github.com/brancz/kube-rbac-proxy
Source: kube-rbac-proxy-%{version}.tar.gz Source: kube-rbac-proxy-%{version}.tar
Source1: vendor.tar.gz Source1: vendor.tar.gz
BuildRequires: golang(API) = 1.23 BuildRequires: golang(API) = 1.23
ExcludeArch: s390 ExcludeArch: s390

View File

@ -12,10 +12,8 @@
<param name="without-version">yes</param> <param name="without-version">yes</param>
<param name="versionrewrite-replacement">\1</param> <param name="versionrewrite-replacement">\1</param>
</service> </service>
<service mode="buildtime" name="tar" /> <service mode="buildtime" name="tar">
<service mode="buildtime" name="recompress"> <param name="obsinfo">metallb.obsinfo</param>
<param name="file">*.tar</param>
<param name="compression">gz</param>
</service> </service>
<service name="go_modules"> <service name="go_modules">
</service> </service>

View File

@ -22,7 +22,7 @@ Release: 0.14.8
Summary: Load Balancer for bare metal Kubernetes clusters Summary: Load Balancer for bare metal Kubernetes clusters
License: Apache-2.0 License: Apache-2.0
URL: https://github.com/metallb/metallb URL: https://github.com/metallb/metallb
Source: %{name}-%{version}.tar.gz Source: %{name}-%{version}.tar
Source1: vendor.tar.gz Source1: vendor.tar.gz
BuildRequires: golang(API) = 1.22 BuildRequires: golang(API) = 1.22
ExcludeArch: s390 ExcludeArch: s390

View File

@ -9,7 +9,9 @@
<param name="versionrewrite-replacement">\1</param> <param name="versionrewrite-replacement">\1</param>
<param name="changesgenerate">enable</param> <param name="changesgenerate">enable</param>
</service> </service>
<service mode="buildtime" name="tar" /> <service mode="buildtime" name="tar">
<param name="obsinfo">nm-configurator.obsinfo</param>
</service>
<service mode="buildtime" name="set_version"/> <service mode="buildtime" name="set_version"/>
<service mode="manual" name="cargo_vendor"> <service mode="manual" name="cargo_vendor">
<param name="src">nm-configurator</param> <param name="src">nm-configurator</param>

View File

@ -9,10 +9,8 @@
<param name="versionrewrite-replacement">\1.\2.\3</param> <param name="versionrewrite-replacement">\1.\2.\3</param>
<param name="changesgenerate">enable</param> <param name="changesgenerate">enable</param>
</service> </service>
<service mode="buildtime" name="tar" /> <service mode="buildtime" name="tar">
<service mode="buildtime" name="recompress"> <param name="obsinfo">upgrade-controller.obsinfo</param>
<param name="file">*.tar</param>
<param name="compression">gz</param>
</service> </service>
<service name="go_modules"> <service name="go_modules">
<param name="compression">gz</param> <param name="compression">gz</param>

View File

@ -22,7 +22,7 @@ Release: 0
Summary: Upgrade Controller Summary: Upgrade Controller
License: Apache-2.0 License: Apache-2.0
URL: https://github.com/suse-edge/upgrade-controller URL: https://github.com/suse-edge/upgrade-controller
Source: upgrade-controller-%{version}.tar.gz Source: upgrade-controller-%{version}.tar
Source1: vendor.tar.gz Source1: vendor.tar.gz
BuildRequires: golang(API) go1.22 BuildRequires: golang(API) go1.22
BuildRequires: golang-packaging BuildRequires: golang-packaging