b 5 月之前
父節點
當前提交
7221a9a71d
共有 8 個文件被更改,包括 645 次插入0 次删除
  1. 58 0
      README.md
  2. 13 0
      setup-gentool.sh
  3. 42 0
      setup-mysql-cli.sh
  4. 65 0
      setup-ssh.sh
  5. 39 0
      setup-trunk.sh
  6. 166 0
      tool-import-sql.sh
  7. 69 0
      tool-merge-sql.sh
  8. 193 0
      tool-trunk-checker.sh

+ 58 - 0
README.md

@@ -0,0 +1,58 @@
+# shell-kit
+
+通用脚本集合
+
+## 调用示例
+
+```sh
+#!/bin/bash
+
+# 先克隆 shell-kit 仓库(如果不存在)
+if [ ! -d "/workspace/shell-kit" ]; then
+	echo "正在克隆 shell-kit 仓库..."
+	if git clone https://github.com/Kit/shell-kit.git /workspace/shell-kit; then
+		echo "shell-kit 仓库克隆完成"
+	else
+		echo "错误:shell-kit 仓库克隆失败"
+		exit 1
+	fi
+else
+	echo "shell-kit 仓库已存在,跳过克隆"
+fi
+
+# 配置SSH服务
+if [ -f "/workspace/shell-kit/setup-ssh.sh" ]; then
+	echo "正在配置SSH服务..."
+	chmod +x /workspace/shell-kit/setup-ssh.sh
+	/workspace/shell-kit/setup-ssh.sh
+else
+	echo "警告:SSH配置脚本不存在,跳过SSH配置"
+fi
+
+# 安装 trunk 工具并初始化
+if [ -f "/workspace/shell-kit/setup-trunk.sh" ]; then
+	echo "正在安装 trunk 工具并初始化..."
+	chmod +x /workspace/shell-kit/setup-trunk.sh
+	/workspace/shell-kit/setup-trunk.sh
+else
+	echo "警告:trunk 安装脚本不存在,跳过 trunk 安装和初始化"
+fi
+
+# 安装 gentool 工具
+if [ -f "/workspace/shell-kit/setup-gentool.sh" ]; then
+	echo "正在安装 gentool 工具..."
+	chmod +x /workspace/shell-kit/setup-gentool.sh
+	/workspace/shell-kit/setup-gentool.sh
+else
+	echo "警告:gentool 安装脚本不存在,跳过 gentool 安装"
+fi
+
+# 安装 MySQL CLI 工具
+if [ -f "/workspace/shell-kit/setup-mysql-cli.sh" ]; then
+	echo "正在安装 MySQL CLI 工具..."
+	chmod +x /workspace/shell-kit/setup-mysql-cli.sh
+	/workspace/shell-kit/setup-mysql-cli.sh
+else
+	echo "警告:MySQL CLI 安装脚本不存在,跳过 MySQL CLI 安装"
+fi
+```

+ 13 - 0
setup-gentool.sh

@@ -0,0 +1,13 @@
+#!/bin/bash
+
+# 安装 gentool 的脚本
+# 用于安装 gorm.io/gen/tools/gentool 工具
+
+echo "开始安装 gentool..."
+
+# 安装 gentool
+echo "正在安装 gentool..."
+export GOPROXY=https://goproxy.cn,direct
+go install gorm.io/gen/tools/gentool@latest
+
+echo "gentool 安装完成"

+ 42 - 0
setup-mysql-cli.sh

@@ -0,0 +1,42 @@
+#!/bin/bash
+
+# MySQL CLI工具安装脚本
+# 用于安装MySQL客户端工具
+
+echo "开始安装MySQL CLI工具..."
+
+# 更新软件包列表
+apt-get update
+
+# 在Debian Trixie中,mysql-client已被mariadb-client-compat替代
+# 安装mariadb-client,它提供mysql命令行工具
+apt-get install -y mariadb-client
+
+# 检查安装是否成功
+if command -v mysql &>/dev/null; then
+	echo "MySQL客户端安装成功"
+
+	# 显示版本信息
+	mysql --version
+
+	echo "MySQL CLI工具安装完成"
+	echo "使用说明:"
+	echo "  连接命令: mysql -h <主机> -P <端口> -u <用户名> -p"
+	echo "  本地连接: mysql -h localhost -P 3306 -u root -p"
+else
+	echo "错误:MySQL客户端安装失败"
+	echo "尝试备用安装方案..."
+
+	# 备用方案:安装默认的MySQL客户端
+	apt-get install -y default-mysql-client
+
+	if command -v mysql &>/dev/null; then
+		echo "备用安装方案成功"
+		mysql --version
+	else
+		echo "错误:所有安装方案都失败了"
+		exit 1
+	fi
+fi
+
+echo "MySQL CLI工具配置完成"

