4 Commits

270 changed files with 1991 additions and 2527 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,66 +6,76 @@
#$4 - ${{ needs.build-process.outputs.repo }} #$4 - ${{ needs.build-process.outputs.repo }}
#$5 - ${{ gitea.workspace }} #$5 - ${{ gitea.workspace }}
branch=${1:-"sisyphus"} BR=${1:-"p10"}
org=${2:-"alt"} ORG=${2:-"base"}
url=${3:-"gitea.basealt.ru"} URL=${3:-"gitea.basealt.ru"}
repo=${4:-"alt"} REPO=${4:-"alt"}
wosp=${5:-"."} WS=${5:-"image-forge"}
errors='' errors=''
haserr=false haserr=false
for IM in $(ls $wosp/org/$org/ | xargs) for IM in $(ls $WS/org/$ORG/ | xargs)
do do
echo "image=$IM" echo "image=$IM"
if test -f $wosp/org/$org/$IM/test imgpath="$REPO/$BR/$IM:$BR"
then command=''
test=$(cat $wosp/org/$org/$IM/test) testpath="$WS/org/$ORG/$IM/test.yaml"
else test='' if test -f $testpath
fi then
entrypoint=''
testep=$(cat $testpath | yq '.entrypoint' -r 2> /dev/null)
if [[ $testep != '' ]]; then entrypoint="--entrypoint=\"$testep\""; fi
echo "test script=$test" testcom=$(cat $testpath | yq '.command' -r 2> /dev/null)
imgpath="$repo/$branch/$IM:latest" if [[ $testcom != '' ]]
then command="podman run --rm $entrypoint $URL/$imgpath -c \"$testcom\""
entrypoint='/bin/sh' else echo "test command is not found"
fi
command="echo empty_command" else echo "test file is not found"
if [ -n "$test" ]; then
command="podman run --rm --entrypoint=\"$entrypoint\" $url/$imgpath -c \"$test\""
else
if [ "$IM" = distroless-toybox ]; then
command="podman run -q --rm $url/$imgpath toysh -c true"
fi
if [ "$IM" = distroless-true ]; then
command="podman run -q --rm $url/$imgpath \"true\""
fi
if [ "$IM" = distroless-gotop ]; then
command="podman run -q --rm $url/$imgpath \"--version\""
fi
if [ "$IM" = flannel-cni-plugin ]; then
command="podman run -q --rm $url/$imgpath \"/flannel\""
fi
if [ "$IM" == pause ]; then
command="podman run -q --rm $url/$imgpath \"/pause\" \"-v\""
fi
fi fi
echo $command echo "result test command: $command"
eval $command 2>$IM.log || haserr=true eval $command 2>$IM.log || haserr=true
if [ "$haserr" = false ]
then
echo "start change tag for $IM"
if [[ $ORG != 'base' ]]
then
package=$(podman images --filter reference=$URL/$imgpath --format='{{ json .Labels }}' | jq '."org.opencontainers.image.title"' -r 2> /dev/null)
if [[ $package != '' ]]
then
tag=$(podman run --rm --entrypoint="/bin/sh" $URL/$imgpath -c "rpm -qa --qf \"%{VERSION}\n\" $package" 2> /dev/null)
else
echo "not found package name in images labels"
fi
else
then tag=$(date +"%Y%m%d")
fi
if [[ $tag != '' ]]
then
skopeo copy -a docker://$URL/$imgpath:$BR docker://$URL/$imgpath:$tag
scopeo delete docker://$URL/$imgpath:$BR
echo "tag is updated"
else echo "new tag is empty and is not sent to repository"
fi
else
if [[ $(cat $IM.log) != '' ]]
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"
fi
fi
echo "podman rmi --all" echo "podman rmi --all"
podman rmi --all podman rmi --all
if [ "$haserr" ]
then
if [[ -n $(cat $IM.log) ]]
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"
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

