From ee67dde3942f4faaab354b565866415f96d15544 Mon Sep 17 00:00:00 2001 From: Iosif Pravets Date: Mon, 9 Jun 2025 21:08:07 +0000 Subject: [PATCH 01/11] =?UTF-8?q?chore:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D1=84=D1=80=D0=B5=D0=B9=D0=BC=D0=B2=D0=BE?= =?UTF-8?q?=D1=80=D0=BA=20=D0=B4=D0=BB=D1=8F=20=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/assert.sh | 508 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 508 insertions(+) create mode 100644 tools/assert.sh diff --git a/tools/assert.sh b/tools/assert.sh new file mode 100644 index 0000000..cf09ab4 --- /dev/null +++ b/tools/assert.sh @@ -0,0 +1,508 @@ +#!/usr/bin/env bash + +##################################################################### +## +## title: Assert Extension +## +## description: +## Assert extension of shell (bash, ...) +## with the common assert functions +## Function list based on: +## http://junit.sourceforge.net/javadoc/org/junit/Assert.html +## Log methods : inspired by +## - https://natelandau.com/bash-scripting-utilities/ +## author: Mark Torok +## +## date: 07. Dec. 2016 +## +## license: MIT +## +##################################################################### + +if command -v tput &>/dev/null && tty -s; then + RED=$(tput setaf 1) + GREEN=$(tput setaf 2) + MAGENTA=$(tput setaf 5) + NORMAL=$(tput sgr0) + BOLD=$(tput bold) +else + RED=$(echo -en "\e[31m") + GREEN=$(echo -en "\e[32m") + MAGENTA=$(echo -en "\e[35m") + NORMAL=$(echo -en "\e[00m") + BOLD=$(echo -en "\e[01m") +fi + +# Выводит заголовок в терминал жирным пурпурным цветом. +# +# Arguments: +# +# * Текст заголовка для отображения. +# +# Outputs: +# +# * Печатает форматированный заголовок в STDERR. +log_header() { + printf "\n${BOLD}${MAGENTA}========== %s ==========${NORMAL}\n" "$@" >&2 +} + +# Выводит сообщение об успешном выполнении с зелёной галочкой в стандартный поток ошибок. +# +# Arguments: +# +# * Сообщение об успехе (строка или несколько строк) +# +# Outputs: +# +# * Сообщение с зелёной галочкой в STDERR. +# +# Example: +# +# log_success "Тест успешно пройден" +log_success() { + printf "${GREEN}✔ %s${NORMAL}\n" "$@" >&2 +} + +# Выводит сообщение об ошибке с красным крестиком в стандартный поток ошибок. +# +# Arguments: +# +# * Сообщение об ошибке для отображения. +# +# Outputs: +# +# * Сообщение об ошибке с цветовым выделением в STDERR. +# +# Example: +# +# ```bash +# log_failure "Тест не пройден" +# ``` +log_failure() { + printf "${RED}✖ %s${NORMAL}\n" "$@" >&2 +} + + +# Проверяет, равны ли ожидаемое и фактическое значения. +# +# Arguments: +# +# * expected — ожидаемое значение. +# * actual — фактическое значение. +# * msg (необязательно) — сообщение, выводимое при ошибке. +# +# Returns: +# +# * 0, если значения равны; 1, если не равны (и при этом выводится сообщение об ошибке, если оно указано). +# +# Example: +# +# assert_eq "foo" "$result" "Результат не совпадает с ожидаемым" +assert_eq() { + local expected="$1" + local actual="$2" + local msg="${3-}" + + if [ "$expected" == "$actual" ]; then + return 0 + else + [ "${#msg}" -gt 0 ] && log_failure "$expected == $actual :: $msg" || true + return 1 + fi +} + +# Проверяет, что значения не равны друг другу. +# +# Возвращает 0, если значения различны; иначе выводит сообщение об ошибке (если указано) и возвращает 1. +# +# Аргументы: +# +# * Ожидаемое значение +# * Фактическое значение +# * Необязательное сообщение для вывода при ошибке +# +# Пример: +# +# ```bash +# assert_not_eq "foo" "bar" "Значения совпадают" +# ``` +assert_not_eq() { + local expected="$1" + local actual="$2" + local msg="${3-}" + + if [ ! "$expected" == "$actual" ]; then + return 0 + else + [ "${#msg}" -gt 0 ] && log_failure "$expected != $actual :: $msg" || true + return 1 + fi +} + +# Проверяет, равно ли значение строке "true". +# +# Arguments: +# +# * actual — проверяемое значение. +# * msg — необязательное сообщение, выводимое при ошибке. +# +# Returns: +# +# * 0, если значение равно "true"; иначе 1. +assert_true() { + local actual="$1" + local msg="${2-}" + + assert_eq true "$actual" "$msg" + return "$?" +} + +# Проверяет, что переданное значение равно "false". +# +# Arguments: +# +# * actual — проверяемое значение. +# * msg — необязательное сообщение, выводимое при ошибке. +# +# Returns: +# +# * 0, если значение равно "false"; иначе 1. +assert_false() { + local actual="$1" + local msg="${2-}" + + assert_eq false "$actual" "$msg" + return "$?" +} + +# Проверяет, что два массива равны по длине и содержимому. +# +# Arguments: +# +# * Имя массива с ожидаемыми значениями (передаётся по ссылке) +# * Имя массива с фактическими значениями (передаётся по ссылке) +# * Необязательное сообщение, выводимое при ошибке +# +# Returns: +# +# * 0, если массивы идентичны по длине и значениям; 1 в противном случае. +# +# Example: +# +# ```bash +# arr1=(a b c) +# arr2=(a b c) +# assert_array_eq arr1[@] arr2[@] "Массивы не совпадают" +# ``` +assert_array_eq() { + + declare -a expected=("${!1-}") + # echo "AAE ${expected[@]}" + + declare -a actual=("${!2}") + # echo "AAE ${actual[@]}" + + local msg="${3-}" + + local return_code=0 + if [ ! "${#expected[@]}" == "${#actual[@]}" ]; then + return_code=1 + fi + + local i + for (( i=1; i < ${#expected[@]} + 1; i+=1 )); do + if [ ! "${expected[$i-1]}" == "${actual[$i-1]}" ]; then + return_code=1 + break + fi + done + + if [ "$return_code" == 1 ]; then + [ "${#msg}" -gt 0 ] && log_failure "(${expected[*]}) != (${actual[*]}) :: $msg" || true + fi + + return "$return_code" +} + +# Проверяет, что два массива не равны по длине или содержимому. +# +# Arguments: +# +# * Имя переменной ожидаемого массива (по ссылке) +# * Имя переменной фактического массива (по ссылке) +# * Необязательное сообщение для вывода при неудаче +# +# Returns: +# +# * 0 — если массивы различаются по длине или хотя бы одному элементу +# * 1 — если массивы идентичны по длине и содержимому +# +# Example: +# +# ```bash +# arr1=(a b c) +# arr2=(a b d) +# assert_array_not_eq arr1[@] arr2[@] "Массивы не должны совпадать" +# ``` +assert_array_not_eq() { + + declare -a expected=("${!1-}") + declare -a actual=("${!2}") + + local msg="${3-}" + + local return_code=1 + if [ ! "${#expected[@]}" == "${#actual[@]}" ]; then + return_code=0 + fi + + local i + for (( i=1; i < ${#expected[@]} + 1; i+=1 )); do + if [ ! "${expected[$i-1]}" == "${actual[$i-1]}" ]; then + return_code=0 + break + fi + done + + if [ "$return_code" == 1 ]; then + [ "${#msg}" -gt 0 ] && log_failure "(${expected[*]}) == (${actual[*]}) :: $msg" || true + fi + + return "$return_code" +} + +# Проверяет, является ли переданная строка пустой. +# +# Arguments: +# +# * Строка для проверки. +# * Необязательное сообщение, выводимое при ошибке. +# +# Returns: +# +# * 0, если строка пуста; 1 в противном случае. +# +# Example: +# +# ```bash +# assert_empty "" "Строка должна быть пустой" +# ``` +assert_empty() { + local actual=$1 + local msg="${2-}" + + assert_eq "" "$actual" "$msg" + return "$?" +} + +# Проверяет, что переданная строка не пуста. +# +# Arguments: +# +# * actual — строка для проверки. +# * msg — необязательное сообщение, выводимое при ошибке. +# +# Returns: +# +# * 0, если строка не пуста; 1, если строка пуста. +# +# Example: +# +# ```bash +# assert_not_empty "hello" "Строка не должна быть пустой" +# ``` +assert_not_empty() { + local actual=$1 + local msg="${2-}" + + assert_not_eq "" "$actual" "$msg" + return "$?" +} + +# Проверяет, содержит ли строка подстроку. +# +# Arguments: +# +# * haystack — строка, в которой выполняется поиск. +# * needle — подстрока для поиска. +# * msg — необязательное сообщение, выводимое при неудаче. +# +# Returns: +# +# * 0, если подстрока найдена или needle пустая; 1 в противном случае. +# +# Example: +# +# ```bash +# assert_contain "hello world" "world" # вернёт 0 +# assert_contain "hello world" "foo" "Не найдено" # вернёт 1 и выведет сообщение об ошибке +# ``` +assert_contain() { + local haystack="$1" + local needle="${2-}" + local msg="${3-}" + + if [ -z "${needle:+x}" ]; then + return 0; + fi + + if [ -z "${haystack##*$needle*}" ]; then + return 0 + else + [ "${#msg}" -gt 0 ] && log_failure "$haystack doesn't contain $needle :: $msg" || true + return 1 + fi +} + +# Проверяет, что подстрока не содержится в строке. +# +# Arguments: +# +# * haystack — строка, в которой выполняется поиск. +# * needle — подстрока, отсутствие которой проверяется. +# * msg — необязательное сообщение, выводимое при неудаче. +# +# Returns: +# +# * 0, если needle не содержится в haystack или needle пуста. +# * 1, если needle содержится в haystack (и при этом выводится сообщение об ошибке, если оно указано). +# +# Example: +# +# ```bash +# assert_not_contain "abcdef" "gh" # вернёт 0 +# assert_not_contain "abcdef" "cd" # вернёт 1 +# ``` +assert_not_contain() { + local haystack="$1" + local needle="${2-}" + local msg="${3-}" + + if [ -z "${needle:+x}" ]; then + return 0; + fi + + if [ "${haystack##*$needle*}" ]; then + return 0 + else + [ "${#msg}" -gt 0 ] && log_failure "$haystack contains $needle :: $msg" || true + return 1 + fi +} + +# Проверяет, что первое число больше второго. +# +# Arguments: +# +# * first — первое сравниваемое число +# * second — второе сравниваемое число +# * msg (необязательно) — сообщение, выводимое при неудаче проверки +# +# Returns: +# +# * 0, если first больше second; иначе 1 +# +# Example: +# +# ```bash +# assert_gt 5 3 "5 должно быть больше 3" +# ``` +assert_gt() { + local first="$1" + local second="$2" + local msg="${3-}" + + if [[ "$first" -gt "$second" ]]; then + return 0 + else + [ "${#msg}" -gt 0 ] && log_failure "$first > $second :: $msg" || true + return 1 + fi +} + +# Проверяет, что первое число больше или равно второму. +# +# Arguments: +# +# * first — первое сравниваемое число. +# * second — второе сравниваемое число. +# * msg (необязательно) — сообщение, выводимое при ошибке. +# +# Returns: +# +# * 0, если first >= second; иначе 1 и сообщение об ошибке. +# +# Example: +# +# assert_ge 10 5 "Ожидалось, что 10 больше или равно 5" +assert_ge() { + local first="$1" + local second="$2" + local msg="${3-}" + + if [[ "$first" -ge "$second" ]]; then + return 0 + else + [ "${#msg}" -gt 0 ] && log_failure "$first >= $second :: $msg" || true + return 1 + fi +} + +# Проверяет, что первое число меньше второго. +# +# Arguments: +# +# * first — первое сравниваемое число. +# * second — второе сравниваемое число. +# * msg (необязательно) — сообщение, выводимое при ошибке. +# +# Returns: +# +# * 0, если first < second; иначе 1 и сообщение об ошибке. +# +# Example: +# +# ```bash +# assert_lt 3 5 "3 должно быть меньше 5" +# ``` +assert_lt() { + local first="$1" + local second="$2" + local msg="${3-}" + + if [[ "$first" -lt "$second" ]]; then + return 0 + else + [ "${#msg}" -gt 0 ] && log_failure "$first < $second :: $msg" || true + return 1 + fi +} + +# Проверяет, что первое число меньше или равно второму. +# +# Arguments: +# +# * first — первое сравниваемое число +# * second — второе сравниваемое число +# * msg (необязательно) — сообщение, выводимое при неудаче +# +# Returns: +# +# * 0, если first ≤ second; иначе 1 и сообщение об ошибке (если указано) +# +# Example: +# +# assert_le 3 5 "3 не больше 5" # успешно +# assert_le 7 2 "7 не меньше 2" # завершится с ошибкой и выведет сообщение +assert_le() { + local first="$1" + local second="$2" + local msg="${3-}" + + if [[ "$first" -le "$second" ]]; then + return 0 + else + [ "${#msg}" -gt 0 ] && log_failure "$first <= $second :: $msg" || true + return 1 + fi +} \ No newline at end of file From b1d8b871069c88019e5767c0b719ff5e1ca065eb Mon Sep 17 00:00:00 2001 From: Iosif Pravets Date: Mon, 9 Jun 2025 21:08:36 +0000 Subject: [PATCH 02/11] =?UTF-8?q?chore:=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=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BE=D0=BA?= =?UTF-8?q?=D1=80=D1=83=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/load_env.sh | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100755 scripts/load_env.sh diff --git a/scripts/load_env.sh b/scripts/load_env.sh new file mode 100755 index 0000000..de8fc2f --- /dev/null +++ b/scripts/load_env.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +# Путь к .env файлу (по умолчанию в текущей директории) +ENV_FILE=".env" + +# Проверяем, существует ли файл +if [ ! -f "$ENV_FILE" ]; then + echo "Файл $ENV_FILE не найден." + exit 1 +fi + +# Загружаем переменные окружения из .env файла +set -a +source "$ENV_FILE" +set +a + +echo "Переменные окружения загружены из $ENV_FILE" \ No newline at end of file From 46c753dcb38d6769065e8dae0ddd54a0b2161342 Mon Sep 17 00:00:00 2001 From: Iosif Pravets Date: Mon, 9 Jun 2025 21:08:51 +0000 Subject: [PATCH 03/11] =?UTF-8?q?chore:=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=D0=B0=D0=B2=D1=82=D0=BE=D1=80=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B2=20Docker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/docker_login.sh | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100755 scripts/docker_login.sh diff --git a/scripts/docker_login.sh b/scripts/docker_login.sh new file mode 100755 index 0000000..29d29fa --- /dev/null +++ b/scripts/docker_login.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# Проверка наличия необходимых переменных среды +if [[ -z "$DOCKER_REGISTRY_URL" || -z "$DOCKER_LOGIN" || -z "$DOCKER_PASSWORD" ]]; then + echo "Ошибка: Необходимо установить переменные среды DOCKER_REGISTRY_URL, DOCKER_LOGIN и DOCKER_PASSWORD." + exit 1 +fi + +echo "$DOCKER_PASSWORD" | docker login "$DOCKER_REGISTRY_URL" -u "$DOCKER_LOGIN" --password-stdin + +if [[ $? -eq 0 ]]; then + echo "Успешная авторизация в $DOCKER_REGISTRY_URL" +else + echo "Ошибка авторизации в $DOCKER_REGISTRY_URL" + exit 1 +fi \ No newline at end of file From 8f92a860199a7d42cb3448edcb41df9bbaa26641 Mon Sep 17 00:00:00 2001 From: Iosif Pravets Date: Mon, 9 Jun 2025 21:09:00 +0000 Subject: [PATCH 04/11] =?UTF-8?q?chore:=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=D0=BE=D1=87=D0=B8=D1=81=D1=82=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D1=85?= =?UTF-8?q?=20=D1=81=D1=80=D0=B5=D0=B4=D1=8B=20=D0=B8=20=D1=80=D0=B0=D0=B7?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=D0=B8=D0=BD=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B8=D0=B7=20Docker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/cleanup.sh | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100755 scripts/cleanup.sh diff --git a/scripts/cleanup.sh b/scripts/cleanup.sh new file mode 100755 index 0000000..341d4d2 --- /dev/null +++ b/scripts/cleanup.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Разлогинивание из Docker +if [ -n "$DOCKER_REGISTRY_URL" ]; then + docker logout "$DOCKER_REGISTRY_URL" +else + docker logout +fi + +# Очистка переменных среды из .env +if [ -f .env ]; then + while IFS='=' read -r var _; do + # Удаляем пробелы и префикс export, если есть + var=$(echo "$var" | sed -e 's/^export[[:space:]]*//') + if [[ $var != "" && $var != \#* ]]; then + unset "$var" + fi + done < .env +fi + +echo "Очистка завершена." \ No newline at end of file From 7f49b490e592e52f5ffd2675da8d8615f9c5d7cf Mon Sep 17 00:00:00 2001 From: Iosif Pravets Date: Mon, 9 Jun 2025 21:09:30 +0000 Subject: [PATCH 05/11] =?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=D0=B4=D0=BE=D0=BA=D0=B5=D1=80=D1=84=D0=B0?= =?UTF-8?q?=D0=B9=D0=BB=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B8=20onescript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/oscript/Dockerfile | 55 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/oscript/Dockerfile diff --git a/src/oscript/Dockerfile b/src/oscript/Dockerfile new file mode 100644 index 0000000..cc32749 --- /dev/null +++ b/src/oscript/Dockerfile @@ -0,0 +1,55 @@ +ARG DOCKER_REGISTRY_URL=library +ARG BASE_IMAGE=ubuntu +ARG BASE_TAG=24.04 + +FROM ${DOCKER_REGISTRY_URL}/${BASE_IMAGE}:${BASE_TAG} +LABEL maintainer="Iosif Pravets " + +# mono and oscript dependencies +ARG MONO_VERSION=6.12.0.182 + +RUN apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + ca-certificates \ + gnupg \ + dirmngr \ + wget \ + locales \ + && apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF \ + && echo "deb http://download.mono-project.com/repo/debian stable-buster/snapshots/$MONO_VERSION main" > /etc/apt/sources.list.d/mono-official-stable.list \ + && apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \ + mono-runtime \ + ca-certificates-mono \ + libmono-i18n4.0-all \ + libmono-system-runtime-serialization4.0-cil \ + libicu-dev \ + && rm -rf /etc/apt/sources.list.d/mono-official-stable.list \ + && apt-get update \ + && cert-sync --user /etc/ssl/certs/ca-certificates.crt \ + && rm -rf \ + /var/lib/apt/lists/* \ + /var/cache/debconf \ +RUN locale-gen ru_RU.UTF-8 \ + && localedef -i ru_RU -c -f UTF-8 -A /usr/share/locale/locale.alias ru_RU.UTF-8 + +# locale +ENV LANG=ru_RU.UTF-8 +ENV LANGUAGE=ru_RU:ru +ENV LC_ALL=ru_RU.UTF-8 + +# oscript +ARG OVM_VERSION=1.6.1 +ARG OSCRIPT_VERSION + +RUN wget https://github.com/oscript-library/ovm/releases/download/v${OVM_VERSION}/ovm.exe \ + && mv ovm.exe /usr/local/bin/ \ + && echo 'mono /usr/local/bin/ovm.exe "$@"' | tee /usr/local/bin/ovm \ + && chmod +x /usr/local/bin/ovm \ + && ovm install ${OSCRIPT_VERSION} \ + && ovm use ${OSCRIPT_VERSION} + +ENV OSCRIPTBIN=/root/.local/share/ovm/current/bin +ENV PATH="$OSCRIPTBIN:$PATH" + +ENTRYPOINT ["oscript"] \ No newline at end of file From 012e1f6f1dd1d6b0d0f0860e6c0a1411c902aac5 Mon Sep 17 00:00:00 2001 From: Iosif Pravets Date: Mon, 9 Jun 2025 21:09:57 +0000 Subject: [PATCH 06/11] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D1=80=D0=BD=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82?= =?UTF-8?q?=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B8=20onescript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/build-oscript.sh | 64 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100755 src/build-oscript.sh diff --git a/src/build-oscript.sh b/src/build-oscript.sh new file mode 100755 index 0000000..e103e80 --- /dev/null +++ b/src/build-oscript.sh @@ -0,0 +1,64 @@ +#!/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 + +oscript_version="${OSCRIPT_VERSION}" + +docker build \ + --pull \ + --build-arg OSCRIPT_VERSION="${oscript_version}" \ + -t "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/oscript:${oscript_version}" \ + -f "${SCRIPT_DIR}/oscript/Dockerfile" \ + ${last_arg} + +if ./tests/test-oscript.sh; then + container_version=$(docker run --rm "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/oscript:${oscript_version}" -v | head -n1 | awk '{print $NF}') + + if [[ -n "${container_version}" ]]; then + docker push "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/oscript:${oscript_version}" + + docker tag "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/oscript:${oscript_version}" "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/oscript:${container_version}" + docker push "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/oscript:${container_version}" + + if ! [[ "${oscript_version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] && ! [[ "${container_version}" =~ rc ]]; then + semver_tag=$(echo "${container_version}" | awk -F. '{print $1"."$2"."$3}') + if [[ -n "${semver_tag}" ]]; then + docker tag "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/oscript:${oscript_version}" "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/oscript:${semver_tag}" + docker push "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/oscript:${semver_tag}" + else + echo "Не удалось получить корректную semver версию из контейнера" + exit 1 + fi + fi + + else + echo "Не удалось получить версию из контейнера" + exit 1 + fi + source "${SCRIPT_DIR}/../scripts/cleanup.sh" +else + log_failure "ERROR: Tests failed. Docker image will not be pushed." + source "${SCRIPT_DIR}/../scripts/cleanup.sh" + exit 1 +fi +exit 0 \ No newline at end of file From 3f8ea26989d38d2d8cde6316ba76a97b952bd0ba Mon Sep 17 00:00:00 2001 From: Iosif Pravets Date: Mon, 9 Jun 2025 21:10:20 +0000 Subject: [PATCH 07/11] =?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=82=D0=B5=D1=81=D1=82=20=D1=81=D0=B1?= =?UTF-8?q?=D0=BE=D1=80=D0=BA=D0=B8=20onescript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test-oscript.sh | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100755 tests/test-oscript.sh diff --git a/tests/test-oscript.sh b/tests/test-oscript.sh new file mode 100755 index 0000000..a5c65df --- /dev/null +++ b/tests/test-oscript.sh @@ -0,0 +1,31 @@ +#!/bin/bash +set -e + +if [ -z "${CI-}" ]; then + echo "The script is not running in CI" + source .env +else + echo "The script is running in CI" +fi + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +source "${SCRIPT_DIR}/../tools/assert.sh" + + +test_oscript_is_running() { + log_header "Test :: oscript is running" + + local expected actual + expected="1Script Execution Engine" + actual=$(docker run --rm $DOCKER_REGISTRY_URL/${DOCKER_LOGIN}/oscript:$OSCRIPT_VERSION) + + if assert_contain "$actual" "$expected"; then + log_success "oscript is running test passed" + else + log_failure "oscript is running test failed" + fi +} + +# test calls +test_oscript_is_running \ No newline at end of file From 15355589847bc53f80fd26b8cc67c2a2939c6ef7 Mon Sep 17 00:00:00 2001 From: Iosif Pravets Date: Mon, 9 Jun 2025 21:16:04 +0000 Subject: [PATCH 08/11] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20workflow=20=D0=B4=D0=BB=D1=8F=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8=20Docker-=D0=BE=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=B7=D0=B0=20Oscript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build-oscript.yml | 34 +++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/workflows/build-oscript.yml diff --git a/.github/workflows/build-oscript.yml b/.github/workflows/build-oscript.yml new file mode 100644 index 0000000..50600ab --- /dev/null +++ b/.github/workflows/build-oscript.yml @@ -0,0 +1,34 @@ +name: Build Oscript Docker Image + +on: + push: + tags: + - 'oscript_*' # реагировать на теги, начинающиеся с executor_ + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Docker registry + uses: docker/login-action@v3 + with: + registry: ${{ secrets.DOCKER_REGISTRY_URL }} + username: ${{ secrets.DOCKER_LOGIN }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Set environment variables + run: | + echo "DOCKER_REGISTRY_URL=${{ secrets.DOCKER_REGISTRY_URL }}" >> "$GITHUB_ENV" + + - name: Build and Push Docker image + run: | + export OSCRIPT_VERSION="${GITHUB_REF#refs/tags/oscript_}" + echo "Собираем oscript версии ${OSCRIPT_VERSION}" + ./src/build-oscript.sh From 64e1df5abc8e6051262ff2f0b202dc4942654310 Mon Sep 17 00:00:00 2001 From: Iosif Pravets Date: Mon, 9 Jun 2025 21:43:45 +0000 Subject: [PATCH 09/11] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=BE=D0=BA=D1=80=D1=83=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=20Docker=20=D0=BB=D0=BE?= =?UTF-8?q?=D0=B3=D0=B8=D0=BD=D0=B0=20=D0=B8=20=D0=BF=D0=B0=D1=80=D0=BE?= =?UTF-8?q?=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build-oscript.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build-oscript.yml b/.github/workflows/build-oscript.yml index 50600ab..ae6cf55 100644 --- a/.github/workflows/build-oscript.yml +++ b/.github/workflows/build-oscript.yml @@ -8,6 +8,9 @@ on: jobs: build: runs-on: ubuntu-latest + env: + DOCKER_LOGIN: ${{ secrets.DOCKER_LOGIN }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} steps: - name: Checkout repository From 0ec1f19a34a6eafa666cbb385d7f6502d1af4983 Mon Sep 17 00:00:00 2001 From: Iosif Pravets Date: Mon, 9 Jun 2025 21:45:11 +0000 Subject: [PATCH 10/11] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BE=D0=BF=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=83=D1=82=D0=B8?= =?UTF-8?q?=20=D0=BA=20.env=20=D0=B2=20=D1=82=D0=B5=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=BE=D0=BC=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test-oscript.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test-oscript.sh b/tests/test-oscript.sh index a5c65df..e1f5dd2 100755 --- a/tests/test-oscript.sh +++ b/tests/test-oscript.sh @@ -3,7 +3,8 @@ set -e if [ -z "${CI-}" ]; then echo "The script is not running in CI" - source .env + SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + source "${SCRIPT_DIR}/../.env" else echo "The script is running in CI" fi From bbc54963fbfc6b2c5ee7aa989b356f59af2784a3 Mon Sep 17 00:00:00 2001 From: Iosif Pravets Date: Mon, 9 Jun 2025 21:47:04 +0000 Subject: [PATCH 11/11] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D0=BE=D0=B9=20NO=5FCACHE?= =?UTF-8?q?=20=D0=B2=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D0=B5=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/build-oscript.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build-oscript.sh b/src/build-oscript.sh index e103e80..e0e15f3 100755 --- a/src/build-oscript.sh +++ b/src/build-oscript.sh @@ -18,7 +18,7 @@ then fi last_arg="." -if [[ $NO_CACHE = "true" ]] ; then +if [[ ${NO_CACHE:-} = "true" ]] ; then last_arg="--no-cache ." fi