Files
2026-08-13 00:30:09 +08:00

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