actions-template/docker-runner/buildx/entrypoint.sh

235 lines
6.5 KiB
Bash

#!/bin/bash
set -e
echo "==================================="
echo "Gitea Runner Container Starting..."
echo "==================================="
# 定义路径
PERSISTENT_BIN="/data/bin"
RUNNER_PATH="$PERSISTENT_BIN/act_runner"
SYSTEM_LINK="/usr/local/bin/act_runner"
# 创建必要目录
mkdir -p /data/runners
mkdir -p "$PERSISTENT_BIN"
mkdir -p /data/buildx
mkdir -p /var/log/supervisor
mkdir -p /var/run
# ============================================
# 初始化 Docker Buildx 支持
# ============================================
echo ""
echo "Initializing Docker Buildx..."
# 启动 Docker 守护进程(如果使用主机 socket 则跳过)
if [ -S /var/run/docker.sock ]; then
echo "✓ Using host Docker socket"
else
echo "Starting Docker daemon..."
dockerd > /var/log/dockerd.log 2>&1 &
sleep 5
fi
# 等待 Docker 就绪
echo "Waiting for Docker daemon..."
for i in {1..30}; do
if docker info > /dev/null 2>&1; then
echo "✓ Docker daemon is ready"
break
fi
if [ $i -eq 30 ]; then
echo "✗ Docker daemon failed to start"
[ -f /var/log/dockerd.log ] && cat /var/log/dockerd.log
exit 1
fi
sleep 1
done
# 注册 QEMU binfmt
echo ""
echo "Registering QEMU binary formats..."
update-binfmts --enable 2>/dev/null || {
echo "⚠ binfmt_misc not available, trying to mount..."
mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc 2>/dev/null || true
update-binfmts --enable
}
# 验证多架构支持
echo "Verifying multi-arch support..."
if docker run --rm arm64v8/alpine uname -m > /dev/null 2>&1; then
echo " ✓ arm64 support verified"
else
echo " ⚠ arm64 verification failed"
fi
if docker run --rm amd64/alpine uname -m > /dev/null 2>&1; then
echo " ✓ amd64 support verified"
else
echo " ⚠ amd64 verification failed"
fi
# 配置 Buildx
if [ ! -f "/data/buildx/.configured" ]; then
echo ""
echo "Setting up Buildx for the first time..."
# 创建 BuildKit 配置
cat > /data/buildx/buildkitd.toml <<EOF
[worker.oci]
max-parallelism = 4
EOF
# 创建 Buildx builder
docker buildx create \
--name gitea-multiarch \
--driver docker-container \
--bootstrap \
--use \
--config /data/buildx/buildkitd.toml 2>/dev/null || \
docker buildx use gitea-multiarch 2>/dev/null
# 验证
echo "Verifying Buildx..."
docker buildx inspect --bootstrap > /dev/null 2>&1
# 标记为已配置
touch /data/buildx/.configured
echo "✓ Buildx configured successfully!"
docker buildx inspect | grep "Platforms:" | head -1
else
echo "✓ Buildx already configured"
# 确保 builder 可用
docker buildx use gitea-multiarch 2>/dev/null || {
echo "⚠ Recreating Buildx builder..."
docker buildx rm gitea-multiarch 2>/dev/null || true
docker buildx create \
--name gitea-multiarch \
--driver docker-container \
--bootstrap \
--use 2>/dev/null
}
fi
echo ""
# ============================================
# 检查 act_runner 安装
# ============================================
# 创建主 supervisor 配置文件
cat > /etc/supervisor/supervisord.conf <<EOF
[supervisord]
nodaemon=true
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
[unix_http_server]
file=/var/run/supervisor.sock
chmod=0700
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[include]
files = /etc/supervisor/conf.d/*.conf
EOF
# 检查持久化目录中的 act_runner
if [ -f "$RUNNER_PATH" ]; then
echo "✓ Found act_runner in persistent storage"
echo " Location: $RUNNER_PATH"
if [ ! -L "$SYSTEM_LINK" ] || [ ! -e "$SYSTEM_LINK" ]; then
ln -sf "$RUNNER_PATH" "$SYSTEM_LINK"
echo " Created system link: $SYSTEM_LINK -> $RUNNER_PATH"
fi
RUNNER_VERSION=$("$SYSTEM_LINK" --version 2>/dev/null || echo "unknown")
echo " Version: $RUNNER_VERSION"
elif [ -f "$SYSTEM_LINK" ]; then
echo "⚠ Found act_runner in system path, migrating to persistent storage..."
cp "$SYSTEM_LINK" "$RUNNER_PATH"
chmod +x "$RUNNER_PATH"
ln -sf "$RUNNER_PATH" "$SYSTEM_LINK"
echo " ✓ Migrated to: $RUNNER_PATH"
else
echo "⚠ act_runner not installed yet!"
echo ""
echo "Please run the setup script first:"
echo " docker-compose exec gitea-runner /data/setup.sh"
echo ""
echo "Container is waiting..."
while [ ! -f "$RUNNER_PATH" ] && [ ! -f "$SYSTEM_LINK" ]; do
sleep 10
done
if [ -f "$RUNNER_PATH" ]; then
ln -sf "$RUNNER_PATH" "$SYSTEM_LINK"
echo "✓ act_runner detected and linked!"
elif [ -f "$SYSTEM_LINK" ]; then
cp "$SYSTEM_LINK" "$RUNNER_PATH"
ln -sf "$RUNNER_PATH" "$SYSTEM_LINK"
echo "✓ act_runner detected and migrated!"
fi
fi
# ============================================
# 配置已注册的 Runners
# ============================================
echo ""
echo "Scanning for registered runners..."
RUNNER_COUNT=0
if [ -d "/data/runners" ]; then
for runner_dir in /data/runners/*/; do
if [ -d "$runner_dir" ]; then
runner_name=$(basename "$runner_dir")
if [ -f "$runner_dir/.runner" ] && [ -f "$runner_dir/config.yaml" ]; then
echo "Found runner: $runner_name"
cat > "/etc/supervisor/conf.d/runner-${runner_name}.conf" <<EOF
[program:runner-${runner_name}]
command=/usr/local/bin/act_runner daemon --config ${runner_dir}/config.yaml
directory=${runner_dir}
autostart=true
autorestart=true
stderr_logfile=/var/log/supervisor/runner-${runner_name}.err.log
stdout_logfile=/var/log/supervisor/runner-${runner_name}.out.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10
stderr_logfile_maxbytes=50MB
stderr_logfile_backups=10
user=root
environment=HOME="/root",PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
EOF
RUNNER_COUNT=$((RUNNER_COUNT + 1))
fi
fi
done
fi
if [ $RUNNER_COUNT -eq 0 ]; then
echo "⚠ No runners registered yet!"
echo ""
echo "Please run the register script to add a runner:"
echo " docker-compose exec gitea-runner /data/register.sh"
echo ""
fi
echo "Total runners configured: $RUNNER_COUNT"
echo ""
echo "==================================="
echo "Starting Supervisor..."
echo "==================================="
# 启动 supervisord
exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf