Compare commits

..

12 Commits

Author SHA1 Message Date
e659731d7b run tests for images from packages in task 2025-08-07 16:11:20 +03:00
8c81cfecf0 test script 2025-08-07 13:13:36 +03:00
bf4dedb221 my c10f2 patch 2025-08-06 20:52:11 +03:00
fc2a686fc1 feat(build.py): clean images only if specified through cli option
Some checks failed
Building alt images / build-process (push) Failing after 41s
Building alt images / test-process (push) Has been skipped
2025-07-30 16:43:27 +03:00
fccd2998fe feat(build.py): get package version from repo if couldn't from task 2025-07-30 16:43:27 +03:00
bc457107f1 fix(build.py): use identity check instead of equality for None 2025-07-30 16:43:27 +03:00
81d5297c7c style: remove trailing whitespace 2025-07-30 16:43:27 +03:00
Nadezhda Fedorova
ebfa49dd1d fix(org/alt): delete config volumes from kafka and redis
All checks were successful
Building alt images / build-process (push) Successful in 3m56s
Building alt images / test-process (push) Successful in 1m10s
2025-07-23 12:47:50 +03:00
Nadezhda Fedorova
d609016659 fix(images-info.toml): Add skip-arches for kafka image
Some checks failed
Building alt images / build-process (push) Successful in 5m9s
Building alt images / test-process (push) Failing after 1m17s
2025-07-23 11:58:13 +03:00
Nadezhda Fedorova
a3de7f8261 fix(images-info.toml): Add skip-arches for kubevirt images
Some checks failed
Full building alt images / build-process (push) Successful in 16m15s
Full building alt images / test-process (push) Successful in 1m10s
Building alt images / build-process (push) Successful in 5m11s
Building alt images / test-process (push) Failing after 1m16s
2025-07-22 13:39:34 +03:00
Nadezhda Fedorova
0a105aace4 Add kafka image
All checks were successful
Full building alt images / build-process (push) Successful in 4m34s
Full building alt images / test-process (push) Has been skipped
2025-07-22 11:42:41 +03:00
Nadezhda Fedorova
2db6b03aa8 Add redis image 2025-07-22 11:39:29 +03:00
31 changed files with 566 additions and 50 deletions

View File

