Compare commits

..

1 Commits

Author SHA1 Message Date
ed01a19d17 aklsjdfasdj
alksdfjlaksj
2025-01-13 15:38:09 +03:00
82 changed files with 267 additions and 509 deletions

View File

@ -3,7 +3,6 @@ on:
push: push:
tags: tags:
- '*_*' - '*_*'
- '!*_k8s'
jobs: jobs:
build-process: build-process:
@ -15,14 +14,6 @@ jobs:
repo: ${{ env.REPO }} repo: ${{ env.REPO }}
buildres: ${{ steps.build-script.outcome }} buildres: ${{ steps.build-script.outcome }}
steps: steps:
- name: Update apt
uses: actions/init-alt-env@v1
- name: Install requires
run: |
echo "apt-get install -y python3-module-tomli python3-module-jinja2 python3-module-yaml python3-module-requests podman buildah jq curl"
apt-get install -y python3-module-tomli python3-module-jinja2 python3-module-yaml python3-module-requests podman buildah jq curl
echo "apt-get install -y qemu-user-static-binfmt-aarch64 qemu-user-static-binfmt-arm qemu-user-static-binfmt-riscv qemu-user-static-binfmt-loongarch"
apt-get install -y qemu-user-static-binfmt-aarch64 qemu-user-static-binfmt-arm qemu-user-static-binfmt-riscv qemu-user-static-binfmt-loongarch
- name: Check workspace - name: Check workspace
run: | run: |
repourl=$(echo $GU | cut -d '/' -f 3) repourl=$(echo $GU | cut -d '/' -f 3)
@ -34,6 +25,23 @@ jobs:
env: env:
GU: ${{ gitea.server_url }} GU: ${{ gitea.server_url }}
GR: ${{ gitea.repository }} GR: ${{ gitea.repository }}
- name: Set repo for c10f2 (Temporary)
if: ${{ contains(github.ref_name, 'c10f2') }}
run: |
echo "event tag=${{ github.ref_name }}"
echo "10.4.0.3 update.altsp.su" >> /etc/hosts
echo "cat /etc/hosts"
cat /etc/hosts
- name: Update apt
uses: actions/init-alt-env@v1
- name: Install requires
run: |
echo "apt-get install -y python3-module-tomli python3-module-jinja2 python3-module-yaml python3-module-requests podman buildah jq curl"
apt-get install -y python3-module-tomli python3-module-jinja2 python3-module-yaml python3-module-requests podman buildah jq curl
echo "apt-get install -y qemu-user-static-binfmt-aarch64 qemu-user-static-binfmt-arm qemu-user-static-binfmt-ppc qemu-user-static-binfmt-riscv qemu-user-static-binfmt-loongarch"
apt-get install -y qemu-user-static-binfmt-aarch64 qemu-user-static-binfmt-arm qemu-user-static-binfmt-ppc qemu-user-static-binfmt-riscv qemu-user-static-binfmt-loongarch
- name: Check out current repo
uses: actions/checkout@v4
- name: Parse target branch and tag from events context, save to env - name: Parse target branch and tag from events context, save to env
env: env:
EV: ${{ toJson(gitea.event) }} EV: ${{ toJson(gitea.event) }}
@ -43,15 +51,6 @@ jobs:
org=$(echo $EV | jq '.ref' -r | sed 's/refs\/tags\///g' | cut -d '_' -f 2) org=$(echo $EV | jq '.ref' -r | sed 's/refs\/tags\///g' | cut -d '_' -f 2)
echo "ORG=$org" >> ${GITHUB_ENV} echo "ORG=$org" >> ${GITHUB_ENV}
echo "ORG=$org" echo "ORG=$org"
- name: Set repo for c10f2 (Temporary)
if: ${{ contains(github.ref_name, 'c10f2') }}
run: |
echo "event tag=${{ github.ref_name }}"
echo "10.4.0.3 update.altsp.su" >> /etc/hosts
echo "cat /etc/hosts"
cat /etc/hosts
- name: Check out current repo
uses: actions/checkout@v4
- name: Login podman gitea - name: Login podman gitea
run: | run: |
echo "podman login ${{ env.URL }}" echo "podman login ${{ env.URL }}"
@ -62,16 +61,14 @@ jobs:
- name: Run building script - name: Run building script
id: build-script id: build-script
run: | run: |
#build base with riskv64 for sisyphus if it is build_args="-b $BR -o $ORG --skip-images alt/distroless-devel"
if [[ "$BR" == "sisyphus" && "$ORG" == "base" ]]; then echo "${{ gitea.workspace }}/build.py --log-level debug -i base/base -b $BR --latest $BR --registry $BUILD_URL"; ${{ gitea.workspace }}/build.py -i base/base -b "$BR" --latest "$BR" --registry "$BUILD_URL"; fi if [[ "$BR" == "sisyphus" ]]; then arches="--arches amd64 386 arm64 loong64"; else arches="--arches amd64 386 arm64"; fi
build_args="-b $BR --log-level debug --latest $BR -o $ORG --registry $BUILD_URL --package-versions {\"alt/etcd\":\"3.5.15\"}" if [[ "$ORG" == "k8s" ]]; then build_args="$build_args --overwrite-organization $ORG-$BR --package-versions {\"k8s/kube-apiserver\":\"1.31\",\"k8s/kube-scheduler\":\"1.31\",\"k8s/kube-controller-manager\":\"1.31\",\"k8s/kube-proxy\":\"1.31\",\"k8s/coredns\":\"1.11.3\",\"k8s/kubelet\":\"1.31\"}"; fi
if [[ "$BR" == "sisyphus" ]]; then arches="--arches amd64 386 arm64 loong64 --skip-images base/base"; else arches="--arches amd64 386 arm64"; fi echo "build.py $build_args $arches"
echo "${{ gitea.workspace }}/build.py $build_args $arches"
${{ gitea.workspace }}/build.py $build_args $arches ${{ gitea.workspace }}/build.py $build_args $arches
env: env:
ORG: ${{ env.ORG }} ORG: ${{ env.ORG }}
BR: ${{ env.BRANCH }} BR: ${{ env.BRANCH }}
BUILD_URL: "gitea.basealt.ru/alt"
continue-on-error: true continue-on-error: true
- name: Send notification if build crashed - name: Send notification if build crashed
if: ${{ steps.build-script.outcome != 'success' }} if: ${{ steps.build-script.outcome != 'success' }}

