You've already forked oscript-images
mirror of
https://github.com/pravets/oscript-images.git
synced 2025-11-23 22:24:41 +02:00
Merge pull request #9 from pravets/feature/winow
Реализован образ winow
This commit is contained in:
26
.github/workflows/build-winow.yml
vendored
Normal file
26
.github/workflows/build-winow.yml
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
name: Build winow Docker Image
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'winow' # реагировать на тег winow
|
||||
|
||||
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 "Собираем winow"
|
||||
./src/build-winow.sh
|
||||
54
README.md
54
README.md
@@ -15,6 +15,7 @@
|
||||
- [oscript](#oscript)
|
||||
- [yard](#yard)
|
||||
- [onec-installer-downloader](#onec-installer-downloader)
|
||||
- [winow](#winow)
|
||||
|
||||
## Подготовительные шаги
|
||||
|
||||
@@ -201,4 +202,55 @@ sleemp/onec-installer-downloader:20250723 thin-client32 8.3.25.1445
|
||||
|
||||
Ограничения аналогичны [базовому образу](#yard)
|
||||
|
||||
[↑ В начало](#oscript-images)
|
||||
[↑ В начало](#oscript-images)
|
||||
|
||||
## winow
|
||||
|
||||
[](https://hub.docker.com/r/sleemp/winow)
|
||||
|
||||
Готовые собранные образы можно взять в [sleemp/winow](https://hub.docker.com/r/sleemp/winow)
|
||||
|
||||
### Назначение
|
||||
|
||||
Образ предназначен для запуска веб-приложений на фреймворке [winow](https://github.com/autumn-library/winow).
|
||||
|
||||
### Сборка
|
||||
|
||||
1. [**Выполните подготовительные шаги**](#подготовительные-шаги), если не сделали это ранее
|
||||
|
||||
1. **Добавьте тег `winow`**
|
||||
- Перейдите во вкладку "Tags" или используйте команду:
|
||||
```bash
|
||||
git tag winow
|
||||
git push origin winow
|
||||
```
|
||||
|
||||
- либо клонируйте репозиторий к себе на Linux-хост (или используйте GitHub Codespaces) и запустите скрипт `./src/tag-winow-latest.sh` — он принудительно «перевесит» тег на последний коммит и запушит теги
|
||||
- Это необходимо для запуска сборки yard через GitHub Actions.
|
||||
|
||||
1. **Запустите сборку**
|
||||
- После пуша тега workflow автоматически соберёт и опубликует образ `winow` в ваш Docker Registry.
|
||||
- будет опубликован образ с тегом `latest`, а также с номерной версией собранного `winow`
|
||||
|
||||
1. **Проверьте результат**
|
||||
- Убедитесь, что образ появился в вашем Docker Registry с именем `winow` и соответствующей версией.
|
||||
|
||||
### Зависимости
|
||||
|
||||
Образ собирается на основе [oscript:dev](#oscript), он должен быть предварительно собран и запушен.
|
||||
|
||||
### Использование
|
||||
|
||||
1. Есть два варианта использования образа - для запуска как есть и для сборки на его основе образа вашего приложения
|
||||
|
||||
1. В любом случае, необходимо добавить в контейнер каталог c вашим приложением. Для запуска как есть используйте ключ `-v ./app:/app`.
|
||||
|
||||
1. Также необходимо пробросить из контейнера порт `3333`, например так `-p 8080:3333`
|
||||
|
||||
1. В образе реализована возможность при запуске доустанавливать зависимости вашего приложения с помощью ключа `-deps`. Но нужно помнить, что "прибитые молотком" версии пакетов `autumn`, `winow`, `winow-cli` и их зависимостей могут привести к непредсказуемым последствиям.
|
||||
|
||||
### Ограничения
|
||||
|
||||
1. Явных ограничений вроде бы нет.
|
||||
|
||||
[↑ В начало](#oscript-images)
|
||||
|
||||
57
src/build-winow.sh
Executable file
57
src/build-winow.sh
Executable file
@@ -0,0 +1,57 @@
|
||||
#!/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
|
||||
|
||||
winow_version="latest"
|
||||
|
||||
docker build \
|
||||
--pull \
|
||||
--build-arg WINOW_VERSION="${winow_version}" \
|
||||
--build-arg DOCKER_REGISTRY_URL="${DOCKER_REGISTRY_URL}" \
|
||||
--build-arg DOCKER_LOGIN="${DOCKER_LOGIN}" \
|
||||
-t "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/winow:${winow_version}" \
|
||||
-f "${SCRIPT_DIR}/winow/Dockerfile" \
|
||||
${last_arg}
|
||||
|
||||
if ./tests/test-winow.sh; then
|
||||
opm_output=$(docker run --rm --entrypoint "opm" "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/winow:${winow_version}" ls)
|
||||
container_version=$(echo "$opm_output" | awk -F '|' '/^winow[[:space:]]+\|/ {gsub(/ /, "", $2); print $2}')
|
||||
|
||||
if [[ -n "${container_version}" ]]; then
|
||||
docker push "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/winow:${winow_version}"
|
||||
|
||||
docker tag "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/winow:${winow_version}" "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/winow:${container_version}"
|
||||
docker push "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/winow:${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
|
||||
4
src/tag-winow-latest.sh
Executable file
4
src/tag-winow-latest.sh
Executable file
@@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
git tag -f winow && git push origin winow -f
|
||||
16
src/winow/Dockerfile
Normal file
16
src/winow/Dockerfile
Normal file
@@ -0,0 +1,16 @@
|
||||
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 <i@pravets.ru>"
|
||||
|
||||
RUN opm i winow winow-cli
|
||||
WORKDIR /app
|
||||
COPY ./src/winow/entrypoint.sh /usr/local/bin/entrypoint.sh
|
||||
RUN chmod +x /usr/local/bin/entrypoint.sh
|
||||
VOLUME [ "/app" ]
|
||||
EXPOSE 3333
|
||||
|
||||
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
|
||||
27
src/winow/entrypoint.sh
Executable file
27
src/winow/entrypoint.sh
Executable file
@@ -0,0 +1,27 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Проверяем наличие параметра -deps
|
||||
check_deps=false
|
||||
for arg in "$@"; do
|
||||
if [ "$arg" = "-deps" ]; then
|
||||
check_deps=true
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
# Если передан -deps И существует packagedef, выполняем opm i
|
||||
if [ "$check_deps" = true ]; then
|
||||
if [ -f "packagedef" ]; then
|
||||
echo "Файл packagedef найден. Устанавливаем зависимости с помощью opm i."
|
||||
opm i
|
||||
if ! opm i; then
|
||||
echo "Ошибка при установке зависимостей"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "Файл packagedef НЕ найден. Параметр -deps не может быть использован без него."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
winow start
|
||||
106
tests/test-winow.sh
Executable file
106
tests/test-winow.sh
Executable file
@@ -0,0 +1,106 @@
|
||||
#!/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_winow_is_running() {
|
||||
log_header "Test :: winow is running"
|
||||
|
||||
local expected actual
|
||||
local container_name="winow_test_running_$(date +%s)"
|
||||
|
||||
expected="ИНФОРМАЦИЯ - Используется нативный веб-сервер"
|
||||
actual=$(docker run --rm --name $container_name ${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/winow:latest 2>/dev/null | head -n1)
|
||||
|
||||
if assert_eq "$expected" "$actual"; then
|
||||
log_success "winow is running test passed"
|
||||
else
|
||||
log_failure "winow is running test failed"
|
||||
fi
|
||||
|
||||
docker stop $container_name > /dev/null 2>&1
|
||||
|
||||
}
|
||||
|
||||
test_winow_is_responsible() {
|
||||
log_header "Test :: winow is responsible"
|
||||
|
||||
local expected actual
|
||||
local container_name="winow_test_responsible_$(date +%s)"
|
||||
|
||||
expected="hello"
|
||||
docker run \
|
||||
--rm \
|
||||
--name $container_name \
|
||||
-p 3333:3333 \
|
||||
-v "${SCRIPT_DIR}/../tests/winow/hello:/app" \
|
||||
-d \
|
||||
${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/winow:latest > /dev/null 2>&1
|
||||
sleep 5
|
||||
|
||||
actual=$(curl -s http://localhost:3333/)
|
||||
|
||||
if assert_eq "$expected" "$actual"; then
|
||||
log_success "winow is responsible test passed"
|
||||
else
|
||||
log_failure "winow is responsible test failed"
|
||||
fi
|
||||
|
||||
docker stop $container_name > /dev/null 2>&1
|
||||
|
||||
}
|
||||
|
||||
test_winow_is_stopped_without_packagedef() {
|
||||
log_header "Test :: winow is stopped without packagedef"
|
||||
|
||||
local expected actual
|
||||
local container_name="winow_test_stopped_without_packagedef_$(date +%s)"
|
||||
|
||||
expected="Файл packagedef НЕ найден. Параметр -deps не может быть использован без него."
|
||||
actual=$(docker run --rm --name $container_name ${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/winow:latest -deps 2>/dev/null | head -n1)
|
||||
|
||||
if assert_eq "$expected" "$actual"; then
|
||||
log_success "winow is stopped without packagedef test passed"
|
||||
else
|
||||
log_failure "winow is stopped without packagedef test failed"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
test_winow_is_installing_deps() {
|
||||
log_header "Test :: winow is installing deps"
|
||||
|
||||
local expected actual
|
||||
local container_name="winow_test_installing_deps_$(date +%s)"
|
||||
|
||||
expected="Файл packagedef найден. Устанавливаем зависимости с помощью opm i."
|
||||
actual=$(docker run \
|
||||
--rm \
|
||||
--name $container_name \
|
||||
-v "${SCRIPT_DIR}/../tests/winow/hello:/app" \
|
||||
${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/winow:latest -deps 2>/dev/null | head -n1)
|
||||
|
||||
if assert_eq "$expected" "$actual"; then
|
||||
log_success "winow is installing deps test passed"
|
||||
else
|
||||
log_failure "winow is installing deps test failed"
|
||||
fi
|
||||
|
||||
docker stop $container_name > /dev/null 2>&1
|
||||
|
||||
}
|
||||
|
||||
# test calls
|
||||
test_winow_is_running
|
||||
test_winow_is_responsible
|
||||
test_winow_is_stopped_without_packagedef
|
||||
test_winow_is_installing_deps
|
||||
5
tests/winow/hello/autumn-properties.json
Normal file
5
tests/winow/hello/autumn-properties.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{ "winow":
|
||||
{
|
||||
"КаталогСПриложениями": "./controls"
|
||||
}
|
||||
}
|
||||
9
tests/winow/hello/controls/ОсновнойКонтрол.os
Normal file
9
tests/winow/hello/controls/ОсновнойКонтрол.os
Normal file
@@ -0,0 +1,9 @@
|
||||
&Контроллер("/")
|
||||
Процедура ПриСозданииОбъекта()
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
&ТочкаМаршрута("")
|
||||
Процедура Главная(Ответ) Экспорт
|
||||
Ответ.ТелоТекст = "hello";
|
||||
КонецПроцедуры
|
||||
8
tests/winow/hello/main.os
Normal file
8
tests/winow/hello/main.os
Normal file
@@ -0,0 +1,8 @@
|
||||
#Использовать autumn
|
||||
#Использовать autumn-logos
|
||||
#Использовать winow
|
||||
|
||||
Поделка = Новый Поделка;
|
||||
Поделка.ЗапуститьПриложение();
|
||||
ЗапускательВебПриложения = Поделка.НайтиЖелудь("ЗапускательВебПриложения");
|
||||
ЗапускательВебПриложения.Запустить();
|
||||
8
tests/winow/hello/packagedef
Normal file
8
tests/winow/hello/packagedef
Normal file
@@ -0,0 +1,8 @@
|
||||
Описание.Имя("winow-test-hello")
|
||||
.Версия("0.0.1")
|
||||
.ВерсияСреды("1.9.2")
|
||||
.ЗависитОт("winow")
|
||||
.ЗависитОт("winow-cli")
|
||||
.ЗависитОт("autumn")
|
||||
.ЗависитОт("csv")
|
||||
;
|
||||
Reference in New Issue
Block a user