+ 65 - 0
setup-ssh.sh

@@ -0,0 +1,65 @@
+#!/bin/bash
+
+# SSH服务配置脚本
+# 用于设置和启动SSH服务
+
+echo "开始配置SSH服务..."
+
+# 安装 SSH 服务
+apt-get update && apt-get install -y openssh-server
+
+# 创建sshd用户(如果不存在)
+if ! id "sshd" &>/dev/null; then
+	useradd -r -s /bin/false -d /var/run/sshd -c "SSH privilege separation" sshd
+	echo "已创建sshd用户"
+fi
+
+# 创建并设置正确的目录权限
+mkdir -p /var/run/sshd
+chown root:root /var/run/sshd
+chmod 755 /var/run/sshd
+
+# 创建/run/sshd目录(系统运行时目录)
+mkdir -p /run/sshd
+chown root:root /run/sshd
+chmod 755 /run/sshd
+
+# 生成SSH主机密钥(如果不存在)
+if [ ! -f /etc/ssh/ssh_host_rsa_key ]; then
+	ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -N ""
+	echo "已生成RSA主机密钥"
+fi
+if [ ! -f /etc/ssh/ssh_host_ecdsa_key ]; then
+	ssh-keygen -t ecdsa -b 521 -f /etc/ssh/ssh_host_ecdsa_key -N ""
+	echo "已生成ECDSA主机密钥"
+fi
+if [ ! -f /etc/ssh/ssh_host_ed25519_key ]; then
+	ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
+	echo "已生成Ed25519主机密钥"
+fi
+
+# 设置 root 用户密码
+passwd -u root && echo 'root:root' | chpasswd
+
+# 配置SSH服务
+# 允许 root 用户通过 SSH 登录
+sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
+# 允许密码认证
+sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config
+
+# 重启 SSH 服务
+service ssh start
+
+# 检查SSH服务状态
+if service ssh status >/dev/null 2>&1; then
+	echo "SSH服务启动成功"
+	echo "SSH连接信息:"
+	echo "  用户名: root"
+	echo "  密码: root"
+	echo "  端口: 22"
+else
+	echo "警告:SSH服务启动失败"
+	exit 1
+fi
+
+echo "SSH服务配置完成"

+ 39 - 0
setup-trunk.sh

@@ -0,0 +1,39 @@
+#!/bin/bash
+
+# 安装 trunk 的脚本
+# 用于安装 trunk 工具并初始化
+
+echo "开始安装 trunk 工具并初始化..."
+
+# 进入工作目录
+if ! cd /workspace; then
+	echo "错误: 无法切换到 /workspace 目录"
+	exit 1
+fi
+
+current_dir=$(pwd)
+echo "工作目录: ${current_dir}"
+
+# 如果 trunk 不存在,则下载
+if [ ! -f "./trunk" ]; then
+	echo "正在下载 trunk 工具..."
+	curl -fsSLO --retry 3 https://trunk.io/releases/trunk
+	chmod +x ./trunk
+	echo "trunk 工具下载完成"
+else
+	echo "trunk 工具已存在"
+fi
+
+# 如果 trunk 未初始化,则初始化
+if [ ! -d "./.trunk" ]; then
+	echo "正在初始化 trunk..."
+	./trunk init && ./trunk config share
+	echo "trunk 初始化完成"
+else
+	echo "trunk 已初始化"
+fi
+
+# 启用 trivy 检查
+./trunk check enable trivy
+
+echo "trunk 工具安装和初始化完成"

+ 166 - 0
tool-import-sql.sh

