fix: validate runner host and type combinations in parse_runner_entry function

This commit is contained in:
S
2026-03-02 08:51:43 -05:00
parent f82c98513f
commit c5f9bb506f

View File

@@ -128,6 +128,14 @@ parse_runner_entry() {
log_error "Runner '$target_name': type='$RUNNER_TYPE' (must be docker or native)" log_error "Runner '$target_name': type='$RUNNER_TYPE' (must be docker or native)"
return 1 return 1
fi fi
if [[ "$RUNNER_HOST" == "local" ]] && [[ "$RUNNER_TYPE" != "native" ]]; then
log_error "Runner '$target_name': invalid combo host='$RUNNER_HOST' type='$RUNNER_TYPE' (host=local requires type=native)"
return 1
fi
if [[ "$RUNNER_HOST" != "local" ]] && [[ "$RUNNER_TYPE" != "docker" ]]; then
log_error "Runner '$target_name': invalid combo host='$RUNNER_HOST' type='$RUNNER_TYPE' (host=${RUNNER_HOST} requires type=docker)"
return 1
fi
if [[ -z "$RUNNER_DATA_PATH" ]]; then if [[ -z "$RUNNER_DATA_PATH" ]]; then
log_error "Runner '$target_name': data_path is empty" log_error "Runner '$target_name': data_path is empty"
return 1 return 1
@@ -475,12 +483,30 @@ remove_docker_runner() {
log_info "Removing Docker runner '${RUNNER_NAME}' from ${RUNNER_HOST} (${RUNNER_SSH_HOST})..." log_info "Removing Docker runner '${RUNNER_NAME}' from ${RUNNER_HOST} (${RUNNER_SSH_HOST})..."
if runner_ssh "test -f '${RUNNER_DATA_PATH}/docker-compose.yml'" 2>/dev/null; then if runner_ssh "test -f '${RUNNER_DATA_PATH}/docker-compose.yml'" 2>/dev/null; then
runner_ssh "cd '${RUNNER_DATA_PATH}' && docker compose down 2>/dev/null || docker-compose down" || true if runner_ssh "cd '${RUNNER_DATA_PATH}' && docker compose down 2>/dev/null || docker-compose down"; then
# Remove docker-compose.yml — it contains the registration token in plaintext # Remove docker-compose.yml only after successful stop.
runner_ssh "rm -f '${RUNNER_DATA_PATH}/docker-compose.yml'" 2>/dev/null || true # It contains the registration token in plaintext.
log_success "Docker runner '${RUNNER_NAME}' stopped and compose file removed" runner_ssh "rm -f '${RUNNER_DATA_PATH}/docker-compose.yml'" 2>/dev/null || true
log_success "Docker runner '${RUNNER_NAME}' stopped and compose file removed"
else
log_error "Failed to stop Docker runner '${RUNNER_NAME}' — preserving compose file for retry"
return 1
fi
else else
log_info "No docker-compose.yml found for runner '${RUNNER_NAME}' — already removed" # Backward-safe cleanup: if compose file was removed manually but the container
# still exists, force-remove the orphaned container by exact name.
local orphan_id
orphan_id=$(runner_ssh "docker ps -a --filter 'name=^/gitea-runner-${RUNNER_NAME}$' --format '{{.ID}}'" 2>/dev/null || true)
if [[ -n "$orphan_id" ]]; then
if runner_ssh "docker rm -f 'gitea-runner-${RUNNER_NAME}'" >/dev/null 2>&1; then
log_warn "docker-compose.yml missing; removed orphaned container gitea-runner-${RUNNER_NAME}"
else
log_error "docker-compose.yml missing and failed to remove orphaned container gitea-runner-${RUNNER_NAME}"
return 1
fi
else
log_info "No docker-compose.yml found for runner '${RUNNER_NAME}' — already removed"
fi
fi fi
} }