Compare commits

..

6 Commits

145 changed files with 501 additions and 1524 deletions

View File

@ -6,46 +6,39 @@
#$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"
entrypoint='/bin/sh'
if [[ $2 == 'k8s' ]]
then imgpath="$2-$1/$IM:latest"
fi
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=\"/bin/sh\" $3/$imgpath -c \"$test\""
else
if [[ "$IM" == distroless-toybox ]]; then
command="podman run --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 --rm $url/$imgpath \"true\""
fi
if [ "$IM" = distroless-gotop ]; then
command="podman run --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 --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 --rm $url/$imgpath \"/pause\" \"-v\""
if [[ $IM = 'pause' ]]; then
command="podman run --rm $3/$imgpath \"/pause\" \"-v\""
fi
fi
echo $command
@ -54,9 +47,9 @@ do
echo "podman rmi --all"
podman rmi --all
if [ "$haserr" ]
if [ "$haserr" = true ]
then
if [[ -n $(cat $IM.log) ]]
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
@ -65,7 +58,7 @@ do
done
echo "$errors"
if [ -n "$errors" ]
if [[ $errors != '' ]]
then haserr=true
fi
echo "ERR=$haserr" > haserr.log

View File

@ -2,7 +2,7 @@ name: Full building alt images
on:
push:
tags:
- '*_*'
- 'sisyphus_*'
jobs:
build-process:
@ -25,47 +25,40 @@ jobs:
env:
GU: ${{ gitea.server_url }}
GR: ${{ gitea.repository }}
- name: Set repo for c10f2 (Temporary)
if: ${{ contains(github.ref_name, 'c10f2') }}
run: |
echo "event tag=${{ github.ref_name }}"
echo "10.4.0.3 update.altsp.su" >> /etc/hosts
echo "cat /etc/hosts"
cat /etc/hosts
- name: Update apt
uses: actions/init-alt-env@v1
- name: Install requires
run: |
echo "apt-get install -y python3-module-tomli python3-module-jinja2 python3-module-yaml python3-module-requests podman buildah jq curl"
apt-get install -y python3-module-tomli python3-module-jinja2 python3-module-yaml python3-module-requests podman buildah jq curl
echo "apt-get install -y qemu-user-static-binfmt-aarch64 qemu-user-static-binfmt-arm qemu-user-static-binfmt-ppc qemu-user-static-binfmt-riscv qemu-user-static-binfmt-loongarch"
apt-get install -y qemu-user-static-binfmt-aarch64 qemu-user-static-binfmt-arm qemu-user-static-binfmt-ppc qemu-user-static-binfmt-riscv qemu-user-static-binfmt-loongarch
echo "apt-get install -y python3-module-tomli python3-module-jinja2 podman buildah jq curl"
apt-get install -y python3-module-tomli python3-module-jinja2 podman buildah jq curl
echo "apt-get install -y qemu-user-static-binfmt-aarch64 qemu-user-static-binfmt-arm qemu-user-static-binfmt-ppc"
apt-get install -y qemu-user-static-binfmt-aarch64 qemu-user-static-binfmt-arm qemu-user-static-binfmt-ppc
- name: Check out current repo
uses: actions/checkout@v4
- name: Parse target branch and tag from events context, save to env
- name: Parse target branch and tag from events context, save to env
env:
EV: ${{ toJson(gitea.event) }}
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" >> ${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 }}
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 [[ "$BR" == "sisyphus" ]]; then arches="--arches amd64 386 arm64 loong64"; else arches="--arches amd64 386 arm64"; fi
if [[ "$ORG" == "k8s" ]]; then build_args="$build_args --overwrite-organization $ORG-$BR --package-versions {\"k8s/kube-apiserver\":\"1.31\",\"k8s/kube-scheduler\":\"1.31\",\"k8s/kube-controller-manager\":\"1.31\",\"k8s/kube-proxy\":\"1.31\",\"k8s/coredns\":\"1.11.3\",\"k8s/kubelet\":\"1.31\"}"; fi
echo "build.py $build_args $arches"
${{ gitea.workspace }}/build.py $build_args $arches
build_args="-b $BR -o $ORG --skip-images alt/distroless-devel"
if [[ $BR == 'sisyphus' ]]; then build_args="$build_args --skip-arches arm"; fi
if [[ $ORG == 'k8s' ]]; then build_args="$build_args --tags tags.toml --overwrite-organization $ORG-$BR --skip-images k8s/kube-apiserver k8s/kube-controller-manager k8s/kube-proxy k8s/kube-scheduler"; fi
echo "build.py $build_args"
${{ gitea.workspace }}/build.py $build_args
env:
ORG: ${{ env.ORG }}
BR: ${{ env.BRANCH }}
@ -73,10 +66,12 @@ jobs:
- 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"
issueid=$(curl -X 'GET' "$URL/api/v1/repos/$REPO/image-forge/issues?state=open&labels=building&type=issues&page=1&limit=1&token=$T" -H 'accept: application/json' -s | jq '.[].number' -r)
if [[ $issueid != '' ]]; then \
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"; \
else echo "no issue to send notification"; fi
env:
T: ${{ secrets.TOKEN }}
BR: ${{ env.BRANCH }}
@ -86,7 +81,7 @@ jobs:
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"
echo "tag $tagname is deleted"
env:
T: ${{ secrets.TOKEN }}
BR: ${{ env.BRANCH }}
@ -95,7 +90,7 @@ jobs:
EV: ${{ toJson(gitea.event) }}
test-process:
needs: build-process
if: ${{ needs.build-process.outputs.buildres == 'success' && needs.build-process.outputs.org != 'k8s' }}
if: ${{ needs.build-process.outputs.buildres == 'success' }}
runs-on: alt-sisyphus
steps:
- name: Update apt
@ -122,11 +117,13 @@ jobs:
- 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"
issueid=$(curl -X 'GET' "$URL/api/v1/repos/$REPO/image-forge/issues?state=open&labels=building&type=issues&page=1&limit=1&token=$T" -H 'accept: application/json' -s | jq '.[].number' -r)
if [[ $issueid != '' ]]; then \
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"; \
else echo "no issue to send notification"; fi
env:
T: ${{ secrets.TOKEN }}
BR: ${{ needs.build-process.outputs.branch }}

