From f15f971a1547ddf380e6dff920b6215a67b92b48 Mon Sep 17 00:00:00 2001 From: Iosif Pravets Date: Thu, 25 Sep 2025 19:41:15 +0000 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B8=20=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B7=D0=B0=20git?= =?UTF-8?q?rules?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build-gitrules.yml | 26 +++++++++++++ src/build-gitrules.sh | 56 ++++++++++++++++++++++++++++ src/gitrules/Dockerfile | 11 ++++++ src/tag-gitrules-latest.sh | 4 ++ tests/test-gitrules.sh | 31 +++++++++++++++ 5 files changed, 128 insertions(+) create mode 100644 .github/workflows/build-gitrules.yml create mode 100755 src/build-gitrules.sh create mode 100644 src/gitrules/Dockerfile create mode 100755 src/tag-gitrules-latest.sh create mode 100755 tests/test-gitrules.sh diff --git a/.github/workflows/build-gitrules.yml b/.github/workflows/build-gitrules.yml new file mode 100644 index 0000000..087c327 --- /dev/null +++ b/.github/workflows/build-gitrules.yml @@ -0,0 +1,26 @@ +name: Build gitrules Docker Image + +on: + push: + tags: + - 'gitrules' # реагировать на тег gitrules + +jobs: + build: + runs-on: ubuntu-latest + env: + DOCKER_REGISTRY_URL: ${{ secrets.DOCKER_REGISTRY_URL }} + DOCKER_LOGIN: ${{ secrets.DOCKER_LOGIN }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and Push Docker image + run: | + echo "Собираем gitrules" + ./src/build-gitrules.sh diff --git a/src/build-gitrules.sh b/src/build-gitrules.sh new file mode 100755 index 0000000..11c9865 --- /dev/null +++ b/src/build-gitrules.sh @@ -0,0 +1,56 @@ +#!/bin/bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +if [ -z "${CI:-}" ]; then + echo "The script is not running in CI" + source "${SCRIPT_DIR}/../scripts/load_env.sh" +else + echo "The script is running in CI"; +fi + +source "${SCRIPT_DIR}/../scripts/docker_login.sh" +source "${SCRIPT_DIR}/../tools/assert.sh" + +if [[ "${DOCKER_SYSTEM_PRUNE:-}" = "true" ]] ; +then + docker system prune -af +fi + +last_arg="." +if [[ ${NO_CACHE:-} = "true" ]] ; then + last_arg="--no-cache ." +fi + +gitrules_version="latest" + +docker build \ + --pull \ + --build-arg GITRULES_VERSION="${gitrules_version}" \ + --build-arg DOCKER_REGISTRY_URL="${DOCKER_REGISTRY_URL}" \ + --build-arg DOCKER_LOGIN="${DOCKER_LOGIN}" \ + -t "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/gitrules:${gitrules_version}" \ + -f "${SCRIPT_DIR}/gitrules/Dockerfile" \ + ${last_arg} + +if ./tests/test-gitrules.sh; then + container_version=$(docker run --rm "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/gitrules:${gitrules_version}" --version | tail -n1) + + if [[ -n "${container_version}" ]]; then + docker push "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/gitrules:${gitrules_version}" + + docker tag "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/gitrules:${gitrules_version}" "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/gitrules:${container_version}" + docker push "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/gitrules:${container_version}" + + else + log_failure "Не удалось получить версию из контейнера" + exit 1 + fi + + source "${SCRIPT_DIR}/../scripts/cleanup.sh" +else + log_failure "ERROR: Тесты провалены. Образ не был запушен." + source "${SCRIPT_DIR}/../scripts/cleanup.sh" + exit 1 +fi +exit 0 \ No newline at end of file diff --git a/src/gitrules/Dockerfile b/src/gitrules/Dockerfile new file mode 100644 index 0000000..27be5fd --- /dev/null +++ b/src/gitrules/Dockerfile @@ -0,0 +1,11 @@ +ARG DOCKER_REGISTRY_URL=docker.io +ARG DOCKER_LOGIN=sleemp +ARG BASE_IMAGE=oscript +ARG BASE_TAG=dev + +FROM ${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/${BASE_IMAGE}:${BASE_TAG} +LABEL maintainer="Iosif Pravets " + +RUN opm i gitrules; + +ENTRYPOINT ["gitrules"] \ No newline at end of file diff --git a/src/tag-gitrules-latest.sh b/src/tag-gitrules-latest.sh new file mode 100755 index 0000000..36e80bf --- /dev/null +++ b/src/tag-gitrules-latest.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -euo pipefail + +git tag -f gitrules && git push origin gitrules -f \ No newline at end of file diff --git a/tests/test-gitrules.sh b/tests/test-gitrules.sh new file mode 100755 index 0000000..3b344e8 --- /dev/null +++ b/tests/test-gitrules.sh @@ -0,0 +1,31 @@ +#!/bin/bash +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +if [ -z "${CI-}" ]; then + echo "The script is not running in CI" + source "${SCRIPT_DIR}/../.env" +else + echo "The script is running in CI" +fi + +source "${SCRIPT_DIR}/../tools/assert.sh" + +test_gitrules_is_running() { + log_header "Test :: gitrules is running" + + local expected actual + + expected="ИНФОРМАЦИЯ - [СписокРелизов1С]: Инициализирован обработчик" + actual=$(docker run --rm ${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/gitrules:latest 2>/dev/null | head -n1) + + if assert_eq "$expected" "$actual"; then + log_success "gitrules is running test passed" + else + log_failure "gitrules is running test failed" + fi +} + +# test calls +test_gitrules_is_running \ No newline at end of file From f4250bc0704c699d273bfb1b401be1547ce02d34 Mon Sep 17 00:00:00 2001 From: Iosif Pravets Date: Thu, 25 Sep 2025 19:51:11 +0000 Subject: [PATCH 2/5] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BE=D0=B6=D0=B8=D0=B4=D0=B0=D0=B5?= =?UTF-8?q?=D0=BC=D0=BE=D0=B5=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B2=20=D1=82=D0=B5=D1=81=D1=82=D0=B5=20gitrul?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test-gitrules.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test-gitrules.sh b/tests/test-gitrules.sh index 3b344e8..bb3a8ab 100755 --- a/tests/test-gitrules.sh +++ b/tests/test-gitrules.sh @@ -17,7 +17,7 @@ test_gitrules_is_running() { local expected actual - expected="ИНФОРМАЦИЯ - [СписокРелизов1С]: Инициализирован обработчик" + expected="Приложение: gitrules" actual=$(docker run --rm ${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/gitrules:latest 2>/dev/null | head -n1) if assert_eq "$expected" "$actual"; then From 879940f4c84c3f0f279899b029adcbf26575dedb Mon Sep 17 00:00:00 2001 From: Iosif Pravets Date: Thu, 25 Sep 2025 19:55:40 +0000 Subject: [PATCH 3/5] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=84=D0=BB=D0=B0=D0=B3=D0=BE=D0=BC?= =?UTF-8?q?=20=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B2=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82?= =?UTF-8?q?=D0=B5=20gitrules?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test-gitrules.sh | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tests/test-gitrules.sh b/tests/test-gitrules.sh index bb3a8ab..0b66514 100755 --- a/tests/test-gitrules.sh +++ b/tests/test-gitrules.sh @@ -12,6 +12,10 @@ fi source "${SCRIPT_DIR}/../tools/assert.sh" +# Global flag to mark if any test failed. At the end script will exit with non-zero +# status if any test set this flag. This ensures CI/build scripts stop on test failures. +TEST_FAILED=0 + test_gitrules_is_running() { log_header "Test :: gitrules is running" @@ -24,8 +28,14 @@ test_gitrules_is_running() { log_success "gitrules is running test passed" else log_failure "gitrules is running test failed" + TEST_FAILED=1 fi } # test calls -test_gitrules_is_running \ No newline at end of file +test_gitrules_is_running + +# Exit with non-zero if any test failed so callers (like build scripts) can stop further steps +if [[ "$TEST_FAILED" -ne 0 ]]; then + exit 1 +fi \ No newline at end of file From 5b72f1e4eabf42323f66b7cfb7a4258080d8a476 Mon Sep 17 00:00:00 2001 From: Iosif Pravets Date: Fri, 26 Sep 2025 12:56:56 +0000 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B8=20=D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D0=B8=20=D0=BF=D0=BE=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8E=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B7=D0=B0=20gitrules=20=D0=B2=20READ?= =?UTF-8?q?ME?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/README.md b/README.md index 1e93928..93b4a8e 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ - [yard](#yard) - [onec-installer-downloader](#onec-installer-downloader) - [winow](#winow) +- [gitrules](#gitrules) ## Подготовительные шаги @@ -267,3 +268,49 @@ sleemp/onec-installer-downloader:20250723 thin-client32 8.3.25.1445 1. Явных ограничений вроде бы нет. [↑ В начало](#oscript-images) + +## gitrules + +[![Docker Pulls](https://img.shields.io/docker/pulls/sleemp/gitrules)](https://hub.docker.com/r/sleemp/gitrules) +[![Docker Version](https://img.shields.io/docker/v/sleemp/gitrules/latest)](https://hub.docker.com/r/sleemp/gitrules) + +Готовые собранные образы можно взять в [sleemp/gitrules](https://hub.docker.com/r/sleemp/gitrules) + +### Назначение + +Образ предназначен для сборки/разборки правил конверации в формате Конвертации данных 2.0 с помощью утилиты [gitrules](https://github.com/oscript-library/gitrules). + +### Сборка + +1. [**Выполните подготовительные шаги**](#подготовительные-шаги), если не сделали это ранее + +1. **Добавьте тег `gitrules`** + - Перейдите во вкладку "Tags" или используйте команду: + ```bash + git tag -f gitrules + git push origin gitrules -f + ``` + + - либо клонируйте репозиторий к себе на Linux-хост (или используйте GitHub Codespaces) и запустите скрипт `./src/tag-gitrules-latest.sh` — он принудительно «перевесит» тег на последний коммит и запушит теги + - Это необходимо для запуска сборки gitrules через GitHub Actions. + +1. **Запустите сборку** + - После пуша тега workflow автоматически соберёт и опубликует образ `gitrules` в ваш Docker Registry. + - будет опубликован образ с тегом `latest`, а также с номерной версией собранного `gitrules` + +1. **Проверьте результат** + - Убедитесь, что образ появился в вашем Docker Registry с именем `gitrules` и соответствующей версией. + +### Зависимости + +Образ собирается на основе [oscript:dev](#oscript), он должен быть предварительно собран и запушен. + +### Использование + +1. Необходимо пробросить в контейнер каталог, в котором находятся ваши правила и где будет происходить сборка. Путь к каталогу внутри не регламентируеся, вы можете, например, использовать `-v ./:/tmp/rules`. + +1. Подробнее с использованием утилиты можно в репозитории [gitrules](https://github.com/oscript-library/gitrules) + +1. Также, например, образ используется в CI/CD [компоненте для сборки правил конвертации для Gitlab CI](https://gitlab.com/explore/catalog/onec-components/onec-gitrules). Репозиторий данной компоненты есть и [на GitHub](https://github.com/onec-components/onec-gitrules) + +[↑ В начало](#oscript-images) From b708ea4f56aef68ec93c3750348b5f96a14462db Mon Sep 17 00:00:00 2001 From: Iosif Pravets Date: Fri, 26 Sep 2025 16:09:00 +0300 Subject: [PATCH 5/5] Update README.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 93b4a8e..f6bf7ed 100644 --- a/README.md +++ b/README.md @@ -278,7 +278,7 @@ sleemp/onec-installer-downloader:20250723 thin-client32 8.3.25.1445 ### Назначение -Образ предназначен для сборки/разборки правил конверации в формате Конвертации данных 2.0 с помощью утилиты [gitrules](https://github.com/oscript-library/gitrules). +Образ предназначен для сборки/разборки правил конвертации в формате Конвертации данных 2.0 с помощью утилиты [gitrules](https://github.com/oscript-library/gitrules). ### Сборка