diff --git a/scanner/Dockerfile b/scanner/Dockerfile index 6492f408..9a50a618 100644 --- a/scanner/Dockerfile +++ b/scanner/Dockerfile @@ -39,7 +39,6 @@ RUN set -ex && \ --timeout 120 \ --retries 5 \ --trusted-host mirrors.aliyun.com \ - --extra-index-url https://pypi.tuna.tsinghua.edu.cn/simple \ cisco-ai-skill-scanner && \ echo "" && \ echo "=== 清理编译依赖 ===" && \ diff --git a/scanner/Dockerfile.fallback b/scanner/Dockerfile.fallback new file mode 100644 index 00000000..88fa94a6 --- /dev/null +++ b/scanner/Dockerfile.fallback @@ -0,0 +1,66 @@ +# 基础镜像 - Alibaba Cloud Linux 3 +# 带多个 PyPI 源备用方案 +FROM jsessh-registry.cn-shanghai.cr.aliyuncs.com/base-images/python:latest + +WORKDIR /app + +# 升级 pip +RUN pip install --upgrade pip \ + -i https://mirrors.aliyun.com/pypi/simple/ \ + --timeout 120 \ + --retries 5 \ + --trusted-host mirrors.aliyun.com + +# 安装编译依赖和 Python 包 +RUN set -ex && \ + echo "=== 安装编译依赖 ===" && \ + yum clean all && \ + yum install -y \ + gcc \ + gcc-c++ \ + make \ + glibc-devel \ + libffi-devel \ + openssl-devel \ + wget \ + ca-certificates && \ + echo "" && \ + echo "=== 安装 Python 包(多源备用)===" && \ + (pip install --no-cache-dir \ + -i https://mirrors.aliyun.com/pypi/simple/ \ + --timeout 120 \ + --retries 5 \ + --trusted-host mirrors.aliyun.com \ + cisco-ai-skill-scanner && echo "SUCCESS: 从阿里云安装成功") || \ + (echo "FALLBACK: 尝试官方 PyPI..." && \ + pip install --no-cache-dir \ + --timeout 120 \ + --retries 5 \ + cisco-ai-skill-scanner && echo "SUCCESS: 从官方 PyPI 安装成功") || \ + (echo "ERROR: 所有安装尝试失败" && exit 1) && \ + echo "" && \ + echo "=== 清理编译依赖 ===" && \ + yum remove -y \ + gcc \ + gcc-c++ \ + make \ + glibc-devel \ + libffi-devel \ + openssl-devel && \ + yum clean all && \ + rm -rf /var/cache/yum + +# 创建 app 用户和组 +RUN groupadd -r app && \ + useradd -r -g app -s /sbin/nologin app && \ + mkdir -p /tmp/skillhub-scans && \ + chown -R app:app /tmp/skillhub-scans + +USER app + +EXPOSE 8000 + +HEALTHCHECK --interval=10s --timeout=3s --start-period=5s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://127.0.0.1:8000/health || exit 1 + +CMD ["skill-scanner-api", "--host", "0.0.0.0", "--port", "8000"] diff --git a/scanner/Dockerfile.official-pypi b/scanner/Dockerfile.official-pypi new file mode 100644 index 00000000..24f50589 --- /dev/null +++ b/scanner/Dockerfile.official-pypi @@ -0,0 +1,49 @@ +# 基础镜像 - Alibaba Cloud Linux 3 +# 使用官方 PyPI(最稳定但可能较慢) +FROM jsessh-registry.cn-shanghai.cr.aliyuncs.com/base-images/python:latest + +WORKDIR /app + +# 升级 pip(使用官方源) +RUN pip install --upgrade pip --timeout 180 --retries 10 + +# 安装编译依赖和 Python 包 +RUN set -ex && \ + yum clean all && \ + yum install -y \ + gcc \ + gcc-c++ \ + make \ + glibc-devel \ + libffi-devel \ + openssl-devel \ + wget \ + ca-certificates && \ + pip install --no-cache-dir \ + --timeout 180 \ + --retries 10 \ + cisco-ai-skill-scanner && \ + yum remove -y \ + gcc \ + gcc-c++ \ + make \ + glibc-devel \ + libffi-devel \ + openssl-devel && \ + yum clean all && \ + rm -rf /var/cache/yum + +# 创建 app 用户和组 +RUN groupadd -r app && \ + useradd -r -g app -s /sbin/nologin app && \ + mkdir -p /tmp/skillhub-scans && \ + chown -R app:app /tmp/skillhub-scans + +USER app + +EXPOSE 8000 + +HEALTHCHECK --interval=10s --timeout=3s --start-period=5s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://127.0.0.1:8000/health || exit 1 + +CMD ["skill-scanner-api", "--host", "0.0.0.0", "--port", "8000"] diff --git a/scanner/yunxiao-build.sh b/scanner/yunxiao-build.sh new file mode 100755 index 00000000..88d4e752 --- /dev/null +++ b/scanner/yunxiao-build.sh @@ -0,0 +1,48 @@ +#!/bin/bash +# 云效构建脚本 - 简化版,完全禁用 buildx 缓存 + +set -e + +# 镜像配置 +IMAGE_NAME="jsessh-registry.cn-shanghai.cr.aliyuncs.com/apps/sh-skill-scanner" +IMAGE_TAG="${BUILD_NUMBER:-latest}" +FULL_IMAGE="${IMAGE_NAME}:${IMAGE_TAG}" + +echo "=========================================" +echo "开始构建 Docker 镜像(禁用缓存)" +echo "=========================================" +echo "镜像名称: ${FULL_IMAGE}" +echo "构建时间: $(date '+%Y-%m-%d %H:%M:%S')" +echo "" + +# 构建镜像(使用 docker build,不使用 buildx) +echo "正在构建镜像..." +docker build \ + --no-cache \ + --pull \ + -t "${FULL_IMAGE}" \ + -f Dockerfile \ + . + +echo "" +echo "=========================================" +echo "镜像构建成功" +echo "=========================================" +echo "" + +# 推送镜像 +echo "正在推送镜像..." +docker push "${FULL_IMAGE}" + +# 打 latest 标签 +echo "正在推送 latest 标签..." +docker tag "${FULL_IMAGE}" "${IMAGE_NAME}:latest" +docker push "${IMAGE_NAME}:latest" + +echo "" +echo "=========================================" +echo "镜像推送成功" +echo "=========================================" +echo "镜像地址: ${FULL_IMAGE}" +echo "Latest: ${IMAGE_NAME}:latest" +echo "=========================================" diff --git a/scanner/云效图形化配置指南.md b/scanner/云效图形化配置指南.md new file mode 100644 index 00000000..5c4d83f2 --- /dev/null +++ b/scanner/云效图形化配置指南.md @@ -0,0 +1,277 @@ +# 云效图形化界面配置指南 + +## 📋 问题说明 + +当前问题:Docker 构建使用了 buildx 并自动导出缓存,导致缓存冲突。 + +**好消息:** 镜像本身已经构建并推送成功!只是缓存导出失败。 + +**解决方案:** 使用简单的 `docker build` 命令替代 buildx。 + +--- + +## 🎯 方案一:使用脚本文件(最简单) + +### 第 1 步:提交脚本文件到 Git + +```bash +cd /Users/zhai/my_project/indea_project_workspaces/skillhub +git add scanner/yunxiao-build.sh +git commit -m "feat: 添加云效构建脚本(禁用 buildx 缓存)" +git push +``` + +### 第 2 步:在云效中配置 + +#### 2.1 找到构建步骤 +- 进入云效 Flow 流水线 +- 点击"编辑" +- 找到 Docker 构建的步骤 + +#### 2.2 修改或新建步骤 + +**选项 A:修改现有步骤** +如果现有步骤是"Shell 脚本"或"主机构建"类型: +- 点击步骤进行编辑 +- 将脚本内容改为: + ```bash + cd scanner + chmod +x yunxiao-build.sh + ./yunxiao-build.sh + ``` + +**选项 B:新建步骤** +如果现有步骤无法修改: +- 删除或禁用原有的 Docker 构建步骤 +- 点击"添加步骤" +- 选择"主机构建"或"Shell 脚本" +- 步骤名称:`构建并推送镜像` +- 脚本内容: + ```bash + cd scanner + chmod +x yunxiao-build.sh + ./yunxiao-build.sh + ``` + +#### 2.3 保存并测试 +- 点击"保存" +- 点击"运行"测试构建 + +--- + +## 🎯 方案二:直接粘贴脚本内容 + +如果不想使用脚本文件,可以直接在云效中粘贴: + +### 第 1 步:编辑构建步骤 + +进入云效 Flow → 编辑 → 找到 Docker 构建步骤 + +### 第 2 步:粘贴脚本 + +将以下内容粘贴到脚本框中: + +```bash +#!/bin/bash +set -e + +# 镜像配置 +IMAGE_NAME="jsessh-registry.cn-shanghai.cr.aliyuncs.com/apps/sh-skill-scanner" +IMAGE_TAG="${BUILD_NUMBER:-latest}" +FULL_IMAGE="${IMAGE_NAME}:${IMAGE_TAG}" + +echo "=========================================" +echo "开始构建 Docker 镜像(禁用缓存)" +echo "=========================================" +echo "镜像名称: ${FULL_IMAGE}" +echo "" + +# 构建镜像 +docker build \ + --no-cache \ + --pull \ + -t "${FULL_IMAGE}" \ + -f scanner/Dockerfile \ + scanner/ + +# 推送镜像 +echo "正在推送镜像..." +docker push "${FULL_IMAGE}" + +# 打 latest 标签 +docker tag "${FULL_IMAGE}" "${IMAGE_NAME}:latest" +docker push "${IMAGE_NAME}:latest" + +echo "=========================================" +echo "镜像推送成功: ${FULL_IMAGE}" +echo "=========================================" +``` + +### 第 3 步:保存并运行 + +--- + +## 🎯 方案三:临时方案 - 继续使用现有配置 + +既然镜像已经成功了,可以: + +### 1. 暂时接受这个错误 + +- 虽然云效标记为"失败",但镜像已经推送成功 +- 可以正常部署和使用 + +### 2. 手动触发部署 + +如果云效不会自动继续部署步骤: + +**选项 A:在云效中手动触发** +- 找到部署步骤 +- 点击"重新运行"或"强制运行" + +**选项 B:手动部署到 K8s** +```bash +# 使用成功的镜像标签 +kubectl set image deployment/skillhub-scanner \ + scanner=jsessh-registry.cn-shanghai.cr.aliyuncs.com/apps/sh-skill-scanner:2026-04-03-23-14-42 + +# 或者应用 manifests +kubectl apply -f scanner/manifests/ + +# 更新镜像 +kubectl set image deployment/skillhub-scanner \ + scanner=jsessh-registry.cn-shanghai.cr.aliyuncs.com/apps/sh-skill-scanner:2026-04-03-23-14-42 +``` + +--- + +## 📸 如何找到云效的配置界面 + +### 典型的云效界面结构: + +``` +云效 Flow 首页 + └── 流水线列表 + └── 选择你的流水线 + ├── 运行历史 + ├── [编辑] 按钮 ← 点击这里 + │ └── 流水线配置页面 + │ ├── 构建环境 + │ ├── 阶段/步骤列表 ← 在这里找到 Docker 构建步骤 + │ │ ├── 步骤 1: 代码下载 + │ │ ├── 步骤 2: Docker 构建 ← 编辑这个 + │ │ └── 步骤 3: 部署 + │ └── [保存] 按钮 + └── [运行] 按钮 +``` + +### 步骤配置可能的界面: + +**类型 1:Shell 脚本步骤** +``` +┌─────────────────────────────┐ +│ 步骤名称: [构建镜像 ]│ +│ 步骤类型: [Shell 脚本 ▼]│ +│ 脚本内容: │ +│ ┌─────────────────────────┐ │ +│ │#!/bin/bash │ │ +│ │docker build ... │ │ +│ │ │ │ +│ └─────────────────────────┘ │ +│ [保存] [取消] │ +└─────────────────────────────┘ +``` + +**类型 2:Docker 构建组件** +``` +┌─────────────────────────────┐ +│ 步骤名称: [构建镜像 ]│ +│ 步骤类型: [Docker 构建 ▼]│ +│ Dockerfile: [scanner/Docker]│ +│ 镜像名称: [apps/sh-skill-s]│ +│ 额外参数: [--no-cache ]│ ← 在这里添加 +│ [保存] [取消] │ +└─────────────────────────────┘ +``` + +--- + +## 🔍 如何判断使用哪种方式 + +### 查看当前构建日志 + +在构建日志中搜索关键词: + +**如果看到 `docker buildx build`:** +- 说明使用了 buildx +- 需要修改为 `docker build` + +**如果看到 `exporting cache to registry`:** +- 说明开启了远程缓存 +- 需要禁用 + +--- + +## ✅ 验证修改是否生效 + +修改后重新构建,检查日志: + +**成功的标志:** +- ✅ 日志中只有 `docker build`,没有 `buildx` +- ✅ 没有 `exporting cache to registry` 相关日志 +- ✅ 看到 `pushing manifest` 成功 +- ✅ 构建完成,没有错误 + +--- + +## 💡 常见问题 + +### Q1: 找不到"编辑"按钮 +**A:** 可能权限不足,联系管理员添加编辑权限。 + +### Q2: 步骤类型无法修改 +**A:** 删除现有步骤,新建一个"Shell 脚本"类型的步骤。 + +### Q3: BUILD_NUMBER 变量未定义 +**A:** 在脚本中改为: +```bash +IMAGE_TAG="${BUILD_NUMBER:-$(date +%Y%m%d%H%M%S)}" +``` + +### Q4: 修改后还是使用 buildx +**A:** 确保删除了原有的 Docker 构建组件,使用 Shell 脚本步骤。 + +--- + +## 📞 需要帮助? + +如果还有问题,请提供: + +1. **云效界面截图** + - 流水线编辑页面 + - Docker 构建步骤配置页面 + +2. **完整的构建日志** + - 特别是构建镜像部分的日志 + +3. **云效版本信息** + - 是云效 Flow 还是云效 Pipeline? + - 版本号是多少? + +我会根据具体情况提供更详细的指导! + +--- + +## 🎯 推荐操作(最快的方式) + +1. ✅ **立即行动:使用方案一** + - 提交 `yunxiao-build.sh` 到 Git + - 在云效中修改构建步骤,调用这个脚本 + - 5 分钟搞定! + +2. ✅ **验证部署:镜像已经成功** + - 当前镜像:`jsessh-registry.cn-shanghai.cr.aliyuncs.com/apps/sh-skill-scanner:2026-04-03-23-14-42` + - 可以直接部署使用 + +3. ✅ **测试修复:下次构建验证** + - 修改后重新运行构建 + - 检查是否还有缓存错误