View File

@ -1,164 +0,0 @@
name: Building alt images
on:
push:
tags:
- '*_*/*_*'
jobs:
build-process:
runs-on: alt-sisyphus
outputs:
branch: ${{ env.BRANCH }}
image: ${{ env.IMAGE }}
url: ${{ env.URL }}
repo: ${{ env.REPO }}
buildres: ${{ steps.build-script.outcome }}
test: ${{ env.TEST }}
steps:
- name: Check workspace
run: |
repourl=$(echo $GU | cut -d '/' -f 3)
echo "URL=$repourl" >> ${GITHUB_ENV}
echo "URL=$repourl"
reponame=$(echo $GR | cut -d '/' -f 1)
echo "REPO=$reponame" >> ${GITHUB_ENV}
echo "REPO=$reponame"
env:
GU: ${{ gitea.server_url }}
GR: ${{ gitea.repository }}
- name: Set repo for c10f2 (Temporary)
if: ${{ contains(github.ref_name, 'c10f2') }}
run: |
echo "event tag=${{ github.ref_name }}"
echo "10.4.0.3 update.altsp.su" >> /etc/hosts
echo "cat /etc/hosts"
cat /etc/hosts
- name: Update apt
uses: actions/init-alt-env@v1
- name: Install requires
run: |
echo "apt-get install -y python3-module-tomli python3-module-jinja2 python3-module-yaml python3-module-requests podman buildah jq curl"
apt-get install -y python3-module-tomli python3-module-jinja2 python3-module-yaml python3-module-requests podman buildah jq curl
echo "apt-get install -y qemu-user-static-binfmt-aarch64 qemu-user-static-binfmt-arm qemu-user-static-binfmt-ppc qemu-user-static-binfmt-riscv qemu-user-static-binfmt-loongarch"
apt-get install -y qemu-user-static-binfmt-aarch64 qemu-user-static-binfmt-arm qemu-user-static-binfmt-ppc qemu-user-static-binfmt-riscv qemu-user-static-binfmt-loongarch
- name: Check out current repo
uses: actions/checkout@v4
- name: Login podman gitea
run: |
echo "podman login ${{ env.URL }}"
podman login --username $P_USER --password $P_PASS ${{ env.URL }}
env:
P_USER: ${{ secrets.PODMAN_USER }}
P_PASS: ${{ secrets.PODMAN_PASS }}
- name: Check files in the repository
run: |
ls -a ${{ gitea.workspace }}
- name: Parse target branch and tag from events context, save to env
env:
EV: ${{ toJson(gitea.event) }}
run: |
echo $EV | jq '.ref' -r | sed "s/refs\/tags\//BRANCH=/g" | cut -d '_' -f 1
echo $EV | jq '.ref' -r | sed "s/refs\/tags\//BRANCH=/g" | cut -d '_' -f 1 >> ${GITHUB_ENV}
localimage=$(echo $EV | jq '.ref' -r | sed 's/refs\/tags\///g' | cut -d '_' -f 2)
echo "IMAGE=$localimage" >> ${GITHUB_ENV}
echo "IMAGE=$localimage"
org=$(echo "$localimage" | cut -d '/' -f 1)
echo "ORG=$org" >> ${GITHUB_ENV}
echo "ORG=$org"
ver=$(echo $EV | jq '.ref' -r | sed 's/refs\/tags\///g' | cut -d '_' -f 3)
echo "VER=$ver" >> ${GITHUB_ENV}
echo "VER=$ver"
- name: Get test for image
run: |
if test -f ${{ gitea.workspace }}/org/$IM/test; then testscript=$(cat ${{ gitea.workspace }}/org/$IM/test); else testscript=""; fi
echo "TEST=$testscript" >> ${GITHUB_ENV}
env:
IM: ${{ env.IMAGE }}
BR: ${{ env.BRANCH }}
- name: Run building script
id: build-script
run: |
if [[ "$IM" == *"k8s"* ]]; then k8sarg="--overwrite-organization $ORG-$BR --package-versions {\"$IM\":\"$VER\"}"; else k8sarg=""; fi
if [[ "$BR" == "sisyphus" ]]; then arches="--arches amd64 386 arm64 loong64"; else arches="--arches amd64 386 arm64"; fi
echo "build.py -i $IM -b $BR $arches $k8sarg"
${{ gitea.workspace }}/build.py -i $IM -b $BR $arches $k8sarg
env:
IM: ${{ env.IMAGE }}
VER: ${{ env.VER }}
BR: ${{ env.BRANCH }}
ORG: ${{ env.ORG }}
continue-on-error: true
- name: Send notification if build crashed
if: ${{ steps.build-script.outcome != 'success' }}
run: |
issueid=1
body="Building image $IM finish with some errors."
curl -X 'POST' "$URL/api/v1/repos/$REPO/image-forge/issues/$issueid/comments?token=$T" -H 'accept: application/json' -H 'Content-Type: application/json' -d "{ \"body\": \"$body\" }" -s
echo "notification about test error is sent to issue $issueid"
env:
T: ${{ secrets.TOKEN }}
BR: ${{ env.BRANCH }}
URL: ${{ gitea.server_url }}
REPO: ${{ env.REPO }}
IM: ${{ env.IMAGE }}
- name: Delete event tag
run: |
tagname=$(echo $EV | jq '.ref' -r | sed "s/refs\/tags\///g")
curl -X 'DELETE' "$URL/api/v1/repos/$REPO/image-forge/tags/$tagname?token=$T" -H 'accept: application/json' -s
echo "tag $tagname is deleted"
env:
T: ${{ secrets.TOKEN }}
BR: ${{ env.BRANCH }}
URL: ${{ gitea.server_url }}
REPO: ${{ env.REPO }}
EV: ${{ toJson(gitea.event) }}
test-process:
needs: build-process
if: ${{ needs.build-process.outputs.buildres == 'success' }}
runs-on: alt-sisyphus
steps:
- name: Update apt
uses: https://gitea.basealt.ru/actions/init-alt-env@v1
- name: Install requires
run: |
echo "apt-get install -y python3-module-tomli python3-module-jinja2 podman buildah curl"
apt-get install -y python3-module-tomli python3-module-jinja2 podman buildah curl
- name: Run test
id: test-script
if: ${{ needs.build-process.outputs.test != '' }}
continue-on-error: true
run: |
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 }}
- name: Run special test
id: special-test
if: ${{ needs.build-process.outputs.test == '' }}
continue-on-error: true
run: |
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: ${{ needs.build-process.outputs.image }}
BR: ${{ needs.build-process.outputs.branch }}
URL: ${{ needs.build-process.outputs.url }}
REPO: ${{ needs.build-process.outputs.repo }}
- name: Send notification if test crashed
if: ${{ steps.test-script.outcome == 'failure' || steps.special-test.outcome == 'failure' }}
run: |
issueid=1
errors=$(cat errors.log)
body="Testing image $IM finish with some errors."
curl -X 'POST' "$URL/api/v1/repos/$REPO/image-forge/issues/$issueid/comments?token=$T" -H 'accept: application/json' -H 'Content-Type: application/json' -d "{ \"body\": \"$body\" }" -s
echo "notification about test error is sent to issue $issueid"
env:
T: ${{ secrets.TOKEN }}
BR: ${{ needs.build-process.outputs.branch }}
URL: ${{ gitea.server_url }}
REPO: ${{ needs.build-process.outputs.repo }}
IM: ${{ needs.build-process.outputs.image }}

