Compare commits
	
		
			14 Commits
		
	
	
		
			fix_vers_t
			...
			refactor-i
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9e9f57957e | |||
| d9e501ccda | |||
| 0e335ff425 | |||
| fd353cabb1 | |||
| d9dc8a94b7 | |||
| 424c8b3927 | |||
| 6ee75efc93 | |||
| 05707d938c | |||
| 13f9a20369 | |||
| 92ebc2f9d2 | |||
| 955edbf714 | |||
| db15411d60 | |||
| 1113beba96 | |||
| 3bffb21c84 | 
| @@ -1,76 +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") | ||||
|         etcd_ver = ver.get("etcd", kube_ver) | ||||
|         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\":\"{etcd_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 | ||||
|              | ||||
|             print(f'Run build command: {args.workspace}/build.py {args.other_build_args} {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() | ||||
| @@ -1,74 +0,0 @@ | ||||
| { | ||||
|   "branches": [ | ||||
|     { | ||||
|       "name": "p10", | ||||
|       "versions": [ | ||||
|         { | ||||
|           "kube-version": "1.27", | ||||
|           "coredns": "0", | ||||
| 	  "etcd": "3.5.15" | ||||
|         }, | ||||
|         { | ||||
|           "kube-version": "1.28", | ||||
|           "coredns": "0", | ||||
| 	  "etcd": "3.5.16", | ||||
|           "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 | ||||
|         } | ||||
|       ] | ||||
|     } | ||||
|   ] | ||||
| } | ||||
| @@ -6,71 +6,61 @@ | ||||
| #$4 - ${{ needs.build-process.outputs.repo }} | ||||
| #$5 - ${{ gitea.workspace }} | ||||
|  | ||||
| branch=${1:-"sisyphus"} | ||||
| org=${2:-"alt"} | ||||
| url=${3:-"gitea.basealt.ru"} | ||||
| repo=${4:-"alt"} | ||||
| wosp=${5:-"."} | ||||
|  | ||||
| errors='' | ||||
| haserr=false | ||||
| for IM in $(ls $wosp/org/$org/ | xargs) | ||||
| for IM in $(ls $5/org/$2/ | xargs) | ||||
| do  | ||||
|   echo "image=$IM" | ||||
|   if test -f $wosp/org/$org/$IM/test | ||||
|   if test -f $5/org/$2/$IM/test | ||||
|   then  | ||||
|     test=$(cat $wosp/org/$org/$IM/test) | ||||
|     test=$(cat $5/org/$2/$IM/test) | ||||
|   else test='' | ||||
|   fi  | ||||
|  | ||||
|   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' | ||||
|  | ||||
|   command="echo empty_command" | ||||
|   if [ -n "$test" ]; then | ||||
|     command="podman run --rm --entrypoint=\"$entrypoint\" $url/$imgpath -c \"$test\"" | ||||
|   if [[ $test != '' ]]; then | ||||
|     command="podman run --rm --entrypoint=\"$entrypoint\" $3/$imgpath -c \"$test\"" | ||||
|   else | ||||
|     if [ "$IM" = distroless-toybox ]; then | ||||
|       command="podman run -q --rm $url/$imgpath toysh -c true" | ||||
|     if [[ $IM == 'distroless-true' ]]; then | ||||
|       command="podman run --rm $3/$imgpath \"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\"" | ||||
|     if [[ $IM == 'distroless-gotop' ]]; then  | ||||
|       command="podman run --rm $3/$imgpath \"--version\"" | ||||
|     fi  | ||||
|     if [ "$IM" = flannel-cni-plugin ]; then | ||||
|       command="podman run -q --rm $url/$imgpath \"/flannel\"" | ||||
|     if [[ $IM == 'flannel-cni-plugin' ]]; then | ||||
|       command="podman run --rm $3/$imgpath \"/flannel\"" | ||||
|     fi | ||||
|     if [ "$IM" == pause ]; then  | ||||
|       command="podman run -q --rm $url/$imgpath \"/pause\" \"-v\"" | ||||
|     if [[ $IM == 'pause' ]]; then  | ||||
|       command="podman run --rm $3/$imgpath \"/pause\" \"-v\"" | ||||
|     fi  | ||||
|   fi | ||||
|   echo $command | ||||
|   eval $command 2>$IM.log | ||||
|   if [ "$(echo $?)" == "0" ]; then | ||||
| 	rm -rf $IM.log ||: | ||||
|   else | ||||
| 	  haserr=true  | ||||
|   fi | ||||
|   eval $command 2>$IM.log || haserr=true | ||||
|  | ||||
|   echo "podman rmi --all" | ||||
|   podman rmi --all | ||||
|  | ||||
|   if $haserr | ||||
|   if [ "$haserr" = true ] | ||||
|   then  | ||||
|     if [ -f $IM.log ] | ||||
|     then errors="TEST ERROR OF IMAGE $IM: $(cat $IM.log)\n $errors" | ||||
|     #else errors="TEST ERROR OF IMAGE $IM: test returned empty error, but exit status was nozero; $errors" | ||||
|     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  | ||||
|   haserr=false | ||||
| done | ||||
|  | ||||
| echo "$errors" | ||||
| if [ -n "$errors" ] | ||||
| if [[ $errors != '' ]] | ||||
|   then haserr=true  | ||||
| fi | ||||
| echo "ERR=$haserr" > haserr.log | ||||
|   | ||||
| @@ -1,141 +0,0 @@ | ||||
| name: Full building alt images | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|     inputs: | ||||
|       branch: | ||||
|         description: 'Branch' | ||||
|         required: true | ||||
|         default: 'sisyphus' | ||||
|         type: choice | ||||
|         options: | ||||
|         - sisyphus | ||||
|         - p10 | ||||
|         - p11 | ||||
|         - c10f2 | ||||
|       group: | ||||
|         description: 'Images group' | ||||
|         required: true | ||||
|         type: choice | ||||
|         options: | ||||
|         - base | ||||
|         - alt | ||||
|         - kubevirt | ||||
|  | ||||
| jobs: | ||||
|   build-process: | ||||
|     runs-on: alt-sisyphus | ||||
|     outputs: | ||||
|       url: ${{ env.URL }} | ||||
|       repo: ${{ env.REPO }} | ||||
|       buildres: ${{ steps.build-script.outcome }} | ||||
|     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 golang" | ||||
|           apt-get install -y python3-module-tomli python3-module-jinja2 python3-module-yaml python3-module-requests podman buildah jq curl golang | ||||
|           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 | ||||
|         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" | ||||
|           echo "GROUP=${{ inputs.group }}" | ||||
|           echo "BRANCH=${{ inputs.branch }}" | ||||
|         env: | ||||
|           GU: ${{ gitea.server_url }} | ||||
|           GR: ${{ gitea.repository }} | ||||
|       - name: Check out current repo | ||||
|         uses: actions/checkout@v4 | ||||
|       - name: Change vendor label for c10f | ||||
|         if: ${{ contains(inputs.branch, '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: ${{ inputs.group }} | ||||
|       - name: Set repo for c10f2 (Temporary) | ||||
|         if: ${{ contains(inputs.branch, 'c10f2') }} | ||||
|         run: | | ||||
|           echo "10.4.0.3        update.altsp.su" >> /etc/hosts | ||||
|           echo "cat /etc/hosts" | ||||
|           cat /etc/hosts | ||||
|       - 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 base with riskv64 for sisyphus if it is | ||||
|           if [[ "$BR" == "sisyphus" && "$ORG" == "base" ]]; then echo "${{ gitea.workspace }}/build.py -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 | ||||
|           build_args="-b $BR --log-level debug --latest $BR -o $ORG --registry $BUILD_URL" | ||||
|           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: | ||||
|           ORG: ${{ inputs.group }} | ||||
|           BR: ${{ inputs.branch }} | ||||
|           BUILD_URL: "${{ env.URL }}/${{ env.REPO }}" | ||||
|         continue-on-error: true | ||||
|       - name: Send success notification | ||||
|         if: ${{ steps.build-script.outcome != 'success' }} | ||||
|         uses: actions/telegram-channel-action@v5 | ||||
|         with: | ||||
|           bot_token: ${{ secrets.TELEGRAM_BOT }} | ||||
|           channel_id: ${{ secrets.TELEGRAM_CHANNEL }} | ||||
|           message: "Building of images org/${{ inputs.group }} for branch ${{ inputs.branch }} is failed" | ||||
|  | ||||
|   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 golang" | ||||
|           apt-get install -y python3-module-tomli python3-module-jinja2 podman buildah jq curl golang | ||||
|       - 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} | ||||
|           cat errors.log 2>/dev/null || echo '' | ||||
|           echo "test process finished" | ||||
|         env: | ||||
|           BR: ${{ inputs.branch }} | ||||
|           ORG: ${{ inputs.group }} | ||||
|           URL: ${{ needs.build-process.outputs.url }} | ||||
|           REPO: ${{ needs.build-process.outputs.repo }} | ||||
|           WS: ${{ gitea.workspace }} | ||||
|       - name: Send notification if building was crashed | ||||
|         if: ${{ env.ERR == 'true' || steps.test-script.outcome == 'failure' }} | ||||
|         uses: actions/telegram-channel-action@v5 | ||||
|         with: | ||||
|           bot_token: ${{ secrets.TELEGRAM_BOT }} | ||||
|           channel_id: ${{ secrets.TELEGRAM_CHANNEL }} | ||||
|           message: "Testing of images org/${{ inputs.group }} for branch ${{ inputs.branch }} is failed" | ||||
|       - name: Send notification if building was crashed | ||||
|         if: ${{ env.ERR == 'false' && steps.test-script.outcome != 'failure' }} | ||||
|         uses: actions/telegram-channel-action@v5 | ||||
|         with: | ||||
|           bot_token: ${{ secrets.TELEGRAM_BOT }} | ||||
|           channel_id: ${{ secrets.TELEGRAM_CHANNEL }} | ||||
|           message: "Images group org/${{ inputs.group }} for branch ${{ inputs.branch }} are builed and ready to push into registry.altlinux.org" | ||||
							
								
								
									
										133
									
								
								.gitea/workflows/wf_full_p10.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								.gitea/workflows/wf_full_p10.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,133 @@ | ||||
| name: Full building alt images | ||||
| on: | ||||
|   push: | ||||
|     tags: | ||||
|       - '*10*_*' | ||||
|  | ||||
| jobs: | ||||
|   build-process: | ||||
|     runs-on: alt-p10 | ||||
|     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 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                                 | ||||
|         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-p10 | ||||
|     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 }} | ||||
							
								
								
									
										133
									
								
								.gitea/workflows/wf_full_p11.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								.gitea/workflows/wf_full_p11.yaml
									
									
									
									
									
										Normal 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 }} | ||||
							
								
								
									
										126
									
								
								.gitea/workflows/wf_full_sis.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								.gitea/workflows/wf_full_sis.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,126 @@ | ||||
