diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 5793460..9577825 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -10,6 +10,11 @@ on: description: "Docker image version tag (e.g., v1.0, v1.1-alpha)" required: true default: "v2" + # 定义一个输入框,让您在运行时输入仓库地址 + repository: + description: "Docker repository (e.g., username/repo-name)" + required: true + default: "ellinalopez/cloud-studio" # 定义一个复选框,让您决定是否更新 latest 标签 update_latest: description: 'Update the "latest" tag as well?' @@ -24,11 +29,24 @@ jobs: # 需要获取你手动运行时所在的分支(通常是main) uses: actions/checkout@v4 - - name: Get Camoufox Download URL - id: get_camoufox_url + - name: Get Camoufox Download URLs + id: get_camoufox_urls run: | - URL=$(curl -s "https://api.github.com/repos/${{ github.repository }}/releases/latest" | grep "browser_download_url.*camoufox-linux.tar.gz" | cut -d : -f 2,3 | tr -d '", ') - echo "CAMOUFOX_URL=$URL" >> $GITHUB_ENV + # 获取最新版本号 + LATEST_VERSION=$(curl -s "https://api.github.com/repos/daijro/camoufox/releases/latest" | grep '"tag_name"' | cut -d : -f 2,3 | tr -d '", ') + echo "LATEST_VERSION=$LATEST_VERSION" >> $GITHUB_ENV + + # 获取amd64版本下载URL + AMD64_URL=$(curl -s "https://api.github.com/repos/daijro/camoufox/releases/latest" | grep "browser_download_url.*lin.x86_64.zip" | cut -d : -f 2,3 | tr -d '", ') + echo "CAMOUFOX_AMD64_URL=$AMD64_URL" >> $GITHUB_ENV + + # 获取arm64版本下载URL + ARM64_URL=$(curl -s "https://api.github.com/repos/daijro/camoufox/releases/latest" | grep "browser_download_url.*lin.arm64.zip" | cut -d : -f 2,3 | tr -d '", ') + echo "CAMOUFOX_ARM64_URL=$ARM64_URL" >> $GITHUB_ENV + + echo "版本: $LATEST_VERSION" + echo "AMD64 URL: $AMD64_URL" + echo "ARM64 URL: $ARM64_URL" - name: Log in to Docker Hub uses: docker/login-action@v3 @@ -38,6 +56,8 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 + with: + platforms: linux/amd64,linux/arm64 - name: Build and push Docker image id: build-and-push @@ -46,11 +66,15 @@ jobs: context: . file: ./Dockerfile push: true - # 核心修改:根据您输入的版本号来生成标签 - # 格式是:ellinalopez/cloud-studio:v1.0-testing - tags: ellinalopez/cloud-studio:${{ github.event.inputs.version }} + # 支持多架构构建 + platforms: linux/amd64,linux/arm64 + # 核心修改:根据您输入的仓库地址和版本号来生成标签 + # 格式是:username/repo-name:v1.0-testing + tags: ${{ github.event.inputs.repository }}:${{ github.event.inputs.version }} build-args: | - CAMOUFOX_URL=${{ env.CAMOUFOX_URL }} + CAMOUFOX_AMD64_URL=${{ env.CAMOUFOX_AMD64_URL }} + CAMOUFOX_ARM64_URL=${{ env.CAMOUFOX_ARM64_URL }} + CAMOUFOX_VERSION=${{ env.LATEST_VERSION }} cache-from: type=gha cache-to: type=gha,mode=max @@ -59,6 +83,7 @@ jobs: # 使用 if 条件判断是否运行此步骤 if: github.event.inputs.update_latest == true run: | - IMAGE_ID=$(docker inspect --format='{{.Id}}' ellinalopez/cloud-studio:${{ github.event.inputs.version }}) - docker tag $IMAGE_ID ellinalopez/cloud-studio:latest - docker push ellinalopez/cloud-studio:latest + # 为多架构镜像创建latest标签 + docker buildx imagetools create \ + ${{ github.event.inputs.repository }}:${{ github.event.inputs.version }} \ + --tag ${{ github.event.inputs.repository }}:latest diff --git a/Dockerfile b/Dockerfile index 595167c..4d3d98e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,10 @@ -# Dockerfile (进一步优化版) +# Dockerfile (多架构支持版) FROM node:18-slim WORKDIR /app -# 1. [保持不变] 安装最稳定、最不常变化的系统依赖。 +# 1. 安装系统依赖,支持多架构 RUN apt-get update && apt-get install -y \ - curl \ + curl unzip\ libasound2 libatk-bridge2.0-0 libatk1.0-0 libatspi2.0-0 libcups2 \ libdbus-1-3 libdrm2 libgbm1 libgtk-3-0 libnspr4 libnss3 libx11-6 \ libx11-xcb1 libxcb1 libxcomposite1 libxdamage1 libxext6 libxfixes3 \ @@ -17,12 +17,78 @@ COPY package*.json ./ RUN npm install --production # 3. 【核心优化】将浏览器下载和解压作为独立的一层。 -# 只要CAMOUFOX_URL不变,这一层就会被缓存。这层体积最大,缓存命中至关重要。 -ARG CAMOUFOX_URL -RUN curl -sSL ${CAMOUFOX_URL} -o camoufox-linux.tar.gz && \ - tar -xzf camoufox-linux.tar.gz && \ - rm camoufox-linux.tar.gz && \ - chmod +x /app/camoufox-linux/camoufox +# 根据目标架构下载对应的Camoufox版本 +ARG TARGETPLATFORM +ARG CAMOUFOX_AMD64_URL +ARG CAMOUFOX_ARM64_URL +ARG CAMOUFOX_VERSION + +RUN set -eux; \ + echo "=== 多架构构建信息 ===" && \ + echo "目标平台: ${TARGETPLATFORM}" && \ + echo "AMD64 URL: ${CAMOUFOX_AMD64_URL}" && \ + echo "ARM64 URL: ${CAMOUFOX_ARM64_URL}" && \ + echo "版本: ${CAMOUFOX_VERSION}" && \ + echo "======================" && \ + \ + case "${TARGETPLATFORM}" in \ + "linux/amd64") \ + echo ">>> [AMD64] 开始下载 Camoufox..." && \ + DOWNLOAD_URL="${CAMOUFOX_AMD64_URL}" \ + ;; \ + "linux/arm64") \ + echo ">>> [ARM64] 开始下载 Camoufox..." && \ + DOWNLOAD_URL="${CAMOUFOX_ARM64_URL}" \ + ;; \ + *) \ + echo "!!! 错误: 不支持的架构 ${TARGETPLATFORM}" >&2 && \ + exit 1 \ + ;; \ + esac && \ + \ + echo ">>> 下载地址: ${DOWNLOAD_URL}" && \ + curl -fSL --retry 3 --retry-delay 2 "${DOWNLOAD_URL}" -o camoufox.zip && \ + \ + echo ">>> 下载完成,文件大小: $(du -h camoufox.zip | cut -f1)" && \ + echo ">>> 验证文件..." && \ + [ -f camoufox.zip ] || (echo "!!! 文件不存在" >&2 && exit 1) && \ + [ -s camoufox.zip ] || (echo "!!! 文件为空" >&2 && exit 1) && \ + \ + echo ">>> 检查文件类型..." && \ + file camoufox.zip && \ + echo ">>> ZIP 文件详细信息:" && \ + ls -la camoufox.zip && \ + echo ">>> ZIP 文件完整性测试..." && \ + unzip -t camoufox.zip || (echo "!!! ZIP 文件损坏" >&2 && exit 1) && \ + echo ">>> 查看 ZIP 内容列表..." && \ + unzip -l camoufox.zip && \ + echo ">>> 检查是否有特殊字符文件名..." && \ + unzip -l camoufox.zip | grep -E '[^[:print:][:space:]]' || echo "未发现非打印字符" && \ + echo ">>> 尝试详细解压并显示每个文件..." && \ + unzip -v camoufox.zip && \ + echo ">>> 开始解压 Camoufox..." && \ + unzip -o camoufox.zip 2>&1 | tee unzip.log || (echo "!!! 解压失败,显示详细信息:" >&2 && cat unzip.log && ls -la && file camoufox.zip && exit 1) && \ + echo ">>> 解压完成,检查解压日志..." && \ + [ -f unzip.log ] && cat unzip.log || echo "无解压日志文件" && \ + \ + echo ">>> 当前目录内容:" && \ + ls -lah && \ + \ + echo ">>> 查找 camoufox 可执行文件..." && \ + CAMOUFOX_BIN=$(find . -name "camoufox" -type f | head -n 1) && \ + [ -n "${CAMOUFOX_BIN}" ] || (echo "!!! 未找到 camoufox" >&2 && exit 1) && \ + echo ">>> 找到: ${CAMOUFOX_BIN}" && \ + \ + echo ">>> 设置可执行权限..." && \ + chmod +x "${CAMOUFOX_BIN}" && \ + \ + echo ">>> 清理临时文件..." && \ + rm -rf camoufox.zip && \ + \ + echo ">>> 最终目录结构:" && \ + ls -lah . && \ + \ + echo ">>> ✓ Camoufox 安装完成 (${TARGETPLATFORM})" # 4. 【核心优化】现在,才拷贝你经常变动的代码文件。 # 这一步放在后面,确保你修改代码时,前面所有重量级的层都能利用缓存。 @@ -40,7 +106,7 @@ EXPOSE 7860 EXPOSE 9998 # 设置环境变量 -ENV CAMOUFOX_EXECUTABLE_PATH=/app/camoufox-linux/camoufox +ENV CAMOUFOX_EXECUTABLE_PATH=/app/camoufox # 定义容器启动命令 CMD ["node", "unified-server.js"]