@@ -0,0 +1,166 @@
+#!/bin/bash
+
+# MySQL数据库初始化脚本
+# 用于创建基础数据库并导入表结构
+
+# 显示使用说明
+show_usage() {
+	echo "用法: $0 [选项]"
+	echo "选项:"
+	echo "  -h, --host HOST        MySQL主机地址 (默认: bm_mysql)"
+	echo "  -P, --port PORT        MySQL端口 (默认: 3306)"
+	echo "  -u, --user USER        MySQL用户名 (默认: root)"
+	echo "  -p, --password PASS    MySQL密码 (默认: 空)"
+	echo "  -d, --database DB      数据库名称 (默认: bm_center)"
+	echo "  -f, --file FILE        SQL文件路径 (默认: /workspace/db/center/merged.sql)"
+	echo "  --help                 显示此帮助信息"
+	echo ""
+	echo "示例:"
+	echo "  $0 -h localhost -d mydb -f /path/to/sql/file.sql"
+	echo "  $0 --file /workspace/db/sub/merged.sql"
+}
+
+# 默认配置
+DB_HOST="bm_mysql"
+DB_PORT="3306"
+DB_USER="root"
+DB_PASSWORD=""
+DB_NAME="bm_center"
+SQL_FILE="/workspace/db/center/merged.sql"
+
+# 解析命令行参数
+while [[ $# -gt 0 ]]; do
+	case $1 in
+	-h | --host)
+		DB_HOST="$2"
+		shift 2
+		;;
+	-P | --port)
+		DB_PORT="$2"
+		shift 2
+		;;
+	-u | --user)
+		DB_USER="$2"
+		shift 2
+		;;
+	-p | --password)
+		DB_PASSWORD="$2"
+		shift 2
+		;;
+	-d | --database)
+		DB_NAME="$2"
+		shift 2
+		;;
+	-f | --file)
+		SQL_FILE="$2"
+		shift 2
+		;;
+	--help)
+		show_usage
+		exit 0
+		;;
+	*)
+		echo "错误: 未知参数 '$1'"
+		show_usage
+		exit 1
+		;;
+	esac
+done
+
+echo ""
+echo "- - = 开始初始化数据库 = - -"
+echo ""
+echo "  主机: ${DB_HOST}"
+echo "  数据库: ${DB_NAME}"
+echo "  SQL文件: ${SQL_FILE}"
+echo ""
+
+# 检查MySQL客户端是否可用
+if ! command -v mysql &>/dev/null; then
+	echo "错误:MySQL客户端未安装,请先运行 setup-mysql-cli.sh"
+	exit 1
+fi
+
+# 检查SQL文件是否存在
+if [ ! -f "${SQL_FILE}" ]; then
+	echo "错误:SQL文件不存在: ${SQL_FILE}"
+	echo "请先运行 'make m' 生成merged.sql文件"
+	exit 1
+fi
+
+# 构建MySQL连接命令
+MYSQL_CMD="mysql -h ${DB_HOST} -P ${DB_PORT} -u ${DB_USER} --skip-ssl"
+if [ -n "${DB_PASSWORD}" ]; then
+	MYSQL_CMD="${MYSQL_CMD} -p${DB_PASSWORD}"
+fi
+
+# 测试MySQL连接
+if ! ${MYSQL_CMD} -e "SELECT 1;" &>/dev/null; then
+	echo "错误:无法连接到MySQL服务器"
+	echo "请检查MySQL服务是否运行,以及连接参数是否正确"
+	echo "主机: ${DB_HOST}, 端口: ${DB_PORT}, 用户: ${DB_USER}"
+	exit 1
+fi
+
+# 检查数据库是否已存在
+echo "检查数据库 ${DB_NAME} 是否存在..."
+if ${MYSQL_CMD} -e "USE ${DB_NAME};" &>/dev/null; then
+	echo "警告:数据库 ${DB_NAME} 已存在"
+	read -p "是否删除并重新创建数据库?(y/N): " -n 1 -r
+	echo
+	if [[ ! ${REPLY} =~ ^[Yy]$ ]]; then
+		echo "操作已取消"
+		exit 0
+	fi
+
+	# 删除现有数据库
+	echo "删除现有数据库 ${DB_NAME}..."
+	if ! ${MYSQL_CMD} -e "DROP DATABASE ${DB_NAME};" &>/dev/null; then
+		echo "错误:删除数据库失败"
+		exit 1
+	fi
+fi
+
+# 创建数据库
+echo "创建数据库 ${DB_NAME}..."
+if ! ${MYSQL_CMD} -e "CREATE DATABASE ${DB_NAME} CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" &>/dev/null; then
+	echo "错误:创建数据库失败"
+	exit 1
+fi
+
+echo "数据库创建成功"
+echo ""
+
+# 导入SQL文件
+echo "导入表结构文件: ${SQL_FILE}"
+if ! ${MYSQL_CMD} "${DB_NAME}" <"${SQL_FILE}"; then
+	echo "错误:导入SQL文件失败"
+	exit 1
+fi
+
+echo "SQL文件导入成功"
+echo ""
+
+# 验证导入结果
+echo "验证导入结果..."
+TABLE_COUNT=$(${MYSQL_CMD} "${DB_NAME}" -N -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '${DB_NAME}';" 2>/dev/null)
+
+if [ -n "${TABLE_COUNT}" ] && [ "${TABLE_COUNT}" -gt 0 ]; then
+	echo "✅ 数据库初始化完成"
+	echo "   数据库名: ${DB_NAME}"
+	echo "   表数量: ${TABLE_COUNT}"
+	echo "   包含的表:"
+	${MYSQL_CMD} "${DB_NAME}" -e "SHOW TABLES;" 2>/dev/null
+else
+	echo "警告:未检测到导入的表"
+fi
+
+echo ""
+echo "使用说明:"
+echo "   连接数据库: mysql -h ${DB_HOST} -P ${DB_PORT} -u ${DB_USER} -p ${DB_NAME}"
+echo "   查看表结构: SHOW TABLES;"
+echo "   查看表详情: DESCRIBE table_name;"
+echo ""
+echo "mb_center数据库初始化完成"
+echo ""
+echo ""

+ 69 - 0
tool-merge-sql.sh

@@ -0,0 +1,69 @@
+#!/bin/bash
+
+# 递归合并SQL文件脚本
+
+# 检查命令行参数
+if [ $# -eq 0 ]; then
+	# 如果没有参数,使用默认目录
+	SOURCE_DIR="mysql"
+	OUTPUT_FILE="merged.sql"
+else
+	# 使用第一个参数作为源目录
+	SOURCE_DIR="$1"
+	# 使用第二个参数作为输出文件
+	OUTPUT_FILE="$2"
+fi
+
+# 检查源目录是否存在
+if [ ! -d "${SOURCE_DIR}" ]; then
+	echo "错误: 源目录 ${SOURCE_DIR} 不存在"
+	exit 1
+fi
+
+# 清空或创建输出文件
+current_date=$(date)
+echo "-- 合并时间: ${current_date}" >"${OUTPUT_FILE}"
+echo "-- 合并目录: ${SOURCE_DIR}" >>"${OUTPUT_FILE}"
+echo "" >>"${OUTPUT_FILE}"
+
+# 递归查找所有SQL文件并合并
+find "${SOURCE_DIR}" -name "*.sql" | sort >sql_files.txt 2>/dev/null || true
+
+while IFS= read -r sql_file; do
+	# 仅提取建表语句并添加到输出文件
+	# 1. 只保留CREATE TABLE语句(从CREATE TABLE到ENGINE = InnoDB)
+	# 2. 移除SQL注释
+	# 3. 移除空行
+	# 使用单个 stderr 重定向
+	{
+		awk '/CREATE TABLE IF NOT EXISTS/,/ENGINE = InnoDB/ {print}' "${sql_file}" |
+			grep -v "BEGIN;" |
+			grep -v "INSERT INTO" |
+			grep -v "COMMIT;" |
+			sed -e 's/--.*$//' | sed '/^[[:space:]]*$/d'
+	} 2>/dev/null >>"${OUTPUT_FILE}" || true
+	# 只在有内容输出时才添加空行分隔符
+	if [ -s "${OUTPUT_FILE}" ]; then
+		last_char=$(tail -c 1 "${OUTPUT_FILE}" 2>/dev/null || true)
+		if [ "${last_char}" != "" ] && [ "${last_char}" != "\n" ]; then
+			echo "" >>"${OUTPUT_FILE}"
+		fi
+	fi
+done <sql_files.txt
+
+# 清理临时文件
+rm -f sql_files.txt 2>/dev/null || true
+
+# 计算合并的文件数量
+file_count=0
+find "${SOURCE_DIR}" -name "*.sql" 2>/dev/null >file_list.txt || true
+while IFS= read -r _; do
+	((file_count++))
+done <file_list.txt
+rm -f file_list.txt 2>/dev/null || true
+
+echo ""
+echo "SQL文件合并完成!"
+echo "输出文件: ${OUTPUT_FILE}"
+echo "合并的文件数量: ${file_count}"
+echo ""

+ 193 - 0
tool-trunk-checker.sh

@@ -0,0 +1,193 @@
+#!/bin/bash
+
+# 自动运行代码质量检查
+
+# 显示使用说明
+show_usage() {
+	echo "用法: $0 [选项] [文件或目录...]"
+	echo "选项:"
+	echo "  -a, --all             检查所有文件"
+	echo "  -g, --git             [默认] 只检查git相关的文件(已修改、已暂存、未跟踪)"
+	echo "  -f, --file FILE       指定要检查的特定文件"
+	echo "  -d, --dir DIR         指定要检查的目录"
+	echo "  --help                显示此帮助信息"
+	echo ""
+	echo "示例:"
+	echo "  $0                          # 检查所有git相关文件(默认)"
+	echo "  $0 -f file1.go -f file2.py  # 检查指定文件"
+	echo "  $0 -d src/ -d tests/        # 检查指定目录"
+	echo "  $0 file1.go src/ tests/     # 混合指定文件和目录"
+}
+
+# 默认模式:检查git相关文件
+MODE="git"
+
+# 解析命令行参数
+declare -a USER_FILES_ARRAY=()
+
+while [[ $# -gt 0 ]]; do
+	case $1 in
+	-a | --all)
+		MODE="all"
+		shift
+		;;
+	-g | --git)
+		MODE="git"
+		shift
+		;;
+	-f | --file)
+		if [ -f "$2" ]; then
+			USER_FILES_ARRAY+=("$2")
+		else
+			echo "警告:文件 '$2' 不存在,跳过"
+		fi
+		shift 2
+		;;
+	-d | --dir)
+		if [ -d "$2" ]; then
+			# 查找目录下的所有文件并添加到数组
+			while IFS= read -r file; do
+				[ -n "${file}" ] && [[ ${file} != */.* ]] && [[ ${file} != .* ]] && USER_FILES_ARRAY+=("${file}")
+			done < <(find "$2" -type f 2>/dev/null | grep -v '/\.' || true)
+		else
+			echo "警告:目录 '$2' 不存在,跳过"
+		fi
+		shift 2
+		;;
+	--help)
+		show_usage
+		exit 0
+		;;
+	-*)
+		echo "错误:未知选项 '$1'"
+		show_usage
+		exit 1
+		;;
+	*)
+		# 处理直接指定的文件或目录
+		if [ -f "$1" ]; then
+			USER_FILES_ARRAY+=("$1")
+		elif [ -d "$1" ]; then
+			# 查找目录下的所有文件并添加到数组
+			while IFS= read -r file; do
+				[ -n "${file}" ] && [[ ${file} != */.* ]] && [[ ${file} != .* ]] && USER_FILES_ARRAY+=("${file}")
+			done < <(find "$1" -type f 2>/dev/null | grep -v '/\.' || true)
+		else
+			echo "警告:'$1' 不是文件或目录,跳过"
+		fi
+		shift
+		;;
+	esac
+done
+
+# 将数组转换为换行分隔的字符串
+if [ ${#USER_FILES_ARRAY[@]} -gt 0 ]; then
+	USER_FILES=$(printf "%s\n" "${USER_FILES_ARRAY[@]}")
+else
+	USER_FILES=""
+fi
+
+echo ""
+echo "🚀 正在运行代码质量检查..."
+echo "========================================"
+echo "模式: ${MODE}"
+
+# 切换到工作目录
+cd /workspace || exit
+
+# 检查trunk工具是否可用
+if ! command -v ./trunk &>/dev/null; then
+	echo "❌ trunk工具未找到,请确保已正确安装"
+	exit 1
+fi
+
+# 根据模式获取需要检查的文件
+if [ "${MODE}" = "all" ]; then
+	# 检查所有文件
+	ALL_FILES=$(find . -type f 2>/dev/null | grep -v '/\.' | grep -v '^/\.' | sort | uniq || true)
+elif [ -n "${USER_FILES}" ]; then
+	# 使用用户指定的文件
+	ALL_FILES="${USER_FILES}"
+else
+	# 默认:检查git相关文件
+	STAGED_FILES=$(git diff --name-only --diff-filter=d 2>/dev/null || true)
+	NEW_FILES=$(git diff --cached --name-only --diff-filter=A 2>/dev/null || true)
+	UNTRACKED_FILES=$(git ls-files --others --exclude-standard 2>/dev/null || true)
+
+	# 使用数组安全地合并文件列表
+	declare -a ALL_FILES_ARRAY=()
+
+	# 添加已修改的文件
+	if [ -n "${STAGED_FILES}" ]; then
+		while IFS= read -r file; do
+			[ -n "${file}" ] && [[ ${file} != */.* ]] && [[ ${file} != .* ]] && ALL_FILES_ARRAY+=("${file}")
+		done <<<"${STAGED_FILES}"
+	fi
+
+	# 添加新暂存的文件
+	if [ -n "${NEW_FILES}" ]; then
+		while IFS= read -r file; do
+			[ -n "${file}" ] && [[ ${file} != */.* ]] && [[ ${file} != .* ]] && ALL_FILES_ARRAY+=("${file}")
+		done <<<"${NEW_FILES}"
+	fi
+
+	# 添加未跟踪的文件
+	if [ -n "${UNTRACKED_FILES}" ]; then
+		while IFS= read -r file; do
+			[ -n "${file}" ] && [[ ${file} != */.* ]] && [[ ${file} != .* ]] && ALL_FILES_ARRAY+=("${file}")
+		done <<<"${UNTRACKED_FILES}"
+	fi
+
+	# 去重并生成最终文件列表
+	if [ ${#ALL_FILES_ARRAY[@]} -gt 0 ]; then
+		ALL_FILES=$(printf "%s\n" "${ALL_FILES_ARRAY[@]}" | sort | uniq || true)
+	else
+		ALL_FILES=""
+	fi
+fi
+
+# 去重并过滤空行和隐藏文件(针对非数组模式)
+if [ "${MODE}" = "all" ] || [ -n "${USER_FILES}" ]; then
+	ALL_FILES=$(echo "${ALL_FILES}" | grep -v '^$' | grep -v '/\.' | grep -v '^/\.' | sort | uniq || true)
+fi
+
+if [ -z "${ALL_FILES}" ]; then
+	echo "ℹ️  没有找到需要检查的文件"
+	exit 0
+fi
+
+# 检查文件数量
+FILE_COUNT=$(echo "${ALL_FILES}" | wc -l)
+echo ""
+echo "📊 共发现 ${FILE_COUNT} 个需要检查的文件:"
+echo "${ALL_FILES}"
+echo ""
+
+# 运行trunk check检查代码质量
+echo ""
+echo "🔍 正在运行代码质量检查..."
+if ! ./trunk check ${ALL_FILES}; then
+	echo ""
+	echo "❌ 代码质量检查失败!"
+	echo ""
+	echo "请修复上述问题后再提交"
+	echo ""
+	exit 1
+fi
+
+# 检查安全漏洞
+echo ""
+echo "🔒 正在检查安全漏洞..."
+if ! ./trunk check --filter=trivy ${ALL_FILES}; then
+	echo ""
+	echo "⚠️  发现安全相关问题,建议检查后再推送"
+	echo ""
+	exit 1
+fi
+
+echo ""
+echo "✅ 代码质量检查通过!可以安全提交。"
+echo "========================================"
+echo ""
+
+exit 0