View File

@ -3,43 +3,13 @@ on:
push: push:
tags: tags:
- '*_*/*_*' - '*_*/*_*'
workflow_dispatch:
inputs:
branch:
description: "Repository branch"
required: true
default: sisyphus
type: choice
options:
- sisyphus
- p11
- p10
- c10f2
organization:
description: "Group of images"
required: true
default: alt
type: choice
options:
- alt
- base
- k8s
- kubevirt
image:
description: "Image name"
required: true
type: string
version:
description: "Package version"
required: false
type: string
jobs: jobs:
build-process: build-process:
runs-on: alt-sisyphus runs-on: alt-sisyphus
outputs: outputs:
branch: ${{ inputs.branch }} branch: ${{ env.BRANCH }}
image: ${{ inputs.image }} image: ${{ env.IMAGE }}
url: ${{ env.URL }} url: ${{ env.URL }}
repo: ${{ env.REPO }} repo: ${{ env.REPO }}
buildres: ${{ steps.build-script.outcome }} buildres: ${{ steps.build-script.outcome }}
@ -83,89 +53,112 @@ jobs:
- name: Check files in the repository - name: Check files in the repository
run: | run: |
ls -a ${{ gitea.workspace }} ls -a ${{ gitea.workspace }}
- name: Parse target branch and tag from events context, save to env
env:
EV: ${{ toJson(gitea.event) }}
run: |
echo $EV | jq '.ref' -r | sed "s/refs\/tags\//BRANCH=/g" | cut -d '_' -f 1
echo $EV | jq '.ref' -r | sed "s/refs\/tags\//BRANCH=/g" | cut -d '_' -f 1 >> ${GITHUB_ENV}
localimage=$(echo $EV | jq '.ref' -r | sed 's/refs\/tags\///g' | cut -d '_' -f 2)
echo "IMAGE=$localimage" >> ${GITHUB_ENV}
echo "IMAGE=$localimage"
org=$(echo "$localimage" | cut -d '/' -f 1)
echo "ORG=$org" >> ${GITHUB_ENV}
echo "ORG=$org"
ver=$(echo $EV | jq '.ref' -r | sed 's/refs\/tags\///g' | cut -d '_' -f 3)
echo "VER=$ver" >> ${GITHUB_ENV}
echo "VER=$ver"
- name: Get test for image - name: Get test for image
run: | run: |
if test -f ${{ gitea.workspace }}/org/$IM/test; then testscript=$(cat ${{ gitea.workspace }}/org/$IM/test); else testscript=""; fi if test -f ${{ gitea.workspace }}/org/$IM/test; then testscript=$(cat ${{ gitea.workspace }}/org/$IM/test); else testscript=""; fi
echo "TEST=$testscript" >> ${GITHUB_ENV} echo "TEST=$testscript" >> ${GITHUB_ENV}
env: env:
IM: ${{ inputs.organization }}/${{ inputs.image }} IM: ${{ env.IMAGE }}
BR: ${{ inputs.branch }} BR: ${{ env.BRANCH }}
- name: Run building script - name: Run building script
id: build-script id: build-script
run: | run: |
if [[ "$IM" == *"k8s"* ]]; then k8sarg="--package-versions {\"$IM\":\"$VER\"}"; else k8sarg=""; fi if [[ "$IM" == *"k8s"* ]]; then k8sarg="--overwrite-organization $ORG-$BR --package-versions {\"$IM\":\"$VER\"}"; else k8sarg=""; fi
if [[ "$BR" == "sisyphus" ]]; then arches="--arches amd64 386 arm64 loong64"; else arches="--arches amd64 386 arm64"; fi if [[ "$BR" == "sisyphus" ]]; then arches="--arches amd64 386 arm64 loong64"; else arches="--arches amd64 386 arm64"; fi
echo "build.py -i $IM -b $BR $arches $k8sarg" echo "build.py -i $IM -b $BR $arches $k8sarg"
${{ gitea.workspace }}/build.py --skip-stages push -i $IM -b $BR $arches --latest $BR --log-level debug --registry gitea.basealt.ru/alt $k8sarg ${{ gitea.workspace }}/build.py -i $IM -b $BR $arches $k8sarg
env: env:
IM: ${{ inputs.organization }}/${{ inputs.image }} IM: ${{ env.IMAGE }}
VER: ${{ inputs.version }} VER: ${{ env.VER }}
BR: ${{ inputs.branch }} BR: ${{ env.BRANCH }}
ORG: ${{ inputs.organization }} ORG: ${{ env.ORG }}
continue-on-error: true continue-on-error: true
# - name: Send notification if build crashed - name: Send notification if build crashed
# if: ${{ steps.build-script.outcome != 'success' }} if: ${{ steps.build-script.outcome != 'success' }}
# run: | run: |
# issueid=1 issueid=1
# body="Building image $IM finish with some errors." body="Building image $IM finish with some errors."
# curl -X 'POST' "$URL/api/v1/repos/$REPO/image-forge/issues/$issueid/comments?token=$T" -H 'accept: application/json' -H 'Content-Type: application/json' -d "{ \"body\": \"$body\" }" -s curl -X 'POST' "$URL/api/v1/repos/$REPO/image-forge/issues/$issueid/comments?token=$T" -H 'accept: application/json' -H 'Content-Type: application/json' -d "{ \"body\": \"$body\" }" -s
# echo "notification about test error is sent to issue $issueid" echo "notification about test error is sent to issue $issueid"
# env: env:
# T: ${{ secrets.TOKEN }} T: ${{ secrets.TOKEN }}
# BR: ${{ inputs.branch }} BR: ${{ env.BRANCH }}
# URL: ${{ gitea.server_url }} URL: ${{ gitea.server_url }}
# REPO: ${{ env.REPO }} REPO: ${{ env.REPO }}
# IM: ${{ inputs.organization }}/${{ inputs.image }} IM: ${{ env.IMAGE }}
# EV: ${{ toJson(gitea.event) }} - name: Delete event tag
# test-process: run: |
# needs: build-process tagname=$(echo $EV | jq '.ref' -r | sed "s/refs\/tags\///g")
# if: ${{ needs.build-process.outputs.buildres == 'success' }} curl -X 'DELETE' "$URL/api/v1/repos/$REPO/image-forge/tags/$tagname?token=$T" -H 'accept: application/json' -s
# runs-on: alt-sisyphus echo "tag $tagname is deleted"
# steps: env:
# - name: Update apt T: ${{ secrets.TOKEN }}
# uses: https://gitea.basealt.ru/actions/init-alt-env@v1 BR: ${{ env.BRANCH }}
# - name: Install requires URL: ${{ gitea.server_url }}
# run: | REPO: ${{ env.REPO }}
# echo "apt-get install -y python3-module-tomli python3-module-jinja2 podman buildah curl" EV: ${{ toJson(gitea.event) }}
# apt-get install -y python3-module-tomli python3-module-jinja2 podman buildah curl test-process:
# - name: Run test needs: build-process
# id: test-script if: ${{ needs.build-process.outputs.buildres == 'success' }}
# if: ${{ needs.build-process.outputs.test != '' }} runs-on: alt-sisyphus
# continue-on-error: true steps:
# run: | - name: Update apt
# imname=$(echo "$IM" | cut -d "/" -f2) uses: https://gitea.basealt.ru/actions/init-alt-env@v1
# if [[ "$IM" == *"k8s"* ]]; then echo "skip tests for k8s images"; else podman run --rm --entrypoint="/bin/sh" $URL/$REPO/$BR/$imname:latest -c "$TEST"; fi - name: Install requires
# env: run: |
# IM: ${{ needs.build-process.outputs.image }} echo "apt-get install -y python3-module-tomli python3-module-jinja2 podman buildah curl"
# BR: ${{ needs.build-process.outputs.branch }} apt-get install -y python3-module-tomli python3-module-jinja2 podman buildah curl
# URL: ${{ needs.build-process.outputs.url }} - name: Run test
# REPO: ${{ needs.build-process.outputs.repo }} id: test-script
# TEST: ${{ needs.build-process.outputs.test }} if: ${{ needs.build-process.outputs.test != '' }}
# - name: Run special test continue-on-error: true
# id: special-test run: |
# if: ${{ needs.build-process.outputs.test == '' }} if [[ "$IM" == *"k8s"* ]]; then echo "skip tests for k8s images"; else podman run --rm --entrypoint="/bin/sh" $URL/$IM:$BR -c "$TEST"; fi
# continue-on-error: true env:
# run: | IM: ${{ needs.build-process.outputs.image }}
# imname=$(echo "$IM" | cut -d "/" -f2) BR: ${{ needs.build-process.outputs.branch }}
# if [[ $IM = 'alt/distroless-true' ]]; then podman run --rm $URL/$REPO/$BR/$imname:latest true; fi URL: ${{ needs.build-process.outputs.url }}
# if [[ $IM = 'alt/distroless-gotop' ]]; then podman run --rm $URL/$REPO/$BR/$imname:latest --version; fi REPO: ${{ needs.build-process.outputs.repo }}
# env: TEST: ${{ needs.build-process.outputs.test }}
# IM: ${{ needs.build-process.outputs.image }} - name: Run special test
# BR: ${{ needs.build-process.outputs.branch }} id: special-test
# URL: ${{ needs.build-process.outputs.url }} if: ${{ needs.build-process.outputs.test == '' }}
# REPO: ${{ needs.build-process.outputs.repo }} continue-on-error: true
# - name: Send notification if test crashed run: |
# if: ${{ steps.test-script.outcome == 'failure' || steps.special-test.outcome == 'failure' }} if [[ $IM = 'alt/distroless-true' ]]; then podman run --rm $URL/$IM:$BR true; fi
# run: | if [[ $IM = 'alt/distroless-gotop' ]]; then podman run --rm $URL/$IM:$BR --version; fi
# issueid=1 env:
# errors=$(cat errors.log) IM: ${{ needs.build-process.outputs.image }}
# body="Testing image $IM finish with some errors." BR: ${{ needs.build-process.outputs.branch }}
# curl -X 'POST' "$URL/api/v1/repos/$REPO/image-forge/issues/$issueid/comments?token=$T" -H 'accept: application/json' -H 'Content-Type: application/json' -d "{ \"body\": \"$body\" }" -s URL: ${{ needs.build-process.outputs.url }}
# echo "notification about test error is sent to issue $issueid" REPO: ${{ needs.build-process.outputs.repo }}
# env: - name: Send notification if test crashed
# T: ${{ secrets.TOKEN }} if: ${{ steps.test-script.outcome == 'failure' || steps.special-test.outcome == 'failure' }}
# BR: ${{ needs.build-process.outputs.branch }} run: |
# URL: ${{ gitea.server_url }} issueid=1
# REPO: ${{ needs.build-process.outputs.repo }} errors=$(cat errors.log)
# IM: ${{ needs.build-process.outputs.image }} body="Testing image $IM finish with some errors."
# curl -X 'POST' "$URL/api/v1/repos/$REPO/image-forge/issues/$issueid/comments?token=$T" -H 'accept: application/json' -H 'Content-Type: application/json' -d "{ \"body\": \"$body\" }" -s
echo "notification about test error is sent to issue $issueid"
env:
T: ${{ secrets.TOKEN }}
BR: ${{ needs.build-process.outputs.branch }}
URL: ${{ gitea.server_url }}
REPO: ${{ needs.build-process.outputs.repo }}
IM: ${{ needs.build-process.outputs.image }}

