From a99814607f377f57aec50f148cbc0a8ede64af07 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Oct 2025 21:11:12 +0000 Subject: [PATCH] Add edt-ripper Docker image implementation Co-authored-by: pravets <24823089+pravets@users.noreply.github.com> --- .github/workflows/build-edt-ripper.yml | 26 ++++++++++++ README.md | 57 ++++++++++++++++++++++++++ src/build-edt-ripper.sh | 56 +++++++++++++++++++++++++ src/edt-ripper/Dockerfile | 12 ++++++ src/tag-edt-ripper-latest.sh | 4 ++ tests/test-edt-ripper.sh | 41 ++++++++++++++++++ 6 files changed, 196 insertions(+) create mode 100644 .github/workflows/build-edt-ripper.yml create mode 100755 src/build-edt-ripper.sh create mode 100644 src/edt-ripper/Dockerfile create mode 100755 src/tag-edt-ripper-latest.sh create mode 100755 tests/test-edt-ripper.sh diff --git a/.github/workflows/build-edt-ripper.yml b/.github/workflows/build-edt-ripper.yml new file mode 100644 index 0000000..4c4ef17 --- /dev/null +++ b/.github/workflows/build-edt-ripper.yml @@ -0,0 +1,26 @@ +name: Build edt-ripper Docker Image + +on: + push: + tags: + - 'edt-ripper' # реагировать на тег edt-ripper + +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 "Собираем edt-ripper" + ./src/build-edt-ripper.sh diff --git a/README.md b/README.md index 5f707ab..2fe0ca9 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ - [winow](#winow) - [gitrules](#gitrules) - [stebi](#stebi) +- [edt-ripper](#edt-ripper) ## Подготовительные шаги @@ -371,3 +372,59 @@ sleemp/onec-installer-downloader:20250723 thin-client32 8.3.25.1445 Явных ограничений нет. [↑ В начало](#oscript-images) + +## edt-ripper + +[![Docker Pulls](https://img.shields.io/docker/pulls/sleemp/edt-ripper)](https://hub.docker.com/r/sleemp/edt-ripper) +[![Docker Version](https://img.shields.io/docker/v/sleemp/edt-ripper/latest)](https://hub.docker.com/r/sleemp/edt-ripper) + +Готовые собранные образы можно взять в [sleemp/edt-ripper](https://hub.docker.com/r/sleemp/edt-ripper) + +### Назначение + +Образ предназначен для разборки/сборки EDT-проектов с помощью утилиты [edt-ripper](https://github.com/bia-technologies/edt_ripper). Утилита позволяет разобрать проект EDT в исходники и собрать обратно, что полезно для версионного контроля и автоматизации. + +### Сборка + +1. [**Выполните подготовительные шаги**](#подготовительные-шаги), если не сделали это ранее + +1. **Добавьте тег `edt-ripper`** + - Перейдите во вкладку "Tags" или используйте команду: + ```bash + git tag -f edt-ripper + git push origin edt-ripper -f + ``` + + - либо клонируйте репозиторий к себе на Linux-хост (или используйте GitHub Codespaces) и запустите скрипт `./src/tag-edt-ripper-latest.sh` — он принудительно «перевесит» тег на последний коммит и запушит теги + - Это необходимо для запуска сборки edt-ripper через GitHub Actions. + +1. **Запустите сборку** + - После пуша тега workflow автоматически соберёт и опубликует образ `edt-ripper` в ваш Docker Registry. + - будет опубликован образ с тегом `latest`, а также с номерной версией собранного `edt-ripper` + +1. **Проверьте результат** + - Убедитесь, что образ появился в вашем Docker Registry с именем `edt-ripper` и соответствующей версией. + +### Зависимости + +Образ собирается на основе [oscript:dev](#oscript), он должен быть предварительно собран и запушен. + +### Использование + +1. Образ можно использовать для разборки EDT-проекта в исходники: + ```bash + docker run --rm -v ./:/workspace sleemp/edt-ripper:latest unpack ./project.edt ./src + ``` + +1. Для просмотра всех доступных команд запустите образ без параметров или с ключом `--help`: + ```bash + docker run --rm sleemp/edt-ripper:latest + ``` + +1. Подробнее с использованием утилиты можно ознакомиться в репозитории [edt-ripper](https://github.com/bia-technologies/edt_ripper) + +### Ограничения + +Явных ограничений нет. + +[↑ В начало](#oscript-images) diff --git a/src/build-edt-ripper.sh b/src/build-edt-ripper.sh new file mode 100755 index 0000000..d5e5fed --- /dev/null +++ b/src/build-edt-ripper.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 + +edt_ripper_version="latest" + +docker build \ + --pull \ + --build-arg EDT_RIPPER_VERSION="${edt_ripper_version}" \ + --build-arg DOCKER_REGISTRY_URL="${DOCKER_REGISTRY_URL}" \ + --build-arg DOCKER_LOGIN="${DOCKER_LOGIN}" \ + -t "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/edt-ripper:${edt_ripper_version}" \ + -f "${SCRIPT_DIR}/edt-ripper/Dockerfile" \ + ${last_arg} + +if ./tests/test-edt-ripper.sh; then + container_version=$(docker run --rm "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/edt-ripper:${edt_ripper_version}" --version | tail -n1) + + if [[ -n "${container_version}" ]]; then + docker push "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/edt-ripper:${edt_ripper_version}" + + docker tag "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/edt-ripper:${edt_ripper_version}" "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/edt-ripper:${container_version}" + docker push "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/edt-ripper:${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 diff --git a/src/edt-ripper/Dockerfile b/src/edt-ripper/Dockerfile new file mode 100644 index 0000000..efee424 --- /dev/null +++ b/src/edt-ripper/Dockerfile @@ -0,0 +1,12 @@ +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 edt-ripper; + +ENTRYPOINT ["edt-ripper"] +CMD ["--help"] diff --git a/src/tag-edt-ripper-latest.sh b/src/tag-edt-ripper-latest.sh new file mode 100755 index 0000000..7d24307 --- /dev/null +++ b/src/tag-edt-ripper-latest.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -euo pipefail + +git tag -f edt-ripper && git push origin edt-ripper -f diff --git a/tests/test-edt-ripper.sh b/tests/test-edt-ripper.sh new file mode 100755 index 0000000..94d9505 --- /dev/null +++ b/tests/test-edt-ripper.sh @@ -0,0 +1,41 @@ +#!/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" + +# 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_edt_ripper_is_running() { + log_header "Test :: edt-ripper is running" + + local expected actual + + expected="Приложение: edt-ripper" + actual=$(docker run --rm ${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/edt-ripper:latest 2>/dev/null | head -n1) + + if assert_eq "$expected" "$actual"; then + log_success "edt-ripper is running test passed" + else + log_failure "edt-ripper is running test failed" + TEST_FAILED=1 + fi +} + +# test calls +test_edt_ripper_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