| name: Full building alt images | ||||
| on: | ||||
|   push: | ||||
|     tags: | ||||
|       - 'sisyphus_*' | ||||
|  | ||||
| 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: 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 }} | ||||
| @@ -1,91 +0,0 @@ | ||||
| name: Full building alt images | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|     inputs: | ||||
|       branch: | ||||
|         description: 'Branch' | ||||
|         required: true | ||||
|         default: 'sisyphus' | ||||
|         type: choice | ||||
|         options: | ||||
|         - sisyphus | ||||
|         - p10 | ||||
|         - p11 | ||||
|         - c10f2 | ||||
| env: | ||||
|   ORG: k8s | ||||
|  | ||||
| jobs: | ||||
|   build-process: | ||||
|     runs-on: alt-sisyphus | ||||
|     outputs: | ||||
|       url: ${{ env.URL }} | ||||
|       repo: ${{ env.REPO }} | ||||
|       buildres: ${{ steps.build-script.outcome }} | ||||
|     steps: | ||||
|       - name: Check workspace and inputs | ||||
|         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" | ||||
|           echo "BRANCH=${{ inputs.branch }}" | ||||
|         env: | ||||
|           GU: ${{ gitea.server_url }} | ||||
|           GR: ${{ gitea.repository }} | ||||
|       - name: Set repo for c10f2 (Temporary) | ||||
|         if: ${{ contains(inputs.branch, 'c10f2') }} | ||||
|         run: | | ||||
|           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 golang" | ||||
|           apt-get install -y python3-module-tomli python3-module-jinja2 python3-module-yaml python3-module-requests podman buildah jq curl golang | ||||
|           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 out current repo | ||||
|         uses: actions/checkout@v4 | ||||
|       - name: Change vendor label for c10f | ||||
|         if: ${{ contains(inputs.branch, '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 | ||||
|         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: | | ||||
|           if [[ "$BR" == "sisyphus" ]]; then arches="--arches amd64 386 arm64 loong64"; else arches="--arches amd64 386 arm64"; fi | ||||
|           build_args="--registry $BUILD_URL $arches" | ||||
|           #run build script | ||||
|           ${{ gitea.workspace }}/.gitea/workflows/k8s_buildscript.py --branch "$BR" --other-build-args "$build_args" --workspace "${{ gitea.workspace }}" | ||||
|         env: | ||||
|           ORG: ${{ env.ORG }} | ||||
|           BR: ${{ inputs.branch }} | ||||
|           BUILD_URL: "gitea.basealt.ru/alt" | ||||
|         continue-on-error: true | ||||
|       - name: Send notification if build crashed | ||||
|         if: ${{ steps.build-script.outcome != 'success' }} | ||||
|         uses: actions/telegram-channel-action@v5 | ||||
|         with: | ||||
|           bot_token: ${{ secrets.TELEGRAM_BOT }} | ||||
|           channel_id: ${{ secrets.TELEGRAM_CHANNEL }} | ||||
|           message: "Building of images org/k8s for branch ${{ inputs.branch }} is failed" | ||||
|            | ||||
| @@ -1,161 +0,0 @@ | ||||
| name: Dispatch building alt images | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|     inputs: | ||||
|       branch: | ||||
|         description: 'Branch' | ||||
|         required: true | ||||
|         default: 'sisyphus' | ||||
|         type: choice | ||||
|         options: | ||||
|         - sisyphus | ||||
|         - p10 | ||||
|         - p11 | ||||
|         - c10f2 | ||||
|       images: | ||||
|         description: 'Json containing images with version to build it'  | ||||
|         required: true | ||||
|         type: string | ||||
|  | ||||
| jobs: | ||||
|   build-process: | ||||
|     runs-on: alt-sisyphus | ||||
|     outputs: | ||||
|       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: Check inputs | ||||
|         run: |  | ||||
|           echo "${{ inputs.images }}" | ||||
|           echo "${{ inputs.branch }}" | ||||
|       - 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 golang" | ||||
|           apt-get install -y python3-module-tomli python3-module-jinja2 python3-module-yaml python3-module-requests podman buildah jq curl golang | ||||
|           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: Get images list to build | ||||
|         env: | ||||
|           BR: ${{ inputs.branch }} | ||||
|           IMS: ${{ inputs.images }} | ||||
|         run: | | ||||
|           images=() | ||||
|           declare -A versions | ||||
|  | ||||
|           ims=$(echo $IMS | jq -c -r '.[]') | ||||
|           for im in ${ims[@]}; do  | ||||
|             image=$(echo $im | jq -r .name) | ||||
|             version=$(echo $im | jq -r .version) | ||||
|             images+=("$image") | ||||
|             versions["$image"]="$version" | ||||
|           done | ||||
|  | ||||
|           image_args="${images[*]}" | ||||
|  | ||||
|           package_versions="{" | ||||
|           first=1 | ||||
|           for image in "${!versions[@]}"; do | ||||
|               [[ $first -eq 0 ]] && package_versions+="," | ||||
|               package_versions+="\"$image\": \"${versions[$image]}\"" | ||||
|               first=0 | ||||
|           done | ||||
|           package_versions+="}" | ||||
|  | ||||
|           echo "IMAGES=$image_args" | ||||
|           echo "PACKAGE_VERSIONS=$package_versions" | ||||
|  | ||||
|           echo "BRANCH=$branch" >> ${GITHUB_ENV} | ||||
|           echo "IMAGES=$image_args" >> $GITHUB_ENV | ||||
|           echo "images=$image_args" | ||||
|           echo "PACKAGE_VERSIONS=$package_versions" >> $GITHUB_ENV | ||||
|           echo "package_versions=$package_versions" | ||||
|       - 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/*/*/Dockerfile.template ||:" | ||||
|           sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/*/*/Dockerfile.template ||: | ||||
|           echo "sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/*/*/distroless.toml ||:" | ||||
|           sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/*/*/distroless.toml ||: | ||||
|           echo "sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/*/*/info.yaml ||:" | ||||
|           sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/*/*/info.yaml ||: | ||||
|       - 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 | ||||
|         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: | | ||||
|           if [[ "$BRANCH" == "sisyphus" ]]; then arches="--arches amd64 386 arm64 loong64"; else arches="--arches amd64 386 arm64"; fi | ||||
|           echo "${{ gitea.workspace }}/build.py \ | ||||
|             --log-level debug \ | ||||
|             --skip-stages push \ | ||||
|             --branch $BRANCH \ | ||||
|             --registry $BUILD_URL \ | ||||
|             --arches $arches \ | ||||
|             -i $IMAGES \ | ||||
|             --package-versions \"$PACKAGE_VERSIONS\"" | ||||
|            | ||||
|           ${{ gitea.workspace }}/build.py \ | ||||
|             --log-level debug \ | ||||
|             --skip-stages push \ | ||||
|             --branch $BRANCH \ | ||||
|             --registry $BUILD_URL \ | ||||
|             --arches $arches \ | ||||
|             -i $IMAGES \ | ||||
|             --package-versions "$PACKAGE_VERSIONS"  | ||||
|  | ||||
|           echo "start update latest tag" | ||||
|           for im in $IMAGES; do \ | ||||
|             image=$(echo $im | cut -d '/' -f 2) ; \ | ||||
|             latest=$(skopeo list-tags docker://$BUILD_URL/$BRANCH/$image | jq '.Tags.[]' -r 2> /dev/null | sort -V -r | grep -v latest -m 1) ; \ | ||||
|             echo "image: $image; latest version-tag: $latest" ; \ | ||||
|             echo "skopeo copy -a docker://$BUILD_URL/$BRANCH/$im:$latest docker://BUILD_URL/$BRANCH/$im:latest"; \ | ||||
|             skopeo copy -a docker://$BUILD_URL/$BRANCH/$im:$latest docker://BUILD_URL/$BRANCH/$im:latest ; \ | ||||
|           done | ||||
|           echo "finish update latest tag" | ||||
|         env: | ||||
|           BRANCH: ${{ inputs.BRANCH }} | ||||
|           IMAGES: ${{ env.IMAGES }} | ||||
|           PACKAGE_VERSIONS: ${{ env.PACKAGE_VERSIONS }} | ||||
|           BUILD_URL: "${{ env.URL }}/${{ env.REPO }}" | ||||
|         continue-on-error: true | ||||
|       - name: Send notification if building was crashed | ||||
|         if: ${{ steps.build-script.outcome != 'success' }} | ||||
|         uses: actions/telegram-channel-action@v5 | ||||
|         with: | ||||
|           bot_token: ${{ secrets.TELEGRAM_BOT }} | ||||
|           channel_id: ${{ secrets.TELEGRAM_CHANNEL }} | ||||
|           message: "Building of images ${{ inputs.images }} for branch ${{ inputs.branch }} is failed" | ||||
|       - name: Send success notification | ||||
|         if: ${{ steps.build-script.outcome == 'success' }} | ||||
|         uses: actions/telegram-channel-action@v5 | ||||
|         with: | ||||
|           bot_token: ${{ secrets.TELEGRAM_BOT }} | ||||
|           channel_id: ${{ secrets.TELEGRAM_CHANNEL }} | ||||
|           message: "Images ${{ inputs.images }} for branch ${{ inputs.branch }} are builed and ready to push into registry.altlinux.org" | ||||
| @@ -1,35 +1,21 @@ | ||||
| name: Building alt images | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|     inputs: | ||||
|       branch: | ||||
|         description: 'Branch' | ||||
|         required: true | ||||
|         default: 'sisyphus' | ||||
|         type: choice | ||||
|         options: | ||||
|         - sisyphus | ||||
|         - p10 | ||||
|         - p11 | ||||
|         - c10f2 | ||||
|       image: | ||||
|         description: 'Image name' | ||||
|         required: true | ||||
|         type: string | ||||
|       version: | ||||
|         description: 'Needed version' | ||||
|         type: string | ||||
|   push: | ||||
|     tags: | ||||
|       - '*_*/*' | ||||
|  | ||||
| jobs: | ||||
|   build-process: | ||||
|     runs-on: alt-sisyphus | ||||
|     runs-on: alt-latest | ||||
|     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 and inputs | ||||
|       - name: Check workspace | ||||
|         run: | | ||||
|           repourl=$(echo $GU | cut -d '/' -f 3) | ||||
|           echo "URL=$repourl" >> ${GITHUB_ENV} | ||||
| @@ -37,15 +23,13 @@ jobs: | ||||
|           reponame=$(echo $GR | cut -d '/' -f 1) | ||||
|           echo "REPO=$reponame" >> ${GITHUB_ENV}  | ||||
|           echo "REPO=$reponame" | ||||
|           echo "BRANCH=${{ inputs.branch }}" | ||||
|           echo "IMAGE=${{ inputs.image }}" | ||||
|           echo "VERSION=${{ inputs.version }}" | ||||
|         env: | ||||
|           GU: ${{ gitea.server_url }} | ||||
|           GR: ${{ gitea.repository }} | ||||
|       - name: Set repo for c10f2 (Temporary) | ||||
|         if: ${{ contains(inputs.branch, 'c10f2') }} | ||||
|         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 | ||||
| @@ -53,10 +37,10 @@ jobs: | ||||
|         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 golang" | ||||
|           apt-get install -y python3-module-tomli python3-module-jinja2 python3-module-yaml python3-module-requests podman buildah jq curl golang | ||||
|           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 | ||||
|           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: Login podman gitea | ||||
| @@ -66,65 +50,83 @@ jobs: | ||||
|         env: | ||||
|           P_USER: ${{ secrets.PODMAN_USER }} | ||||
|           P_PASS: ${{ secrets.PODMAN_PASS }} | ||||
|       - name: Change vendor label for c10f | ||||
|         if: ${{ contains(inputs.branch, 'c10f') }} | ||||
|       - name: Check files in the repository | ||||
|         run: | | ||||
|           echo "sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$IM/Dockerfile.template ||:" | ||||
|           sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$IM/Dockerfile.template ||: | ||||
|           echo "sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$IM/distroless.toml ||:" | ||||
|           sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$IM/distroless.toml ||: | ||||
|           echo "sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$IM/info.yaml ||:" | ||||
|           sed -i 's/ALT Linux Team/BaseALT LLC/g' ${{ gitea.workspace }}/org/$IM/info.yaml ||: | ||||
|           ls -a ${{ gitea.workspace }}           | ||||
|       - name: Parse target branch and tag from events context, save to env                                 | ||||
|         env: | ||||
|           IM: ${{ inputs.image }} | ||||
|           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" | ||||
|       - 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: ${{ inputs.image }} | ||||
|           BR: ${{ inputs.branch }} | ||||
|           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 --latest $BR --log-level debug --registry $BUILD_URL $k8sarg" | ||||
|           ${{ gitea.workspace }}/build.py -i $IM -b $BR $arches --latest $BR --log-level debug --registry $BUILD_URL $k8sarg  | ||||
|           if [[ "$IM" == *"k8s"* ]]; then k8sarg="--tags=tags.toml --overwrite-organization $ORG-$BR"; else k8sarg=""; fi | ||||
|           echo "build.py -i $IM -b $BR" | ||||
|           ${{ gitea.workspace }}/build.py -i $IM -b $BR $k8sarg         | ||||
|         env: | ||||
|           IM: ${{ inputs.image }} | ||||
|           VER: ${{ inputs.version }} | ||||
|           BR: ${{ inputs.branch }} | ||||
|           BUILD_URL: "${{ env.URL }}/${{ env.REPO }}" | ||||
|           IM: ${{ env.IMAGE }} | ||||
|           BR: ${{ env.BRANCH }} | ||||
|           ORG: ${{ env.ORG }} | ||||
|         continue-on-error: true | ||||
|       - name: Send notification if build crashed | ||||
|         if: ${{ steps.build-script.outcome != 'success' }} | ||||
|         uses: actions/telegram-channel-action@v5 | ||||
|         with: | ||||
|           bot_token: ${{ secrets.TELEGRAM_BOT }} | ||||
|           channel_id: ${{ secrets.TELEGRAM_CHANNEL }} | ||||
|           message: "Building of image ${{ inputs.image }} for branch ${{ inputs.branch }} is failed" | ||||
|         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 | ||||
|     runs-on: alt-latest | ||||
|     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 golang" | ||||
|           apt-get install -y python3-module-tomli python3-module-jinja2 podman buildah curl golang  | ||||
|           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: ${{ inputs.image }}  | ||||
|           BR: ${{ inputs.branch }} | ||||
|           if [[ "$IM" == *"k8s"* ]]; then echo "skip tests for k8s images"; else podman run --rm --entrypoint="/bin/sh" $URL/$IM:$BR -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 }} | ||||
| @@ -133,12 +135,25 @@ jobs: | ||||
|         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 | ||||
|           if [[ $IM = 'alt/distroless-true' ]]; then podman run --rm $URL/$IM:$BR true; fi | ||||
|           if [[ $IM = 'alt/distroless-gotop' ]]; then podman run --rm $URL/$IM:$BR --version; fi | ||||
|         env: | ||||
|           IM: ${{ inputs.image }} | ||||
|           BR: ${{ inputs.branch }} | ||||
|           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 }} | ||||
|  | ||||
|   | ||||
							
								
								
									
										95
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										95
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,5 +1,22 @@ | ||||
| # image-forge | ||||
|  | ||||
| ## Wrapper | ||||
|  | ||||
| ### Examples | ||||
|  | ||||
| From the repository | ||||
|  | ||||
| ```shell | ||||
| image-build -b sisyphus -r registry.altlinux.org --prefix=k8s-sisyphus kube-apiserver kubernetes1.28 | ||||
| ``` | ||||
|  | ||||
| From a task | ||||
|  | ||||
| ```shell | ||||
| image-build -b sisyphus -r test.registry.altlinux.org -t 335250 --prefix=k8s-sisyphus kube-apiserver kubernetes1.28 | ||||
| ``` | ||||
|  | ||||
|  | ||||
| ## alt images | ||||
| To build `alt` images, run: | ||||
| ```bash | ||||
| @@ -26,88 +43,10 @@ the organization `<ORGANIZATION>`, run: | ||||
| ``` | ||||
| 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 | ||||
| On x86_64 machine using p10 branch you need: | ||||
| - `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-arm` to build for arm architecture | ||||
| - `qemu-user-static-binfmt-ppc` to build for ppc64le architecture | ||||
|   | ||||
							
								
								
									
										331
									
								
								build.py
									
									
									
									
									
								
							
							
						
						
									
										331
									
								
								build.py
									
									
									
									
									
								
							| @@ -3,81 +3,29 @@ | ||||