View File

@ -38,12 +38,10 @@ If you push to the users repository, then organiztion is your username.
If contains jinja2 template syntax, `--package-version` If contains jinja2 template syntax, `--package-version`
CLI option must be specified. CLI option must be specified.
- `version_template`: **string** or **list of strings** (OPTIONAL) - `version_template`: **string** (OPTIONAL)
Template to apply when construction the tag, template to apply when construction the tag,
`version` string variable is available in the template. `version` string variable is available in the template
If `version_template` is a list of strings, then the image wiil be tagged
with every string in the list.
### examples ### examples
@ -86,27 +84,6 @@ source_packages:
./build.py -i k8s/pause ./build.py -i k8s/pause
``` ```
#### org/alt/etcd
```yaml
is_versioned: true
version_template:
- "v{{ version }}"
- "{{ version }}"
- "{{ version }}-0"
source_packages:
- >
{% if branch in ["sisyphus", "p11"] %}
{% raw %}etcd{{ version }}{% endraw %}
{% else %}
etcd
{% endif %}
```
```bash
./build.py -b sisyphus -i alt/etcd --package-version '{"alt/etcd": "3.5.15"}'
```
## Dependencies ## Dependencies
On x86_64 machine using p10 branch you need: On x86_64 machine using p10 branch you need:
- `python3-module-tomli` - `python3-module-tomli`

