8 Commits

143 changed files with 420 additions and 1145 deletions

View File

@ -1,74 +0,0 @@
#!/usr/bin/env python3
import argparse
import json
import subprocess
vers_path = ".gitea/workflows/k8s_vers.json"
def run(args):
result = subprocess.run(
args,
capture_output = True,
text = True
)
if result.stderr is not None:
print(result.stderr)
return False
print(result.stdout)
return True
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
)
parser.add_argument(
"--branch",
help="used to pick the appropriate VM template to clone",
choices=["sisyphus", "c10f2", "p10", "p11"],
)
parser.add_argument(
"--other-build-args",
help="other build arg as a string",
)
parser.add_argument(
"--workspace",
help="workspace, path to builing script",
)
return parser.parse_args()
def main() -> None:
args = parse_args()
if args.branch is None or args.branch == "":
raise RuntimeError("Empty branch setting. Check your choise --branch.")
data = {}
with open(f"{args.workspace}/{vers_path}", "r") as f:
data = json.load(f)
i = 0
for br in data.get("branches"):
if br.get("name") == args.branch:
break
i += 1
vers_branch = data.get("branches")[i].get("versions")
if vers_branch == None :
raise RuntimeError(f"Unknown branch: {args.branch!r}. In {vers_path} no k8s-versions list.")
images_to_rebuild="k8s/kube-apiserver k8s/kube-scheduler k8s/kube-controller-manager k8s/kube-proxy k8s/kubelet k8s/coredns k8s/etcd"
for ver in vers_branch:
kube_ver = ver.get("kube-version")
dns_ver = ver.get("coredns")
if kube_ver != None and dns_ver != None:
packs_string=f"-b {args.branch} " + "--package-versions '{\"k8s/kube-apiserver\":" + f"\"{kube_ver}\",\"k8s/kube-scheduler\":\"{kube_ver}\",\"k8s/kube-controller-manager\":\"{kube_ver}\",\"k8s/kube-proxy\":\"{kube_ver}\",\"k8s/kubelet\":\"{kube_ver}\",\"k8s/coredns\":\"{dns_ver}\",\"k8s/etcd\":\"{kube_ver}\"" + "}'"
if ver.get("latest") != None and ver.get("latest"):
packs_string=f"-o k8s --latest {args.branch} "+packs_string
else:
packs_string=f"-i {images_to_rebuild} "+packs_string
subprocess.run(f"{args.workspace}/build.py {args.other_build_args} {packs_string}", shell=True)
subprocess.run("podman rmi -f --all", shell=True)
if __name__ == "__main__":
main()

View File

@ -1,72 +0,0 @@
{
"branches": [
{
"name": "p10",
"versions": [
{
"kube-version": "1.27",
"coredns": "1.10.1"
},
{
"kube-version": "1.28",
"coredns": "1.10.1",
"latest": true
}
]
},
{
"name": "p11",
"versions": [
{
"kube-version": "1.31",
"coredns": "1.11.3"
},
{
"kube-version": "1.32",
"coredns": "1.11.3"
},
{
"kube-version": "1.33",
"coredns": "1.33",
"latest": true
}
]
},
{
"name": "c10f2",
"versions": [
{
"kube-version": "1.31",
"coredns": "1.11.3"
},
{
"kube-version": "1.32",
"coredns": "1.11.3"
},
{
"kube-version": "1.33",
"coredns": "1.33",
"latest": true
}
]
},
{
"name": "sisyphus",
"versions": [
{
"kube-version": "1.31",
"coredns": "1.11.3"
},
{
"kube-version": "1.32",
"coredns": "1.11.3"
},
{
"kube-version": "1.33",
"coredns": "1.33",
"latest": true
}
]
}
]
}

View File