| import argparse | ||||
| import functools | ||||
| import json | ||||
| import logging | ||||
| import re | ||||
| import subprocess | ||||
| import textwrap | ||||
| from datetime import datetime | ||||
| from dataclasses import dataclass | ||||
| from graphlib import TopologicalSorter | ||||
| from pathlib import Path | ||||
| from typing import Optional, Union | ||||
|  | ||||
| import requests | ||||
| import tomli | ||||
| import yaml | ||||
| from jinja2 import Environment, BaseLoader | ||||
| from jinja2 import Template | ||||
|  | ||||
| logger = logging.getLogger(__name__) | ||||
|  | ||||
| ORG_DIR = Path("org") | ||||
|  | ||||
| PKG_VERSIONS: Optional[dict] = None | ||||
| PKG_VERSION: str = "" | ||||
|  | ||||
| # Jinja2 custom fail filter | ||||
| def fail(message: str): | ||||
|     raise ValueError(message) | ||||
|  | ||||
| JINJA_ENV = Environment(loader=BaseLoader()) | ||||
| JINJA_ENV.filters['fail'] = fail | ||||
|  | ||||
| @dataclass | ||||
| class Image: | ||||
|     canonical_name: str | ||||
|     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): | ||||
|     def __init__(self, canonical_name): | ||||
|         self.canonical_name = canonical_name | ||||
|         self.path = ORG_DIR / canonical_name | ||||
|         self.base_name = re.sub("^[^/]+/", "", canonical_name) | ||||
|  | ||||
|         info_file = self.path / "info.yaml" | ||||
|         if not info_file.exists(): | ||||
|             self.is_versioned = None | ||||
|             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"] | ||||
|     def __str__(self): | ||||
|         return (f'Image(canonical_name="{self.canonical_name}", ' | ||||
|                 f'path="{self.path}", base_name="{self.base_name}")') | ||||
|  | ||||
|  | ||||
| class Tasks: | ||||
| @@ -101,163 +49,23 @@ class Tasks: | ||||
|                     if image.canonical_name in i or len(i) == 0 | ||||
|                 ] | ||||
|  | ||||
| class AltAPIError(Exception): | ||||
|     pass | ||||
|  | ||||
| def api_get_source_package_version(branch: str, package_name: str) -> str: | ||||
|     api_url = "https://rdb.altlinux.org/api/site/package_versions_from_tasks" | ||||
|     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: | ||||
|     def __init__(self, tags_file: Optional[str], latest: str): | ||||
|     def __init__(self, tags_file, latest): | ||||
|         if tags_file is None: | ||||
|             self._tags = None | ||||
|         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 | ||||
|  | ||||
|     def tags(self, branch: str, image: Image, tasks: Optional[Tasks] = None): | ||||
|     def tags(self, branch, image: Image): | ||||
|         if self._tags is None: | ||||
|             if image.is_versioned is None: | ||||
|                 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") | ||||
|             tags = [branch] | ||||
|         else: | ||||
|             tags = self._tags[image.canonical_name][branch].copy() | ||||
|  | ||||
|         if branch == self._latest: | ||||
|             tags.append("latest") | ||||
|         return tags | ||||
|  | ||||
|  | ||||
| @@ -300,10 +108,6 @@ class Distroless: | ||||
|         elif value := dd.get("workingdir"): | ||||
|             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 if_arches(arches, value, default=""): | ||||
|             if arch in arches or not arches: | ||||
| @@ -350,10 +154,9 @@ class DockerBuilder: | ||||
|     def make_image_re(self): | ||||
|         registry = r"(?P<registry>[\w.:]+)" | ||||
|         organization = r"(?P<organization>\w+)" | ||||
|         branch = r"(?P<branch>\w+)" | ||||
|         name = r"(?P<name>[-.\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): | ||||
|         image_re = self.make_image_re() | ||||
| @@ -381,7 +184,7 @@ class DockerBuilder: | ||||
|         if overwrite_organization: | ||||
|             self.overwrite_organization = overwrite_organization | ||||
|         else: | ||||
|             self.overwrite_organization = branch | ||||
|             self.overwrite_organization = organization | ||||
|         self.latest = latest | ||||
|         self.dry_run = dry_run | ||||
|         self.images_info = images_info | ||||
| @@ -428,17 +231,16 @@ class DockerBuilder: | ||||
|     ) -> str: | ||||
|         if self.registry: | ||||
|             registry = self.registry.rstrip("/") + "/" | ||||
|             alt_image = "alt" | ||||
|             alt_image = "alt/alt" | ||||
|         else: | ||||
|             registry = "" | ||||
|             alt_image = "alt" | ||||
|         rendered = JINJA_ENV.from_string(template).render( | ||||
|         rendered = Template(template).render( | ||||
|             alt_image=alt_image, | ||||
|             branch=self.branch, | ||||
|             install_packages=install_packages, | ||||
|             organization=organization, | ||||
|             registry=registry, | ||||
|             pkg_versions=PKG_VERSIONS, | ||||
|             **kwargs, | ||||
|         ) | ||||
|  | ||||
| @@ -503,7 +305,7 @@ class DockerBuilder: | ||||
|                     from_image = match.groupdict() | ||||
|                     if from_image["name"] != "scratch": | ||||
|                         requires.add( | ||||
|                             f"{self.organization}/{from_image['name']}" | ||||
|                             f"{from_image['organization']}/{from_image['name']}" | ||||
|                         ) | ||||
|         elif distrolessfile.exists(): | ||||
|             requires.add("alt/distroless-builder") | ||||
| @@ -512,7 +314,7 @@ class DockerBuilder: | ||||
|             if match := re.match(self.image_re, from_): | ||||
|                 from_image = match.groupdict() | ||||
|                 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) | ||||
|  | ||||
| @@ -539,17 +341,12 @@ class DockerBuilder: | ||||
|             pre_cmd = ["echo"] | ||||
|         else: | ||||
|             pre_cmd = [] | ||||
|  | ||||
|         logger.debug("run: %s", pre_cmd + cmd) | ||||
|         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_arch(arch, manifest): | ||||
|             distroless_builder = self.render_full_tag( | ||||
|                 Image("alt/distroless-builder"), "latest" | ||||
|                 Image("alt/distroless-builder"), self.branch | ||||
|             ) | ||||
|             distroless = self.distrolesses[image.canonical_name] | ||||
|             distroless.render_arch_branch(arch, self.branch) | ||||
| @@ -690,7 +487,7 @@ class DockerBuilder: | ||||
|         build_arches = set(arches) - set( | ||||
|             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]) | ||||
|  | ||||
|         msg = "Building image {} for {} arches".format( | ||||
| @@ -741,7 +538,7 @@ class DockerBuilder: | ||||
|             self.images_info.skip_arches(image.canonical_name) | ||||
|         ) | ||||
|         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]) | ||||
|  | ||||
|         msg = "Building image {} for {} arches".format( | ||||
| @@ -782,36 +579,9 @@ class DockerBuilder: | ||||
|             "--force-rm", | ||||
|             f"--manifest={manifest}", | ||||
|             f"--platform={platforms}", | ||||
|             f'--build-arg=PKG_VERSION={PKG_VERSION}', | ||||
|             ".", | ||||
|         ] | ||||
|  | ||||
|         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) | ||||
|  | ||||
|         for tag in tags[1:]: | ||||
| @@ -819,12 +589,11 @@ class DockerBuilder: | ||||
|             tag_cmd = ["podman", "tag", manifest, other_manifest] | ||||
|             self.run(tag_cmd) | ||||
|  | ||||
|  | ||||
|     def podman_push(self, image: Image, sign=None): | ||||
|         if self.images_info.skip_branch(image.canonical_name, self.branch): | ||||
|             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] | ||||
|  | ||||
|         for manifest in manifests: | ||||
| @@ -843,7 +612,6 @@ class DockerBuilder: | ||||
|             self.run(cmd) | ||||
|  | ||||
|  | ||||
|  | ||||
| class ImagesInfo: | ||||
|     def __init__(self): | ||||
|         info = {} | ||||
| @@ -872,14 +640,12 @@ class ImagesInfo: | ||||
|  | ||||
| def parse_args(): | ||||
|     stages = ["build", "remove_dockerfiles", "render_dockerfiles", "push"] | ||||
|     arches = ["amd64", "386", "arm64", "loong64", "riscv64"] | ||||
|     arches = ["amd64", "386", "arm64"] | ||||
|     branches = ["p11", "p10", "sisyphus", "c10f1", "c10f2"] | ||||
|     organizations = list(ORG_DIR.iterdir()) | ||||
|     images = [f"{o.name}/{i.name}" for o in organizations for i in o.iterdir()] | ||||
|     organizations = [o.name for o in organizations] | ||||
|  | ||||
|     log_levels = ["debug", "info", "warning", "error", "critical"] | ||||
|  | ||||
|     parser = argparse.ArgumentParser( | ||||
|         formatter_class=argparse.ArgumentDefaultsHelpFormatter, | ||||
|     ) | ||||
| @@ -986,19 +752,8 @@ def parse_args(): | ||||
|         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", | ||||
|         "--package-version", | ||||
|         help="from which package to build", | ||||
|     ) | ||||
|     args = parser.parse_args() | ||||
|  | ||||
| @@ -1011,20 +766,10 @@ def parse_args(): | ||||
|  | ||||
|  | ||||
| def main(): | ||||
|     global PKG_VERSIONS | ||||
|     global PKG_VERSION | ||||
|  | ||||
|     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 | ||||
|  | ||||
|     PKG_VERSION = args.package_version | ||||
|     arches = args.arches | ||||
|     images_info = ImagesInfo() | ||||
|     tags = Tags(args.tags, args.latest) | ||||
| @@ -1046,7 +791,6 @@ def main(): | ||||
|             if "render_dockerfiles" in args.stages: | ||||
|                 db.render_dockerfiles() | ||||
|             db.load_distrolesses() | ||||
|  | ||||
|             for image in db.get_build_order(): | ||||
|                 if image.canonical_name not in args.images: | ||||
|                     continue | ||||
| @@ -1060,23 +804,6 @@ def main(): | ||||
|                 if "push" in args.stages: | ||||
|                     db.podman_push(image, args.sign) | ||||
|  | ||||
|                 if args.clean_images_limit is not None: | ||||
|                     if clean_images_counter >= args.clean_images_limit: | ||||
|                         cmd = [ | ||||
|                             "podman", | ||||
|                             "rmi", | ||||
|                             "--all", | ||||
|                             "-f", | ||||
|                         ] | ||||
|                         db.run(cmd, | ||||
|                             check=False, | ||||
|                             stderr=subprocess.DEVNULL, | ||||
|                             stdout=subprocess.DEVNULL, | ||||
|                         ) | ||||
|                         clean_images_counter = 0 | ||||
|                     else: | ||||
|                         clean_images_counter += 1 | ||||
|  | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     main() | ||||
|   | ||||
							
								
								
									
										7
									
								
								image-build.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								image-build.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| ## Examples | ||||