@@ -19,8 +19,6 @@ import yaml
from jinja2 import Environment, BaseLoader
logger = logging.getLogger(__name__)
clean_images_counter = 0
clean_images_limit_count = 5
ORG_DIR = Path("org")
@@ -103,6 +101,8 @@ class Tasks:
if image.canonical_name in i or len(i) == 0
]
class AltAPIError(Exception):
pass
def api_get_source_package_version(branch: str, package_name: str) -> str:
api_url = "https://rdb.altlinux.org/api/site/package_versions_from_tasks"
@@ -113,7 +113,7 @@ def api_get_source_package_version(branch: str, package_name: str) -> str:
params = {"arch": "x86_64", "package_type": "source", "name": package_name}
response = requests.get(api_url, params)
if response.status_code != 200:
raise RuntimeError(
raise AltAPIError(
f"failed to retrieve source package version: source package {package_name!r}, branch {branch!r} "
)
result = response.json()
@@ -121,7 +121,7 @@ def api_get_source_package_version(branch: str, package_name: str) -> str:
if v["branch"] == branch:
return v["version"]
raise RuntimeError(
raise AltAPIError(
f"failed to retrieve source package version: source package {package_name!r}, branch {branch!r} "
)
@@ -134,7 +134,7 @@ def api_get_source_package_version_from_task(task_id: str, package_name: str):
api_url = f"https://rdb.altlinux.org/api/task/packages/{task_id}"
response = requests.get(api_url)
if response.status_code != 200:
raise RuntimeError(
raise AltAPIError(
f"failed to retrieve source package version from task: source package {package_name!r}, task_id {task_id}"
)
@@ -143,7 +143,7 @@ def api_get_source_package_version_from_task(task_id: str, package_name: str):
if subtask["source"]["name"] == package_name:
return subtask["source"]["version"]
raise RuntimeError(
raise AltAPIError(
f"failed to retrieve source package version from task: source package {package_name!r}, task_id {task_id}"
)
@@ -202,9 +202,22 @@ class Tags:
package_name,
task_ids[0],
)
version = api_get_source_package_version_from_task(
task_ids[0], package_name
)
try:
version = api_get_source_package_version_from_task(
task_ids[0], package_name
)
except AltAPIError:
logger.warning(
"failed getting %s package version from task %s",
package_name,
task_ids[0],
)
logger.info(
"getting %s package version from repo %s",
package_name,
branch,
)
version = api_get_source_package_version(branch, package_name)
else:
logger.info(
"getting %s package version from repo %s",
@@ -419,12 +432,22 @@ class DockerBuilder:
else:
registry = ""
alt_image = "alt"
if self.branch == "c10f2":
base_image_prefix = "c10f"
label_vendor = "BaseALT LLC"
else:
base_image_prefix = self.branch
label_vendor = "ALT Linux Team"
rendered = JINJA_ENV.from_string(template).render(
alt_image=alt_image,
branch=self.branch,
base_image_prefix=base_image_prefix,
install_packages=install_packages,
organization=organization,
registry=registry,
label_vendor=label_vendor,
pkg_versions=PKG_VERSIONS,
**kwargs,
)
@@ -772,7 +795,7 @@ class DockerBuilder:
".",
]
if image.annotations != None:
if image.annotations is not None and self.branch != "c10f2":
build_cmd = [
"podman",
"build",
@@ -829,23 +852,6 @@ class DockerBuilder:
self.run(cmd)
global clean_images_counter
if clean_images_limit_count <= clean_images_counter:
cmd = [
"podman",
"rmi",
"--all",
"-f",
]
self.run(cmd,
check=False,
stderr=subprocess.DEVNULL,
stdout=subprocess.DEVNULL,
)
clean_images_counter = 0
else:
clean_images_counter += 1
class ImagesInfo:
@@ -994,6 +1000,10 @@ def parse_args():
type=json.loads,
help="json string where key is image name, value is the package version",
)
parser.add_argument(
"--clean-images-limit",
help="remove all the images in the container storage when number of images hits the limit",
)
parser.add_argument(
"--log-level",
default="warning",
@@ -1023,6 +1033,8 @@ def main():
logger.info("PKG_VERSIONS=%s", PKG_VERSIONS)
clean_images_counter = 0
arches = args.arches
images_info = ImagesInfo()
tags = Tags(args.tags, args.latest)
@@ -1044,6 +1056,7 @@ def main():
if "render_dockerfiles" in args.stages:
db.render_dockerfiles()
db.load_distrolesses()
for image in db.get_build_order():
if image.canonical_name not in args.images:
continue
@@ -1057,6 +1070,23 @@ def main():
if "push" in args.stages:
db.podman_push(image, args.sign)
if args.clean_images_limit is not None:
if clean_images_counter >= args.clean_images_limit:
cmd = [
"podman",
"rmi",
"--all",
"-f",
]
db.run(cmd,
check=False,
stderr=subprocess.DEVNULL,
stdout=subprocess.DEVNULL,
)
clean_images_counter = 0
else:
clean_images_counter += 1
if __name__ == "__main__":
main()

View File

@@ -7,8 +7,32 @@ skip-arches = [ "386" ]
["alt/zot"]
skip-arches = [ "386" ]
["alt/kafka"]
skip-arches = [ "386" ]
["alt/ansible"]
skip-branches = [ "c10f2", "c10f1", "p10" ]
["alt/buildkit"]
skip-branches = [ "c10f1", "p10" ]
["kubevirt/virt-api"]
skip-arches = [ "386", "loong64" ]
["kubevirt/virt-controller"]
skip-arches = [ "386", "loong64" ]
["kubevirt/virt-exportproxy"]
skip-arches = [ "386", "loong64" ]
["kubevirt/virt-exportserver"]
skip-arches = [ "386", "loong64" ]
["kubevirt/virt-handler"]
skip-arches = [ "386", "loong64" ]
["kubevirt/virt-launcher"]
skip-arches = [ "386", "loong64" ]
["kubevirt/virt-operator"]
skip-arches = [ "386", "loong64" ]

View File

@@ -0,0 +1,21 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="kafka"
LABEL org.opencontainers.image.description="Apache Kafka is a distributed event store and stream-processing platform"
LABEL org.opencontainers.image.source="https://github.com/apache/kafka"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("kafka", "ca-certificates", "gpg") }}
USER kafka:kafka
EXPOSE 9092 2181
WORKDIR /var/lib/kafka
VOLUME ["/var/lib/kafka","/var/log/kafka"]
COPY kafka-entrypoint.sh /kafka-entrypoint.sh
ENTRYPOINT [ "/bin/bash" ]
CMD ["/kafka-entrypoint.sh"]

37
org/alt/kafka/README.md Normal file
View File

@@ -0,0 +1,37 @@
# Kafka image
Command for run kafka server:
```
podman run --rm -it -p 9092:9092 <REGISTRY>/<BRANCH>/kafka:latest
```
To lead images running need use kafka-entrypoint.sh or change it. As default login kafka need runnig zookeeper and than kafka's start script.
Commnad for using kafka:
```
podman exec -it -u kafka <CONTAINER ID> /usr/bin/sh
```
```
sh-5.2$ /usr/lib/kafka/bin/kafka-topics.sh --create --topic quickstart-events --bootstrap-server localhost:9092
```
Created topic quickstart-events.
```
sh-5.2$ /usr/lib/kafka/bin/kafka-topics.sh --describe --topic quickstart-events --bootstrap-server localhost:9092
```
Topic: quickstart-events TopicId: kPjhCFFAS-Sg5J3Hpgr-PA PartitionCount: 1 ReplicationFactor: 1 Configs:
Topic: quickstart-events Partition: 0 Leader: 0 Replicas: 0 Isr: 0 Elr: N/A LastKnownElr: N/A
```
sh-5.2$ /usr/lib/kafka/bin/kafka-console-producer.sh --topic quickstart-events --bootstrap-server localhost:9092
```
>hello 1
>hello 2
>hello 3
```
sh-5.2$ /usr/lib/kafka/bin/kafka-console-consumer.sh --topic quickstart-events --from-beginning --bootstrap-server localhost:9092
```
hello 1
hello 2
hello 3
^CProcessed a total of 3 messages

15
org/alt/kafka/info.yaml Normal file
View File

@@ -0,0 +1,15 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- kafka
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://github.com/apache/kafka'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'kafka'
org.opencontainers.image.description: 'Apache Kafka is a distributed event store and stream-processing platform'
org.opencontainers.image.licenses: Apache-2.0
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@@ -0,0 +1,4 @@
#!/bin/sh -eux
nohup /usr/lib/kafka/bin/zookeeper-server-start.sh /etc/kafka/zookeeper.properties &
/usr/lib/kafka/bin/kafka-server-start.sh /etc/kafka/server.properties

1
org/alt/kafka/test Normal file
View File

@@ -0,0 +1 @@
ls -a /usr/lib/kafka/bin/ | grep kafka && /usr/lib/kafka/bin/kafka-topics.sh --version

View File

@@ -0,0 +1,19 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="redis"
LABEL org.opencontainers.image.description="Redis is an advanced key-value store"
LABEL org.opencontainers.image.source="http://redis.io"
LABEL org.opencontainers.image.licenses="BSD-3-Clause AND BSD-2-Clause AND MIT AND BSL-1.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("ca-certificates","redis","redis-cli") }}
USER _redis:_redis
EXPOSE 6379
VOLUME ["/var/lib/redis","/var/log/redis"]
WORKDIR /var/lib/redis
ENTRYPOINT [ "/usr/sbin/redis-server" ]
CMD [ "/etc/redis/redis.conf" ]

8
org/alt/redis/README.md Normal file
View File

@@ -0,0 +1,8 @@
# Redis image
Command for run redis-db server:
```
podman run --rm -it -v ./redis.conf:/etc/redis/redis.conf -p 6379:6379 <REGISTRY>/<BRANCH>/redis:latest
```
For testing running server you can run redis.py, if it's working you will see version redis

15
org/alt/redis/info.yaml Normal file
View File

@@ -0,0 +1,15 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- redis
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'http://redis.io/'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'redis'
org.opencontainers.image.description: 'Redis is an advanced key-value store'
org.opencontainers.image.licenses: 'BSD-3-Clause AND BSD-2-Clause AND MIT AND BSL-1.0'
org.opencontainers.image.vendor: 'ALT Linux Team'
...

22
org/alt/redis/redis.py Executable file
View File

@@ -0,0 +1,22 @@
#!/usr/bin/python3
import redis
def main():
r = redis.Redis(host='127.0.0.1', port=6379, db=0, username='test', password='test')
try:
info = r.info()
print(info['redis_version'])
response = r.ping()
if response:
print("Подключение успешно!")
else:
print("Не удалось подключиться к Redis.")
except redis.exceptions.RedisError as e:
print(f"Ошибка: {e}")
if __name__ == "__main__":
main()

1
org/alt/redis/test Normal file
View File

@@ -0,0 +1 @@
redis-cli --version && redis-server --version

View File

@@ -0,0 +1,5 @@
bind 0.0.0.0
requirepass test
appendonly yes
appendfsync everysec
user test on -DEBUG +@all ~* >test

View File

@@ -14,4 +14,4 @@ LABEL org.opencontainers.image.title="cert-manager-acmesolver"
LABEL org.opencontainers.image.description="HTTP server used to solve ACME challenges."
LABEL org.opencontainers.image.source="https://github.com/cert-manager/cert-manager"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
LABEL org.opencontainers.image.vendor="{{ label_vendor }}"

View File

@@ -14,4 +14,4 @@ LABEL org.opencontainers.image.title="cert-manager-cainjector"
LABEL org.opencontainers.image.description="cert-manager CA injector is a Kubernetes addon to automate the injection of CA data into webhooks and APIServices from cert-manager certificates."
LABEL org.opencontainers.image.source="https://github.com/cert-manager/cert-manager"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
LABEL org.opencontainers.image.vendor="{{ label_vendor }}"

View File

@@ -14,4 +14,4 @@ LABEL org.opencontainers.image.title="cert-manager-controller"
LABEL org.opencontainers.image.description="Automatically provision and manage TLS certificates in Kubernetes."
LABEL org.opencontainers.image.source="https://github.com/cert-manager/cert-manager"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
LABEL org.opencontainers.image.vendor="{{ label_vendor }}"

View File

@@ -14,4 +14,4 @@ LABEL org.opencontainers.image.title="cert-manager-startupapicheck"
LABEL org.opencontainers.image.description="Check that cert-manager started successfully."
LABEL org.opencontainers.image.source="https://github.com/cert-manager/cert-manager"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
LABEL org.opencontainers.image.vendor="{{ label_vendor }}"

View File

@@ -14,4 +14,4 @@ LABEL org.opencontainers.image.title="cert-manager-webhook"
LABEL org.opencontainers.image.description="The webhook component provides API validation, mutation and conversion functionality for cert-manager."
LABEL org.opencontainers.image.source="https://github.com/cert-manager/cert-manager"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
LABEL org.opencontainers.image.vendor="{{ label_vendor }}"

View File

@@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
FROM {{ registry }}{{ base_image_prefix }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
@@ -6,7 +6,7 @@ LABEL org.opencontainers.image.title="coredns"
LABEL org.opencontainers.image.description="CoreDNS is a DNS server that chains plugins"
LABEL org.opencontainers.image.source="https://github.com/coredns/coredns"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
LABEL org.opencontainers.image.vendor="{{ label_vendor }}"
{% if pkg_versions and "k8s/coredns" in pkg_versions %}
{% set num_version_parts = (pkg_versions["k8s/coredns"].split('.') | length) %}

View File

@@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
FROM {{ registry }}{{ base_image_prefix }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
@@ -6,7 +6,7 @@ LABEL org.opencontainers.image.title="etcd"
LABEL org.opencontainers.image.description="Distributed reliable key-value store for the most critical data of a distributed system"
LABEL org.opencontainers.image.source="https://github.com/etcd-io/etcd"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
LABEL org.opencontainers.image.vendor="{{ label_vendor }}"
ARG PKG_VERSION

View File

@@ -6,7 +6,7 @@ LABEL org.opencontainers.image.title="flannel-cni-plugin" \
org.opencontainers.image.description="CNI network plugin that is powered by flannel" \
org.opencontainers.image.source="https://github.com/flannel-io/cni-plugin" \
org.opencontainers.image.licenses="Apache-2.0" \
org.opencontainers.image.vendor="ALT Linux Team"
org.opencontainers.image.vendor="{{ label_vendor }}"
{{ install_packages("cni-plugin-flannel") }}

View File

@@ -6,7 +6,7 @@ LABEL org.opencontainers.image.title="flannel"
LABEL org.opencontainers.image.description="Network fabric for containers"
LABEL org.opencontainers.image.source="https://github.com/flannel-io/flannel"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
LABEL org.opencontainers.image.vendor="{{ label_vendor }}"
{{ install_packages(
"iproute2",

View File

@@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
FROM {{ registry }}{{ base_image_prefix }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
@@ -14,4 +14,4 @@ LABEL org.opencontainers.image.title="kube-apiserver"
LABEL org.opencontainers.image.description="The Kubernetes API server validates and configures data for the api objects which include pods, services, replicationcontrollers, and others."
LABEL org.opencontainers.image.source="https://github.com/kubernetes/kubernetes"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
LABEL org.opencontainers.image.vendor="{{ label_vendor }}"

View File

@@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
FROM {{ registry }}{{ base_image_prefix }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
@@ -14,4 +14,4 @@ LABEL org.opencontainers.image.title="kube-controller-manager"
LABEL org.opencontainers.image.description="The Kubernetes controller manager is a daemon that embeds the core control loops shipped with Kubernetes."
LABEL org.opencontainers.image.source="https://github.com/kubernetes/kubernetes"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
LABEL org.opencontainers.image.vendor="{{ label_vendor }}"

View File

@@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
FROM {{ registry }}{{ base_image_prefix }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
@@ -14,4 +14,4 @@ LABEL org.opencontainers.image.title="kube-proxy"
LABEL org.opencontainers.image.description="The Kubernetes network proxy runs on each node."
LABEL org.opencontainers.image.source="https://github.com/kubernetes/kubernetes"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
LABEL org.opencontainers.image.vendor="{{ label_vendor }}"

View File

@@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
FROM {{ registry }}{{ base_image_prefix }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
@@ -14,4 +14,4 @@ LABEL org.opencontainers.image.title="kube-scheduler"
LABEL org.opencontainers.image.description="The Kubernetes scheduler is a control plane process which assigns Pods to Nodes."
LABEL org.opencontainers.image.source="https://github.com/kubernetes/kubernetes"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
LABEL org.opencontainers.image.vendor="{{ label_vendor }}"

View File

@@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
FROM {{ registry }}{{ base_image_prefix }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
@@ -14,4 +14,4 @@ LABEL org.opencontainers.image.title="kubelet" \
org.opencontainers.image.description="An agent that runs on each node in the cluster. It makes sure that containers are running in a Pod." \
org.opencontainers.image.source="https://github.com/kubernetes/kubernetes" \
org.opencontainers.image.licenses="Apache-2.0" \
org.opencontainers.image.vendor="ALT Linux Team" \
org.opencontainers.image.vendor="{{ label_vendor }}" \

View File

@@ -5,7 +5,7 @@ MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="pause" \
org.opencontainers.image.description="Simple pause image" \
org.opencontainers.image.licenses="GPLv2" \
org.opencontainers.image.vendor="ALT Linux Team"
org.opencontainers.image.vendor="{{ label_vendor }}"
{{ install_packages("kubernetes-pause") }}

View File

@@ -6,7 +6,7 @@ LABEL org.opencontainers.image.title="trivy-node-collector"
LABEL org.opencontainers.image.description="Open source collector who collect Node information (fs and process data) and output in a table/json format"
LABEL org.opencontainers.image.source="https://github.com/aquasecurity/k8s-node-collector"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
LABEL org.opencontainers.image.vendor="{{ label_vendor }}"
{{ install_packages(
"k8s-trivy-node-collector",

192
test.py Executable file
View File

@@ -0,0 +1,192 @@
#!/usr/bin/env python3
import argparse
import json
import logging
import subprocess
import os
import tempfile
from pathlib import Path
import requests
import yaml
from jinja2 import Template
from build import AltAPIError
logger = logging.getLogger(__name__)
def api_get_package_versions_from_task(task_id: str) -> dict[str, str]:
api_url = f"https://rdb.altlinux.org/api/task/packages/{task_id}"
response = requests.get(api_url)
if response.status_code != 200:
raise AltAPIError(
f"failed to retrieve kubernetes versions from task: task_id {task_id}"
)
result = response.json()
packages = {}
for subtask in result["subtasks"]:
packages[subtask["source"]["name"]] = subtask["source"]["version"]
return packages
def api_get_latest_flannel_tag(branch: str):
api_url = f"https://registry.altlinux.org/v2/{branch}/flannel/tags/list"
response = requests.get(api_url)
if response.status_code != 200:
raise AltAPIError(
f"failed to get latest flannel version for branch {branch}"
)
result = response.json()
return result["tags"][-1]
def run(cmd: list[str]):
global DRY_RUN
logger.debug("%s", cmd)
if not DRY_RUN:
subprocess.run(cmd, check=True)
def parse_args():
log_levels = ["debug", "info", "warning", "error", "critical"]
parser = argparse.ArgumentParser()
parser.add_argument(
"--log-level",
default="debug",
choices=log_levels,
help="log messages above specified level",
)
parser.add_argument(
"--dry-run",
action="store_true",
help="don't run commands",
)
parser.add_argument(
"--skip-packages",
nargs="+",
help="log messages above specified level",
)
parser.add_argument("branch")
parser.add_argument("task_id")
return parser.parse_args()
def main():
global DRY_RUN
args = parse_args()
DRY_RUN = args.dry_run
numeric_level = getattr(logging, args.log_level.upper(), logging.DEBUG)
logging.basicConfig(
level=numeric_level, format="%(asctime)s - %(levelname)s\t- %(message)s"
)
package_versions = api_get_package_versions_from_task(args.task_id)
test_registry = "10.4.5.110:5000"
image_forge_dir = Path(".").resolve()
tests_dir = Path("../kubernetes-tests").resolve()
registry_prefix = args.branch
if args.branch == "c10f2":
registry_prefix = "c10f"
srpm_to_images = yaml.safe_load(Path("srpm_to_images.yaml").read_text())
temp_tasks_config = tempfile.NamedTemporaryFile(mode="w+", delete=False, delete_on_close=False)
temp_tasks_config.write(f"""\
[{args.branch}]
{args.task_id} = [{",".join([f'"{image}"' for pkg_name in package_versions if pkg_name in srpm_to_images for image in srpm_to_images[pkg_name]])}]
""")
temp_tasks_config.close()
k8s_dir = image_forge_dir / "org" / "k8s"
image_to_version_template: dict[str, str | list[str]] = {}
for image_dir in k8s_dir.iterdir():
info_file = image_dir / "info.yaml"
info = yaml.safe_load(info_file.read_text())
image_to_version_template[f"{image_dir.parent.name}/{image_dir.name}"] = info.get("version_template", None)
run([
"podman",
"login",
test_registry,
"--username", "admin",
"--password", "123"
])
flannel_tag = api_get_latest_flannel_tag(registry_prefix)
run(["skopeo", "copy", "-a", f"docker://registry.altlinux.org/{registry_prefix}/flannel:{flannel_tag}", f"docker://{test_registry}/{registry_prefix}/flannel:{flannel_tag}"])
if args.skip_packages is not None:
package_versions = {name: version for name, version in package_versions.items() if name not in args.skip_packages}
for pkg_name, pkg_version in package_versions.items():
os.chdir(image_forge_dir)
if pkg_name not in srpm_to_images:
continue
cmd = [
"./build.py",
"--branch", args.branch,
"--registry", "registry.altlinux.org",
"--overwrite-organization", registry_prefix,
"--skip-arches", "riscv64", "loong64",
"--skip-stage", "push",
"--log-level", "debug",
"--tasks", temp_tasks_config.name,
"-i",
]
cmd += srpm_to_images[pkg_name]
version_for_template = pkg_version[:4]
if pkg_name.startswith("coredns-for-kubernetes") or pkg_name.startswith("etcd-for-kubernetes"):
version_for_template = pkg_name[-4:]
versions_arg = {image: version_for_template for image in srpm_to_images[pkg_name]}
cmd += [
"--package-versions",
json.dumps(versions_arg),
]
run(cmd)
for image in srpm_to_images[pkg_name]:
version_template = image_to_version_template[image]
tags = []
if version_template is not None:
if isinstance(version_template, str):
tags.append(Template(version_template).render(version=pkg_version).strip())
elif isinstance(version_template, list):
for template in version_template:
tags.append(Template(template).render(version=pkg_version).strip())
else:
tags = [pkg_version]
image_name = image[4:]
for tag in tags:
run([
"podman",
"manifest",
"push",
f"registry.altlinux.org/{registry_prefix}/{image_name}:{tag}",
f"docker://{test_registry}/{registry_prefix}/{image_name}:{tag}"
])
os.chdir(tests_dir)
for pkg_name, pkg_version in package_versions.items():
if pkg_name.startswith("kubernetes"):
run(["./run.sh", args.branch, pkg_version, flannel_tag, test_registry, args.task_id, "iptables"])
if __name__ == "__main__":
main()

122
test.sh Executable file
View File

@@ -0,0 +1,122 @@
#!/bin/bash
set -efu
dry_run=0
while true; do
case "$1" in
--dry-run)
dry_run=1
shift
;;
*)
break
;;
esac
done
r()
{
if [[ $dry_run == 1 ]]; then
echo "$@"
else
"$@"
fi
}
branch=$1
task_id=$2
# kubernetes_package_versions=()
declare -A kubernetes_package_versions
api_url="https://rdb.altlinux.org/api/task/packages/$task_id"
test_registry=10.4.5.110:5000
image_forge_dir=$PWD
tests_dir=$(realpath ../kubernetes-tests)
kubernetes_images=(k8s/kube-apiserver k8s/kube-controller-manager k8s/kube-scheduler k8s/kube-proxy k8s/kubelet)
temp_tasks_config=$(mktemp)
registry_prefix=$branch
if [[ $branch == c10f2 ]]; then
registry_prefix=c10f
fi
api_response=$(curl -s "$api_url")
while read -r subtask; do
package_name=$(jq -r '.source.name' <<< "$subtask")
package_version=$(jq -r '.source.version' <<< "$subtask")
if [[ $package_name =~ ^kubernetes1\.[0-9]{2}$ ]]; then
kubernetes_package_versions[$package_name]=$package_version
elif [[ $package_name =~ ^etcd-for-kubernetes ]]; then
kubernetes_package_versions[$package_name]=$package_version
fi
done < <(jq -c '.subtasks[]' <<< "$api_response")
printf -v kubernetes_images_joined '"%s", ' "${kubernetes_images[@]}"
cat <<EOF > "$temp_tasks_config"
[$branch]
$task_id = [${kubernetes_images_joined%, }]
EOF
r podman login "$test_registry" --username admin --password 123
flannel_tag=$(curl -s "https://registry.altlinux.org/v2/$registry_prefix/flannel/tags/list" | jq -r '.tags[-1]')
r skopeo copy -a "docker://registry.altlinux.org/$registry_prefix/flannel:$flannel_tag" "docker://$test_registry/$registry_prefix/flannel:$flannel_tag"
if [[ ${!kubernetes_package_versions[*]} =~ cni-plugin-flannel ]]; then
r ./build.py \
--branch "$branch" \
--registry registry.altlinux.org \
--overwrite-organization "$registry_prefix" \
--skip-arches riscv64 loong64 \
--skip-stage push \
--log-level debug \
--tasks "$temp_tasks_config" \
-i k8s/flannel-cni-plugin
r podman manifest push "registry.altlinux.org/$registry_prefix/flannel-cni-plugin:v$version" "docker://$test_registry/$registry_prefix/$image_name:v$version"
fi
for name in "${!kubernetes_package_versions[@]}"; do
version=${kubernetes_package_versions[$name]}
images=()
versions='{'
if [[ $name =~ ^kubernetes1\.[0-9]{2}$ ]]; then
images+=("${kubernetes_images[@]}")
for image in "${kubernetes_images[@]}"; do
versions+="\"$image\":\"${version::4}\","
done
fi
if [[ $name =~ ^etcd-for-kubernetes(1\.[0-9]{2})$ ]]; then
images+=("k8s/etcd")
versions+="\"k8s/etcd\":\"${BASH_REMATCH[1]::4}\","
fi
versions="${versions%,}}"
cd "$image_forge_dir"
r ./build.py \
--branch "$branch" \
--registry registry.altlinux.org \
--overwrite-organization "$registry_prefix" \
--skip-arches riscv64 loong64 \
--skip-stage push \
--log-level debug \
--tasks "$temp_tasks_config" \
-i "${images[@]}" \
--package-versions "$versions"
for image in "${images[@]}"; do
image_name=${image:4}
r podman manifest push "registry.altlinux.org/$registry_prefix/$image_name:v$version" "docker://$test_registry/$registry_prefix/$image_name:v$version"
if [[ $image_name == etcd ]]; then
r podman manifest push "registry.altlinux.org/$registry_prefix/$image_name:v$version" "docker://$test_registry/$registry_prefix/$image_name:$version-0"
r podman manifest push "registry.altlinux.org/$registry_prefix/$image_name:v$version" "docker://$test_registry/$registry_prefix/$image_name:$version"
fi
done
done
if [[ =~ ^kubernetes1\.[0-9]{2}$ ]]; then
cd "$tests_dir"
r ./run.sh "$branch" "$version" "$flannel_tag" "$test_registry" "$task_id" iptables
fi