111
build.py
View File

@ -3,7 +3,6 @@
import argparse import argparse
import functools import functools
import json import json
import logging
import re import re
import subprocess import subprocess
import textwrap import textwrap
@ -15,26 +14,18 @@ from pathlib import Path
import requests import requests
import tomli import tomli
import yaml import yaml
from jinja2 import Environment, BaseLoader from jinja2 import Template
logger = logging.getLogger(__name__)
ORG_DIR = Path("org") ORG_DIR = Path("org")
PKG_VERSIONS: dict | None = None PKG_VERSIONS: dict | None = None
# Jinja2 custom fail filter
def fail(message: str):
raise ValueError(message)
JINJA_ENV = Environment(loader=BaseLoader())
JINJA_ENV.filters['fail'] = fail
@dataclass @dataclass
class Image: class Image:
canonical_name: str canonical_name: str
is_versioned: bool | None is_versioned: bool | None
version_template: list[str] | str | None verion_template: str | None
source_packages: list[str] | None source_packages: list[str] | None
def __init__(self, canonical_name: str): def __init__(self, canonical_name: str):
@ -100,10 +91,12 @@ def api_get_source_package_version(branch: str, package_name: str) -> str:
params = {"branch": branch, "name": package_name} params = {"branch": branch, "name": package_name}
response = requests.get(api_url, params) response = requests.get(api_url, params)
if response.status_code != 200: if response.status_code != 200:
print(response)
api_url = "https://rdb.altlinux.org/api/site/package_versions" api_url = "https://rdb.altlinux.org/api/site/package_versions"
params = {"arch": "x86_64", "package_type": "source", "name": package_name} params = {"arch": "x86_64", "package_type": "source", "name": package_name}
response = requests.get(api_url, params) response = requests.get(api_url, params)
if response.status_code != 200: if response.status_code != 200:
print(response)
raise RuntimeError( raise RuntimeError(
f"failed to retrieve source package version: source package {package_name!r}, branch {branch!r} " f"failed to retrieve source package version: source package {package_name!r}, branch {branch!r} "
) )
@ -121,24 +114,6 @@ def api_get_source_package_version(branch: str, package_name: str) -> str:
return result["versions"][0]["version"] return result["versions"][0]["version"]
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(
f"failed to retrieve source package version from task: source package {package_name!r}, task_id {task_id}"
)
result = response.json()
for subtask in result["subtasks"]:
if subtask["source"]["name"] == package_name:
return subtask["source"]["version"]
raise RuntimeError(
f"failed to retrieve source package version from task: source package {package_name!r}, task_id {task_id}"
)
class Tags: class Tags:
def __init__(self, tags_file: str | None, latest: str): def __init__(self, tags_file: str | None, latest: str):
if tags_file is None: if tags_file is None:
@ -147,7 +122,7 @@ class Tags:
self._tags = tomli.loads(Path(tags_file).read_text()) self._tags = tomli.loads(Path(tags_file).read_text())
self._latest = latest self._latest = latest
def tags(self, branch: str, image: Image, tasks: Tasks | None = None): def tags(self, branch: str, image: Image):
if self._tags is None: if self._tags is None:
if image.is_versioned is None: if image.is_versioned is None:
tags = [branch] tags = [branch]
@ -158,7 +133,8 @@ class Tags:
package_name = image.source_packages[0] package_name = image.source_packages[0]
if re.search("{%.*%}", package_name): if re.search("{%.*%}", package_name):
package_name = JINJA_ENV.from_string(package_name).render(branch=branch).strip() package_name = Template(package_name).render(branch=branch).strip()
print(f"{package_name=}")
if re.search("{{.*}}", package_name): if re.search("{{.*}}", package_name):
if PKG_VERSIONS is None: if PKG_VERSIONS is None:
@ -176,58 +152,23 @@ class Tags:
f"invalid version for image {image.canonical_name!r}: {PKG_VERSIONS[image.canonical_name]!r}" f"invalid version for image {image.canonical_name!r}: {PKG_VERSIONS[image.canonical_name]!r}"
) )
package_name = JINJA_ENV.from_string(package_name).render( package_name = Template(package_name).render(
version=PKG_VERSIONS[image.canonical_name] version=PKG_VERSIONS[image.canonical_name]
) )
version = api_get_source_package_version(branch, package_name)
if tasks is not None:
task_ids = tasks.get(branch, image)
else:
task_ids = []
if task_ids:
logger.info(
"getting %s package version from task %s",
package_name,
task_ids[0],
)
version = api_get_source_package_version_from_task(
task_ids[0], package_name
)
else:
logger.info(
"getting %s package version from repo %s",
package_name,
branch,
)
version = api_get_source_package_version(branch, package_name)
tags = []
if image.version_template is not None: if image.version_template is not None:
if isinstance(image.version_template, str): version = (
version_tag = ( Template(image.version_template).render(version=version).strip()
JINJA_ENV.from_string(image.version_template).render(version=version).strip() )
)
tags.append(version_tag)
elif isinstance(image.version_template, list):
for v in image.version_template:
version_tag = (
JINJA_ENV.from_string(v).render(version=version).strip()
)
tags.append(version_tag)
else:
raise RuntimeError(f"expected type for version_template: 'str' or 'list[str]', got '{type(image.version_template)}' for image {image}")
else:
tags.append(version)
tags = [version]
tags.append("latest") tags.append("latest")
else: else:
version = datetime.now().strftime('%Y%m%d') version = datetime.now().strftime('%Y%m%d')
if image.version_template is not None: if image.version_template is not None:
if not isinstance(image.version_template, str):
raise RuntimeError(f"expected type for version_template: 'str', got '{type(image.version_template)}' for image {image}")
version = ( version = (
JINJA_ENV.from_string(image.version_template).render(version=version).strip() Template(image.version_template).render(version=version).strip()
) )
tags = [version] tags = [version]
tags.append("latest") tags.append("latest")
@ -408,7 +349,7 @@ class DockerBuilder:
else: else:
registry = "" registry = ""
alt_image = "alt" alt_image = "alt"
rendered = JINJA_ENV.from_string(template).render( rendered = Template(template).render(
alt_image=alt_image, alt_image=alt_image,
branch=self.branch, branch=self.branch,
install_packages=install_packages, install_packages=install_packages,
@ -514,8 +455,6 @@ class DockerBuilder:
pre_cmd = ["echo"] pre_cmd = ["echo"]
else: else:
pre_cmd = [] pre_cmd = []
logger.debug("run: %s", pre_cmd + cmd)
subprocess.run(pre_cmd + cmd, *args, **kwargs) subprocess.run(pre_cmd + cmd, *args, **kwargs)
def distroless_build(self, image: Image, arches): def distroless_build(self, image: Image, arches):
@ -713,7 +652,7 @@ class DockerBuilder:
self.images_info.skip_arches(image.canonical_name) self.images_info.skip_arches(image.canonical_name)
) )
platforms = ",".join([f"linux/{a}" for a in build_arches]) platforms = ",".join([f"linux/{a}" for a in build_arches])
tags = self.tags.tags(self.branch, image, self.tasks) tags = self.tags.tags(self.branch, image)
manifest = self.render_full_tag(image, tags[0]) manifest = self.render_full_tag(image, tags[0])
msg = "Building image {} for {} arches".format( msg = "Building image {} for {} arches".format(
@ -773,7 +712,7 @@ class DockerBuilder:
if self.images_info.skip_branch(image.canonical_name, self.branch): if self.images_info.skip_branch(image.canonical_name, self.branch):
return return
tags = self.tags.tags(self.branch, image, self.tasks) tags = self.tags.tags(self.branch, image)
manifests = [self.render_full_tag(image, t) for t in tags] manifests = [self.render_full_tag(image, t) for t in tags]
for manifest in manifests: for manifest in manifests:
@ -826,8 +765,6 @@ def parse_args():
images = [f"{o.name}/{i.name}" for o in organizations for i in o.iterdir()] images = [f"{o.name}/{i.name}" for o in organizations for i in o.iterdir()]
organizations = [o.name for o in organizations] organizations = [o.name for o in organizations]
log_levels = ["debug", "info", "warning", "error", "critical"]
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter, formatter_class=argparse.ArgumentDefaultsHelpFormatter,
) )
@ -938,12 +875,6 @@ def parse_args():
type=json.loads, type=json.loads,
help="json string where key is image name, value is the package version", help="json string where key is image name, value is the package version",
) )
parser.add_argument(
"--log-level",
default="warning",
choices=log_levels,
help="log messages above specified level",
)
args = parser.parse_args() args = parser.parse_args()
args.stages = set(args.stages) - set(args.skip_stages) args.stages = set(args.stages) - set(args.skip_stages)
@ -959,14 +890,6 @@ def main():
args = parse_args() args = parse_args()
PKG_VERSIONS = args.package_versions PKG_VERSIONS = args.package_versions
numeric_level = getattr(logging, args.log_level.upper(), logging.WARNING)
logging.basicConfig(
level=numeric_level, format="%(asctime)s - %(levelname)s\t- %(message)s"
)
logger.info("PKG_VERSIONS=%s", PKG_VERSIONS)
arches = args.arches arches = args.arches
images_info = ImagesInfo() images_info = ImagesInfo()
tags = Tags(args.tags, args.latest) tags = Tags(args.tags, args.latest)

