Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 36 additions & 11 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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?'
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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

Expand All @@ -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
86 changes: 76 additions & 10 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -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 \
Expand All @@ -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. 【核心优化】现在,才拷贝你经常变动的代码文件。
# 这一步放在后面,确保你修改代码时,前面所有重量级的层都能利用缓存。
Expand All @@ -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"]