104 lines
3.0 KiB
Bash
Executable File
104 lines
3.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -Eeuo pipefail
|
|
|
|
readonly SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
readonly COMPOSE_FILE="${SOURCE_DIR}/compose.yaml"
|
|
readonly RUNNER_DATA_DIR="${SOURCE_DIR}/data"
|
|
readonly RUNNER_STATE_FILE="${RUNNER_DATA_DIR}/.runner"
|
|
|
|
if [[ "$EUID" -ne 0 ]]; then
|
|
echo "请使用 sudo 运行此安装脚本。" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -r "$COMPOSE_FILE" || ! -r "${SOURCE_DIR}/config.yaml" ]]; then
|
|
echo "缺少 Runner 的 compose.yaml 或 config.yaml。" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -s "$RUNNER_STATE_FILE" ]]; then
|
|
echo "Runner 已注册,不会覆盖现有注册凭据。" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# The rootless image runs as UID 1000 and needs to read this bind-mounted,
|
|
# non-secret configuration file.
|
|
chmod 0644 "${SOURCE_DIR}/config.yaml"
|
|
|
|
stop_runner() {
|
|
docker compose --file "$COMPOSE_FILE" stop runner >/dev/null 2>&1 || true
|
|
}
|
|
|
|
wait_for_internal_docker() {
|
|
for _ in $(seq 1 60); do
|
|
if docker compose --file "$COMPOSE_FILE" exec -T runner \
|
|
docker version >/dev/null 2>&1; then
|
|
return 0
|
|
fi
|
|
sleep 2
|
|
done
|
|
return 1
|
|
}
|
|
|
|
install -d -o 1000 -g 1000 -m 0700 "$RUNNER_DATA_DIR"
|
|
docker compose --file "$COMPOSE_FILE" pull runner
|
|
|
|
echo "正在空载验证 Runner 的 rootless Docker 环境。"
|
|
if ! docker compose --file "$COMPOSE_FILE" up --detach runner; then
|
|
stop_runner
|
|
echo "Runner 容器无法启动,未使用注册令牌。" >&2
|
|
exit 1
|
|
fi
|
|
if ! wait_for_internal_docker; then
|
|
stop_runner
|
|
docker compose --file "$COMPOSE_FILE" logs --tail 120 runner >&2 || true
|
|
echo "Runner 内部 Docker 未能在 120 秒内启动,未使用注册令牌。" >&2
|
|
exit 1
|
|
fi
|
|
stop_runner
|
|
|
|
printf '请输入 Gitea 仓库 Runner 注册令牌(输入不会显示):'
|
|
IFS= read -r -s registration_token
|
|
printf '\n'
|
|
if [[ -z "$registration_token" ]]; then
|
|
echo "注册令牌不能为空。" >&2
|
|
exit 1
|
|
fi
|
|
trap 'unset registration_token' EXIT
|
|
GITEA_RUNNER_REGISTRATION_TOKEN="$registration_token" \
|
|
docker compose --file "$COMPOSE_FILE" run --rm --no-deps \
|
|
--entrypoint /bin/sh \
|
|
--env GITEA_RUNNER_REGISTRATION_TOKEN \
|
|
runner \
|
|
-c 'cd /data && exec gitea-runner register \
|
|
--config /config.yaml \
|
|
--instance "$GITEA_INSTANCE_URL" \
|
|
--token "$GITEA_RUNNER_REGISTRATION_TOKEN" \
|
|
--name "$GITEA_RUNNER_NAME" \
|
|
--labels "$GITEA_RUNNER_LABELS" \
|
|
--no-interactive'
|
|
unset registration_token
|
|
|
|
if [[ ! -s "$RUNNER_STATE_FILE" ]]; then
|
|
echo "Runner 注册失败:未生成 data/.runner。" >&2
|
|
exit 1
|
|
fi
|
|
chown 1000:1000 "$RUNNER_STATE_FILE"
|
|
chmod 0600 "$RUNNER_STATE_FILE"
|
|
|
|
if ! docker compose --file "$COMPOSE_FILE" up --detach runner; then
|
|
stop_runner
|
|
echo "已注册 Runner,但其常驻容器无法启动。" >&2
|
|
exit 1
|
|
fi
|
|
if wait_for_internal_docker; then
|
|
echo "Plainleaf 专用 Runner 已注册,内部 rootless Docker 可用。"
|
|
exit 0
|
|
fi
|
|
|
|
echo "Runner 内部 Docker 未能在 120 秒内启动,正在停止该 Runner。" >&2
|
|
stop_runner
|
|
docker compose --file "$COMPOSE_FILE" logs --tail 120 runner >&2 || true
|
|
exit 1
|