@ -3,11 +3,13 @@ on:
push: push:
tags: tags:
- '*_*' - '*_*'
- '!*_k8s' tags-ignore:
- '*_k8s'
- 'sisyphus_*'
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 +17,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,28 +28,6 @@ jobs:
env: env:
GU: ${{ gitea.server_url }} GU: ${{ gitea.server_url }}
GR: ${{ gitea.repository }} GR: ${{ gitea.repository }}
- 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: 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 ||:
echo "sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$ORG/*/info.yaml ||:"
sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$ORG/*/info.yaml ||:
env:
ORG: ${{ env.ORG }}
- name: Set repo for c10f2 (Temporary) - name: Set repo for c10f2 (Temporary)
if: ${{ contains(github.ref_name, 'c10f2') }} if: ${{ contains(github.ref_name, 'c10f2') }}
run: | run: |
@ -63,26 +35,41 @@ jobs:
echo "10.4.0.3 update.altsp.su" >> /etc/hosts echo "10.4.0.3 update.altsp.su" >> /etc/hosts
echo "cat /etc/hosts" echo "cat /etc/hosts"
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 - name: Login podman gitea
run: | run: |
echo "podman login ${{ env.URL }}" echo "podman login ${{ env.URL }}"
podman login --username $P_USER --password $P_PASS ${{ env.URL }} podman login --username $P_USER --password $P_PASS ${{ env.URL }}
env: env:
P_USER: ${{ secrets.PODMAN_USER }} P_USER: ${{ secrets.PODMAN_USER }}
P_PASS: ${{ secrets.PODMAN_PASS }} P_PASS: ${{ secrets.PODMAN_PASS }}
- name: Run building script - name: Run standart 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 base/distroless-devel --overwrite-organization $BR --registry $URL/$BR"
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 echo "build.py $build_args"
build_args="-b $BR --log-level debug --latest $BR -o $ORG --registry $BUILD_URL" ${{ gitea.workspace }}/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
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' }}
@ -100,7 +87,7 @@ jobs:
run: | run: |
tagname=$(echo $EV | jq '.ref' -r | sed "s/refs\/tags\///g") 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 curl -X 'DELETE' "$URL/api/v1/repos/$REPO/image-forge/tags/$tagname?token=$T" -H 'accept: application/json' -s
echo "tag $tagname is deleted" echo "tag $tagname is deleted"
env: env:
T: ${{ secrets.TOKEN }} T: ${{ secrets.TOKEN }}
BR: ${{ env.BRANCH }} BR: ${{ env.BRANCH }}
@ -109,18 +96,25 @@ 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
- name: Install requires - name: Install requires
run: | run: |
echo "apt-get install -y python3-module-tomli python3-module-jinja2 podman buildah jq curl" echo "apt-get install -y python3-module-tomli python3-module-jinja2 podman buildah skopeo jq yq curl"
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 - name: Check out current repo
uses: https://gitea.com/actions/checkout@v4 uses: https://gitea.com/actions/checkout@v4
- name: Test - name: Login podman gitea
run: |
echo "podman login ${{ env.URL }}"
podman login --username $P_USER --password $P_PASS ${{ needs.build-process.outputs.url }}
env:
P_USER: ${{ secrets.PODMAN_USER }}
P_PASS: ${{ secrets.PODMAN_PASS }}
- name: Test images and update tags
id: test-script id: test-script
continue-on-error: true continue-on-error: true
run: | run: |

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,61 +25,42 @@ 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: Parse target branch and tag from events context, save to env - name: Check out current repo
uses: actions/checkout@v4
- name: Parse target branch and tag from events context, save to env
env: env:
EV: ${{ toJson(gitea.event) }} EV: ${{ toJson(gitea.event) }}
run: | 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
echo $EV | jq '.ref' -r | sed "s/refs\/tags\//BRANCH=/g" | cut -d '_' -f 1 >> ${GITHUB_ENV} 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) 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 ||:
echo "sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$ORG/*/info.yaml ||:"
sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$ORG/*/info.yaml ||:
env:
ORG: ${{ env.ORG }}
- name: Login podman gitea - name: Login podman gitea
run: | run: |
echo "podman login ${{ env.URL }}" echo "podman login ${{ env.URL }}"
podman login --username $P_USER --password $P_PASS ${{ env.URL }} podman login --username $P_USER --password $P_PASS ${{ env.URL }}
env: env:
P_USER: ${{ secrets.PODMAN_USER }} P_USER: ${{ secrets.PODMAN_USER }}
P_PASS: ${{ secrets.PODMAN_PASS }} P_PASS: ${{ secrets.PODMAN_PASS }}
- 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' }}
@ -97,10 +78,49 @@ jobs:
run: | run: |
tagname=$(echo $EV | jq '.ref' -r | sed "s/refs\/tags\///g") 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 curl -X 'DELETE' "$URL/api/v1/repos/$REPO/image-forge/tags/$tagname?token=$T" -H 'accept: application/json' -s
echo "tag $tagname is deleted" echo "tag $tagname is deleted"
env: env:
T: ${{ secrets.TOKEN }} T: ${{ secrets.TOKEN }}
BR: ${{ env.BRANCH }} BR: ${{ env.BRANCH }}
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

@ -1,177 +0,0 @@
name: Building alt images
on:
push:
tags:
- '*_*/*_*'
jobs:
build-process:
runs-on: alt-sisyphus
outputs:
branch: ${{ env.BRANCH }}
image: ${{ env.IMAGE }}
url: ${{ env.URL }}
repo: ${{ env.REPO }}
buildres: ${{ steps.build-script.outcome }}
test: ${{ env.TEST }}
steps:
- name: Check workspace
run: |
repourl=$(echo $GU | cut -d '/' -f 3)
echo "URL=$repourl" >> ${GITHUB_ENV}
echo "URL=$repourl"
reponame=$(echo $GR | cut -d '/' -f 1)
echo "REPO=$reponame" >> ${GITHUB_ENV}
echo "REPO=$reponame"
env:
GU: ${{ gitea.server_url }}
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: 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: Check files in the repository
run: |
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: 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 ||:
echo "sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$ORG/*/info.yaml ||:"
sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$ORG/*/info.yaml ||:
env:
ORG: ${{ env.ORG }}
- name: Get test for image
run: |
if test -f ${{ gitea.workspace }}/org/$IM/test; then testscript=$(cat ${{ gitea.workspace }}/org/$IM/test); else testscript=""; fi
echo "TEST=$testscript" >> ${GITHUB_ENV}
env:
IM: ${{ env.IMAGE }}
BR: ${{ env.BRANCH }}
- name: Run building script
id: build-script
run: |
if [[ "$IM" == *"k8s"* ]]; then k8sarg="--package-versions {\"$IM\":\"$VER\"}"; 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 $arches $k8sarg"
${{ gitea.workspace }}/build.py -i $IM -b $BR $arches --latest $BR --log-level debug --registry gitea.basealt.ru/alt $k8sarg
env:
IM: ${{ env.IMAGE }}
VER: ${{ env.VER }}
BR: ${{ env.BRANCH }}
ORG: ${{ env.ORG }}
continue-on-error: true
- name: Send notification if build crashed
if: ${{ steps.build-script.outcome != 'success' }}
run: |
issueid=1
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
echo "notification about test error is sent to issue $issueid"
env:
T: ${{ secrets.TOKEN }}
BR: ${{ env.BRANCH }}
URL: ${{ gitea.server_url }}
REPO: ${{ env.REPO }}
IM: ${{ env.IMAGE }}
- 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: https://gitea.basealt.ru/actions/init-alt-env@v1
- name: Install requires
run: |
echo "apt-get install -y python3-module-tomli python3-module-jinja2 podman buildah curl"
apt-get install -y python3-module-tomli python3-module-jinja2 podman buildah curl
- name: Run test
id: test-script
if: ${{ needs.build-process.outputs.test != '' }}
continue-on-error: true
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/$REPO/$BR/$imname:latest -c "$TEST"; fi
env:
IM: ${{ needs.build-process.outputs.image }}
BR: ${{ needs.build-process.outputs.branch }}
URL: ${{ needs.build-process.outputs.url }}
REPO: ${{ needs.build-process.outputs.repo }}
TEST: ${{ needs.build-process.outputs.test }}
- name: Run special test
id: special-test
if: ${{ needs.build-process.outputs.test == '' }}
continue-on-error: true
run: |
imname=$(echo "$IM" | cut -d "/" -f2)
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/$REPO/$BR/$imname:latest --version; fi
env:
IM: ${{ needs.build-process.outputs.image }}
BR: ${{ needs.build-process.outputs.branch }}
URL: ${{ needs.build-process.outputs.url }}
REPO: ${{ needs.build-process.outputs.repo }}
- name: Send notification if test crashed
if: ${{ steps.test-script.outcome == 'failure' || steps.special-test.outcome == 'failure' }}
run: |
issueid=1
errors=$(cat errors.log)
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

@ -26,88 +26,9 @@ the organization `<ORGANIZATION>`, run:
``` ```
If you push to the users repository, then organiztion is your username. If you push to the users repository, then organiztion is your username.
## info.yaml format
- `is_versioned`: **bool** (REQUIRED)
Whether to use package version as a tag for this image
- `source_packages`: **list of strings** (REQUIRED)
List of source packages (src.rpm) this image depends on.
If contains jinja2 template syntax, `--package-version`
CLI option must be specified.
- `version_template`: **string** or **list of strings** (OPTIONAL)
Template to apply when construction the tag,
`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
#### org/k8s/flannel-cni-plugin
```yaml
is_versioned: true
version_template: v{{ version.rsplit('.', 1) | first }}-flannel{{ version.rsplit('.', 1) | last }}
source_packages:
- cni-plugin-flannel
```
```bash
./build.py -i k8s/flannel-cni-plugin
```
#### org/k8s/kube-apiserver
```yaml
is_versioned: true
version_template: v{{ version }}
source_packages:
- kubernetes{{ version }}
```
```bash
./build.py -b sisyphus -i k8s/kube-apiserver --package-version '{"k8s/kube-apiserver": "1.31"}'
```
#### org/k8s/pause
```yaml
is_versioned: true
source_packages:
- kubernetes-pause
```
```bash
./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-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

330
build.py
View File

@ -3,81 +3,28 @@
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 graphlib import TopologicalSorter from graphlib import TopologicalSorter
from pathlib import Path from pathlib import Path
from typing import Optional, Union
import requests
import tomli import tomli
import yaml from jinja2 import Template
from jinja2 import Environment, BaseLoader
logger = logging.getLogger(__name__)
ORG_DIR = Path("org") ORG_DIR = Path("org")
PKG_VERSIONS: Optional[dict] = None
# Jinja2 custom fail filter
def fail(message: str):
raise ValueError(message)
JINJA_ENV = Environment(loader=BaseLoader())
JINJA_ENV.filters['fail'] = fail
@dataclass
class Image: class Image:
canonical_name: str def __init__(self, canonical_name):
is_versioned: Optional[bool]
version_template: Union[list[str], str, None]
source_packages: Optional[list[str]]
annotations: Optional[dict[str, str]]
def __init__(self, canonical_name: str):
self.canonical_name = canonical_name self.canonical_name = canonical_name
self.path = ORG_DIR / canonical_name self.path = ORG_DIR / canonical_name
self.base_name = re.sub("^[^/]+/", "", canonical_name) self.base_name = re.sub("^[^/]+/", "", canonical_name)
info_file = self.path / "info.yaml" def __str__(self):
if not info_file.exists(): return (f'Image(canonical_name="{self.canonical_name}", '
self.is_versioned = None f'path="{self.path}", base_name="{self.base_name}")')
self.source_packages = None
self.annotations = None
return
info: dict = yaml.safe_load(info_file.read_text())
if "is_versioned" not in info:
raise RuntimeError(
f"info.yaml for {self.canonical_name} doesn't contain 'is_versioned' key"
)
if "source_packages" not in info:
raise RuntimeError(
f"info.yaml for {self.canonical_name} doesn't contain 'source_packages' key"
)
self.is_versioned = info["is_versioned"]
self.source_packages = info["source_packages"]
if self.is_versioned and not self.source_packages:
raise RuntimeError(
f"source_packages for {self.canonical_name} doesn't contain any values"
)
self.version_template = None
if "version_template" in info:
self.version_template = info["version_template"]
self.annotations = None
if "annotations" in info:
self.annotations = info["annotations"]
class Tasks: class Tasks:
@ -101,163 +48,23 @@ class Tasks:
if image.canonical_name in i or len(i) == 0 if image.canonical_name in i or len(i) == 0
] ]
class AltAPIError(Exception):
pass
def api_get_source_package_version(branch: str, package_name: str) -> str:
api_url = "https://rdb.altlinux.org/api/site/package_versions_from_tasks"
params = {"branch": branch, "name": package_name}
response = requests.get(api_url, params)
if response.status_code != 200:
api_url = "https://rdb.altlinux.org/api/site/package_versions"
params = {"arch": "x86_64", "package_type": "source", "name": package_name}
response = requests.get(api_url, params)
if response.status_code != 200:
raise AltAPIError(
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 AltAPIError(
f"failed to retrieve source package version: source package {package_name!r}, branch {branch!r} "
)
result = response.json()
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 AltAPIError(
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 AltAPIError(
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, latest):
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()) tags_file = Path(tags_file)
self._tags = tomli.loads(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, image: Image):
if self._tags is None: if self._tags is None:
if image.is_versioned is None: tags = [branch]
tags = [branch]
if branch == self._latest:
tags.append("latest")
elif image.is_versioned and image.source_packages:
package_name = image.source_packages[0]
context_version = ""
if re.search("{{.*}}", package_name):
if PKG_VERSIONS is None:
raise RuntimeError(
f"--package-versions option is not specified, required for {image.canonical_name!r}"
)
if image.canonical_name not in PKG_VERSIONS:
raise RuntimeError(
f"--package-versions option does not contain version for image {image.canonical_name!r}"
)
if not PKG_VERSIONS[image.canonical_name]:
raise RuntimeError(
f"invalid version for image {image.canonical_name!r}: {PKG_VERSIONS[image.canonical_name]!r}"
)
context_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,
)
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],
)
try:
version = api_get_source_package_version_from_task(
task_ids[0], package_name
)
except AltAPIError:
logger.warning(
"failed getting %s package version from task %s",
package_name,
task_ids[0],
)
logger.info(
"getting %s package version from repo %s",
package_name,
branch,
)
version = api_get_source_package_version(branch, package_name)
else:
logger.info(
"getting %s package version from repo %s",
package_name,
branch,
)
version = api_get_source_package_version(branch, package_name)
tags = []
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 = (
JINJA_ENV.from_string(image.version_template).render(version=version).strip()
)
tags = [version]
tags.append("latest")
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
@ -300,10 +107,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:
@ -350,10 +153,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()
@ -381,7 +183,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
@ -428,17 +230,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,
) )
@ -503,7 +304,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")
@ -512,7 +313,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)
@ -539,17 +340,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 run_with_result(self, cmd):
return subprocess.run(cmd, stdout=subprocess.PIPE).stdout.decode('utf-8')
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)
@ -690,7 +486,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(
@ -741,7 +537,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(
@ -784,34 +580,6 @@ class DockerBuilder:
f"--platform={platforms}", f"--platform={platforms}",
".", ".",
] ]
if image.annotations is not None:
build_cmd = [
"podman",
"build",
"--rm",
"--force-rm",
f"--manifest={manifest}",
f"--platform={platforms}"
]
for akey, avalue in image.annotations.items():
build_cmd.append(
f"--annotation={akey}={avalue}")
d = datetime.now()
build_cmd.append(f"--annotation=org.opencontainers.image.created={d.isoformat("T") + "Z"}")
ver = next((tag for tag in tags if tag != 'latest'), '')
if ver != '':
build_cmd.append(f"--annotation=org.opencontainers.image.version={ver}")
build_cmd.append(".")
if PKG_VERSIONS is not None and image.canonical_name in PKG_VERSIONS:
build_cmd.insert(
-1, f"--build-arg=PKG_VERSION={PKG_VERSIONS[image.canonical_name]}"
)
self.run(build_cmd, cwd=image.path) self.run(build_cmd, cwd=image.path)
for tag in tags[1:]: for tag in tags[1:]:
@ -819,12 +587,11 @@ class DockerBuilder:
tag_cmd = ["podman", "tag", manifest, other_manifest] tag_cmd = ["podman", "tag", manifest, other_manifest]
self.run(tag_cmd) self.run(tag_cmd)
def podman_push(self, image: Image, sign=None): def podman_push(self, image: Image, sign=None):
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:
@ -843,7 +610,6 @@ class DockerBuilder:
self.run(cmd) self.run(cmd)
class ImagesInfo: class ImagesInfo:
def __init__(self): def __init__(self):
info = {} info = {}
@ -872,14 +638,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 = ["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,
) )
@ -985,21 +749,6 @@ def parse_args():
choices=stages, choices=stages,
help="list of stages to skip", help="list of stages to skip",
) )
parser.add_argument(
"--package-versions",
type=json.loads,
help="json string where key is image name, value is the package version",
)
parser.add_argument(
"--clean-images-limit",
help="remove all the images in the container storage when number of images hits the limit",
)
parser.add_argument(
"--log-level",
default="warning",
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)
@ -1011,20 +760,7 @@ def parse_args():
def main(): def main():
global PKG_VERSIONS
args = parse_args() args = parse_args()
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)
clean_images_counter = 0
arches = args.arches arches = args.arches
images_info = ImagesInfo() images_info = ImagesInfo()
tags = Tags(args.tags, args.latest) tags = Tags(args.tags, args.latest)
@ -1046,7 +782,6 @@ def main():
if "render_dockerfiles" in args.stages: if "render_dockerfiles" in args.stages:
db.render_dockerfiles() db.render_dockerfiles()
db.load_distrolesses() db.load_distrolesses()
for image in db.get_build_order(): for image in db.get_build_order():
if image.canonical_name not in args.images: if image.canonical_name not in args.images:
continue continue
@ -1060,23 +795,6 @@ def main():
if "push" in args.stages: if "push" in args.stages:
db.podman_push(image, args.sign) db.podman_push(image, args.sign)
if args.clean_images_limit is not None:
if clean_images_counter >= args.clean_images_limit:
cmd = [
"podman",
"rmi",
"--all",
"-f",
]
db.run(cmd,
check=False,
stderr=subprocess.DEVNULL,
stdout=subprocess.DEVNULL,
)
clean_images_counter = 0
else:
clean_images_counter += 1
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@ -1,14 +1,65 @@
["base/distroless-toybox"] ["alt/buildpack-deps"]
skip-branches = [ "p10", "c10f2", "c10f1" ] skip-branches = [ "p9" ]
["alt/openjdk21"] ["alt/distroless-base"]
skip-arches = [ "386" ] skip-branches = [ "p9" ]
["alt/zot"] ["alt/distroless-builder"]
skip-arches = [ "386" ] skip-branches = [ "p9" ]
["alt/ansible"] ["alt/distroless-devel"]
skip-branches = [ "c10f2", "c10f1", "p10" ] skip-branches = [ "p9" ]
["alt/buildkit"] ["alt/distroless-gotop"]
skip-branches = [ "c10f1", "p10" ] skip-branches = [ "p9" ]
["alt/distroless-static"]
skip-branches = [ "p9" ]
["alt/distroless-true"]
skip-branches = [ "p9" ]
["alt/gitea"]
skip-branches = [ "p9" ]
["alt/node"]
skip-branches = [ "p9" ]
["alt/unit"]
skip-branches = [ "p9" ]
["alt/prometheus"]
skip-branches = [ "p9" ]
["alt/registry"]
skip-branches = [ "p9" ]
["k8s/cert-manager-cainjector"]
skip-branches = [ "p9" ]
["k8s/cert-manager-controller"]
skip-branches = [ "p9" ]
["k8s/cert-manager-webhook"]
skip-branches = [ "p9" ]
["k8s/coredns"]
skip-branches = [ "p9" ]
["k8s/etcd"]
skip-branches = [ "p9" ]
["k8s/kube-apiserver"]
skip-branches = [ "p9" ]
["k8s/kube-controller-manager"]
skip-branches = [ "p9" ]
["k8s/kube-proxy"]
skip-branches = [ "p9" ]
["k8s/kube-scheduler"]
skip-branches = [ "p9" ]
["k8s/pause"]
skip-branches = [ "p9" ]

View File

@ -1,17 +0,0 @@
FROM {{ registry }}{{ branch }}/node:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="ansible"
LABEL org.opencontainers.image.description="A radically simple IT automation system"
LABEL org.opencontainers.image.source="http://www.ansible.com"
LABEL org.opencontainers.image.licenses="GPL-3.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages(
"ansible-vim",
"ansible-core",
"ansible-lint"
) }}
WORKDIR /etc/ansible/playbooks

View File

@ -1,17 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- ansible-core
- ansible-vim
- ansible-lint
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'http://www.ansible.com'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'ansible'
org.opencontainers.image.description: 'A radically simple IT automation system'
org.opencontainers.image.licenses: GPL-3.0
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
ansible --version

View File

@ -1,15 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- apache2
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'http://httpd.apache.org'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'apache2'
org.opencontainers.image.description: 'The most widely used Web server on the Internet'
org.opencontainers.image.licenses: Apache-2.0
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
apachectl -v

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,15 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- buildkit
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://github.com/moby/buildkit'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'buildkit'
org.opencontainers.image.description: 'Concurrent, cache-efficient, and Dockerfile-agnostic builder toolkit'
org.opencontainers.image.licenses: Apache-2.0
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

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

View File

@ -1,15 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- gitea
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://github.com/go-gitea/gitea'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'gitea'
org.opencontainers.image.description: 'Git with a cup of tea, painless self-hosted git service'
org.opencontainers.image.licenses: MIT
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
gitea --version

View File

@ -1,11 +0,0 @@
FROM {{ registry }}{{ branch }}/base:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="golang"
LABEL org.opencontainers.image.description="The Golang environment for development"
LABEL org.opencontainers.image.source="https://github.com/golang/go"
LABEL org.opencontainers.image.licenses="BSD"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("golang") }}

View File

@ -1,15 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- golang
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://github.com/golang/go'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'golang'
org.opencontainers.image.description: 'The Golang environment for development'
org.opencontainers.image.licenses: BSD
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
go version

View File

@ -1,22 +0,0 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="grafana"
LABEL org.opencontainers.image.description="Metrics dashboard and graph editor"
LABEL org.opencontainers.image.source="https://github.com/grafana/grafana"
LABEL org.opencontainers.image.licenses="AGPL-3.0-only AND Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("grafana") }}
USER grafana
EXPOSE 3000
VOLUME ["/var/lib/grafana"]
ENV GF_PATHS_PROVISIONING=/etc/grafana/provisioning
ENV GF_AUTH_ANONYMOUS_ENABLED=true
ENV GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
ENTRYPOINT [ "/usr/bin/grafana" ]
CMD [ "server", "--config=/etc/grafana/grafana.ini", "--homepath=/usr/share/grafana", "--packaging=docker", "-configOverrides='cfg:default.paths.provisioning=/etc/grafana/provisioning cfg:default.paths.data=/var/lib/grafana cfg:default.paths.logs=/var/log/grafana cfg:default.paths.plugins=/var/lib/grafana/plugins'" ]

View File

@ -1,6 +0,0 @@
# Prometheus image
Command for run:
```
docker run -d --name="grafana" -p 3000:3000 -v grafana-data:/var/lib/grafana IMAGENAME
```

View File

@ -1,15 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- grafana
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://github.com/grafana/grafana'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'grafana'
org.opencontainers.image.description: 'Metrics dashboard and graph editor'
org.opencontainers.image.licenses: 'AGPL-3.0-only AND Apache-2.0'
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
grafana --version

View File

@ -1,19 +0,0 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="loki"
LABEL org.opencontainers.image.description="Like Prometheus, but for logs"
LABEL org.opencontainers.image.source="https://github.com/grafana/loki"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("loki") }}
USER _loki:_loki
VOLUME ["/var/lib/loki", "/etc/loki/loki.yml"]
EXPOSE 3100
ENTRYPOINT ["/usr/bin/loki"]
CMD ["-config.file=/etc/loki/loki.yaml"]

View File

@ -1,6 +0,0 @@
# Prometheus image
Command for run:
```
docker run -d --name="loki" -p 3100:3100 -v loki-data:/var/lib/loki -v loki-config:/etc/loki/loki.yaml IMAGENAME
```

View File

@ -1,15 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- loki
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://github.com/grafana/loki'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'loki'
org.opencontainers.image.description: 'Like Prometheus, but for logs'
org.opencontainers.image.licenses: Apache-2.0
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
loki -version -config.file=/etc/loki/loki.yaml

View File

@ -1,17 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- nginx
- apache2
- tzdata
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://nginx.org/'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'nginx'
org.opencontainers.image.description: 'Fast HTTP server, extremely useful as an Apache frontend'
org.opencontainers.image.licenses: BSD
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
nginx -v

View File

@ -1,16 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- node
- yarn
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://github.com/nodejs/node'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'node'
org.opencontainers.image.description: 'Evented I/O for V8 Javascript'
org.opencontainers.image.licenses: MIT
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
node -v

View File

@ -1,14 +0,0 @@
FROM {{ registry }}{{ branch }}/base:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="openjdk21"
LABEL org.opencontainers.image.description="OpenJDK 21 Runtime Environment"
LABEL org.opencontainers.image.source="https://openjdk-sources.osci.io"
LABEL org.opencontainers.image.licenses="Apache-1.1 and Apache-2.0 and BSD and BSD with advertising and GPL-2.0 and GPL-2.0 with exceptions and IJG and LGPL-2.0+ and MIT and MPL-2.0 and ALT-Public-Domain and W3C and Zlib and ISC and FTL and RSA-MD"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages(
"java-21-openjdk",
"java-21-openjdk-devel"
) }}

View File

@ -1,15 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- java-21-openjdk
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://openjdk-sources.osci.io'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'openjdk21'
org.opencontainers.image.description: 'OpenJDK 21 Runtime Environment'
org.opencontainers.image.licenses: 'Apache-1.1 and Apache-2.0 and BSD and BSD with advertising and GPL-2.0 and GPL-2.0 with exceptions and IJG and LGPL-2.0+ and MIT and MPL-2.0 and ALT-Public-Domain and W3C and Zlib and ISC and FTL and RSA-MD'
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
javac --version && java --version

View File

@ -1,21 +0,0 @@
FROM {{ registry }}{{ branch }}/base:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="php"
LABEL org.opencontainers.image.description="The PHP language environment for development"
LABEL org.opencontainers.image.source="https://github.com/php/php-src"
LABEL org.opencontainers.image.licenses="PHP-3.01"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{% if branch == 'p10' %}
{{ install_packages(
"php8.2",
"php8.2-xdebug",
) }}
{% else %}
{{ install_packages(
"php8.3",
"php8.3-xdebug",
) }}
{% endif %}

View File

@ -1,20 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- >
{%- if branch in [ "p10", "c10f1", "c10f2"] -%}
php8.2
{%- else -%}
php8.3
{%- endif -%}
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://github.com/php/php-src'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'php'
org.opencontainers.image.description: 'The PHP language environment for development'
org.opencontainers.image.licenses: PHP-3.01
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
php --version

View File

@ -1,20 +0,0 @@
FROM {{ registry }}{{ branch }}/base:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="postgresql16"
LABEL org.opencontainers.image.description="PostgreSQL rograms and libraries"
LABEL org.opencontainers.image.source="https://github.com/postgres/postgres"
LABEL org.opencontainers.image.licenses="PostgreSQL"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("postgresql16","postgresql16-server") }}
RUN usermod -a -G postgres postgres
RUN chown -R postgres:postgres /var/lib/pgsql
USER postgres
WORKDIR /var/lib/pgsql
EXPOSE 5432
VOLUME [ "/var/lib/pgsql/data" ]

View File

@ -1,16 +0,0 @@
dockerfiles-alt-postgresql
==========================
ALT dockerfile for postgresql.
Copy Dockerfile somewhere and build the image:
`$ docker build --rm -t <username>/postgresql .`
And launch the rabbitmq-server container:
`docker run -d -p 5432:5432 --name="postgresql" -v pgsql-data:/var/lib/pgsql/data IMAGENAME`
First steps to start service and create db:
`/usr/bin/initdb /var/lib/pgsql/data`
`/usr/bin/pg_ctl -D /var/lib/pgsql/data -l logfile start`
`/usr/bin/createdb mydb`
`psql mydb`

View File

@ -1,15 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- postgresql16
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://github.com/postgres/postgres'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'postgresql16'
org.opencontainers.image.description: 'PostgreSQL rograms and libraries'
org.opencontainers.image.licenses: PostgreSQL
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
pg_ctl --version

View File

@ -1,20 +0,0 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="prometheus-alertmanager"
LABEL org.opencontainers.image.description="The Alertmanager handles alerts sent by client applications"
LABEL org.opencontainers.image.source="https://github.com/prometheus/alertmanager"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("prometheus-alertmanager") }}
WORKDIR /var/lib/prometheus/alertmanager
RUN useradd -r -u 10001 alertmanager
RUN usermod -a -G prometheus alertmanager
USER alertmanager
EXPOSE 9093
VOLUME [ "/var/lib/prometheus/alertmanager" ]
ENTRYPOINT [ "/usr/bin/prometheus/alertmanager" ]
CMD [ "--config.file=/etc/prometheus/alertmanager.yml" ]

View File

@ -1,11 +0,0 @@
# Prometheus alertmanager image
Command for run:
```
docker run -d --name="alertmanager" -p 9093:9093 -v promdata-am:/var/lib/prometheus/alertmanager IMAGENAME
```
*If you want to be able to view services on localhost, instead of -p, specify the flag:
```
--network="host"
```

View File

@ -1,15 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- prometheus-alertmanager
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://github.com/prometheus/alertmanager'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'prometheus-alertmanager'
org.opencontainers.image.description: 'The Alertmanager handles alerts sent by client applications'
org.opencontainers.image.licenses: Apache-2.0
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
alertmanager --version

View File

@ -1,19 +0,0 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="prometheus-node_exporter"
LABEL org.opencontainers.image.description="Prometheus exporter for hardware and OS metrics exposed by *NIX kernels"
LABEL org.opencontainers.image.source="https://github.com/prometheus/node_exporter"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("prometheus-node_exporter") }}
WORKDIR /var/lib/prometheus/node-exporter
RUN useradd -r -u 10001 node_exporter
RUN usermod -a -G prometheus node_exporter
USER node_exporter
EXPOSE 9100
VOLUME [ "/var/lib/prometheus/node-exporter" ]
ENTRYPOINT [ "/usr/bin/prometheus-node_exporter" ]

View File

@ -1,11 +0,0 @@
# Prometheus node_exporter image
Command for run:
```
docker run -d --name="prometheus-node_exporter" -p 9100:9100 -v promdata-ne:/var/lib/prometheus/node-exporter IMAGENAME
```
*If you want to be able to view services on localhost, instead of -p, specify the flag:
```
--network="host"
```

View File

@ -1,15 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- prometheus-node_exporter
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://github.com/prometheus/node_exporter'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'prometheus-node_exporter'
org.opencontainers.image.description: 'Prometheus exporter for hardware and OS metrics exposed by *NIX kernels'
org.opencontainers.image.licenses: Apache-2.0
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
node_exporter --version

View File

@ -1,15 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- prometheus
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://github.com/prometheus/prometheus'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'prometheus'
org.opencontainers.image.description: 'Prometheus monitoring system and time series database'
org.opencontainers.image.licenses: Apache-2.0
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
prometheus --version

View File

@ -1,18 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- python3
- python3-module-setuptools
- python3-module-pip
- gcc-defaults
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://github.com/python/cpython'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'python'
org.opencontainers.image.description: 'Python 3 and tools needed for development'
org.opencontainers.image.licenses: Python
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
python3 --version

View File

@ -1,17 +0,0 @@
FROM {{ registry }}{{ branch }}/base:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="python"
LABEL org.opencontainers.image.description="Python 2 and tools needed for development"
LABEL org.opencontainers.image.source="https://www.python.org/downloads/source"
LABEL org.opencontainers.image.licenses="Python-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages(
"python-module-setuptools",
"python-dev",
"gcc",
) }}
CMD ["python2"]

View File

@ -1,13 +0,0 @@
dockerfiles-alt-python
=======================
ALT dockerfile for python.
Image contains python(2) and tools to get upstream python modules. Main purpose
of the image is to run python apps using upstream modules.
Copy Dockerfile somewhere and build the image:
`$ docker build --rm -t <image_name> .`
And launch the python container:
`docker run -it <image_name>`

View File

@ -1,17 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- python
- python-module-setuptools
- gcc-defaults
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://www.python.org/downloads/source'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'python'
org.opencontainers.image.description: 'Python 2 and tools needed for development'
org.opencontainers.image.licenses: Python-2.0
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
python2 --version

View File

@ -1,19 +0,0 @@
FROM {{ registry }}{{ branch }}/base:latest
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="rabbitmq"
LABEL org.opencontainers.image.description="The RabbitMQ server"
LABEL org.opencontainers.image.source="https://github.com/rabbitmq/rabbitmq-server"
LABEL org.opencontainers.image.licenses="MPL-1.1"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("rabbitmq-server") }}
USER rabbitmq
WORKDIR /var/lib/rabbitmq
EXPOSE 5672 25672
VOLUME [ "/var/lib/rabbitmq", "/etc/rabbitmq" ]
ENTRYPOINT [ "/usr/sbin/rabbitmq-server" ]
CMD ["start", "rabbitmq"]

View File

@ -1,18 +0,0 @@
dockerfiles-alt-rabbitmq
========================
ALT dockerfile for rabbitmq.
Copy Dockerfile somewhere and build the image:
`$ docker build --rm -t <username>/rabbitmq .`
And launch the rabbitmq-server container:
`docker run -d -p 5672:5672 --name="rabbitmq" -v rabbit-data:/var/lib/rabbitmq -v rabbit-conf:/etc/rabbitmq IMAGENAME`
With mounting /etc/rabbitmq/rabbitmq-env.conf could be change settings of rabbitmq-server.
It could be test via:
`curl localhost:5672`
For starting app:
`rabbitmqctl start_app`

View File

@ -1,15 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- rabbitmq-server
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://github.com/rabbitmq/rabbitmq-server'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'rabbitmq'
org.opencontainers.image.description: 'The RabbitMQ server'
org.opencontainers.image.licenses: MPL-1.1
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
rabbitmqctl version

View File

@ -1,15 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- docker-registry
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://github.com/docker/distribution'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'registry'
org.opencontainers.image.description: 'The Docker toolset to pack, ship, store, and deliver content'
org.opencontainers.image.licenses: Apache-2.0
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
registry --version

View File

@ -1,20 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- >
{%- if branch in ["p10", "c10f2", "c10f1"] -%}
ruby
{%- else -%}
gem-irb
{%- endif -%}
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://github.com/ruby/ruby'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'ruby'
org.opencontainers.image.description: 'Interactive Ruby Shell'
org.opencontainers.image.licenses: 'BSD-2-Clause or Ruby'
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
ruby --version

View File

@ -1,15 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- systemd
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://github.com/systemd/systemd'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'systemd'
org.opencontainers.image.description: 'System and Session Manager'
org.opencontainers.image.licenses: LGPLv2.1+
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
ls -la /sbin/init | grep systemd

View File

@ -1,15 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- trivy
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://aquasecurity.github.io/trivy'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'trivy'
org.opencontainers.image.description: 'A Fast Vulnerability Scanner for Containers'
org.opencontainers.image.licenses: Apache-2.0
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
trivy --version

View File

@ -1,17 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- unit
- curl
- tzdata
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://github.com/nginx/unit'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'unit'
org.opencontainers.image.description: 'NGINX Unit is a lightweight and versatile web-server'
org.opencontainers.image.licenses: Apache-2.0
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
unitd --version

View File

@ -1,15 +0,0 @@
---
is_versioned: true
version_template: "{{ version }}"
source_packages:
- zot
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: 'https://github.com/project-zot/zot'
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'zot'
org.opencontainers.image.description: 'A production-ready vendor-neutral OCI-native container image registry (purely based on OCI Distribution Specification)'
org.opencontainers.image.licenses: Apache-2.0
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
zot verify /etc/zot/config.json

View File

@ -1,12 +1,7 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud 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") }} {{ install_packages("glibc-gconv-modules", "glibc-locales", "tzdata") }}
CMD ["bash"] CMD ["bash"]

6
org/base/base/image.yaml Normal file
View File

@ -0,0 +1,6 @@
version: '1.0'
kind: image
test:
entrypoint: /bin/sh
command: LC_ALL=ru_RU.UTF-8 TZ=/usr/share/zoneinfo/Europe/Moscow date| grep MSK
maintainers: []

View File

@ -1,16 +0,0 @@
---
is_versioned: false
version_template: "{{ version }}"
source_packages:
- glibc
- tzdata
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: ''
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: base
org.opencontainers.image.licenses: GPLv2
org.opencontainers.image.vendor: 'ALT Linux Team'
org.opencontainers.image.description: 'Base image with localization and timezone packages'
...

View File

@ -1 +0,0 @@
LC_ALL=ru_RU.UTF-8 TZ=/usr/share/zoneinfo/Europe/Moscow date| grep MSK

2
org/base/base/test.yaml Normal file
View File

@ -0,0 +1,2 @@
entrypoint: "/bin/sh"
command: "LC_ALL=ru_RU.UTF-8 TZ=/usr/share/zoneinfo/Europe/Moscow date| grep MSK"

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

@ -0,0 +1,6 @@
version: '1.0'
kind: image
test:
entrypoint: /bin/sh
command: curl --version && gpg --version
maintainers: []

View File

@ -1,18 +0,0 @@
---
is_versioned: false
version_template: "{{ version }}"
source_packages:
- ca-certificates
- curl
- gnupg
- wget
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: ''
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'buildpack-deps-curl'
org.opencontainers.image.description: 'Transfer data environment'
org.opencontainers.image.licenses: GPLv2
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
curl --version && gpg --version

View File

@ -0,0 +1,2 @@
entrypoint: "/bin/sh"
command: "curl --version && gpg --version"

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

@ -0,0 +1,6 @@
version: '1.0'
kind: image
test:
entrypoint: /bin/sh
command: git --version && hg --version
maintainers: []

View File

@ -1,19 +0,0 @@
---
is_versioned: false
version_template: "{{ version }}"
source_packages:
- git
- mercurial
- openssh
- procps
- subversion
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: ''
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'buildpack-deps-scm'
org.opencontainers.image.description: 'Software configuration management environment'
org.opencontainers.image.licenses: GPLv2
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
git --version && hg --version

View File

@ -0,0 +1,2 @@
entrypoint: "/bin/sh"
command: "git --version && hg --version"

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

@ -0,0 +1,6 @@
version: '1.0'
kind: image
test:
entrypoint: /bin/sh
command: gcc --version && make --version
maintainers: []

View File

@ -1,15 +0,0 @@
---
is_versioned: false
version_template: "{{ version }}"
source_packages:
- gcc-defaults
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: ''
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'buildpack-deps'
org.opencontainers.image.description: 'Projects building environment'
org.opencontainers.image.licenses: GPLv2
org.opencontainers.image.vendor: 'ALT Linux Team'
...

View File

@ -1 +0,0 @@
gcc --version && make --version

View File

@ -0,0 +1,2 @@
entrypoint: "/bin/sh"
command: "gcc --version && make --version"

View File

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

View File

@ -0,0 +1,4 @@
version: '1.0'
kind: image
test: man --version && ip -V && vim --version | grep vim
maintainers: []

View File

@ -1,26 +0,0 @@
---
is_versioned: false
version_template: "{{ version }}"
source_packages:
- gcc-defaults
- vim
- gdb
- git
- iproute2
- iputils
- wget
- curl
- lsof
- ripgrep
- zsh
- make
annotations:
org.opencontainers.image.revision: ''
org.opencontainers.image.source: ''
org.opencontainers.image.url: ''
org.opencontainers.image.version: ''
org.opencontainers.image.title: 'devel'
org.opencontainers.image.description: 'This image is only for devel or testing purposes'
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