View File

@ -1,14 +1,11 @@
["alt/distroless-toybox"] ["alt/buildpack-deps"]
skip-branches = [ "p10", "c10f2", "c10f1" ] skip-branches = [ "p9" ]
["base/distroless-toybox"] ["alt/distroless-toybox"]
skip-branches = [ "p10", "c10f2", "c10f1" ] skip-branches = [ "p10" ]
["alt/openjdk21"] ["alt/openjdk21"]
skip-arches = [ "386" ] skip-arches = [ "386" ]
["alt/ansible"] ["alt/ansible"]
skip-branches = [ "c10f2", "c10f1", "p10" ] skip-branches = [ "c10f2", "c10f1", "p10" ]
["alt/buildkit"]
skip-branches = [ "c10f1", "p10" ]

View File

@ -1,16 +0,0 @@
FROM {{ registry }}{{ branch }}/base:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="buildkit"
LABEL org.opencontainers.image.description="Concurrent, cache-efficient, and Dockerfile-agnostic builder toolkit"
LABEL org.opencontainers.image.source="https://github.com/moby/buildkit"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages(
"ca-certificates",
"buildkit"
) }}
ENTRYPOINT ["/usr/bin/buildkitd"]

View File

@ -1,6 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- buildkit
...

View File

@ -1 +0,0 @@
buildkitd --version

