You've already forked oscript-images
mirror of
https://github.com/pravets/oscript-images.git
synced 2025-11-25 22:32:37 +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
|
||||||
52
README.md
52
README.md
@@ -15,6 +15,7 @@
|
|||||||
- [oscript](#oscript)
|
- [oscript](#oscript)
|
||||||
- [yard](#yard)
|
- [yard](#yard)
|
||||||
- [onec-installer-downloader](#onec-installer-downloader)
|
- [onec-installer-downloader](#onec-installer-downloader)
|
||||||
|
- [winow](#winow)
|
||||||
|
|
||||||
## Подготовительные шаги
|
## Подготовительные шаги
|
||||||
|
|
||||||
@@ -202,3 +203,54 @@ sleemp/onec-installer-downloader:20250723 thin-client32 8.3.25.1445
|
|||||||
Ограничения аналогичны [базовому образу](#yard)
|
Ограничения аналогичны [базовому образу](#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