Исправить передачу исходников в CI-контейнеры
Some checks failed
Проверка, сборка и развёртывание Magistr / Обязательные проверки (push) Successful in 1m23s
Проверка, сборка и развёртывание Magistr / Собрать backend image (push) Successful in 7m36s
Проверка, сборка и развёртывание Magistr / Собрать frontend image (push) Successful in 31s
Проверка, сборка и развёртывание Magistr / Проверить опубликованные образы (push) Failing after 4m56s
Проверка, сборка и развёртывание Magistr / Развернуть проверенные digests (push) Has been skipped
Some checks failed
Проверка, сборка и развёртывание Magistr / Обязательные проверки (push) Successful in 1m23s
Проверка, сборка и развёртывание Magistr / Собрать backend image (push) Successful in 7m36s
Проверка, сборка и развёртывание Magistr / Собрать frontend image (push) Successful in 31s
Проверка, сборка и развёртывание Magistr / Проверить опубликованные образы (push) Failing after 4m56s
Проверка, сборка и развёртывание Magistr / Развернуть проверенные digests (push) Has been skipped
This commit is contained in:
87
scripts/run-ci-container.sh
Executable file
87
scripts/run-ci-container.sh
Executable file
@@ -0,0 +1,87 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
if (( $# < 4 )); then
|
||||
printf 'Использование: %s <каталог-исходников> <образ> [--copy <каталог> <путь>] [--env <ИМЯ=значение>] -- <команда> [аргументы...]\n' \
|
||||
"${0##*/}" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
SOURCE_DIR=$1
|
||||
IMAGE=$2
|
||||
shift 2
|
||||
EXTRA_SOURCE_DIRS=()
|
||||
EXTRA_DESTINATIONS=()
|
||||
CREATE_ARGS=()
|
||||
|
||||
while (( $# > 0 )); do
|
||||
case "$1" in
|
||||
--copy)
|
||||
if (( $# < 3 )); then
|
||||
printf '[CI-КОНТЕЙНЕР] Ошибка: для --copy нужны каталог и путь в контейнере\n' >&2
|
||||
exit 2
|
||||
fi
|
||||
EXTRA_SOURCE_DIRS+=("$2")
|
||||
EXTRA_DESTINATIONS+=("$3")
|
||||
shift 3
|
||||
;;
|
||||
--env)
|
||||
if (( $# < 2 )) || [[ ! "$2" =~ ^[A-Za-z_][A-Za-z0-9_]*=.*$ ]]; then
|
||||
printf '[CI-КОНТЕЙНЕР] Ошибка: для --env ожидается ИМЯ=значение\n' >&2
|
||||
exit 2
|
||||
fi
|
||||
CREATE_ARGS+=(--env "$2")
|
||||
shift 2
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
*)
|
||||
printf '[CI-КОНТЕЙНЕР] Ошибка: неизвестный аргумент до команды: %s\n' "$1" >&2
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if (( $# == 0 )); then
|
||||
printf '[CI-КОНТЕЙНЕР] Ошибка: не указана команда контейнера\n' >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
if [[ ! -d "$SOURCE_DIR" ]]; then
|
||||
printf '[CI-КОНТЕЙНЕР] Ошибка: каталог исходников не найден: %s\n' "$SOURCE_DIR" >&2
|
||||
exit 2
|
||||
fi
|
||||
for index in "${!EXTRA_SOURCE_DIRS[@]}"; do
|
||||
extra_source=${EXTRA_SOURCE_DIRS[$index]}
|
||||
extra_destination=${EXTRA_DESTINATIONS[$index]}
|
||||
if [[ ! -d "$extra_source" ]]; then
|
||||
printf '[CI-КОНТЕЙНЕР] Ошибка: дополнительный каталог не найден: %s\n' \
|
||||
"$extra_source" >&2
|
||||
exit 2
|
||||
fi
|
||||
if [[ "$extra_destination" != /* || "$extra_destination" == *..* ]]; then
|
||||
printf '[CI-КОНТЕЙНЕР] Ошибка: путь назначения должен быть абсолютным без ..: %s\n' \
|
||||
"$extra_destination" >&2
|
||||
exit 2
|
||||
fi
|
||||
done
|
||||
|
||||
CONTAINER_ID=
|
||||
|
||||
cleanup() {
|
||||
if [[ -n "$CONTAINER_ID" ]]; then
|
||||
docker rm --force "$CONTAINER_ID" >/dev/null 2>&1 || true
|
||||
fi
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
CONTAINER_ID=$(docker create --workdir /workspace "${CREATE_ARGS[@]}" "$IMAGE" "$@")
|
||||
docker cp "$SOURCE_DIR/." "$CONTAINER_ID:/workspace"
|
||||
for index in "${!EXTRA_SOURCE_DIRS[@]}"; do
|
||||
docker cp "${EXTRA_SOURCE_DIRS[$index]}/." \
|
||||
"$CONTAINER_ID:${EXTRA_DESTINATIONS[$index]}"
|
||||
done
|
||||
docker start --attach "$CONTAINER_ID"
|
||||
Reference in New Issue
Block a user