View File

@ -8,15 +8,7 @@ LABEL org.opencontainers.image.source="https://github.com/etcd-io/etcd"
LABEL org.opencontainers.image.licenses="Apache-2.0" LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team" LABEL org.opencontainers.image.vendor="ALT Linux Team"
{% if branch in ["sisyphus"] %}
ARG PKG_VERSION
{{ install_packages("etcd${PKG_VERSION}") }}
{% else %}
{{ install_packages("etcd") }} {{ install_packages("etcd") }}
{% endif %}
RUN ln -s /usr/sbin/etcd /usr/local/bin/etcd
VOLUME /data VOLUME /data

View File

@ -1,14 +1,6 @@
--- ---
is_versioned: true is_versioned: true
version_template: version_template: "{{ version }}"
- "v{{ version }}"
- "{{ version }}"
- "{{ version }}-0"
source_packages: source_packages:
- > - etcd
{% if branch in ["sisyphus"] %}
{% raw %}etcd{{ version }}{% endraw %}
{% else %}
etcd
{% endif %}
... ...

View File

@ -1 +1 @@
etcd --version etcdctl version

View File

@ -15,7 +15,7 @@ RUN cd /etc/nginx/sites-enabled.d && ln -s ../sites-available.d/default.conf .
RUN ln -sf /dev/stdout /var/log/nginx/access.log RUN ln -sf /dev/stdout /var/log/nginx/access.log
RUN ln -sf /dev/stderr /var/log/nginx/error.log RUN ln -sf /dev/stderr /var/log/nginx/error.log
RUN sed -Ei 's/^([[:space:]]*listen[[:space:]]+)(localhost|127.0.0.1)(:80)/\10.0.0.0\3/' \ RUN sed -Ei 's/^([[:space:]]*listen[[:space:]]+)localhost(:80)/\10.0.0.0\2/' \
/etc/nginx/sites-available.d/default.conf /etc/nginx/sites-available.d/default.conf
EXPOSE 80 EXPOSE 80

View File

@ -2,8 +2,8 @@
is_versioned: true is_versioned: true
version_template: "{{ version }}" version_template: "{{ version }}"
source_packages: source_packages:
- python3
- python3-module-setuptools - python3-module-setuptools
- python3-dev
- python3-module-pip - python3-module-pip
- gcc-defaults - gcc-defaults
... ...

View File

@ -2,7 +2,7 @@
is_versioned: true is_versioned: true
version_template: "{{ version }}" version_template: "{{ version }}"
source_packages: source_packages:
- python
- python-module-setuptools - python-module-setuptools
- python-dev
- gcc-defaults - gcc-defaults
... ...

View File

@ -0,0 +1,15 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
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"
{{ install_packages("etcd") }}
VOLUME /data
ENTRYPOINT ["/usr/sbin/etcd", "--data-dir", "/data"]

12
org/k8s/etcd/info.yaml Normal file
View File

@ -0,0 +1,12 @@
---
is_versioned: true
version_template: >
{% set version_patch = version.split(".")[2] | int %}
{% if version_patch < 16 %}
{{ version }}-0
{% else %}
v{{ version }}
{% endif %}
source_packages:
- etcd
...

1
org/k8s/etcd/test Normal file
View File

@ -0,0 +1 @@
etcd --version

View File

@ -1,18 +1,6 @@
--- ---
is_versioned: true is_versioned: true
version_template: >- version_template: v{{ version.rsplit('.', 1) | first }}-flannel{{ version.rsplit('.', 1) | last }}
{%- set version_parts = version.split('.') -%}
{%- if version_parts | length == 3 -%}
{%- if version == "1.4.0" -%}
v{{ version }}-flannel1
{%- else -%}
v{{ version }}
{%- endif %}
{%- elif version_parts | length == 4 -%}
v{{ version.rsplit('.', 1) | first }}-flannel{{ version.rsplit('.', 1) | last }}
{%- else -%}
{{ "Invalid version format: must have 3 or 4 parts" | fail }}
{%- endif %}
source_packages: source_packages:
- cni-plugin-flannel - cni-plugin-flannel
... ...