|  | ||||
| Build `kube-apisever` image from package `kubernetes1.31`: | ||||
|  | ||||
| ```bash | ||||
| ./image-build.py -b sisyphus -r registry.altlinux.org kube-apiserver kubernetes1.31 | ||||
| ``` | ||||
							
								
								
									
										234
									
								
								image-build.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										234
									
								
								image-build.py
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,234 @@ | ||||
| #!/usr/bin/env python3 | ||||
|  | ||||
| import argparse | ||||
| import logging | ||||
| import re | ||||
| import subprocess | ||||
| from pathlib import Path | ||||
|  | ||||
| import requests | ||||
|  | ||||
| LOGGING_FORMAT = "%(asctime)s %(name)s %(levelname)s %(message)s" | ||||
| logging.basicConfig(format=LOGGING_FORMAT) | ||||
| logger = logging.getLogger(__name__) | ||||
|  | ||||
|  | ||||
| def parse_args() -> argparse.Namespace: | ||||
|     parser = argparse.ArgumentParser( | ||||
|         description="build an OCI image from a package", | ||||
|         epilog="""The image is only pushed to the destination registry | ||||
|         if the option --push is present.""", | ||||
|         formatter_class=argparse.ArgumentDefaultsHelpFormatter, | ||||
|     ) | ||||
|  | ||||
|     parser.add_argument("image_name") | ||||
|     parser.add_argument("package_name") | ||||
|     parser.add_argument( | ||||
|         "-b", | ||||
|         "--branch", | ||||
|         default="sisyphus", | ||||
|         help="package repository branch", | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         "-r", | ||||
|         "--registry", | ||||
|         default="registry.altlinux.org", | ||||
|         help="OCI destination registry", | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         "-t", | ||||
|         "--task-id", | ||||
|         help="install the package from the task with this id", | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         "--prefix", | ||||
|         help="image name prefix", | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         "--dry-run", | ||||
|         action="store_true", | ||||
|         help="only print what would be done", | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         "--latest", | ||||
|         action="store_true", | ||||
|         help="also tag this image as latest", | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         "--push", | ||||
|         action="store_true", | ||||
|         help="push the image to the registry after build", | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         "--skip-build", | ||||
|         action="store_true", | ||||
|         help="if push is true, then skip the build stage", | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         "--log-level", | ||||
|         choices=["debug", "info", "warning"], | ||||
|         default="warning", | ||||
|         help="logging level", | ||||
|     ) | ||||
|  | ||||
|     return parser.parse_args() | ||||
|  | ||||
|  | ||||
| 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: | ||||
|         raise RuntimeError( | ||||
|             f"failed to retrieve package version: package {package_name!r}, branch {branch!r} " | ||||
|         ) | ||||
|  | ||||
|     result = response.json() | ||||
|  | ||||
|     logger.debug("api/site/package_versions_from_tasks response=%s", result) | ||||
|  | ||||
|     return result["versions"][0]["version"] | ||||
|  | ||||
|  | ||||
| def api_get_source_package_version_from_task(task_id: int, package_name: str) -> str: | ||||
|     api_url = f"https://rdb.altlinux.org/api/task/packages/{task_id}" | ||||
|     response = requests.get(api_url) | ||||
|     if response.status_code != 200: | ||||
|         raise RuntimeError(f"failed to retrieve information about task {task_id}") | ||||
|  | ||||
|     result = response.json() | ||||
|  | ||||
|     logger.debug("api/task/packages/%s response=%s", task_id, result) | ||||
|  | ||||
|     for subtask in result["subtasks"]: | ||||
|         if subtask["source"]["name"] == package_name: | ||||
|             return subtask["source"]["version"] | ||||
|  | ||||
|     raise RuntimeError( | ||||
|         f"vailed to retrieve version of package {package_name!r} from task {task_id}" | ||||
|     ) | ||||
|  | ||||
|  | ||||
| def main() -> None: | ||||
|     args = parse_args() | ||||
|     logger.setLevel(args.log_level.upper()) | ||||
|  | ||||
|     image = f"k8s/{args.image_name}" | ||||
|     version_arg = None | ||||
|     tasks_file = None | ||||
|  | ||||
|     if args.task_id is None: | ||||
|         version = api_get_source_package_version(args.branch, args.package_name) | ||||
|     else: | ||||
|         version = api_get_source_package_version_from_task( | ||||
|             args.task_id, args.package_name | ||||
|         ) | ||||
|         tasks_file = "/tmp/k8s-tasks.toml" | ||||
|         tasks_file_contents = f"['{args.branch}']\n" | ||||
|         tasks_file_contents += f"{args.task_id} = ['{image}']\n" | ||||
|         Path(tasks_file).write_text(tasks_file_contents) | ||||
|  | ||||
|     tags_file = "/tmp/k8s-tags.toml" | ||||
|     tags_file_contents = f"['{image}']\n" | ||||
|  | ||||
|     match args.image_name: | ||||
|         case ( | ||||
|             "etcd" | ||||
|             | "flannel" | ||||
|             | "flannel-cni-plugin" | ||||
|             | "pause" | ||||
|             | "cert-manager-acmesolver" | ||||
|             | "cert-manager-cainjector" | ||||
|             | "cert-manager-controller" | ||||
|             | "cert-manager-startupapicheck" | ||||
|             | "cert-manager-webhook" | ||||
|         ): | ||||
|             match args.image_name: | ||||
|                 case "flannel-cni-plugin": | ||||
|                     num_dots = version.count(".") | ||||
|                     if num_dots == 2: | ||||
|                         tags_file_contents += ( | ||||
|                             f"{args.branch} = ['v{version}-flannel1']\n" | ||||
|                         ) | ||||
|                     elif num_dots == 3: | ||||
|                         flannel_version, flannel_release = version.rsplit(".", 1) | ||||
|                         tags_file_contents += f"{args.branch} = ['v{flannel_version}-flannel{flannel_release}']\n" | ||||
|                     else: | ||||
|                         raise RuntimeError( | ||||
|                             f"wrong version for package {args.package_name!r}, version {version!r}" | ||||
|                         ) | ||||
|                 case "etcd": | ||||
|                     tags_file_contents += f"{args.branch} = ['{version}-0']\n" | ||||
|                 case "pause": | ||||
|                     tags_file_contents += f"{args.branch} = ['{version}']\n" | ||||
|                 case _: | ||||
|                     tags_file_contents += f"{args.branch} = ['v{version}']\n" | ||||
|  | ||||
|         case ( | ||||
|             "kube-apiserver" | ||||
|             | "kube-controller-manager" | ||||
|             | "kube-scheduler" | ||||
|             | "kube-proxy" | ||||
|             | "coredns" | ||||
|         ): | ||||
|             match args.image_name: | ||||
|                 case "coredns": | ||||
|                     regex_string = "coredns(.+)" | ||||
|                 case ( | ||||
|                     "kube-apiserver" | ||||
|                     | "kube-controller-manager" | ||||
|                     | "kube-scheduler" | ||||
|                     | "kube-proxy" | ||||
|                 ): | ||||
|                     regex_string = "kubernetes(.+)" | ||||
|  | ||||
|             version_match = re.search(regex_string, args.package_name) | ||||
|             if version_match is None: | ||||
|                 raise RuntimeError( | ||||
|                     f"failed to retrieve version argument from package name: package {args.package_name!r}" | ||||
|                 ) | ||||
|  | ||||
|             version_arg = version_match.group(1) | ||||
|  | ||||
|             tags_file = "/tmp/k8s-tags.toml" | ||||
|             tags_file_contents = f"['{image}']\n" | ||||
|             tags_file_contents += f"{args.branch} = ['v{version}']\n" | ||||
|         case _: | ||||
|             raise RuntimeError(f"unknown image {args.image_name!r}") | ||||
|  | ||||
|     Path(tags_file).write_text(tags_file_contents) | ||||
|  | ||||
|     command = [ | ||||
|         "./build.py", | ||||
|         f"--branch={args.branch}", | ||||
|         f"--registry={args.registry}", | ||||
|         f"--image={image}", | ||||
|         f"--tags={tags_file}", | ||||
|     ] | ||||
|  | ||||
|     if tasks_file is not None: | ||||
|         command.append(f"--tasks={tasks_file}") | ||||
|  | ||||
|     if version_arg is not None: | ||||
|         command.append(f"--package-version={version_arg}") | ||||
|  | ||||
|     if args.prefix is not None: | ||||
|         command.append(f"--overwrite-organization={args.prefix}") | ||||
|  | ||||
|     if args.latest: | ||||
|         command.append(f"--latest={args.branch}") | ||||
|  | ||||
|     if not args.push: | ||||
|         command.append("--skip-stages=push") | ||||
|     elif args.skip_build: | ||||
|         command.append("--stages=push") | ||||
|  | ||||
|     if args.dry_run: | ||||
|         command.append("--dry-run") | ||||
|  | ||||
|     logger.debug("Running command: %s", command) | ||||
|     subprocess.run(command, check=True) | ||||
|  | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     main() | ||||
| @@ -1,44 +1,8 @@ | ||||
| ["base/distroless-toybox"] | ||||
| skip-branches = [ "p10", "c10f2", "c10f1" ] | ||||
| ["alt/buildpack-deps"] | ||||
| skip-branches = [ "p9" ] | ||||
|  | ||||
| ["alt/openjdk21"] | ||||
| skip-arches = [ "386" ] | ||||
|  | ||||
| ["alt/zot"] | ||||
| skip-arches = [ "386" ] | ||||
|  | ||||
| ["alt/kafka"] | ||||
| skip-arches = [ "386" ] | ||||
|  | ||||
| ["alt/grafana"] | ||||
| skip-arches = [ "386" ] | ||||
|  | ||||
| ["alt/ansible"] | ||||
| skip-branches = [ "c10f2", "c10f1", "p10" ] | ||||
|  | ||||
| ["alt/buildkit"] | ||||
| skip-branches = [ "c10f1", "p10" ] | ||||
|  | ||||
| ["k8s/metrics-server"] | ||||
| skip-branches = [ "c10f1", "c10f2", "p11", "p10" ] | ||||
|  | ||||
| ["kubevirt/virt-api"] | ||||
| skip-arches = [ "386", "loong64" ] | ||||
|  | ||||
| ["kubevirt/virt-controller"] | ||||
| skip-arches = [ "386", "loong64" ] | ||||
|  | ||||
| ["kubevirt/virt-exportproxy"] | ||||
| skip-arches = [ "386", "loong64" ] | ||||
|  | ||||
| ["kubevirt/virt-exportserver"] | ||||
| skip-arches = [ "386", "loong64" ] | ||||
|  | ||||
| ["kubevirt/virt-handler"] | ||||
| skip-arches = [ "386", "loong64" ] | ||||
|  | ||||
| ["kubevirt/virt-launcher"] | ||||
| skip-arches = [ "386", "loong64" ] | ||||
|  | ||||
| ["kubevirt/virt-operator"] | ||||
| skip-arches = [ "386", "loong64" ] | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/node:latest | ||||
| FROM {{ registry }}{{ organization }}/node:{{ branch }} | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|  | ||||
|   | ||||
| @@ -1,18 +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' | ||||
| ... | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest | ||||
| FROM {{ registry }}{{ alt_image }}:{{ branch }} | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|  | ||||
|   | ||||
| @@ -1,16 +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' | ||||
| ... | ||||
							
								
								
									
										7
									
								
								org/alt/base/Dockerfile.template
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								org/alt/base/Dockerfile.template
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| FROM {{ registry }}{{ alt_image }}:{{ branch }} | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|  | ||||
| {{ install_packages("glibc-gconv-modules", "glibc-locales", "tzdata") }} | ||||
|  | ||||
| CMD ["bash"] | ||||
| @@ -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"] | ||||
| @@ -1,16 +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' | ||||
| ... | ||||
| @@ -1 +0,0 @@ | ||||
| buildkitd --version | ||||
| @@ -1,9 +1,8 @@ | ||||
| FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest | ||||
| FROM {{ registry }}{{ alt_image }}:{{ branch }} | ||||
| 
 | ||||
