refactor: 通用技能按类别拆分为独立目录
skills/ → skills-dev(9), skills-req(10), skills-ops(4), skills-integration(8), skills-biz(4), skills-workflow(7) generate-marketplace.py 改为自动扫描所有 skills-* 目录。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
41
skills-ops/ops-tools-plugin/scripts/deploy-check.sh
Executable file
41
skills-ops/ops-tools-plugin/scripts/deploy-check.sh
Executable file
@@ -0,0 +1,41 @@
|
||||
#!/bin/bash
|
||||
# 部署状态检查脚本
|
||||
# 用法: ./deploy-check.sh [ai-proj|pipeXerp]
|
||||
|
||||
set -e
|
||||
|
||||
TOOLS_SERVER="root@101.200.136.200"
|
||||
TOOLS_KEY="~/.ssh/tools.pem"
|
||||
JOB_NAME="${1:-ai-proj}"
|
||||
|
||||
echo "======================================"
|
||||
echo "Jenkins Job: $JOB_NAME"
|
||||
echo "======================================"
|
||||
|
||||
ssh -i $TOOLS_KEY -o ConnectTimeout=5 $TOOLS_SERVER << EOF
|
||||
echo "--- 最近 5 次构建 ---"
|
||||
ls -lt /var/lib/jenkins/jobs/$JOB_NAME/builds/ 2>/dev/null | head -6
|
||||
|
||||
echo ""
|
||||
echo "--- 最近成功构建 ---"
|
||||
if [ -L /var/lib/jenkins/jobs/$JOB_NAME/builds/lastSuccessfulBuild ]; then
|
||||
BUILD_NUM=\$(readlink /var/lib/jenkins/jobs/$JOB_NAME/builds/lastSuccessfulBuild)
|
||||
echo "Build #\$BUILD_NUM"
|
||||
if [ -f "/var/lib/jenkins/jobs/$JOB_NAME/builds/\$BUILD_NUM/log" ]; then
|
||||
echo "构建时间: \$(stat -c %y /var/lib/jenkins/jobs/$JOB_NAME/builds/\$BUILD_NUM/log 2>/dev/null || stat -f %Sm /var/lib/jenkins/jobs/$JOB_NAME/builds/\$BUILD_NUM/log)"
|
||||
fi
|
||||
else
|
||||
echo "无成功构建记录"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "--- 最近失败构建 ---"
|
||||
if [ -L /var/lib/jenkins/jobs/$JOB_NAME/builds/lastFailedBuild ]; then
|
||||
BUILD_NUM=\$(readlink /var/lib/jenkins/jobs/$JOB_NAME/builds/lastFailedBuild)
|
||||
echo "Build #\$BUILD_NUM"
|
||||
echo "错误日志(最后 20 行):"
|
||||
tail -20 /var/lib/jenkins/jobs/$JOB_NAME/builds/\$BUILD_NUM/log 2>/dev/null || echo "无法读取日志"
|
||||
else
|
||||
echo "无失败构建记录"
|
||||
fi
|
||||
EOF
|
||||
97
skills-ops/ops-tools-plugin/scripts/gitea-pr.sh
Executable file
97
skills-ops/ops-tools-plugin/scripts/gitea-pr.sh
Executable file
@@ -0,0 +1,97 @@
|
||||
#!/bin/bash
|
||||
# Gitea PR 操作脚本
|
||||
# 用法:
|
||||
# ./gitea-pr.sh list # 列出 PR
|
||||
# ./gitea-pr.sh create <title> <head> # 创建 PR
|
||||
# ./gitea-pr.sh merge <pr-number> # 合并 PR
|
||||
|
||||
set -e
|
||||
|
||||
# 加载凭据
|
||||
source ~/.config/devops/credentials.env
|
||||
|
||||
REPO="Tools/new-ai-proj"
|
||||
ACTION="${1:-list}"
|
||||
|
||||
case "$ACTION" in
|
||||
list)
|
||||
echo "=== 当前 Pull Requests ==="
|
||||
curl -s "$GITEA_URL/api/v1/repos/$REPO/pulls?state=open" \
|
||||
-H "Authorization: token $GITEA_TOKEN" | \
|
||||
python3 -c "
|
||||
import sys, json
|
||||
prs = json.load(sys.stdin)
|
||||
if not prs:
|
||||
print('没有开放的 PR')
|
||||
else:
|
||||
for pr in prs:
|
||||
print(f\"#{pr['number']} [{pr['state']}] {pr['title']}\")
|
||||
print(f\" {pr['head']['ref']} -> {pr['base']['ref']}\")
|
||||
print(f\" 作者: {pr['user']['login']}\")
|
||||
print()
|
||||
"
|
||||
;;
|
||||
|
||||
create)
|
||||
TITLE="$2"
|
||||
HEAD="$3"
|
||||
BASE="${4:-main}"
|
||||
|
||||
if [ -z "$TITLE" ] || [ -z "$HEAD" ]; then
|
||||
echo "用法: $0 create <title> <head-branch> [base-branch]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "创建 PR: $TITLE"
|
||||
echo "分支: $HEAD -> $BASE"
|
||||
|
||||
curl -s -X POST "$GITEA_URL/api/v1/repos/$REPO/pulls" \
|
||||
-H "Authorization: token $GITEA_TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{\"title\":\"$TITLE\",\"head\":\"$HEAD\",\"base\":\"$BASE\"}" | \
|
||||
python3 -c "
|
||||
import sys, json
|
||||
pr = json.load(sys.stdin)
|
||||
if 'number' in pr:
|
||||
print(f\"PR 创建成功! #{pr['number']}\")
|
||||
print(f\"URL: {pr['html_url']}\")
|
||||
else:
|
||||
print(f\"创建失败: {pr.get('message', '未知错误')}\")
|
||||
"
|
||||
;;
|
||||
|
||||
merge)
|
||||
PR_NUM="$2"
|
||||
|
||||
if [ -z "$PR_NUM" ]; then
|
||||
echo "用法: $0 merge <pr-number>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "合并 PR #$PR_NUM..."
|
||||
|
||||
curl -s -X POST "$GITEA_URL/api/v1/repos/$REPO/pulls/$PR_NUM/merge" \
|
||||
-H "Authorization: token $GITEA_TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"Do":"merge"}' | \
|
||||
python3 -c "
|
||||
import sys, json
|
||||
try:
|
||||
result = json.load(sys.stdin)
|
||||
if result:
|
||||
print(f\"结果: {result}\")
|
||||
else:
|
||||
print('PR 合并成功!')
|
||||
except:
|
||||
print('PR 合并成功!')
|
||||
"
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "用法: $0 {list|create|merge}"
|
||||
echo " list - 列出所有开放的 PR"
|
||||
echo " create <title> <head> - 创建新 PR"
|
||||
echo " merge <pr-number> - 合并 PR"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
84
skills-ops/ops-tools-plugin/scripts/health-check.sh
Executable file
84
skills-ops/ops-tools-plugin/scripts/health-check.sh
Executable file
@@ -0,0 +1,84 @@
|
||||
#!/bin/bash
|
||||
# 服务器健康检查脚本
|
||||
# 用法: ./health-check.sh [aliyun|website|all]
|
||||
|
||||
set -e
|
||||
|
||||
TOOLS_SERVER="root@101.200.136.200"
|
||||
TOOLS_KEY="~/.ssh/tools.pem"
|
||||
WEBSITE_SERVER="root@192.144.137.14"
|
||||
WEBSITE_KEY="~/.ssh/officialWebsite.pem"
|
||||
|
||||
check_tools_server() {
|
||||
echo "======================================"
|
||||
echo "Tools 服务器 (101.200.136.200)"
|
||||
echo "======================================"
|
||||
|
||||
ssh -i $TOOLS_KEY -o ConnectTimeout=5 $TOOLS_SERVER << 'EOF'
|
||||
echo "--- 系统负载 ---"
|
||||
uptime
|
||||
|
||||
echo ""
|
||||
echo "--- 内存使用 ---"
|
||||
free -h
|
||||
|
||||
echo ""
|
||||
echo "--- 磁盘使用 ---"
|
||||
df -h | grep -E '^/dev|Filesystem'
|
||||
|
||||
echo ""
|
||||
echo "--- Docker 容器 ---"
|
||||
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
|
||||
|
||||
echo ""
|
||||
echo "--- 系统服务 ---"
|
||||
echo -n "Jenkins: "; systemctl is-active jenkins
|
||||
echo -n "Nginx: "; systemctl is-active nginx
|
||||
echo -n "Docker: "; systemctl is-active docker
|
||||
|
||||
echo ""
|
||||
echo "--- 端口检查 ---"
|
||||
netstat -tlnp 2>/dev/null | grep -E ':3000|:8080|:10022|:5000' | awk '{print $4, $7}'
|
||||
EOF
|
||||
}
|
||||
|
||||
check_website_server() {
|
||||
echo "======================================"
|
||||
echo "Website 服务器 (192.144.137.14)"
|
||||
echo "======================================"
|
||||
|
||||
ssh -i $WEBSITE_KEY -o ConnectTimeout=5 $WEBSITE_SERVER << 'EOF'
|
||||
echo "--- 系统负载 ---"
|
||||
uptime
|
||||
|
||||
echo ""
|
||||
echo "--- 内存使用 ---"
|
||||
free -h
|
||||
|
||||
echo ""
|
||||
echo "--- 磁盘使用 ---"
|
||||
df -h | grep -E '^/dev|Filesystem'
|
||||
|
||||
echo ""
|
||||
echo "--- Nginx 状态 ---"
|
||||
systemctl is-active nginx || echo "nginx not running"
|
||||
EOF
|
||||
}
|
||||
|
||||
case "${1:-all}" in
|
||||
aliyun|tools)
|
||||
check_tools_server
|
||||
;;
|
||||
website)
|
||||
check_website_server
|
||||
;;
|
||||
all)
|
||||
check_tools_server
|
||||
echo ""
|
||||
check_website_server
|
||||
;;
|
||||
*)
|
||||
echo "用法: $0 [aliyun|website|all]"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
46
skills-ops/ops-tools-plugin/scripts/jenkins-build.sh
Executable file
46
skills-ops/ops-tools-plugin/scripts/jenkins-build.sh
Executable file
@@ -0,0 +1,46 @@
|
||||
#!/bin/bash
|
||||
# Jenkins 构建触发脚本
|
||||
# 用法: ./jenkins-build.sh [job-name] [env]
|
||||
# 示例: ./jenkins-build.sh ai-proj staging
|
||||
|
||||
set -e
|
||||
|
||||
# 加载凭据
|
||||
source ~/.config/devops/credentials.env
|
||||
|
||||
JOB_NAME="${1:-ai-proj}"
|
||||
DEPLOY_ENV="${2:-staging}"
|
||||
|
||||
echo "触发 Jenkins 构建..."
|
||||
echo "Job: $JOB_NAME"
|
||||
echo "环境: $DEPLOY_ENV"
|
||||
echo ""
|
||||
|
||||
# 触发构建
|
||||
RESPONSE=$(curl -s -w "\n%{http_code}" -X POST \
|
||||
"$JENKINS_URL/job/$JOB_NAME/buildWithParameters" \
|
||||
-u "$JENKINS_USER:$JENKINS_TOKEN" \
|
||||
--data "DEPLOY_ENV=$DEPLOY_ENV&SKIP_TESTS=false")
|
||||
|
||||
HTTP_CODE=$(echo "$RESPONSE" | tail -1)
|
||||
|
||||
if [ "$HTTP_CODE" = "201" ]; then
|
||||
echo "构建已触发成功!"
|
||||
echo ""
|
||||
echo "查看构建状态: $JENKINS_URL/job/$JOB_NAME/"
|
||||
|
||||
# 等待 2 秒后获取构建号
|
||||
sleep 2
|
||||
BUILD_INFO=$(curl -s "$JENKINS_URL/job/$JOB_NAME/lastBuild/api/json" \
|
||||
-u "$JENKINS_USER:$JENKINS_TOKEN" 2>/dev/null)
|
||||
|
||||
if [ -n "$BUILD_INFO" ]; then
|
||||
BUILD_NUM=$(echo "$BUILD_INFO" | python3 -c "import sys,json; print(json.load(sys.stdin).get('number','N/A'))" 2>/dev/null || echo "N/A")
|
||||
BUILD_STATUS=$(echo "$BUILD_INFO" | python3 -c "import sys,json; d=json.load(sys.stdin); print('进行中' if d.get('building') else d.get('result','未知'))" 2>/dev/null || echo "未知")
|
||||
echo "构建号: #$BUILD_NUM"
|
||||
echo "状态: $BUILD_STATUS"
|
||||
fi
|
||||
else
|
||||
echo "构建触发失败! HTTP 状态码: $HTTP_CODE"
|
||||
exit 1
|
||||
fi
|
||||
44
skills-ops/ops-tools-plugin/scripts/service-restart.sh
Executable file
44
skills-ops/ops-tools-plugin/scripts/service-restart.sh
Executable file
@@ -0,0 +1,44 @@
|
||||
#!/bin/bash
|
||||
# 服务重启脚本
|
||||
# 用法: ./service-restart.sh <service-name>
|
||||
# 支持: gitea, jenkins, nginx, registry
|
||||
|
||||
set -e
|
||||
|
||||
TOOLS_SERVER="root@101.200.136.200"
|
||||
TOOLS_KEY="~/.ssh/tools.pem"
|
||||
SERVICE_NAME="$1"
|
||||
|
||||
if [ -z "$SERVICE_NAME" ]; then
|
||||
echo "用法: $0 <service-name>"
|
||||
echo "支持的服务: gitea, jenkins, nginx, registry, docker"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "正在重启服务: $SERVICE_NAME ..."
|
||||
|
||||
case "$SERVICE_NAME" in
|
||||
gitea)
|
||||
ssh -i $TOOLS_KEY $TOOLS_SERVER "docker restart gitea && docker logs --tail 10 gitea"
|
||||
;;
|
||||
registry)
|
||||
ssh -i $TOOLS_KEY $TOOLS_SERVER "docker restart registry && docker ps | grep registry"
|
||||
;;
|
||||
jenkins)
|
||||
ssh -i $TOOLS_KEY $TOOLS_SERVER "systemctl restart jenkins && systemctl status jenkins --no-pager"
|
||||
;;
|
||||
nginx)
|
||||
ssh -i $TOOLS_KEY $TOOLS_SERVER "nginx -t && systemctl restart nginx && systemctl status nginx --no-pager"
|
||||
;;
|
||||
docker)
|
||||
ssh -i $TOOLS_KEY $TOOLS_SERVER "systemctl restart docker && docker ps"
|
||||
;;
|
||||
*)
|
||||
echo "不支持的服务: $SERVICE_NAME"
|
||||
echo "支持的服务: gitea, jenkins, nginx, registry, docker"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
echo ""
|
||||
echo "服务 $SERVICE_NAME 重启完成"
|
||||
Reference in New Issue
Block a user