View File

@ -6,9 +6,7 @@ ARG PKG_VERSION
{{ install_packages("kubernetes${PKG_VERSION}-master") }} {{ install_packages("kubernetes${PKG_VERSION}-master") }}
RUN ln -s /usr/bin/kube-apiserver /usr/local/bin/kube-apiserver ENTRYPOINT ["/usr/bin/kube-apiserver"]
ENTRYPOINT ["/usr/local/bin/kube-apiserver"]
LABEL org.opencontainers.image.title="kube-apiserver" 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.description="The Kubernetes API server validates and configures data for the api objects which include pods, services, replicationcontrollers, and others."

View File

@ -6,9 +6,7 @@ ARG PKG_VERSION
{{ install_packages("kubernetes${PKG_VERSION}-master") }} {{ install_packages("kubernetes${PKG_VERSION}-master") }}
RUN ln -s /usr/bin/kube-controller-manager /usr/local/bin/kube-controller-manager ENTRYPOINT ["/usr/bin/kube-controller-manager"]
ENTRYPOINT ["/usr/local/bin/kube-controller-manager"]
LABEL org.opencontainers.image.title="kube-controller-manager" 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.description="The Kubernetes controller manager is a daemon that embeds the core control loops shipped with Kubernetes."

View File

@ -4,11 +4,11 @@ MAINTAINER alt-cloud
ARG PKG_VERSION ARG PKG_VERSION
{{ install_packages("kmod", "ipset", "nftables", "kubernetes${PKG_VERSION}-node") }} {{ install_packages("kubernetes${PKG_VERSION}-node") }}
RUN ln -s /usr/bin/kube-proxy /usr/local/bin/kube-proxy RUN ln -s /usr/bin/kube-proxy /usr/local/bin/kube-proxy
ENTRYPOINT ["/usr/local/bin/kube-proxy"] ENTRYPOINT ["/usr/bin/kube-proxy"]
LABEL org.opencontainers.image.title="kube-proxy" LABEL org.opencontainers.image.title="kube-proxy"
LABEL org.opencontainers.image.description="The Kubernetes network proxy runs on each node." LABEL org.opencontainers.image.description="The Kubernetes network proxy runs on each node."

View File

@ -6,9 +6,7 @@ ARG PKG_VERSION
{{ install_packages("kubernetes${PKG_VERSION}-master") }} {{ install_packages("kubernetes${PKG_VERSION}-master") }}
RUN ln -s /usr/bin/kube-scheduler /usr/local/bin/kube-scheduler ENTRYPOINT ["/usr/bin/kube-scheduler"]
ENTRYPOINT ["/usr/local/bin/kube-scheduler"]
LABEL org.opencontainers.image.title="kube-scheduler" 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.description="The Kubernetes scheduler is a control plane process which assigns Pods to Nodes."

View File

@ -4,11 +4,11 @@ MAINTAINER alt-cloud
ARG PKG_VERSION ARG PKG_VERSION
{{ install_packages("ca-certificates", "ethtool", "socat", "mount", "kubernetes${PKG_VERSION}-kubelet") }} {{ install_packages("ca-certificates", "ethtool", "socat", "kubernetes${PKG_VERSION}-kubelet") }}
RUN ln -s /usr/bin/kubelet /usr/local/bin/kubelet RUN ln -s /usr/bin/kubelet /usr/local/bin/kubelet
ENTRYPOINT ["/usr/local/bin/kubelet"] ENTRYPOINT ["/usr/bin/kubelet"]
LABEL org.opencontainers.image.title="kubelet" \ 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.description="An agent that runs on each node in the cluster. It makes sure that containers are running in a Pod." \

View File

@ -0,0 +1 @@
926

View File

@ -7,10 +7,83 @@ LABEL org.opencontainers.image.title="pause" \
org.opencontainers.image.licenses="GPLv2" \ org.opencontainers.image.licenses="GPLv2" \
org.opencontainers.image.vendor="ALT Linux Team" org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("kubernetes-pause") }} RUN cat > pause.c <<EOF
/*
Copyright 2016 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#define STRINGIFY(x) #x
#define VERSION_STRING(x) STRINGIFY(x)
#ifndef VERSION
#define VERSION HEAD
#endif
static void sigdown(int signo) {
psignal(signo, "Shutting down, got signal");
exit(0);
}
static void sigreap(int signo) {
while (waitpid(-1, NULL, WNOHANG) > 0)
;
}
int main(int argc, char **argv) {
int i;
for (i = 1; i < argc; ++i) {
if (!strcasecmp(argv[i], "-v")) {
printf("pause.c %s\n", VERSION_STRING(VERSION));
return 0;
}
}
if (getpid() != 1)
/* Not an error because pause sees use outside of infra containers. */
fprintf(stderr, "Warning: pause should be the first process\n");
if (sigaction(SIGINT, &(struct sigaction){.sa_handler = sigdown}, NULL) < 0)
return 1;
if (sigaction(SIGTERM, &(struct sigaction){.sa_handler = sigdown}, NULL) < 0)
return 2;
if (sigaction(SIGCHLD, &(struct sigaction){.sa_handler = sigreap,
.sa_flags = SA_NOCLDSTOP},
NULL) < 0)
return 3;
for (;;)
pause();
fprintf(stderr, "Error: infinite loop terminated\n");
return 42;
}
EOF
{{ install_packages("gcc", "glibc-devel-static") }}
RUN gcc $(rpm --eval %optflags) -static -DVERSION=3.9 pause.c -o pause
FROM scratch FROM scratch
COPY --from=installer /usr/bin/kubernetes-pause /pause COPY --from=installer /pause /pause
ENTRYPOINT ["/pause"] ENTRYPOINT ["/pause"]