| MAINTAINER alt-cloud | ||||
| 
 | ||||
| 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.vendor="ALT Linux Team" | ||||
| 
 | ||||
| @@ -1,10 +1,9 @@ | ||||
| FROM {{ registry }}{{ branch }}/buildpack-deps-curl:latest | ||||
| FROM {{ registry }}{{ organization }}/buildpack-deps-curl:{{ branch }} | ||||
| 
 | ||||
| MAINTAINER alt-cloud | ||||
| 
 | ||||
| LABEL org.opencontainers.image.title="buildpack-deps-scm" | ||||
| LABEL org.opencontainers.image.licenses="GPLv2" | ||||
| LABEL org.opencontainers.image.description = "Software configuration management environment" | ||||
| LABEL org.opencontainers.image.vendor="ALT Linux Team" | ||||
| 
 | ||||
| {{ install_packages( | ||||
| @@ -1,9 +1,8 @@ | ||||
| FROM {{ registry }}{{ branch }}/buildpack-deps-scm:latest | ||||
| FROM {{ registry }}{{ organization }}/buildpack-deps-scm:{{ branch }} | ||||
| 
 | ||||
| MAINTAINER alt-cloud | ||||
| 
 | ||||
| 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.vendor="ALT Linux Team" | ||||
| 
 | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/base:latest | ||||
| FROM {{ registry }}{{ organization }}/base:{{ branch }} | ||||
| 
 | ||||
| MAINTAINER alt-cloud | ||||
| 
 | ||||
| @@ -1,4 +1,4 @@ | ||||
| from = "{{ registry }}{{ branch }}/distroless-static:latest" | ||||
| from = "{{ registry }}{{ organization }}/distroless-static:{{ branch }}" | ||||
| builder-install-packages = [ | ||||
|     "glibc-core", | ||||
|     '{{if_branches(["p10"], "glibc-nss")}}', | ||||
| @@ -19,4 +19,3 @@ packages = [ | ||||
|     "zlib", | ||||
| ] | ||||
| 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"} | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest | ||||
| FROM {{ registry }}{{ alt_image }}:{{ branch }} | ||||
| 
 | ||||
| MAINTAINER alt-cloud | ||||
| 
 | ||||
| @@ -1,4 +1,4 @@ | ||||
| from = "{{ registry }}{{ branch }}/distroless-base:latest" | ||||
| from = "{{ registry }}{{ organization }}/distroless-base:{{ branch }}" | ||||
| builder-install-packages = [ | ||||
|     "coreutils", | ||||
|     "findutils", | ||||
| @@ -37,4 +37,3 @@ packages = [ | ||||
|     "vim-console", | ||||
| ] | ||||
| 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"} | ||||
							
								
								
									
										3
									
								
								org/alt/distroless-gotop/distroless.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								org/alt/distroless-gotop/distroless.toml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| from = "{{ registry }}{{ organization }}/distroless-base:{{ branch }}" | ||||
| full-files = ["/usr/bin/gotop"] | ||||
| entrypoint = ["/usr/bin/gotop"] | ||||
							
								
								
									
										4
									
								
								org/alt/distroless-static/distroless.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								org/alt/distroless-static/distroless.toml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| from = "scratch" | ||||
| file-lists = ["static.list"] | ||||
| user = "nonroot" | ||||
| workdir = "/home/nonroot" | ||||
							
								
								
									
										3
									
								
								org/alt/distroless-true/distroless.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								org/alt/distroless-true/distroless.toml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| from = "{{ registry }}{{ organization }}/distroless-static:{{ branch }}" | ||||
| files = ["/bin/true"] | ||||
| cmd = ["/bin/true"] | ||||
							
								
								
									
										15
									
								
								org/alt/etcd/Dockerfile.template
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								org/alt/etcd/Dockerfile.template
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										13
									
								
								org/alt/etcd/README.md
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										1
									
								
								org/alt/etcd/test
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| etcdctl version | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest | ||||
| FROM {{ registry }}{{ alt_image }}:{{ branch }} | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|  | ||||
|   | ||||
| @@ -1,16 +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' | ||||
| ... | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/base:latest | ||||
| FROM {{ registry }}{{ organization }}/base:{{ branch }} | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|  | ||||
|   | ||||
| @@ -1,16 +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' | ||||
| ... | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest | ||||
| FROM {{ registry }}{{ alt_image }}:{{ branch }} | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|  | ||||
|   | ||||
| @@ -1,16 +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' | ||||
| ... | ||||
| @@ -1,21 +0,0 @@ | ||||
| FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|  | ||||
| LABEL org.opencontainers.image.title="kafka" | ||||
| LABEL org.opencontainers.image.description="Apache Kafka is a distributed event store and stream-processing platform" | ||||
| LABEL org.opencontainers.image.source="https://github.com/apache/kafka" | ||||
| LABEL org.opencontainers.image.licenses="Apache-2.0" | ||||
| LABEL org.opencontainers.image.vendor="ALT Linux Team" | ||||
|  | ||||
| {{ install_packages("kafka", "ca-certificates", "gpg") }} | ||||
|  | ||||
| USER kafka:kafka | ||||
| EXPOSE 9092 2181 | ||||
| WORKDIR /var/lib/kafka | ||||
| VOLUME ["/var/lib/kafka","/var/log/kafka"] | ||||
|  | ||||
| COPY kafka-entrypoint.sh /kafka-entrypoint.sh | ||||
|  | ||||
| ENTRYPOINT [ "/bin/bash" ] | ||||
| CMD ["/kafka-entrypoint.sh"] | ||||
| @@ -1,37 +0,0 @@ | ||||
| # Kafka image | ||||
|  | ||||
| Command for run kafka server: | ||||
| ``` | ||||
| podman run --rm -it -p 9092:9092 <REGISTRY>/<BRANCH>/kafka:latest | ||||
| ``` | ||||
|  | ||||
| To lead images running need use kafka-entrypoint.sh or change it. As default login kafka need runnig zookeeper and than kafka's start script.  | ||||
|  | ||||
| Commnad for using kafka: | ||||
| ``` | ||||
| podman exec -it -u kafka <CONTAINER ID> /usr/bin/sh | ||||
| ``` | ||||
| ``` | ||||
| sh-5.2$ /usr/lib/kafka/bin/kafka-topics.sh --create --topic quickstart-events --bootstrap-server localhost:9092 | ||||
| ``` | ||||
| Created topic quickstart-events. | ||||
| ``` | ||||
| sh-5.2$ /usr/lib/kafka/bin/kafka-topics.sh --describe --topic quickstart-events --bootstrap-server localhost:9092 | ||||
| ``` | ||||
| Topic: quickstart-events	TopicId: kPjhCFFAS-Sg5J3Hpgr-PA	PartitionCount: 1	ReplicationFactor: 1	Configs:  | ||||
| 	Topic: quickstart-events	Partition: 0	Leader: 0	Replicas: 0	Isr: 0	Elr: N/A	LastKnownElr: N/A | ||||
| ``` | ||||
| sh-5.2$ /usr/lib/kafka/bin/kafka-console-producer.sh --topic quickstart-events --bootstrap-server localhost:9092 | ||||
| ``` | ||||
| >hello 1 | ||||
| >hello 2 | ||||
| >hello 3 | ||||
| ``` | ||||
| sh-5.2$ /usr/lib/kafka/bin/kafka-console-consumer.sh --topic quickstart-events --from-beginning --bootstrap-server localhost:9092 | ||||
| ``` | ||||
| hello 1 | ||||
| hello 2 | ||||
| hello 3 | ||||
| ^CProcessed a total of 3 messages | ||||
|  | ||||
|  | ||||
| @@ -1,16 +0,0 @@ | ||||
| --- | ||||
| is_versioned: true | ||||
| version_template:  | ||||
|   - "{{ version }}" | ||||
| source_packages: | ||||
|   - kafka | ||||
| annotations: | ||||
|   org.opencontainers.image.revision: '' | ||||
|   org.opencontainers.image.source: 'https://github.com/apache/kafka' | ||||
|   org.opencontainers.image.url: '' | ||||
|   org.opencontainers.image.version: '' | ||||
|   org.opencontainers.image.title: 'kafka' | ||||
|   org.opencontainers.image.description: 'Apache Kafka is a distributed event store and stream-processing platform' | ||||
|   org.opencontainers.image.licenses: Apache-2.0 | ||||
|   org.opencontainers.image.vendor: 'ALT Linux Team' | ||||
| ... | ||||
| @@ -1,4 +0,0 @@ | ||||
| #!/bin/sh -eux | ||||
|  | ||||
| nohup /usr/lib/kafka/bin/zookeeper-server-start.sh /etc/kafka/zookeeper.properties & | ||||
| /usr/lib/kafka/bin/kafka-server-start.sh /etc/kafka/server.properties | ||||
| @@ -1 +0,0 @@ | ||||
| ls -a /usr/lib/kafka/bin/ | grep kafka && /usr/lib/kafka/bin/kafka-topics.sh --version | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest | ||||
| FROM {{ registry }}{{ alt_image }}:{{ branch }} | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|  | ||||
|   | ||||
| @@ -1,16 +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' | ||||
| ... | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest | ||||
| FROM {{ registry }}{{ alt_image }}:{{ branch }} | ||||
|  | ||||
| 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/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 | ||||
|  | ||||
| EXPOSE 80 | ||||
|   | ||||
| @@ -1,18 +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' | ||||
| ... | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/buildpack-deps:latest | ||||
| FROM {{ registry }}{{ organization }}/buildpack-deps:{{ branch }} | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|  | ||||
|   | ||||
| @@ -1,17 +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' | ||||
| ... | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/base:latest | ||||
| FROM {{ registry }}{{ organization }}/base:{{ branch }} | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|  | ||||
|   | ||||
| @@ -1,16 +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' | ||||
| ... | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/base:latest | ||||
| FROM {{ registry }}{{ organization }}/base:{{ branch }} | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|  | ||||
| @@ -8,19 +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.vendor="ALT Linux Team" | ||||
|  | ||||
| {% if branch == 'p10' %} | ||||
| {{ install_packages( | ||||
| 	"php8.2", | ||||
| 	"php8.2-xdebug", | ||||
| "php8.2", | ||||
| "php8.2-xdebug", | ||||
| ) }} | ||||
| {% elif branch == 'c10f2' %} | ||||
| {{ install_packages(                   | ||||
|         "php8.3",                      | ||||
|         "php8.3-xdebug",               | ||||
| ) }} | ||||
| {% else %} | ||||
| {{ install_packages( | ||||
| 	"php8.4", | ||||
| 	"php8.4-xdebug", | ||||
| ) }} | ||||
| {% endif %} | ||||
|   | ||||
| @@ -1,23 +0,0 @@ | ||||
| --- | ||||
| is_versioned: true | ||||
| version_template:  | ||||
|   - "{{ version }}" | ||||
| source_packages: | ||||
|   - > | ||||
|     {%- if branch in ["p10", "c10f1"] -%} | ||||
|     php8.2 | ||||
|     {%- elif branch in ["c10f2"] -%} | ||||
|     php8.3 | ||||
|     {%- else -%} | ||||
|     php8.4 | ||||
|     {%- 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' | ||||
| ... | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/base:latest | ||||
| FROM {{ registry }}{{ organization }}/base:{{ branch }} | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|   | ||||
| @@ -7,12 +7,8 @@ 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" | ||||
|  | ||||
| {% if branch == 'c10f2' %} | ||||
|                                  | ||||
| {{ install_packages("postgresql16","postgresql16-server") }} | ||||
| {% else %} | ||||
| {{ install_packages("postgresql17","postgresql17-server") }} | ||||
| {% endif %} | ||||
|  | ||||
| RUN usermod -a -G postgres postgres | ||||
| RUN chown -R postgres:postgres /var/lib/pgsql | ||||
|   | ||||
| @@ -1,21 +0,0 @@ | ||||
| --- | ||||
| is_versioned: true | ||||
| version_template:  | ||||
|   - "{{ version }}" | ||||
| source_packages: | ||||
|   - > | ||||
|     {%- if branch in ["c10f2"] -%} | ||||
|     postgresql16 | ||||
|     {%- else -%} | ||||
|     postgresql17 | ||||
|     {%- endif -%} | ||||
| 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' | ||||
| ... | ||||
| @@ -1,8 +1,8 @@ | ||||
| FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest | ||||
| FROM {{ registry }}{{ alt_image }}:{{ branch }} | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|  | ||||
| LABEL org.opencontainers.image.title="prometheus-alertmanager" | ||||
| LABEL org.opencontainers.image.title="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" | ||||
|   | ||||
| @@ -1,16 +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' | ||||
| ... | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest | ||||
| FROM {{ registry }}{{ alt_image }}:{{ branch }} | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|  | ||||
|   | ||||
| @@ -1,16 +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' | ||||
| ... | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest | ||||
| FROM {{ registry }}{{ alt_image }}:{{ branch }} | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|  | ||||
|   | ||||
| @@ -1,16 +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' | ||||
| ... | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/base:latest | ||||
| FROM {{ registry }}{{ organization }}/base:{{ branch }} | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|  | ||||
|   | ||||
| @@ -1,19 +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' | ||||
| ... | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/base:latest | ||||
| FROM {{ registry }}{{ organization }}/base:{{ branch }} | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|   | ||||
|   | ||||
| @@ -1,18 +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' | ||||
| ... | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/base:latest | ||||
| FROM {{ registry }}{{ organization }}/base:{{ branch }} | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|   | ||||
|   | ||||
| @@ -1,16 +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' | ||||
| ... | ||||
| @@ -1,19 +0,0 @@ | ||||
| FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|  | ||||
| LABEL org.opencontainers.image.title="redis" | ||||
| LABEL org.opencontainers.image.description="Redis is an advanced key-value store" | ||||
| LABEL org.opencontainers.image.source="http://redis.io" | ||||
| LABEL org.opencontainers.image.licenses="BSD-3-Clause AND BSD-2-Clause AND MIT AND BSL-1.0" | ||||
| LABEL org.opencontainers.image.vendor="ALT Linux Team" | ||||
|  | ||||
| {{ install_packages("ca-certificates","redis","redis-cli") }} | ||||
|  | ||||
| USER _redis:_redis | ||||
| EXPOSE 6379 | ||||
| VOLUME ["/var/lib/redis","/var/log/redis"] | ||||
| WORKDIR /var/lib/redis | ||||
|  | ||||
| ENTRYPOINT [ "/usr/sbin/redis-server" ] | ||||
| CMD [ "/etc/redis/redis.conf" ] | ||||
| @@ -1,8 +0,0 @@ | ||||
| # Redis image | ||||
|  | ||||
| Command for run redis-db server: | ||||
| ``` | ||||
| podman run --rm -it -v ./redis.conf:/etc/redis/redis.conf -p 6379:6379 <REGISTRY>/<BRANCH>/redis:latest | ||||
| ``` | ||||
| For testing running server you can run redis.py, if it's working you will see version redis | ||||
|  | ||||
| @@ -1,16 +0,0 @@ | ||||
| --- | ||||
| is_versioned: true | ||||
| version_template:  | ||||
|   - "{{ version }}" | ||||
| source_packages: | ||||
|   - redis | ||||
| annotations: | ||||
|   org.opencontainers.image.revision: '' | ||||
|   org.opencontainers.image.source: 'http://redis.io/' | ||||
|   org.opencontainers.image.url: '' | ||||
|   org.opencontainers.image.version: '' | ||||
|   org.opencontainers.image.title: 'redis' | ||||
|   org.opencontainers.image.description: 'Redis is an advanced key-value store' | ||||
|   org.opencontainers.image.licenses: 'BSD-3-Clause AND BSD-2-Clause AND MIT AND BSL-1.0' | ||||
|   org.opencontainers.image.vendor: 'ALT Linux Team' | ||||
| ... | ||||
| @@ -1,22 +0,0 @@ | ||||
| #!/usr/bin/python3 | ||||
|  | ||||
| import redis | ||||
|  | ||||
|  | ||||
| def main(): | ||||
|     r = redis.Redis(host='127.0.0.1', port=6379, db=0, username='test', password='test') | ||||
|  | ||||
|     try: | ||||
|         info = r.info() | ||||
|         print(info['redis_version']) | ||||
|         response = r.ping() | ||||
|         if response: | ||||
|             print("Подключение успешно!") | ||||
|         else: | ||||
|             print("Не удалось подключиться к Redis.") | ||||
|     except redis.exceptions.RedisError as e: | ||||
|         print(f"Ошибка: {e}") | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     main() | ||||
|  | ||||
| @@ -1 +0,0 @@ | ||||
| redis-cli --version && redis-server --version | ||||
| @@ -1,5 +0,0 @@ | ||||
| bind 0.0.0.0 | ||||
| requirepass test | ||||
| appendonly yes | ||||
| appendfsync everysec | ||||
| user test on -DEBUG +@all ~* >test | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest | ||||
| FROM {{ registry }}{{ alt_image }}:{{ branch }} | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|  | ||||
|   | ||||
| @@ -1,16 +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' | ||||
| ... | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest | ||||
| FROM {{ registry }}{{ alt_image }}:{{ branch }} | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|  | ||||
|   | ||||
| @@ -1,21 +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' | ||||
| ... | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM {{ registry }}{{ branch }}/base:latest | ||||
| FROM {{ registry }}{{ organization }}/base:{{ branch }} | ||||
|  | ||||
| MAINTAINER alt-cloud | ||||
|  | ||||
|   | ||||
| @@ -1,16 +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' | ||||
| ... | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user