@ -6,46 +6,41 @@
#$4 - ${{ needs.build-process.outputs.repo }} #$4 - ${{ needs.build-process.outputs.repo }}
#$5 - ${{ gitea.workspace }} #$5 - ${{ gitea.workspace }}
branch=${1:-"sisyphus"}
org=${2:-"alt"}
url=${3:-"gitea.basealt.ru"}
repo=${4:-"alt"}
wosp=${5:-"."}
errors='' errors=''
haserr=false haserr=false
for IM in $(ls $wosp/org/$org/ | xargs) for IM in $(ls $5/org/$2/ | xargs)
do do
echo "image=$IM" echo "image=$IM"
if test -f $wosp/org/$org/$IM/test if test -f $5/org/$2/$IM/test
then then
test=$(cat $wosp/org/$org/$IM/test) test=$(cat $5/org/$2/$IM/test)
else test='' else test=''
fi fi
echo "test script=$test" echo "test script=$test"
imgpath="$repo/$branch/$IM:latest" imgpath="$2/$IM:$1"
if [[ $2 == 'k8s' ]]
then imgpath="$2-$1/$IM:latest"
fi
entrypoint='/bin/sh' entrypoint='/bin/sh'
command="echo empty_command" command="echo empty_command"
if [ -n "$test" ]; then if [[ $test != '' ]]; then
command="podman run --rm --entrypoint=\"$entrypoint\" $url/$imgpath -c \"$test\"" command="podman run --rm --entrypoint=\"$entrypoint\" $3/$imgpath -c \"$test\""
else else
if [ "$IM" = distroless-toybox ]; then if [[ $IM == 'distroless-true' ]]; then
command="podman run -q --rm $url/$imgpath toysh -c true" command="podman run --rm $3/$imgpath \"true\""
fi fi
if [ "$IM" = distroless-true ]; then if [[ $IM == 'distroless-gotop' ]]; then
command="podman run -q --rm $url/$imgpath \"true\"" command="podman run --rm $3/$imgpath \"--version\""
fi fi
if [ "$IM" = distroless-gotop ]; then if [[ $IM == 'flannel-cni-plugin' ]]; then
command="podman run -q --rm $url/$imgpath \"--version\"" command="podman run --rm $3/$imgpath \"/flannel\""
fi fi
if [ "$IM" = flannel-cni-plugin ]; then if [[ $IM == 'pause' ]]; then
command="podman run -q --rm $url/$imgpath \"/flannel\"" command="podman run --rm $3/$imgpath \"/pause\" \"-v\""
fi
if [ "$IM" == pause ]; then
command="podman run -q --rm $url/$imgpath \"/pause\" \"-v\""
fi fi
fi fi
echo $command echo $command
@ -54,18 +49,18 @@ do
echo "podman rmi --all" echo "podman rmi --all"
podman rmi --all podman rmi --all
if [ "$haserr" ] if [ "$haserr" = true ]
then then
if [[ -n $(cat $IM.log) ]] if [[ $(cat $IM.log) != '' ]]
then errors="TEST ERROR OF IMAGE $IM: $(cat $IM.log); $errors" then errors="TEST ERROR OF IMAGE $IM: $(cat $IM.log); $errors"
#else errors="TEST ERROR OF IMAGE $IM: test returned empty error, but exit status was nozero; $errors" else errors="TEST ERROR OF IMAGE $IM: test returned empty error, but exit status was nozero; $errors"
fi fi
fi fi
haserr=false haserr=false
done done
echo "$errors" echo "$errors"
if [ -n "$errors" ] if [[ $errors != '' ]]
then haserr=true then haserr=true
fi fi
echo "ERR=$haserr" > haserr.log echo "ERR=$haserr" > haserr.log

View File