View File

@ -1,5 +1,6 @@
--- ---
is_versioned: true is_versioned: true
version_template: "3.9"
source_packages: source_packages:
- kubernetes-pause - kubernetes-pause
... ...

View File

@ -1,16 +0,0 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="virt-api"
LABEL org.opencontainers.image.description="Kubevirt API server"
LABEL org.opencontainers.image.source="https://github.com/kubevirt/kubevirt"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("kubevirt-virt-api") }}
RUN useradd -m -d /home/virt-api -u 10001 -s /bin/bash -c "virt-api user" virt-api
USER 10001
ENTRYPOINT ["/usr/bin/virt-api"]

View File

@ -1,6 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- kubevirt
...

View File

@ -1,16 +0,0 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="virt-controller"
LABEL org.opencontainers.image.description="Controller for kubevirt"
LABEL org.opencontainers.image.source="https://github.com/kubevirt/kubevirt"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("kubevirt-virt-controller") }}
RUN useradd -m -d /home/virt-controller -u 10001 -s /bin/bash -c "virt-controller user" virt-controller
USER 10001
ENTRYPOINT ["/usr/bin/virt-controller"]

View File

@ -1,6 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- kubevirt
...

View File

@ -1,16 +0,0 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="virt-exportproxy"
LABEL org.opencontainers.image.description="Export proxy for kubevirt"
LABEL org.opencontainers.image.source="https://github.com/kubevirt/kubevirt"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("kubevirt-virt-exportproxy") }}
RUN useradd -m -d /home/virt-exportproxy -u 10001 -s /bin/bash -c "virt-exportproxy user" virt-exportproxy
USER 10001
ENTRYPOINT ["/usr/bin/virt-exportproxy"]

View File

@ -1,6 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- kubevirt
...

View File

@ -1,16 +0,0 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="virt-exportserver"
LABEL org.ope:wncontainersncontainers.image.description="Export server for kubevirt"
LABEL org.opencontainers.image.source="https://github.com/kubevirt/kubevirt"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("kubevirt-virt-exportserver") }}
RUN useradd -m -d /home/virt-exportserver -u 10001 -s /bin/bash -c "virt-exportserver user" virt-exportserver
USER 10001
ENTRYPOINT ["/usr/bin/virt-exportserver"]

View File

@ -1,6 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- kubevirt
...

View File

@ -1,21 +0,0 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="virt-handler"
LABEL org.opencontainers.image.description="Handler component for kubevirt"
LABEL org.opencontainers.image.source="https://github.com/kubevirt/kubevirt"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
RUN groupadd -f -g 107 qemu > /dev/null 2>&1 ||:
RUN useradd -g qemu -m -d /home/qemu -s /bin/bash -c "qemu user" -u 107 qemu > /dev/null 2>&1 ||:
{{ install_packages(
"kubevirt-virt-handler",
"kubevirt-container-disk"
) }}
RUN cp -f /usr/share/kube-virt/virt-handler/nsswitch.conf /etc/ && cp -f /usr/share/kube-virt/virt-handler/virt_launcher.cil /
ENTRYPOINT ["/usr/bin/virt-handle"]

View File

@ -1,6 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- kubevirt
...

View File

@ -1,30 +0,0 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="virt-launcher"
LABEL org.opencontainers.image.description="Launcher component for kubevirt"
LABEL org.opencontainers.image.source="https://github.com/kubevirt/kubevirt"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
RUN groupadd -f -g 107 qemu > /dev/null 2>&1 ||:
RUN useradd -g qemu -m -d /home/qemu -s /bin/bash -c "qemu user" -u 107 qemu > /dev/null 2>&1 ||:
{{ install_packages(
"kubevirt-virt-launcher",
"kubevirt-container-disk"
) }}
ENV DISPLAY=":0.0"
RUN export DISPLAY=":0.0"
RUN cp -f /usr/share/kube-virt/virt-launcher/virtqemud.conf /etc/libvirt/virtqemud.conf && cp -f /usr/share/kube-virt/virt-launcher/qemu.conf /etc/libvirt/qemu.conf
RUN VIRTIOFSD=$(rpm --eval '%{_libexecdir}')/virtiofsd; [ -d ${VIRTIOFSD} ] && VIRTIOFSD=${VIRTIOFSD}/virtiofsd; [ -f /usr/libexec/virtiofsd ] || (mkdir -p /usr/libexec && ln -svrt /usr/libexec ${VIRTIOFSD})
RUN setcap 'cap_net_bind_service=+ep' /usr/bin/virt-launcher && setcap 'cap_net_bind_service=+ep' /usr/bin/virt-launcher-monitor && setcap 'cap_net_bind_service=+ep' /usr/bin/qemu-system-$(uname -m) && chmod 0755 /etc/libvirt
RUN cd /var && rm -rf run && ln -s ../run .
ENTRYPOINT ["/usr/bin/virt-launcher-monitor"]

View File

@ -1,6 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- kubevirt
...

View File

@ -1,18 +0,0 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="virt-operator"
LABEL org.opencontainers.image.description="Operator component for kubevirt"
LABEL org.opencontainers.image.source="https://github.com/kubevirt/kubevirt"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("kubevirt-virt-operator") }}
EXPOSE 8443 8444
RUN useradd -m -d /home/virt-operator -u 10001 -s /bin/bash -c "virt-operator user" virt-operator
USER 10001
ENTRYPOINT ["/usr/bin/virt-operator"]

View File

@ -1,6 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- kubevirt
...