1
0
mirror of https://github.com/pravets/oscript-images.git synced 2025-11-23 22:24:41 +02:00

feat: Реализована сборка образа yard (#3)

This commit is contained in:
Iosif Pravets
2025-07-23 15:49:07 +03:00
committed by GitHub
parent 119a8f996a
commit 335eb7375c
7 changed files with 185 additions and 1 deletions

26
.github/workflows/build-yard.yml vendored Normal file
View File

@@ -0,0 +1,26 @@
name: Build yard Docker Image
on:
push:
tags:
- 'yard'
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 "Собираем yard"
./src/build-yard.sh

View File

@@ -1,2 +1,50 @@
# oscript-images
Всё для сборки docker-образов движка OneScript и некоторых утилит на OneScript
Всё для сборки Docker-образов движка [OneScript](https://oscript.io/) и некоторых утилит на OneScript
Сборка происходит в GitHub Actions, чтобы максимально снизить порог входа и упростить вашу жизнь.
Необходимо выполнить [подготовительные шаги](#подготовительные-шаги) и шаги сборки требуемых вам утилит.
## Оглавление
- [oscript-images](#oscript-images)
- [Подготовительные шаги](#подготовительные-шаги)
- [yard](#yard)
## Подготовительные шаги
1. **Форкните** [этот репозиторий](https://github.com/pravets/oscript-images/).
1. **Включите GitHub Actions**
- Перейдите во вкладку "Actions" в вашем форке и разрешите запуск workflow.
1. **Добавьте секреты для Docker Hub**
- В настройках репозитория (Settings → Secrets and variables → Actions) добавьте переменные:
- `DOCKER_REGISTRY_URL` — адрес реестра (например, `docker.io`)
- `DOCKER_LOGIN` — ваш логин Docker Hub или в вашем приватном registry
- `DOCKER_PASSWORD` — ваш пароль от вашего приватного registry или [токен Docker Hub](https://app.docker.com/settings/personal-access-tokens). Для Docker Hub нужны права Read и Write и рекомендуется использовать токен, вместо пароля.
[↑ В начало](#oscript-images)
## yard
1. [**Выполните подготовительные шаги**](#подготовительные-шаги), если не сделали это ранее
1. **Добавьте тег `yard`**
- Перейдите во вкладку "Tags" или используйте команду:
```bash
git tag yard
git push origin yard
```
- либо клонируйте репозиторий к себе на Linux-хост (или используйте GitHub Codespaces) и запустите скрипт `./src/tag-yard-latest.sh` — он принудительно «перевесит» тег на последний коммит и запушит теги
- Это необходимо для запуска сборки yard через GitHub Actions.
1. **Запустите сборку**
- После пуша тега workflow автоматически соберёт и опубликует образ `yard` в ваш Docker Registry.
- будет опубликован образ с тегом `latest`, а также с номерной версией собранного `yard`
1. **Проверьте результат**
- Убедитесь, что образ появился в вашем Docker Registry с именем `yard` и соответствующей версией.
[↑ В начало](#oscript-images)

View File

@@ -6,6 +6,7 @@ if [[ -z "$DOCKER_REGISTRY_URL" || -z "$DOCKER_LOGIN" || -z "$DOCKER_PASSWORD" ]
exit 1
fi
echo "Авторизуемся в $DOCKER_REGISTRY_URL"
echo "$DOCKER_PASSWORD" | docker login "$DOCKER_REGISTRY_URL" -u "$DOCKER_LOGIN" --password-stdin
if [[ $? -eq 0 ]]; then

56
src/build-yard.sh Executable file
View File

@@ -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
yard_version="latest"
docker build \
--pull \
--build-arg YARD_VERSION="${yard_version}" \
--build-arg DOCKER_REGISTRY_URL="${DOCKER_REGISTRY_URL}" \
--build-arg DOCKER_LOGIN="${DOCKER_LOGIN}" \
-t "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/yard:${yard_version}" \
-f "${SCRIPT_DIR}/yard/Dockerfile" \
${last_arg}
if ./tests/test-yard.sh; then
container_version=$(docker run --rm "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/yard:${yard_version}" --version | tail -n1)
if [[ -n "${container_version}" ]]; then
docker push "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/yard:${yard_version}"
docker tag "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/yard:${yard_version}" "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/yard:${container_version}"
docker push "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/yard:${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-yard-latest.sh Executable file
View File

@@ -0,0 +1,4 @@
#!/bin/bash
set -euo pipefail
git tag -f yard && git push --tags -f

18
src/yard/Dockerfile Normal file
View File

@@ -0,0 +1,18 @@
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 set -e; \
apt-get update -qq; \
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
p7zip-rar \
p7zip-full; \
opm i yard; \
apt-get clean; \
rm -rf /var/lib/apt/lists/* /var/cache/debconf
ENTRYPOINT ["yard"]

31
tests/test-yard.sh Executable file
View File

@@ -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_yard_is_running() {
log_header "Test :: yard is running"
local expected actual
expected="ИНФОРМАЦИЯ - [СписокРелизов1С]: Инициализирован обработчик"
actual=$(docker run --rm ${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/yard:latest 2>/dev/null | head -n1)
if assert_eq "$expected" "$actual"; then
log_success "yard is running test passed"
else
log_failure "yard is running test failed"
fi
}
# test calls
test_yard_is_running