From 94d4faf0f958c519ba77ade8afd33d373899dff19e71249d3725ade765daaaeb Mon Sep 17 00:00:00 2001 From: Nicolas Belouin Date: Wed, 12 Feb 2025 16:53:19 +0100 Subject: [PATCH 1/4] Add project config to git Signed-off-by: Nicolas Belouin (cherry picked from commit c86d724e926cdc8b9b4e0a5f0b25ae8df3c08b49c11b7b8399d4d426b1320d4b) (cherry picked from commit c04b2af72b312ad7988e19c8fe67407aad5dc5b076572c1eb6c2bd709194d65c) (cherry picked from commit 54e09418795aa2e19da7f8848b902bf095145e50be6168dbe0b34a6dfd10d334) (cherry picked from commit a510134ed4d14ae98af4aa5d5bce0c1a053af58d99b805b407620ac046b06096) --- .gitea/workflows/sync_config.yaml | 33 +++++++++ _config | 111 ++++++++++++++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 .gitea/workflows/sync_config.yaml create mode 100644 _config diff --git a/.gitea/workflows/sync_config.yaml b/.gitea/workflows/sync_config.yaml new file mode 100644 index 0000000..b7e3d14 --- /dev/null +++ b/.gitea/workflows/sync_config.yaml @@ -0,0 +1,33 @@ +name: Synchronize Project Config +on: + push: + branches: + - "main" + - "3.*" + paths: + - "_config" + - ".gitea/workflows/sync_config.yaml" + +jobs: + sync-prjconf: + runs-on: tumbleweed + steps: + - run: | + mkdir -p ~/.config/osc + cat >~/.config/osc/oscrc < Date: Thu, 20 Feb 2025 11:05:47 +0100 Subject: [PATCH 2/4] Sync metadata, revamp PR jobs Signed-off-by: Nicolas Belouin (cherry picked from commit d6d501ad99137d3d17d3950e48ea768f0c0848d6d48fbb0f3cf05769ea7285c0) (cherry picked from commit 4d824b71cc20b0ab2b5292d78ac8d79c3046b48fa5b70a1c805252f32e491827) (cherry picked from commit 0d3c83fca159371618bee443a192b3b78adc5465ace6a457e5100a0ca334e1d0) (cherry picked from commit 5a73d61002b63c37b7c204a1d01bf712e892fee5bbcc41e83635c4b633215fa3) (cherry picked from commit 34687fb5e96509bcd109122a5b4ea3dac33b1a7d0190a41ff7aa8fa61be968e3) (cherry picked from commit 4a99805fde33bf70d8826d050e3eb8e1403dc3dd1feae7d5c08692e03c889317) (cherry picked from commit 331f08255c04109ba40a9ee6c1cfe95f6e4202c734c33a6c818f70a3bd395171) (cherry picked from commit 3dea69443d4b33dd453537e2ca5bd6b11bfbb58c818bca2f3b5095e5a7a8bc3e) (cherry picked from commit d97e434fcef181dcfce05e1a633c1bd802ca369820cfb4fbfeac716cc7b4eea3) (cherry picked from commit 9e41ee25d9dc356caf7484e62dc447402b4c235a454d4004709dfd7975d439a4) (cherry picked from commit 8f20b3433e0a9f9a3222e561ecd43462828a6a40c76c2b957e4cd75a393b04d7) --- .gitea/workflows/pr_project.yaml | 62 +++++++++ .gitea/workflows/sync_config.yaml | 14 +- .gitea/workflows/sync_meta.yaml | 45 +++++++ .obs/add_package.py | 28 +--- .obs/create_projects.sh | 37 +++++ .obs/delete_package.py | 14 -- .obs/render_meta.py | 62 +++++++++ .obs/sync_packages.py | 2 +- .obs/wait_obs.py | 83 ++++++++++++ .obs/workflows.yml | 216 ------------------------------ README.md | 15 +-- _meta | 69 ++++++++++ 12 files changed, 370 insertions(+), 277 deletions(-) create mode 100644 .gitea/workflows/pr_project.yaml create mode 100644 .gitea/workflows/sync_meta.yaml create mode 100644 .obs/create_projects.sh create mode 100644 .obs/render_meta.py create mode 100644 .obs/wait_obs.py delete mode 100644 .obs/workflows.yml create mode 100644 _meta diff --git a/.gitea/workflows/pr_project.yaml b/.gitea/workflows/pr_project.yaml new file mode 100644 index 0000000..dd366c2 --- /dev/null +++ b/.gitea/workflows/pr_project.yaml @@ -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 \ No newline at end of file diff --git a/.gitea/workflows/sync_config.yaml b/.gitea/workflows/sync_config.yaml index b7e3d14..dfa6c77 100644 --- a/.gitea/workflows/sync_config.yaml +++ b/.gitea/workflows/sync_config.yaml @@ -1,20 +1,21 @@ name: Synchronize Project Config on: push: - branches: - - "main" - - "3.*" + branches-ignore: + - "devel" paths: - "_config" - ".gitea/workflows/sync_config.yaml" jobs: sync-prjconf: + name: "Update prjconf in OBS" runs-on: tumbleweed steps: - - run: | + - name: Setup OSC + run: | mkdir -p ~/.config/osc - cat >~/.config/osc/oscrc <~/.config/osc/oscrc <<'EOF' [general] apiurl = https://api.opensuse.org @@ -24,10 +25,11 @@ jobs: 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 + if [ "$(osc meta prjconf "${PROJECT}" | sha256sum)" != "$(cat _config | sha256sum)" ] ; then osc meta prjconf "${PROJECT}" -F _config fi diff --git a/.gitea/workflows/sync_meta.yaml b/.gitea/workflows/sync_meta.yaml new file mode 100644 index 0000000..29eab1b --- /dev/null +++ b/.gitea/workflows/sync_meta.yaml @@ -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 diff --git a/.obs/add_package.py b/.obs/add_package.py index c2c6e21..67d913e 100755 --- a/.obs/add_package.py +++ b/.obs/add_package.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -import yaml import subprocess import argparse import os @@ -7,30 +6,6 @@ import os.path 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): package_meta = f""" @@ -53,7 +28,6 @@ def add_package(package_name: str): os.exit(1) add_package_to_project(package_name) - add_package_to_workflow(package_name) def main(): @@ -65,7 +39,7 @@ def main(): 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__': diff --git a/.obs/create_projects.sh b/.obs/create_projects.sh new file mode 100644 index 0000000..514502f --- /dev/null +++ b/.obs/create_projects.sh @@ -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 \ No newline at end of file diff --git a/.obs/delete_package.py b/.obs/delete_package.py index 763219c..f529319 100755 --- a/.obs/delete_package.py +++ b/.obs/delete_package.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -import yaml import subprocess import argparse import os @@ -8,18 +7,6 @@ import os.path 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): p = subprocess.run(["osc", "rdelete", PROJECT, name, "-m \"Deleted via delete_package.py\"" ], stdout=subprocess.PIPE) print(p.stdout) @@ -33,7 +20,6 @@ def delete_package(package_name: str): os.exit(1) delete_package_from_project(package_name) - delete_package_from_workflow(package_name) def main(): diff --git a/.obs/render_meta.py b/.obs/render_meta.py new file mode 100644 index 0000000..3ed31ec --- /dev/null +++ b/.obs/render_meta.py @@ -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() \ No newline at end of file diff --git a/.obs/sync_packages.py b/.obs/sync_packages.py index 1537f13..7f29088 100644 --- a/.obs/sync_packages.py +++ b/.obs/sync_packages.py @@ -9,7 +9,7 @@ from common import PROJECT def get_obs_packages() -> Set[str]: 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]: p = pathlib.Path('.') diff --git a/.obs/wait_obs.py b/.obs/wait_obs.py new file mode 100644 index 0000000..5fe1501 --- /dev/null +++ b/.obs/wait_obs.py @@ -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() \ No newline at end of file diff --git a/.obs/workflows.yml b/.obs/workflows.yml deleted file mode 100644 index 14eac6c..0000000 --- a/.obs/workflows.yml +++ /dev/null @@ -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 diff --git a/README.md b/README.md index 5cd009a..6becf8d 100644 --- a/README.md +++ b/README.md @@ -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> 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 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> ``` +This is done automatically for any PR filed against this repository. + ## Cutting a release version branch 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`) 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 -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 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) diff --git a/_meta b/_meta new file mode 100644 index 0000000..fa14c49 --- /dev/null +++ b/_meta @@ -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 }} + {%- if description is defined %} + {{ description }} + {%- else %} + + {%- endif %} + {%- if scm_url is defined %} + {{ scm_url }} + {%- endif %} +{%- for maintainer in maintainers %} + +{%- endfor %} +{%- if not base_project %} + + + + + + + + + + x86_64 + +{%- endif %} +{%- for repository in ["images", "test_manifest_images"] %} + + {%- if release_project is defined and repository == "images" %} + + {%- endif %} + + + + x86_64 + aarch64 + +{%- endfor %} + + {%- if release_project is defined and not for_release %} + + {%- endif %} + + + x86_64 + aarch64 + + + {%- if release_project is defined and not for_release %} + + {%- endif %} + + x86_64 + + {%- if for_release %} + + + + x86_64 + + {%- endif %} + -- 2.45.2 From fa1da01c29b451562e233cb763675bf5f5e9e7120c7d4544dbe8e329ebf23e5b Mon Sep 17 00:00:00 2001 From: Nicolas Belouin Date: Fri, 21 Feb 2025 15:27:28 +0100 Subject: [PATCH 3/4] Fix obsinfo tar issues Signed-off-by: Nicolas Belouin (cherry picked from commit dccf206a98ebb292fb75977db0e55baf2eea21ebdec7261bcfd5a1a10afb4cd2) (cherry picked from commit 7f93226cd33d1abfa2f6a95a14834da88c4ad853b3dd59e44761a71bff86106f) --- akri/_service | 4 +++- baremetal-operator/_service | 8 +++----- baremetal-operator/baremetal-operator.spec | 2 +- cosign/_service | 6 ++---- cosign/cosign.spec | 2 +- edge-image-builder/_service | 6 ++---- edge-image-builder/edge-image-builder.spec | 2 +- endpoint-copier-operator/_service | 6 ++---- endpoint-copier-operator/endpoint-copier-operator.spec | 2 +- frr-k8s/_service | 6 ++---- frr-k8s/frr-k8s.spec | 2 +- hauler/_service | 6 ++---- hauler/hauler.spec | 2 +- kube-rbac-proxy/_service | 6 ++---- kube-rbac-proxy/kube-rbac-proxy.spec | 2 +- metallb/_service | 6 ++---- metallb/metallb.spec | 2 +- nm-configurator/_service | 4 +++- upgrade-controller/_service | 6 ++---- upgrade-controller/upgrade-controller.spec | 2 +- 20 files changed, 34 insertions(+), 48 deletions(-) diff --git a/akri/_service b/akri/_service index e983bf4..c04162f 100644 --- a/akri/_service +++ b/akri/_service @@ -10,7 +10,9 @@ akri - + + akri.obsinfo + version.txt ^(.*)$ diff --git a/baremetal-operator/_service b/baremetal-operator/_service index 2628004..c45ecc3 100644 --- a/baremetal-operator/_service +++ b/baremetal-operator/_service @@ -12,10 +12,8 @@ yes \1 - - - *.tar - gz + + baremetal-operator.obsinfo @@ -23,7 +21,7 @@ baremetal-operator.spec SOURCE_COMMIT - SOURCE_COMMIT=$(grep commit *.obsinfo | cut -d" " -f2) + SOURCE_COMMIT=$(grep commit baremetal-operator.obsinfo | cut -d" " -f2) 1 diff --git a/baremetal-operator/baremetal-operator.spec b/baremetal-operator/baremetal-operator.spec index 66c6108..94d7ec5 100644 --- a/baremetal-operator/baremetal-operator.spec +++ b/baremetal-operator/baremetal-operator.spec @@ -22,7 +22,7 @@ Release: 0.8.0 Summary: Implements a Kubernetes API for managing bare metal hosts License: Apache-2.0 URL: https://github.com/metal3-io/baremetal-operator -Source: baremetal-operator-%{version}.tar.gz +Source: baremetal-operator-%{version}.tar Source1: vendor.tar.gz BuildRequires: golang(API) = 1.22 ExcludeArch: s390 diff --git a/cosign/_service b/cosign/_service index 94a6556..1233d4a 100644 --- a/cosign/_service +++ b/cosign/_service @@ -8,10 +8,8 @@ v(.*) enable - - - *.tar - gz + + cosign.obsinfo diff --git a/cosign/cosign.spec b/cosign/cosign.spec index 753cb1b..850a003 100644 --- a/cosign/cosign.spec +++ b/cosign/cosign.spec @@ -24,7 +24,7 @@ Release: 0 Summary: Container Signing, Verification and Storage in an OCI registry License: Apache-2.0 URL: https://github.com/rancher-government-carbide/cosign -Source: cosign-%{version}.tar.gz +Source: cosign-%{version}.tar Source1: vendor.tar.gz BuildRequires: golang-packaging diff --git a/edge-image-builder/_service b/edge-image-builder/_service index 534bd18..63b3ac7 100644 --- a/edge-image-builder/_service +++ b/edge-image-builder/_service @@ -9,10 +9,8 @@ \1.\2.\3 enable - - - *.tar - gz + + edge-image-builder.obsinfo diff --git a/edge-image-builder/edge-image-builder.spec b/edge-image-builder/edge-image-builder.spec index c1e10bd..e1c1f77 100644 --- a/edge-image-builder/edge-image-builder.spec +++ b/edge-image-builder/edge-image-builder.spec @@ -22,7 +22,7 @@ Release: 0 Summary: Edge Image Builder License: Apache-2.0 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 BuildRequires: golang(API) go1.22 BuildRequires: golang-packaging diff --git a/endpoint-copier-operator/_service b/endpoint-copier-operator/_service index 81fb0fb..a6877c9 100644 --- a/endpoint-copier-operator/_service +++ b/endpoint-copier-operator/_service @@ -12,10 +12,8 @@ yes \1 - - - *.tar - gz + + endpoint-copier-operator.obsinfo diff --git a/endpoint-copier-operator/endpoint-copier-operator.spec b/endpoint-copier-operator/endpoint-copier-operator.spec index 0466fc1..b1f390e 100644 --- a/endpoint-copier-operator/endpoint-copier-operator.spec +++ b/endpoint-copier-operator/endpoint-copier-operator.spec @@ -22,7 +22,7 @@ Release: 0.2.0 Summary: Implements a Kubernetes API for copying endpoint resources License: Apache-2.0 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 BuildRequires: golang(API) = 1.20 ExcludeArch: s390 diff --git a/frr-k8s/_service b/frr-k8s/_service index 10c03d5..f83862b 100644 --- a/frr-k8s/_service +++ b/frr-k8s/_service @@ -12,10 +12,8 @@ yes \1 - - - *.tar - gz + + frr-k8s.obsinfo diff --git a/frr-k8s/frr-k8s.spec b/frr-k8s/frr-k8s.spec index 9342812..3d97a10 100644 --- a/frr-k8s/frr-k8s.spec +++ b/frr-k8s/frr-k8s.spec @@ -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. License: Apache-2.0 URL: https://github.com/metallb/frr-k8s -Source: frr-k8s-%{version}.tar.gz +Source: frr-k8s-%{version}.tar Source1: vendor.tar.gz BuildRequires: golang(API) = 1.22 ExcludeArch: s390 diff --git a/hauler/_service b/hauler/_service index 54563fb..a7d11ad 100644 --- a/hauler/_service +++ b/hauler/_service @@ -8,10 +8,8 @@ v(.*) enable - - - *.tar - gz + + hauler.obsinfo diff --git a/hauler/hauler.spec b/hauler/hauler.spec index cbee7c0..79b5052 100644 --- a/hauler/hauler.spec +++ b/hauler/hauler.spec @@ -23,7 +23,7 @@ Release: 0 Summary: Airgap Swiss Army Knife License: Apache-2.0 URL: https://github.com/hauler-dev/hauler -Source: hauler-%{version}.tar.gz +Source: hauler-%{version}.tar Source1: vendor.tar.gz BuildRequires: golang-packaging BuildRequires: cosign diff --git a/kube-rbac-proxy/_service b/kube-rbac-proxy/_service index 99268e7..40083f2 100644 --- a/kube-rbac-proxy/_service +++ b/kube-rbac-proxy/_service @@ -12,10 +12,8 @@ yes \1 - - - *.tar - gz + + kube-rbac-proxy.obsinfo diff --git a/kube-rbac-proxy/kube-rbac-proxy.spec b/kube-rbac-proxy/kube-rbac-proxy.spec index 9d8075a..ead43b6 100644 --- a/kube-rbac-proxy/kube-rbac-proxy.spec +++ b/kube-rbac-proxy/kube-rbac-proxy.spec @@ -22,7 +22,7 @@ Release: 0.18.1 Summary: The kube-rbac-proxy is a small HTTP proxy for a single upstream License: Apache-2.0 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 BuildRequires: golang(API) = 1.23 ExcludeArch: s390 diff --git a/metallb/_service b/metallb/_service index 5066257..e709ca2 100644 --- a/metallb/_service +++ b/metallb/_service @@ -12,10 +12,8 @@ yes \1 - - - *.tar - gz + + metallb.obsinfo diff --git a/metallb/metallb.spec b/metallb/metallb.spec index f59d4db..17316a4 100644 --- a/metallb/metallb.spec +++ b/metallb/metallb.spec @@ -22,7 +22,7 @@ Release: 0.14.8 Summary: Load Balancer for bare metal Kubernetes clusters License: Apache-2.0 URL: https://github.com/metallb/metallb -Source: %{name}-%{version}.tar.gz +Source: %{name}-%{version}.tar Source1: vendor.tar.gz BuildRequires: golang(API) = 1.22 ExcludeArch: s390 diff --git a/nm-configurator/_service b/nm-configurator/_service index a83f874..5a481e9 100644 --- a/nm-configurator/_service +++ b/nm-configurator/_service @@ -9,7 +9,9 @@ \1 enable - + + nm-configurator.obsinfo + nm-configurator diff --git a/upgrade-controller/_service b/upgrade-controller/_service index 251bb05..3610179 100644 --- a/upgrade-controller/_service +++ b/upgrade-controller/_service @@ -9,10 +9,8 @@ \1.\2.\3 enable - - - *.tar - gz + + upgrade-controller.obsinfo gz diff --git a/upgrade-controller/upgrade-controller.spec b/upgrade-controller/upgrade-controller.spec index 2d7d586..d7cf993 100644 --- a/upgrade-controller/upgrade-controller.spec +++ b/upgrade-controller/upgrade-controller.spec @@ -22,7 +22,7 @@ Release: 0 Summary: Upgrade Controller License: Apache-2.0 URL: https://github.com/suse-edge/upgrade-controller -Source: upgrade-controller-%{version}.tar.gz +Source: upgrade-controller-%{version}.tar Source1: vendor.tar.gz BuildRequires: golang(API) go1.22 BuildRequires: golang-packaging -- 2.45.2 From e6561f36edde7020e0c0540dbc40b2a82709a26c0efc661316d1109f1a75cfde Mon Sep 17 00:00:00 2001 From: Steven Hardy Date: Wed, 19 Feb 2025 16:50:00 +0000 Subject: [PATCH 4/4] Add metal3 images to ARM allowlist We need to ensure these build to enable usage of the metal3 chart on ARM (cherry picked from commit f61bb1e0e62ed60334535c107070be0d19007f55aba146ed60579857067166ff) Add ipcalc, crudini and fakeroot for aarch64 build Signed-off-by: Nicolas Belouin (cherry picked from commit 98c4be017dedba902725aaf844fb38031f92065657e30171b66a13fdadce95da) --- _config | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/_config b/_config index b7a23d6..9de1f11 100644 --- a/_config +++ b/_config @@ -54,21 +54,35 @@ 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 @@ -108,4 +122,4 @@ Macros: %clamp_mtime_to_source_date_epoch Y %use_source_date_epoch_as_buildtime Y %_buildhost reproducible -:Macros \ No newline at end of file +:Macros -- 2.45.2