@ -2,12 +2,11 @@ name: Full building alt images
on: on:
push: push:
tags: tags:
- '*_*' - '*10*_*'
- '!*_k8s'
jobs: jobs:
build-process: build-process:
runs-on: alt-sisyphus runs-on: alt-p10
outputs: outputs:
branch: ${{ env.BRANCH }} branch: ${{ env.BRANCH }}
org: ${{ env.ORG }} org: ${{ env.ORG }}
@ -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 podman buildah jq curl"
apt-get install -y python3-module-tomli python3-module-jinja2 podman buildah jq curl
echo "apt-get install -y qemu-user-static-binfmt-aarch64 qemu-user-static-binfmt-arm qemu-user-static-binfmt-ppc"
apt-get install -y qemu-user-static-binfmt-aarch64 qemu-user-static-binfmt-arm qemu-user-static-binfmt-ppc
- 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,24 +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: Check out current repo
uses: actions/checkout@v4
- name: Change vendor label for c10f
if: ${{ contains(github.ref_name, 'c10f') }}
run: |
echo "sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$ORG/*/Dockerfile.template ||:"
sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$ORG/*/Dockerfile.template ||:
echo "sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$ORG/*/distroless.toml ||:"
sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$ORG/*/distroless.toml ||:
env:
ORG: ${{ env.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: Login podman gitea - name: Login podman gitea
run: | run: |
echo "podman login ${{ env.URL }}" echo "podman login ${{ env.URL }}"
@ -71,16 +61,13 @@ 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 [[ $ORG == 'k8s' ]]; then build_args="$build_args --tags tags.toml --overwrite-organization $ORG-$BR --skip-images k8s/kube-apiserver k8s/kube-controller-manager k8s/kube-proxy k8s/kube-scheduler"; fi
build_args="-b $BR --log-level debug --latest $BR -o $ORG --registry $BUILD_URL" echo "build.py $build_args"
if [[ "$BR" == "sisyphus" ]]; then arches="--arches amd64 386 arm64 loong64 --skip-images base/base"; else arches="--arches amd64 386 arm64"; fi ${{ gitea.workspace }}/build.py $build_args
echo "${{ 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' }}
@ -107,8 +94,8 @@ jobs:
EV: ${{ toJson(gitea.event) }} EV: ${{ toJson(gitea.event) }}
test-process: test-process:
needs: build-process needs: build-process
if: ${{ needs.build-process.outputs.buildres == 'success' && needs.build-process.outputs.org != 'k8s' }} if: ${{ needs.build-process.outputs.buildres == 'success' }}
runs-on: alt-sisyphus runs-on: alt-p10
steps: steps:
- name: Update apt - name: Update apt
uses: actions/init-alt-env@v1 uses: actions/init-alt-env@v1

View File

@ -0,0 +1,133 @@
name: Full building alt images
on:
push:
tags:
- 'p11_*'
jobs:
build-process:
runs-on: alt-sisyphus
outputs:
branch: ${{ env.BRANCH }}
org: ${{ env.ORG }}
url: ${{ env.URL }}
repo: ${{ env.REPO }}
buildres: ${{ steps.build-script.outcome }}
steps:
- name: Check workspace
run: |
repourl=$(echo $GU | cut -d '/' -f 3)
echo "URL=$repourl" >> ${GITHUB_ENV}
echo $repourl
reponame=$(echo $GR | cut -d '/' -f 1)
echo "REPO=$reponame" >> ${GITHUB_ENV}
echo $reponame
env:
GU: ${{ gitea.server_url }}
GR: ${{ gitea.repository }}
- name: Set repo for p11 (Temporary)
if: ${{ contains(github.ref_name, 'p11') }}
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 podman buildah jq curl"
apt-get install -y python3-module-tomli python3-module-jinja2 podman buildah jq curl
echo "apt-get install -y qemu-user-static-binfmt-aarch64 qemu-user-static-binfmt-arm qemu-user-static-binfmt-ppc"
apt-get install -y qemu-user-static-binfmt-aarch64 qemu-user-static-binfmt-arm qemu-user-static-binfmt-ppc
- name: Check out current repo
uses: actions/checkout@v4
- 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}
org=$(echo $EV | jq '.ref' -r | sed 's/refs\/tags\///g' | cut -d '_' -f 2)
echo "ORG=$org" >> ${GITHUB_ENV}
echo "ORG=$org"
- name: Login podman gitea
run: |
echo "podman login ${{ env.URL }}"
podman login --username $P_USER --password $P_PASS ${{ env.URL }}
env:
P_USER: ${{ secrets.PODMAN_USER }}
P_PASS: ${{ secrets.PODMAN_PASS }}
- name: Run building script
id: build-script
run: |
build_args="-b $BR -o $ORG --skip-images alt/distroless-devel"
if [[ $ORG == 'k8s' ]]; then build_args="$build_args --tags tags.toml --overwrite-organization $ORG-$BR --skip-images k8s/kube-apiserver k8s/kube-controller-manager k8s/kube-proxy k8s/kube-scheduler"; fi
echo "build.py $build_args"
${{ gitea.workspace }}/build.py $build_args
env:
ORG: ${{ env.ORG }}
BR: ${{ env.BRANCH }}
continue-on-error: true
- name: Send notification if build crashed
if: ${{ steps.build-script.outcome != 'success' }}
run: |
issueid=1
body="Building images 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: ${{ env.BRANCH }}
URL: ${{ gitea.server_url }}
REPO: ${{ env.REPO }}
- name: Delete event tag
run: |
tagname=$(echo $EV | jq '.ref' -r | sed "s/refs\/tags\///g")
curl -X 'DELETE' "$URL/api/v1/repos/$REPO/image-forge/tags/$tagname?token=$T" -H 'accept: application/json' -s
echo "tag $tagname is deleted"
env:
T: ${{ secrets.TOKEN }}
BR: ${{ env.BRANCH }}
URL: ${{ gitea.server_url }}
REPO: ${{ env.REPO }}
EV: ${{ toJson(gitea.event) }}
test-process:
needs: build-process
if: ${{ needs.build-process.outputs.buildres == 'success' }}
runs-on: alt-sisyphus
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 podman buildah jq curl"
apt-get install -y python3-module-tomli python3-module-jinja2 podman buildah jq curl
- name: Check out current repo
uses: https://gitea.com/actions/checkout@v4
- name: Test
id: test-script
continue-on-error: true
run: |
$WS/.gitea/workflows/testscript $BR $ORG $URL $REPO $WS
cat haserr.log >> ${GITHUB_ENV}
echo "test process finished"
env:
BR: ${{ needs.build-process.outputs.branch }}
ORG: ${{ needs.build-process.outputs.org }}
URL: ${{ needs.build-process.outputs.url }}
REPO: ${{ needs.build-process.outputs.repo }}
WS: ${{ gitea.workspace }}
- name: Send notification if test crashed
if: ${{ env.ERR == 'true' || steps.test-script.outcome == 'failure' }}
run: |
issueid=1
errors=$(cat errors.log)
body="Testing images finish with some errors. $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 }}

View File

@ -2,7 +2,7 @@ name: Full building alt images
on: on:
push: push:
tags: tags:
- "*_k8s" - 'sisyphus_*'
jobs: jobs:
build-process: build-process:
@ -25,21 +25,16 @@ 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 - name: Update apt
uses: actions/init-alt-env@v1 uses: actions/init-alt-env@v1
- name: Install requires - name: Install requires
run: | run: |
echo "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 python3-module-tomli python3-module-jinja2 podman buildah jq curl"
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 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" echo "apt-get install -y qemu-user-static-binfmt-aarch64 qemu-user-static-binfmt-arm qemu-user-static-binfmt-ppc"
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-ppc
- 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) }}
@ -49,17 +44,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: Check out current repo
uses: actions/checkout@v4
- name: Change vendor label for c10f
if: ${{ contains(github.ref_name, 'c10f') }}
run: |
echo "sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$ORG/*/Dockerfile.template ||:"
sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$ORG/*/Dockerfile.template ||:
echo "sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$ORG/*/distroless.toml ||:"
sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$ORG/*/distroless.toml ||:
env:
ORG: ${{ env.ORG }}
- name: Login podman gitea - name: Login podman gitea
run: | run: |
echo "podman login ${{ env.URL }}" echo "podman login ${{ env.URL }}"
@ -70,14 +54,13 @@ jobs:
- name: Run building script - name: Run building script
id: build-script id: build-script
run: | run: |
if [[ "$BR" == "sisyphus" ]]; then arches="--arches amd64 386 arm64 loong64"; else arches="--arches amd64 386 arm64"; fi build_args="-b $BR -o $ORG --skip-images alt/distroless-devel"
build_args="--registry $BUILD_URL $arches" if [[ $ORG == 'k8s' ]]; then build_args="$build_args --tags tags.toml --overwrite-organization $ORG-$BR --skip-images k8s/kube-apiserver k8s/kube-controller-manager k8s/kube-proxy k8s/kube-scheduler"; fi
#run build script echo "build.py $build_args"
${{ gitea.workspace }}/.gitea/workflows/k8s_buildscript.py --branch "$BR" --other-build-args "$build_args" --workspace "${{ gitea.workspace }}" ${{ gitea.workspace }}/build.py $build_args
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' }}
@ -102,3 +85,42 @@ jobs:
URL: ${{ gitea.server_url }} URL: ${{ gitea.server_url }}
REPO: ${{ env.REPO }} REPO: ${{ env.REPO }}
EV: ${{ toJson(gitea.event) }} EV: ${{ toJson(gitea.event) }}
test-process:
needs: build-process
if: ${{ needs.build-process.outputs.buildres == 'success' }}
runs-on: alt-sisyphus
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 podman buildah jq curl"
apt-get install -y python3-module-tomli python3-module-jinja2 podman buildah jq curl
- name: Check out current repo
uses: https://gitea.com/actions/checkout@v4
- name: Test
id: test-script
continue-on-error: true
run: |
$WS/.gitea/workflows/testscript $BR $ORG $URL $REPO $WS
cat haserr.log >> ${GITHUB_ENV}
echo "test process finished"
env:
BR: ${{ needs.build-process.outputs.branch }}
ORG: ${{ needs.build-process.outputs.org }}
URL: ${{ needs.build-process.outputs.url }}
REPO: ${{ needs.build-process.outputs.repo }}
WS: ${{ gitea.workspace }}
- name: Send notification if test crashed
if: ${{ env.ERR == 'true' || steps.test-script.outcome == 'failure' }}
run: |
issueid=1
errors=$(cat errors.log)
body="Testing images finish with some errors. $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 }}

View File

@ -2,11 +2,11 @@ name: Building alt images
on: on:
push: push:
tags: tags:
- '*_*/*_*' - '*_*/*'
jobs: jobs:
build-process: build-process:
runs-on: alt-sisyphus runs-on: alt-latest
outputs: outputs:
branch: ${{ env.BRANCH }} branch: ${{ env.BRANCH }}
image: ${{ env.IMAGE }} image: ${{ env.IMAGE }}
@ -37,10 +37,10 @@ jobs:
uses: actions/init-alt-env@v1 uses: actions/init-alt-env@v1
- name: Install requires - name: Install requires
run: | run: |
echo "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 python3-module-tomli python3-module-jinja2 podman buildah jq curl"
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 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" echo "apt-get install -y qemu-user-static-binfmt-aarch64 qemu-user-static-binfmt-arm qemu-user-static-binfmt-ppc"
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
- name: Check out current repo - name: Check out current repo
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Login podman gitea - name: Login podman gitea
@ -65,18 +65,6 @@ jobs:
org=$(echo "$localimage" | cut -d '/' -f 1) org=$(echo "$localimage" | cut -d '/' -f 1)
echo "ORG=$org" >> ${GITHUB_ENV} echo "ORG=$org" >> ${GITHUB_ENV}
echo "ORG=$org" 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: Change vendor label for c10f
if: ${{ contains(github.ref_name, 'c10f') }}
run: |
echo "sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$ORG/*/Dockerfile.template ||:"
sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$ORG/*/Dockerfile.template ||:
echo "sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$ORG/*/distroless.toml ||:"
sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$ORG/*/distroless.toml ||:
env:
ORG: ${{ env.ORG }}
- 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
@ -87,13 +75,11 @@ jobs:
- 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="--tags=tags.toml --overwrite-organization $ORG-$BR"; else k8sarg=""; 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"
echo "build.py -i $IM -b $BR $arches $k8sarg" ${{ gitea.workspace }}/build.py -i $IM -b $BR $k8sarg
${{ gitea.workspace }}/build.py -i $IM -b $BR $arches --latest $BR --log-level debug --registry gitea.basealt.ru/alt $k8sarg
env: env:
IM: ${{ env.IMAGE }} IM: ${{ env.IMAGE }}
VER: ${{ env.VER }}
BR: ${{ env.BRANCH }} BR: ${{ env.BRANCH }}
ORG: ${{ env.ORG }} ORG: ${{ env.ORG }}
continue-on-error: true continue-on-error: true
@ -124,7 +110,7 @@ jobs:
test-process: test-process:
needs: build-process needs: build-process
if: ${{ needs.build-process.outputs.buildres == 'success' }} if: ${{ needs.build-process.outputs.buildres == 'success' }}
runs-on: alt-sisyphus runs-on: alt-latest
steps: steps:
- name: Update apt - name: Update apt
uses: https://gitea.basealt.ru/actions/init-alt-env@v1 uses: https://gitea.basealt.ru/actions/init-alt-env@v1
@ -137,8 +123,7 @@ jobs:
if: ${{ needs.build-process.outputs.test != '' }} if: ${{ needs.build-process.outputs.test != '' }}
continue-on-error: true continue-on-error: true
run: | run: |
imname=$(echo "$IM" | cut -d "/" -f2) if [[ "$IM" == *"k8s"* ]]; then echo "skip tests for k8s images"; else podman run --rm --entrypoint="/bin/sh" $URL/$IM:$BR -c "$TEST"; fi
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
env: env:
IM: ${{ needs.build-process.outputs.image }} IM: ${{ needs.build-process.outputs.image }}
BR: ${{ needs.build-process.outputs.branch }} BR: ${{ needs.build-process.outputs.branch }}
@ -150,9 +135,8 @@ jobs:
if: ${{ needs.build-process.outputs.test == '' }} if: ${{ needs.build-process.outputs.test == '' }}
continue-on-error: true continue-on-error: true
run: | run: |
imname=$(echo "$IM" | cut -d "/" -f2) if [[ $IM = 'alt/distroless-true' ]]; then podman run --rm $URL/$IM:$BR true; fi
if [[ $IM = 'alt/distroless-true' ]]; then podman run --rm $URL/$REPO/$BR/$imname:latest true; fi if [[ $IM = 'alt/distroless-gotop' ]]; then podman run --rm $URL/$IM:$BR --version; fi
if [[ $IM = 'alt/distroless-gotop' ]]; then podman run --rm $URL/$REPO/$BR/$imname:latest --version; fi
env: env:
IM: ${{ needs.build-process.outputs.image }} IM: ${{ needs.build-process.outputs.image }}
BR: ${{ needs.build-process.outputs.branch }} BR: ${{ needs.build-process.outputs.branch }}

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,28 +84,10 @@ source_packages:
./build.py -i k8s/pause ./build.py -i k8s/pause
``` ```
#### org/k8s/etcd
```yaml
is_versioned: true
version_template:
- "v{{ version }}"
- "{{ version }}"
- "{{ version }}-0"
source_packages:
- etcd-for-kubernetes{{ version }}
```
```bash
./build.py -b sisyphus -i k8s/etcd --package-version '{"k8s/etcd": "1.32"}'
```
## 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`
- `python3-module-jinja2` - `python3-module-jinja2`
- `python3-module-yaml`
- `python3-module-requests`
- `qemu-user-static-binfmt-aarch64` to build for arm64 architecture - `qemu-user-static-binfmt-aarch64` to build for arm64 architecture
- `qemu-user-static-binfmt-arm` to build for arm architecture - `qemu-user-static-binfmt-arm` to build for arm architecture
- `qemu-user-static-binfmt-ppc` to build for ppc64le architecture - `qemu-user-static-binfmt-ppc` to build for ppc64le architecture

197
build.py
View File

@ -3,42 +3,29 @@
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
from datetime import datetime
from dataclasses import dataclass from dataclasses import dataclass
from graphlib import TopologicalSorter from graphlib import TopologicalSorter
from pathlib import Path from pathlib import Path
from typing import Optional, Union
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__)
clean_images_counter = 0
clean_images_limit_count = 5
ORG_DIR = Path("org") ORG_DIR = Path("org")
PKG_VERSIONS: Optional[dict] = 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: Optional[bool] is_versioned: bool | None
version_template: Union[list[str], str, None] verion_template: str | None
source_packages: Optional[list[str]] source_packages: list[str] | None
def __init__(self, canonical_name: str): def __init__(self, canonical_name: str):
self.canonical_name = canonical_name self.canonical_name = canonical_name
@ -103,18 +90,7 @@ 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:
api_url = "https://rdb.altlinux.org/api/site/package_versions" print(response)
params = {"arch": "x86_64", "package_type": "source", "name": package_name}
response = requests.get(api_url, params)
if response.status_code != 200:
raise RuntimeError(
f"failed to retrieve source package version: source package {package_name!r}, branch {branch!r} "
)
result = response.json()
for v in result["versions"]:
if v["branch"] == branch:
return v["version"]
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} "
) )
@ -124,43 +100,23 @@ 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: Optional[str], latest: str): def __init__(self, tags_file: str | None, latest: str):
if tags_file is None: if tags_file is None:
self._tags = None self._tags = None
else: else:
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: Optional[Tasks] = 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 and image.source_packages:
tags = [branch]
if branch == self._latest:
tags.append("latest")
elif image.is_versioned and image.source_packages:
package_name = image.source_packages[0] package_name = image.source_packages[0]
context_version = "" if re.search("{%.*%}", package_name):
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:
raise RuntimeError( raise RuntimeError(
@ -177,68 +133,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}"
) )
context_version = PKG_VERSIONS[image.canonical_name] package_name = Template(package_name).render(
version=PKG_VERSIONS[image.canonical_name]
if re.search("{%.*%}", package_name) or re.search("{{.*}}", package_name):
package_name = JINJA_ENV.from_string(package_name).render(
branch=branch,
version=context_version,
) )
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_tag = (
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.append("latest")
else:
version = datetime.now().strftime('%Y%m%d')
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") else:
tags = [branch]
else: else:
tags = self._tags[image.canonical_name][branch].copy() tags = self._tags[image.canonical_name][branch].copy()
if branch == self._latest:
tags.append("latest")
return tags return tags
@ -281,10 +192,6 @@ class Distroless:
elif value := dd.get("workingdir"): elif value := dd.get("workingdir"):
self.config_options.append(f"--workingdir={value}") self.config_options.append(f"--workingdir={value}")
if labels := dd.get("label"):
for k, v in labels.items():
self.config_options.append(f"--label={k}={v}")
def render_arch_branch(self, arch, branch): def render_arch_branch(self, arch, branch):
def if_arches(arches, value, default=""): def if_arches(arches, value, default=""):
if arch in arches or not arches: if arch in arches or not arches:
@ -331,10 +238,9 @@ class DockerBuilder:
def make_image_re(self): def make_image_re(self):
registry = r"(?P<registry>[\w.:]+)" registry = r"(?P<registry>[\w.:]+)"
organization = r"(?P<organization>\w+)" organization = r"(?P<organization>\w+)"
branch = r"(?P<branch>\w+)"
name = r"(?P<name>[-.\w]+)" name = r"(?P<name>[-.\w]+)"
tag = r"(?P<tag>[\w.]+)" tag = r"(?P<tag>[\w.]+)"
return rf"(:?{registry}/)?(:?{organization}/)?(:?{branch}/)?{name}(:?:{tag})?" return rf"(:?{registry}/)?(:?{organization}/)?{name}(:?:{tag})?"
def make_dockerfile_from_re(self): def make_dockerfile_from_re(self):
image_re = self.make_image_re() image_re = self.make_image_re()
@ -362,7 +268,7 @@ class DockerBuilder:
if overwrite_organization: if overwrite_organization:
self.overwrite_organization = overwrite_organization self.overwrite_organization = overwrite_organization
else: else:
self.overwrite_organization = branch self.overwrite_organization = organization
self.latest = latest self.latest = latest
self.dry_run = dry_run self.dry_run = dry_run
self.images_info = images_info self.images_info = images_info
@ -409,17 +315,16 @@ class DockerBuilder:
) -> str: ) -> str:
if self.registry: if self.registry:
registry = self.registry.rstrip("/") + "/" registry = self.registry.rstrip("/") + "/"
alt_image = "alt" alt_image = "alt/alt"
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,
organization=organization, organization=organization,
registry=registry, registry=registry,
pkg_versions=PKG_VERSIONS,
**kwargs, **kwargs,
) )
@ -484,7 +389,7 @@ class DockerBuilder:
from_image = match.groupdict() from_image = match.groupdict()
if from_image["name"] != "scratch": if from_image["name"] != "scratch":
requires.add( requires.add(
f"{self.organization}/{from_image['name']}" f"{from_image['organization']}/{from_image['name']}"
) )
elif distrolessfile.exists(): elif distrolessfile.exists():
requires.add("alt/distroless-builder") requires.add("alt/distroless-builder")
@ -493,7 +398,7 @@ class DockerBuilder:
if match := re.match(self.image_re, from_): if match := re.match(self.image_re, from_):
from_image = match.groupdict() from_image = match.groupdict()
if from_image["name"] != "scratch": if from_image["name"] != "scratch":
requires.add(f"{self.organization}/{from_image['name']}") requires.add(f"{from_image['organization']}/{from_image['name']}")
return (canonical_name, requires) return (canonical_name, requires)
@ -520,14 +425,12 @@ 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):
def distroless_build_arch(arch, manifest): def distroless_build_arch(arch, manifest):
distroless_builder = self.render_full_tag( distroless_builder = self.render_full_tag(
Image("alt/distroless-builder"), "latest" Image("alt/distroless-builder"), self.branch
) )
distroless = self.distrolesses[image.canonical_name] distroless = self.distrolesses[image.canonical_name]
distroless.render_arch_branch(arch, self.branch) distroless.render_arch_branch(arch, self.branch)
@ -668,7 +571,7 @@ class DockerBuilder:
build_arches = set(arches) - set( build_arches = set(arches) - set(
self.images_info.skip_arches(image.canonical_name) self.images_info.skip_arches(image.canonical_name)
) )
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(
@ -719,7 +622,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(
@ -779,7 +682,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:
@ -797,24 +700,6 @@ class DockerBuilder:
self.run(cmd) 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: class ImagesInfo:
def __init__(self): def __init__(self):
@ -844,14 +729,12 @@ class ImagesInfo:
def parse_args(): def parse_args():
stages = ["build", "remove_dockerfiles", "render_dockerfiles", "push"] stages = ["build", "remove_dockerfiles", "render_dockerfiles", "push"]
arches = ["amd64", "386", "arm64", "loong64", "riscv64"] arches = ["amd64", "386", "arm64"]
branches = ["p11", "p10", "sisyphus", "c10f1", "c10f2"] branches = ["p11", "p10", "sisyphus", "c10f1", "c10f2"]
organizations = list(ORG_DIR.iterdir()) organizations = list(ORG_DIR.iterdir())
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,
) )
@ -962,12 +845,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)
@ -983,14 +860,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,8 @@
["base/distroless-toybox"] ["alt/buildpack-deps"]
skip-branches = [ "p10", "c10f2", "c10f1" ] skip-branches = [ "p9" ]
["alt/openjdk21"] ["alt/openjdk21"]
skip-arches = [ "386" ] skip-arches = [ "386" ]
["alt/zot"]
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,4 +1,4 @@
FROM {{ registry }}{{ branch }}/node:latest FROM {{ registry }}{{ organization }}/node:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

@ -1,8 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- ansible-core
- ansible-vim
- ansible-lint
...

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

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

View File

@ -0,0 +1,7 @@
FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud
{{ install_packages("glibc-gconv-modules", "glibc-locales", "tzdata") }}
CMD ["bash"]

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

@ -1,9 +1,8 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="buildpack-deps-curl" LABEL org.opencontainers.image.title="buildpack-deps-curl"
LABEL org.opencontainers.image.description = "Transfer data environment"
LABEL org.opencontainers.image.licenses="GPLv2" LABEL org.opencontainers.image.licenses="GPLv2"
LABEL org.opencontainers.image.vendor="ALT Linux Team" LABEL org.opencontainers.image.vendor="ALT Linux Team"

View File

@ -1,10 +1,9 @@
FROM {{ registry }}{{ branch }}/buildpack-deps-curl:latest FROM {{ registry }}{{ organization }}/buildpack-deps-curl:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="buildpack-deps-scm" LABEL org.opencontainers.image.title="buildpack-deps-scm"
LABEL org.opencontainers.image.licenses="GPLv2" LABEL org.opencontainers.image.licenses="GPLv2"
LABEL org.opencontainers.image.description = "Software configuration management environment"
LABEL org.opencontainers.image.vendor="ALT Linux Team" LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages( {{ install_packages(

View File

@ -1,9 +1,8 @@
FROM {{ registry }}{{ branch }}/buildpack-deps-scm:latest FROM {{ registry }}{{ organization }}/buildpack-deps-scm:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="buildpack-deps" LABEL org.opencontainers.image.title="buildpack-deps"
LABEL org.opencontainers.image.description = "Projects building environment"
LABEL org.opencontainers.image.licenses="GPLv2" LABEL org.opencontainers.image.licenses="GPLv2"
LABEL org.opencontainers.image.vendor="ALT Linux Team" LABEL org.opencontainers.image.vendor="ALT Linux Team"

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/base:latest FROM {{ registry }}{{ organization }}/base:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

@ -1,4 +1,4 @@
from = "{{ registry }}{{ branch }}/distroless-static:latest" from = "{{ registry }}{{ organization }}/distroless-static:{{ branch }}"
builder-install-packages = [ builder-install-packages = [
"glibc-core", "glibc-core",
'{{if_branches(["p10"], "glibc-nss")}}', '{{if_branches(["p10"], "glibc-nss")}}',
@ -19,4 +19,3 @@ packages = [
"zlib", "zlib",
] ]
timezone = "Europe/Moscow" timezone = "Europe/Moscow"
label = {"org.opencontainers.image.title" = "distroless-base", "org.opencontainers.image.description" = "Base image for running dynamically linked programs", "org.opencontainers.image.licenses" = "GPLv2", "org.opencontainers.image.vendor" = "ALT Linux Team"}

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

@ -1,4 +1,4 @@
from = "{{ registry }}{{ branch }}/distroless-base:latest" from = "{{ registry }}{{ organization }}/distroless-base:{{ branch }}"
builder-install-packages = [ builder-install-packages = [
"coreutils", "coreutils",
"findutils", "findutils",
@ -37,4 +37,3 @@ packages = [
"vim-console", "vim-console",
] ]
cmd = ["/bin/bash"] cmd = ["/bin/bash"]
label = {"org.opencontainers.image.title" = "distroless-devel", "org.opencontainers.image.description" = "Base image for creating and debugging distroless images", "org.opencontainers.image.licenses" = "GPLv2", "org.opencontainers.image.vendor" = "ALT Linux Team"}

View File

@ -0,0 +1,3 @@
from = "{{ registry }}{{ organization }}/distroless-base:{{ branch }}"
full-files = ["/usr/bin/gotop"]
entrypoint = ["/usr/bin/gotop"]

View File

@ -0,0 +1,4 @@
from = "scratch"
file-lists = ["static.list"]
user = "nonroot"
workdir = "/home/nonroot"

View File

@ -0,0 +1,3 @@
from = "{{ registry }}{{ organization }}/distroless-static:{{ branch }}"
files = ["/bin/true"]
cmd = ["/bin/true"]

View File

@ -0,0 +1,15 @@
FROM {{ registry }}{{ alt_image }}:{{ branch }}
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"]

13
org/alt/etcd/README.md Normal file
View File

@ -0,0 +1,13 @@
dockerfiles-alt-etcd
=========================
ALT dockerfile for etcd.
Copy Dockerfile somewhere and build the image:
`$ docker build --rm -t <username>/etcd.`
And launch the etcd container:
`docker run -d -v <etcd data dir>:/data <username>/etcd`
If etcdclt watnted it could be run via:
`docker run --entrypoint etcdctl <username>/etcd`

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

@ -0,0 +1 @@
etcdctl version

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/base:latest FROM {{ registry }}{{ organization }}/base:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud
@ -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

@ -1,8 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- nginx
- apache2
- tzdata
...

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/buildpack-deps:latest FROM {{ registry }}{{ organization }}/buildpack-deps:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

@ -1,7 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- node
- yarn
...

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/base:latest FROM {{ registry }}{{ organization }}/base:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/base:latest FROM {{ registry }}{{ organization }}/base:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud
@ -8,14 +8,7 @@ LABEL org.opencontainers.image.source="https://github.com/php/php-src"
LABEL org.opencontainers.image.licenses="PHP-3.01" LABEL org.opencontainers.image.licenses="PHP-3.01"
LABEL org.opencontainers.image.vendor="ALT Linux Team" LABEL org.opencontainers.image.vendor="ALT Linux Team"
{% if branch == 'p10' %}
{{ install_packages( {{ install_packages(
"php8.2", "php8.2",
"php8.2-xdebug", "php8.2-xdebug",
) }} ) }}
{% else %}
{{ install_packages(
"php8.3",
"php8.3-xdebug",
) }}
{% endif %}

View File

@ -1,11 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- >
{%- if branch in [ "p10", "c10f1", "c10f2"] -%}
php8.2
{%- else -%}
php8.3
{%- endif -%}
...

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/base:latest FROM {{ registry }}{{ organization }}/base:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/base:latest FROM {{ registry }}{{ organization }}/base:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

@ -1,9 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- python3
- python3-module-setuptools
- python3-module-pip
- gcc-defaults
...

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/base:latest FROM {{ registry }}{{ organization }}/base:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

@ -1,8 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- python
- python-module-setuptools
- gcc-defaults
...

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/base:latest FROM {{ registry }}{{ organization }}/base:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

@ -1,11 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- >
{%- if branch in ["p10", "c10f2", "c10f1"] -%}
ruby
{%- else -%}
gem-irb
{%- endif -%}
...

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/base:latest FROM {{ registry }}{{ organization }}/base:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

@ -1,8 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- unit
- curl
- tzdata
...

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud MAINTAINER alt-cloud

View File

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

View File

@ -1,12 +0,0 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="base"
LABEL org.opencontainers.image.description="Base image with localization and timezone packages"
LABEL org.opencontainers.image.licenses="GPLv2"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("glibc-gconv-modules", "glibc-locales", "tzdata") }}
CMD ["bash"]

View File

@ -1,7 +0,0 @@
---
is_versioned: false
version_template: "{{ version }}"
source_packages:
- glibc
- tzdata
...

View File

@ -1,9 +0,0 @@
---
is_versioned: false
version_template: "{{ version }}"
source_packages:
- ca-certificates
- curl
- gnupg
- wget
...

View File

@ -1,10 +0,0 @@
---
is_versioned: false
version_template: "{{ version }}"
source_packages:
- git
- mercurial
- openssh
- procps
- subversion
...

View File

@ -1,6 +0,0 @@
---
is_versioned: false
version_template: "{{ version }}"
source_packages:
- gcc-defaults
...

View File

@ -1,17 +0,0 @@
---
is_versioned: false
version_template: "{{ version }}"
source_packages:
- gcc-defaults
- vim
- gdb
- git
- iproute2
- iputils
- wget
- curl
- lsof
- ripgrep
- zsh
- make
...

View File

@ -1,9 +0,0 @@
---
is_versioned: false
version_template: "{{ version }}"
source_packages:
- glibc
- tzdata
- zlib
- libselinux
...

View File

@ -1,7 +0,0 @@
---
is_versioned: false
version_template: "{{ version }}"
source_packages:
- glibc
- apt-repo
...

View File

@ -1,10 +0,0 @@
---
is_versioned: false
version_template: "{{ version }}"
source_packages:
- coreutils
- findutils
- glibc
- iproute2
- vim
...

View File

@ -1,4 +0,0 @@
from = "{{ registry }}{{ branch }}/distroless-base:latest"
full-files = ["/usr/bin/gotop"]
entrypoint = ["/usr/bin/gotop"]
label = {"org.opencontainers.image.title" = "distroless-gotop", "org.opencontainers.image.description" = "Gotop image", "org.opencontainers.image.licenses" = "GPLv2", "org.opencontainers.image.vendor" = "ALT Linux Team"}

Some files were not shown because too many files have changed in this diff Show More