View File

@ -26,70 +26,9 @@ 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** (OPTIONAL)
template to apply when construction the tag,
`version` string variable is available in the template
### 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
```
## 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

153
branch/README.md Normal file
View File

@ -0,0 +1,153 @@
# Описание структуры каталогов для автоматизации рабочео процесса создания образов
## Общая структура каталогов
- Вместо каталога `org` предлагается использовать каталог `branch`
- Каталог `branch` содержит подкаталога бранчей (платформ):
* `sisyphus`;
* `p10`;
* `c10f1`;
* `c10f2`;
* ...
Подкаталоги бранчей содержат дерево групп образов.
Корневая группа `base` содержит образы, которые тегируются по дате создания.
Остальные группы тегируются по версии основного ПО, входящего в состав образа.
Каталог группы может содержать yml-файл `images.yml` описания группы.
Пример дерева описания образов:
<pre>
branch/sisyphus/
├── apache
├── base
│   ├── alt
│   ├── buildpack
│   │   ├── buildpack-deps-curl
│   │   └── buildpack-deps-scm
│   ├── devel
│   ├── distroless
│   │   ├── distroless-base
│   │   ├── distroless-builder
│   │   ├── distroless-devel
│   │   ├── distroless-gotop
│   │   ├── distroless-static
│   │   └── distroless-true
│   ├── systemd
│   └── unit
├── cert-manager
│   ├── cert-manager-cainjector
│   ├── cert-manager-controller
│   └── cert-manager-webhook
├── cni
│   └── flannel
│   ├── flannel
│   └── flannel-cni-plugin
├── gitea
├── k8s
│   ├── coredns
│   ├── deckhouse
│   │   ├── coredns
│   │   ├── etcd
│   │   ├── kube-apiserver
│   │   ├── kube-controller-manager
│   │   ├── kube-proxy
│   │   ├── kube-scheduler
│   │   └── pause
│   ├── etcd
│   ├── kube-apiserver
│   ├── kube-controller-manager
│   ├── kube-proxy
│   ├── kube-scheduler
│   └── pause
├── nginx
├── prometheus
├── python
├── registry
├── ruby
└── trivy
└── trivy-node-collector
</pre>
Конечный каталог дерева содержит файлы:
- **`Dockerfile`** - файл для сборки образа;
- **`image.yml`** - файл описания метаданных для образа.
Кроме этого конечный каталог может содержать файлы и каталоги, которые помещаются в образ командами `COPY` и `ADD`.
Все вышележащие до каталога конкретного бранча (`sisyphus`, `p10`, `c10f1`, `c10f2`, ...) описывают группу (возможно пустую), в которую входит образ.
Имя образа формируется как тропа дерева каталогов.
Например:
- `sisyphus/apache`
- `sisyphus/k8s/kube-apiserver`
Имя тега берется либо из файла `image.yml` описания образа, либо из файла описания группы `images.yml`.
## Конечный каталог описания образа
### Dockerfile
Предлагается заменить шаблон `Dockerfile.template` заменить на нативный `Dockerfile`.
Все параметры, подставляемые функцией `render_dockerfiles` скрипта
[/build.py](https://gitea.basealt.ru/alt/image-forge/src/branch/feature-new-layout/build.py#L249)
заменяются на аргументы (`ARG`), инициализируемые непосредственно в `Dockerfile`или передаваемые (с заиещением) при сборко образа параметрами `--build-arg="<ARG>=<VALUE>"`.
За исключением шаблона `{{ install_pakages("<пакет>" ...) }}`
Предлагается во все базовые дистрибутивы включить `shell-скрипт` `alt_install_pakages`, выполняющий функции аналогичные
python-функции [install_pakages](https://gitea.basealt.ru/alt/image-forge/src/branch/feature-new-layout/build.py#L250).
Шаблон `{{ install_pakages("<пакет>" ...) }}` заменяется в `Dockerfile` оператором:
```
RUN alt_install_pakages <пакет> ...
```
Пример файла образа `sisyphus/k8s/kube-apiserver`:
<pre>
ARG BRANCH REGISTRY=gitea.basealt.ru ALT_IMAGE=base/alt:$BRANCH MAINTAINER=alt-cloud ALT_TESTSCRIPT=/bin/true
FROM $REGISTRY/$ALT_IMAGE:$BRANCH
MAINTAINER $MAINTAINER
LABEL org.altlinux.testscript=$ALT_TESTSCRIPT
RUN alt_install_pakages kubernetes-master
ENTRYPOINT ["/usr/bin/kube-apiserver"]
</pre>
### Файл image.yml описания метаданных для образа
В настоящий момент он содержит (жирным шрифтом обязательные элементы):
* **`image.maintainer`** - E-mail майнтейнера для создания и проверки электронной подписи образа;
* `image.alias` - список возможных алиасов образа;
* `image.tag` - тер образа (может при сборке перекрываться тегом, взятым из вышележащего файла `images.yml` описания группы)
* `image.labels` - список дополнительных метов образа, в частности:
- `org.altlinux.testscript` - shell код для тестоиования образа при его запуске в режиме `podman ... -it --- <образ>`
Пример файла образа `sisyphus/k8s/kube-apiserver`:
<pre>
version: 1.0
image:
alias:
- k8s-${BRANCH}/${IMAGE}:${TAG}
labels:
org.altlinux.testscript: /bin/true
maintainer: stepchenkoas@basealt.ru
</pre>
## Каталог группы
### Файл `images.yml` описания метаданных группы

View File

@ -0,0 +1,7 @@
version: 1.0
image:
alias:
- k8s-${BRANCH}/${IMAGE}:${TAG}
labels:
org.altlinux.testscript: /bin/true
maintainer: stepchenkoas@basealt.ru

View File

@ -0,0 +1,41 @@
version: 1.0
imageSet:
listCmd: ...
- version: 1.26.9
images:
- kube-apiserver:
tag: 1.26.9
- kube-controllermanager:
tag: 1.26.9
- kube-proxy:
tag: 1.26.9
- kube-scheduler:
tag: 1.26.9
- pause:
tag: 3.8
- coredns:
tag: v1.10.0
- etcd:
tag: 3.5.9
alias:
- alt/etcd:3.5.9
- version: 1.26.14
images:
- kube-apiserver:
tag: 1.26.14
- kube-controllermanager:
tag: 1.26.14
- kube-proxy:
tag: 1.26.14
- kube-scheduler:
tag: 1.26.14
- pause:
tag: 3.9
- coredns:
tag: v1.10.0
- etcd:
tag: 3.5.10
alias:
- alt/etcd:3.5.10

View File

@ -0,0 +1,7 @@
version: 1.0
image:
alias:
- k8s-${BRANCH}/${IMAGE}:${TAG}
labels:
org.altlinux.testscript: /bin/true
maintainer: stepchenkoas@basealt.ru

View File

@ -0,0 +1,7 @@
version: 1.0
image:
alias:
- k8s-${BRANCH}/${IMAGE}:${TAG}
labels:
org.altlinux.testscript: /bin/true
maintainer: stepchenkoas@basealt.ru

View File

@ -0,0 +1,7 @@
version: 1.0
image:
alias:
- k8s-${BRANCH}/${IMAGE}:${TAG}
labels:
org.altlinux.testscript: /bin/true
maintainer: stepchenkoas@basealt.ru

View File

@ -0,0 +1,7 @@
version: 1.0
image:
alias:
- k8s-${BRANCH}/${IMAGE}:${TAG}
labels:
org.altlinux.testscript: /bin/true
maintainer: stepchenkoas@basealt.ru

View File

@ -0,0 +1,7 @@
version: 1.0
image:
alias:
- k8s-${BRANCH}/${IMAGE}:${TAG}
labels:
org.altlinux.testscript: /bin/true
maintainer: stepchenkoas@basealt.ru

207
build.py
View File

@ -6,62 +6,25 @@ import json
import re
import subprocess
import textwrap
from datetime import datetime
from dataclasses import dataclass
from graphlib import TopologicalSorter
from pathlib import Path
import requests
import tomli
import yaml
from jinja2 import Template
ORG_DIR = Path("org")
PKG_VERSIONS: dict | None = None
@dataclass
class Image:
canonical_name: str
is_versioned: bool | None
verion_template: str | None
source_packages: list[str] | None
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
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"]
def __str__(self):
return (f'Image(canonical_name="{self.canonical_name}", '
f'path="{self.path}", base_name="{self.base_name}")')
class Tasks:
@ -86,95 +49,22 @@ class Tasks:
]
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:
print(response)
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:
print(response)
raise RuntimeError(
f"failed to retrieve source package version: source package {package_name!r}, branch {branch!r} "
)
result = response.json()
for v in result["versions"]:
if v["branch"] == branch:
return v["version"]
raise RuntimeError(
f"failed to retrieve source package version: source package {package_name!r}, branch {branch!r} "
)
result = response.json()
return result["versions"][0]["version"]
class Tags:
def __init__(self, tags_file: str | None, 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):
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]
if re.search("{%.*%}", package_name):
package_name = Template(package_name).render(branch=branch).strip()
print(f"{package_name=}")
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}"
)
package_name = Template(package_name).render(
version=PKG_VERSIONS[image.canonical_name]
)
version = api_get_source_package_version(branch, package_name)
if image.version_template is not None:
version = (
Template(image.version_template).render(version=version).strip()
)
tags = [version]
tags.append("latest")
else:
version = datetime.now().strftime('%Y%m%d')
if image.version_template is not None:
version = (
Template(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
@ -217,10 +107,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:
@ -267,10 +153,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()
@ -298,7 +183,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
@ -340,19 +225,19 @@ class DockerBuilder:
self,
template: str,
organization: str,
install_packages=None,
install_pakages=None,
**kwargs,
) -> str:
if self.registry:
registry = self.registry.rstrip("/") + "/"
alt_image = "alt"
alt_image = "alt/alt"
else:
registry = ""
alt_image = "alt"
rendered = Template(template).render(
alt_image=alt_image,
branch=self.branch,
install_packages=install_packages,
install_pakages=install_pakages,
organization=organization,
registry=registry,
**kwargs,
@ -362,7 +247,7 @@ class DockerBuilder:
@forall_images(consume_result=True)
def render_dockerfiles(self, **kwargs):
def install_packages(*names):
def install_pakages(*names):
tasks = self.tasks.get(self.branch, kwargs["image"])
linux32 = '$([ "$(rpm --eval %_host_cpu)" = i586 ] && echo linux32)'
if tasks:
@ -388,7 +273,7 @@ class DockerBuilder:
rendered = self.render_template(
dockerfile_template.read_text(),
self.overwrite_organization,
install_packages,
install_pakages,
)
kwargs["dockerfile"].write_text(rendered + "\n")
@ -419,7 +304,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")
@ -428,7 +313,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)
@ -460,7 +345,7 @@ class DockerBuilder:
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)
@ -695,12 +580,6 @@ class DockerBuilder:
f"--platform={platforms}",
".",
]
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:]:
@ -759,8 +638,8 @@ class ImagesInfo:
def parse_args():
stages = ["build", "remove_dockerfiles", "render_dockerfiles", "push"]
arches = ["amd64", "386", "arm64", "loong64", "riscv64"]
branches = ["p11", "p10", "sisyphus", "c10f1", "c10f2"]
arches = ["amd64", "386", "arm64", "arm", "ppc64le"]
branches = ["p9", "p10", "sisyphus"]
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]
@ -775,8 +654,7 @@ def parse_args():
nargs="+",
default=images,
choices=images,
metavar="IMAGE_NAME",
help="list of images to build",
help="list of branches",
)
images_group.add_argument(
"-o",
@ -786,14 +664,6 @@ def parse_args():
choices=organizations,
help="build all images from these organizations",
)
parser.add_argument(
"--skip-images",
nargs="+",
default=[],
choices=images,
metavar="IMAGE_NAME",
help="list of images to skip",
)
parser.add_argument(
"-r",
"--registry",
@ -826,20 +696,27 @@ def parse_args():
parser.add_argument(
"--sign",
)
parser.add_argument(
"--skip-images",
nargs="+",
default=[],
choices=images,
help="list of skipping images",
)
parser.add_argument(
"-a",
"--arches",
nargs="+",
default=arches,
choices=arches,
help="build images for these architectures",
help="list of arches",
)
parser.add_argument(
"--skip-arches",
nargs="+",
default=[],
choices=arches,
help="list of architectures to skip",
help="list of skipping arches",
)
parser.add_argument(
"-b",
@ -847,33 +724,28 @@ def parse_args():
nargs="+",
default=branches,
choices=branches,
help="build images for these branches",
help="list of branches",
)
parser.add_argument(
"--skip-branches",
nargs="+",
default=[],
choices=branches,
help="list of branches to skip",
help="list of skipping branches",
)
parser.add_argument(
"--stages",
nargs="+",
default=stages,
choices=stages,
help="list of stages to go through",
help="list of stages",
)
parser.add_argument(
"--skip-stages",
nargs="+",
default=[],
choices=stages,
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",
help="list of skipping stages",
)
args = parser.parse_args()
@ -886,10 +758,7 @@ def parse_args():
def main():
global PKG_VERSIONS
args = parse_args()
PKG_VERSIONS = args.package_versions
arches = args.arches
images_info = ImagesInfo()
tags = Tags(args.tags, args.latest)

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud
@ -8,7 +8,7 @@ LABEL org.opencontainers.image.source="http://httpd.apache.org"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("apache2") }}
{{ install_pakages("apache2") }}
EXPOSE 80

View File

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

View File

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

View File

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

View File

@ -1,13 +1,12 @@
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"
{{ install_packages(
{{ install_pakages(
"ca-certificates",
"curl",
"gnupg",

View File

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

View File

@ -1,13 +1,12 @@
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(
{{ install_pakages(
"git",
"mercurial",
"openssh-clients",

View File

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

View File

@ -1,13 +1,12 @@
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"
{{ install_packages(
{{ install_pakages(
"ImageMagick",
"autoconf",
"automake",

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/base:latest
FROM {{ registry }}{{ organization }}/base:{{ branch }}
MAINTAINER alt-cloud
@ -8,27 +8,27 @@ LABEL org.opencontainers.image.licenses="GPLv2"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
# install editor
{{ install_packages("vim-console") }}
{{ install_pakages("vim-console") }}
# install debugging tools
{{ install_packages("strace", "gdb") }}
{{ install_pakages("strace", "gdb") }}
# install document viewers
{{ install_packages("man") }}
{{ install_pakages("man") }}
# install version control system
{{ install_packages("git-core", "perl-Git") }}
{{ install_pakages("git-core", "perl-Git") }}
# install network utils
{{ install_packages("iproute2", "iputils", "wget", "curl") }}
{{ install_pakages("iproute2", "iputils", "wget", "curl") }}
# install file utils
{{ install_packages("lsof", "ripgrep") }}
{{ install_pakages("lsof", "ripgrep") }}
# install shell and completions
{{ install_packages("zsh", "zsh-completions") }}
{{ install_pakages("zsh", "zsh-completions") }}
# install compilation utils
{{ install_packages("make", "gcc", "gcc-c++") }}
{{ install_pakages("make", "gcc", "gcc-c++") }}
CMD ["zsh"]

View File

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

View File

@ -1,11 +1,11 @@
from = "{{ registry }}{{ branch }}/distroless-static:latest"
from = "{{ registry }}{{ organization }}/distroless-static:{{ branch }}"
builder-install-packages = [
"glibc-core",
'{{if_branches(["p10"], "glibc-nss")}}',
"glibc-timezones",
"libselinux",
'{{if_branches(["p10"], "libssl1.1")}}',
'{{if_branches(["p11"], "libssl3")}}',
'{{if_branches(["p9", "p10"], "libssl1.1")}}',
'{{if_branches(["sisyphus"], "libssl1.1")}}',
'{{if_branches(["sisyphus"], "libssl3")}}',
"tzdata",
"zlib",
@ -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"}

View File

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

View File

@ -1,15 +1,15 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="distroless-builder"
LABEL org.opencontainers.image.description="This image is used to build tarballs for distroless images"
LABEL org.opencontainers.image.description="This images is using to build tarball for distroless images"
LABEL org.opencontainers.image.licenses="GPLv2"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
RUN echo %_excludedocs 1 >> /etc/rpm/macros
RUN rpm -qalds | awk '/^normal/{print $2}' | xargs rm -rf
{{ install_packages("python3", "glibc-utils", "apt-repo") }}
{{ install_pakages("python3", "glibc-utils", "apt-repo") }}
WORKDIR /usr/src/distroless
RUN mkdir file-lists
RUN useradd -m nonroot

View File

@ -1,3 +1,3 @@
ALT dockerfile for distroless-builder image.
This image is used to build tarballs for distroless images.
This images is using to build tarball for distroless images.

View File

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

View File

@ -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"}

View File

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

View File

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

View File

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

View File

@ -2,4 +2,3 @@ from = "scratch"
file-lists = ["static.list"]
user = "nonroot"
workdir = "/home/nonroot"
label = {"org.opencontainers.image.title" = "distroless-static", "org.opencontainers.image.description" = "Base image for running statically linked programs", "org.opencontainers.image.licenses" = "GPLv2", "org.opencontainers.image.vendor" = "ALT Linux Team"}

View File

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

View File

@ -1,11 +0,0 @@
ALT distroless-toybox image
===========================
This is distroless image with toybox binary. It can be used for debugging
containers as toybox provides a lot of utils.
To launch a shell in the container:
`docker run --rm -it registry.altlinux.org/alt/distroless-toybox`
To get system inforamtion:
`docker run --rm -it registry.altlinux.org/alt/distroless-toybox uname -a`

View File

@ -1,7 +0,0 @@
from = "{{ registry }}{{ branch }}/distroless-static:latest"
builder-install-packages = ["toybox"]
files = ["/bin/toybox"]
entrypoint = ["/bin/toybox"]
cmd = ["sh"]
label = {"org.opencontainers.image.title" = "distroless-toybox", "org.opencontainers.image.description" = "Base image with toybox environment", "org.opencontainers.image.licenses" = "GPLv2", "org.opencontainers.image.vendor" = "ALT Linux Team"}

View File

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

View File

@ -1,4 +1,3 @@
from = "{{ registry }}{{ branch }}/distroless-static:latest"
from = "{{ registry }}{{ organization }}/distroless-static:{{ branch }}"
files = ["/bin/true"]
cmd = ["/bin/true"]
label = {"org.opencontainers.image.title" = "distroless-true", "org.opencontainers.image.description" = "True-command image for zero status returning", "org.opencontainers.image.licenses" = "GPLv2", "org.opencontainers.image.vendor" = "ALT Linux Team"}

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud
@ -8,7 +8,7 @@ LABEL org.opencontainers.image.source="https://github.com/etcd-io/etcd"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("etcd") }}
{{ install_pakages("etcd") }}
VOLUME /data

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud
@ -8,7 +8,7 @@ LABEL org.opencontainers.image.source="https://github.com/go-gitea/gitea"
LABEL org.opencontainers.image.licenses="MIT"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("gitea", "openssh-server", "gosu") }}
{{ install_pakages("gitea", "openssh-server", "gosu") }}
ENV USER gitea
ENV HOME /var/lib/gitea

View File

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

View File

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

View File

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

View File

@ -1 +0,0 @@
go version

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud
@ -8,7 +8,7 @@ LABEL org.opencontainers.image.source="https://nginx.org/"
LABEL org.opencontainers.image.licenses="BSD"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("nginx", "apache2-html", "tzdata") }}
{{ install_pakages("nginx", "apache2-html", "tzdata") }}
RUN cd /etc/nginx/sites-enabled.d && ln -s ../sites-available.d/default.conf .

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/buildpack-deps:latest
FROM {{ registry }}{{ organization }}/buildpack-deps:{{ branch }}
MAINTAINER alt-cloud
@ -11,7 +11,7 @@ LABEL org.opencontainers.image.vendor="ALT Linux Team"
RUN groupadd --gid 1000 node \
&& useradd --uid 1000 --gid node --shell /bin/bash --create-home node
{{ install_packages(
{{ install_pakages(
"node",
"npm",
"yarn"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud
@ -8,11 +8,10 @@ LABEL org.opencontainers.image.source="https://github.com/prometheus/prometheus"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("prometheus") }}
{{ install_pakages("prometheus") }}
WORKDIR /var/lib/prometheus
USER prometheus
EXPOSE 9090
VOLUME [ "/var/lib/prometheus" ]
ENTRYPOINT [ "/usr/bin/prometheus" ]
CMD [ "--config.file=/etc/prometheus/prometheus.yml" ]
ENTRYPOINT [ "/usr/bin/prometheus", "--config.file=/etc/prometheus/prometheus.yml"]

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/base:latest
FROM {{ registry }}{{ organization }}/base:{{ branch }}
MAINTAINER alt-cloud
@ -8,7 +8,7 @@ LABEL org.opencontainers.image.source="https://github.com/python/cpython"
LABEL org.opencontainers.image.licenses="Python"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages(
{{ install_pakages(
"python3-module-pip",
"python3-module-setuptools",
"python3-dev",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1 +0,0 @@
rabbitmqctl version

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud
@ -8,7 +8,7 @@ LABEL org.opencontainers.image.source="https://github.com/docker/distribution"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("docker-registry") }}
{{ install_pakages("docker-registry") }}
RUN ln -sf /usr/bin/docker-registry /bin/registry

View File

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

View File

@ -1,4 +1,4 @@
FROM {{ registry }}{{ branch }}/{{ alt_image }}:latest
FROM {{ registry }}{{ alt_image }}:{{ branch }}
MAINTAINER alt-cloud
@ -8,6 +8,6 @@ LABEL org.opencontainers.image.source="https://github.com/ruby/ruby"
LABEL org.opencontainers.image.licenses="BSD-2-Clause or Ruby"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
{{ install_packages("irb") }}
{{ install_pakages("irb") }}
CMD ["irb"]

View File

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

View File

@ -1,16 +1,16 @@
FROM {{ registry }}{{ branch }}/base:latest
FROM {{ registry }}{{ organization }}/base:{{ branch }}
MAINTAINER alt-cloud
LABEL org.opencontainers.image.title="systemd"
LABEL org.opencontainers.image.description="System and Session Manager"
LABEL org.opencontainers.image.description="Systemd System V init tools"
LABEL org.opencontainers.image.source="https://github.com/systemd/systemd"
LABEL org.opencontainers.image.licenses="LGPLv2.1+"
LABEL org.opencontainers.image.vendor="ALT Linux Team"
ENV container docker
{{ install_packages("systemd-sysvinit") }}
{{ install_pakages("systemd-sysvinit") }}
RUN ( \
cd /lib/systemd/system/sysinit.target.wants/; \

View File

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

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