From 82714f3f6115f8adbeafc241ea3ad3420ccc8e0a Mon Sep 17 00:00:00 2001 From: Ran <16112591+chen-ran@users.noreply.github.com> Date: Sun, 29 Mar 2026 02:13:01 +0800 Subject: [PATCH] fix(ci): unify browser image variants --- .github/workflows/docker.yml | 86 +++++++++++++++++++++++------- docker-compose.yml | 36 +------------ docker/Dockerfile.browser | 3 +- docker/Dockerfile.browser-chromium | 41 -------------- docker/Dockerfile.browser-firefox | 41 -------------- docker/docker-compose.cn.yml | 6 +-- scripts/install.sh | 39 ++++++++++---- 7 files changed, 102 insertions(+), 150 deletions(-) delete mode 100644 docker/Dockerfile.browser-chromium delete mode 100644 docker/Dockerfile.browser-firefox diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 9ec64081..035ffc38 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -36,8 +36,9 @@ jobs: strategy: fail-fast: false matrix: - image: [server, web, browser, browser-chromium, browser-firefox, sparse] + image: [server, web, browser, sparse] platform: [linux/amd64, linux/arm64] + variant: [""] include: - image: server dockerfile: docker/Dockerfile.server @@ -45,16 +46,33 @@ jobs: dockerfile: docker/Dockerfile.web - image: browser dockerfile: docker/Dockerfile.browser - - image: browser-chromium - dockerfile: docker/Dockerfile.browser-chromium - - image: browser-firefox - dockerfile: docker/Dockerfile.browser-firefox - image: sparse dockerfile: docker/Dockerfile.sparse - platform: linux/amd64 runner: ubuntu-latest - platform: linux/arm64 runner: ubuntu-24.04-arm + # Browser single-engine variants + - image: browser + variant: chromium + dockerfile: docker/Dockerfile.browser + platform: linux/amd64 + runner: ubuntu-latest + - image: browser + variant: chromium + dockerfile: docker/Dockerfile.browser + platform: linux/arm64 + runner: ubuntu-24.04-arm + - image: browser + variant: firefox + dockerfile: docker/Dockerfile.browser + platform: linux/amd64 + runner: ubuntu-latest + - image: browser + variant: firefox + dockerfile: docker/Dockerfile.browser + platform: linux/arm64 + runner: ubuntu-24.04-arm runs-on: ${{ matrix.runner }} steps: - name: Checkout @@ -91,6 +109,17 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} + - name: Resolve artifact key + id: resolve + run: | + VARIANT="${{ matrix.variant }}" + if [ -n "$VARIANT" ]; then + ARTIFACT_KEY="${{ matrix.image }}-${VARIANT}" + else + ARTIFACT_KEY="${{ matrix.image }}" + fi + echo "artifact_key=${ARTIFACT_KEY}" >> "$GITHUB_OUTPUT" + - name: Build and push by digest id: build uses: docker/build-push-action@v6 @@ -105,12 +134,13 @@ jobs: COMMIT_HASH=${{ github.sha }} VITE_API_URL=/api VITE_AGENT_URL=/agent + ${{ matrix.variant != '' && format('BROWSER_CORES={0}', matrix.variant) || '' }} cache-from: | - type=gha,scope=${{ matrix.image }}-${{ matrix.platform }} - type=registry,ref=${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ matrix.image }}:buildcache-${{ matrix.platform == 'linux/amd64' && 'amd64' || 'arm64' }} + type=gha,scope=${{ steps.resolve.outputs.artifact_key }}-${{ matrix.platform }} + type=registry,ref=${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ matrix.image }}:buildcache-${{ steps.resolve.outputs.artifact_key }}-${{ matrix.platform == 'linux/amd64' && 'amd64' || 'arm64' }} cache-to: | - type=gha,scope=${{ matrix.image }}-${{ matrix.platform }},mode=max - ${{ env.PUSH == 'true' && format('type=registry,ref={0}/{1}/{2}:buildcache-{3},mode=max,compression=zstd', env.REGISTRY, github.repository_owner, matrix.image, matrix.platform == 'linux/amd64' && 'amd64' || 'arm64') || '' }} + type=gha,scope=${{ steps.resolve.outputs.artifact_key }}-${{ matrix.platform }},mode=max + ${{ env.PUSH == 'true' && format('type=registry,ref={0}/{1}/{2}:buildcache-{3}-{4},mode=max,compression=zstd', env.REGISTRY, github.repository_owner, matrix.image, steps.resolve.outputs.artifact_key, matrix.platform == 'linux/amd64' && 'amd64' || 'arm64') || '' }} - name: Export digest if: env.PUSH == 'true' @@ -123,7 +153,7 @@ jobs: if: env.PUSH == 'true' uses: actions/upload-artifact@v4 with: - name: digests-${{ matrix.image }}-${{ strategy.job-index }} + name: digests-${{ steps.resolve.outputs.artifact_key }}-${{ strategy.job-index }} path: /tmp/digests/* if-no-files-found: error retention-days: 1 @@ -134,13 +164,31 @@ jobs: needs: build strategy: matrix: - image: [server, web, browser, browser-chromium, browser-firefox, sparse] + include: + - image: server + artifact_key: server + tag_prefix: "" + - image: web + artifact_key: web + tag_prefix: "" + - image: browser + artifact_key: browser + tag_prefix: "" + - image: browser + artifact_key: browser-chromium + tag_prefix: "chromium-" + - image: browser + artifact_key: browser-firefox + tag_prefix: "firefox-" + - image: sparse + artifact_key: sparse + tag_prefix: "" steps: - name: Download digests uses: actions/download-artifact@v4 with: path: /tmp/digests - pattern: digests-${{ matrix.image }}-* + pattern: digests-${{ matrix.artifact_key }}-* merge-multiple: true - name: Set up Docker Buildx @@ -167,13 +215,13 @@ jobs: memohai/${{ matrix.image }} ghcr.io/${{ github.repository_owner }}/${{ matrix.image }} tags: | - type=raw,value=dev,enable=${{ github.ref == 'refs/heads/main' }} - type=raw,value=${{ github.ref_name }}-dev,enable=${{ startsWith(github.ref, 'refs/heads/v') }} - type=raw,value=latest,enable=${{ github.event_name == 'release' || (startsWith(github.ref, 'refs/tags/') && !contains(github.ref_name, '-')) }} - type=ref,event=pr - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=semver,pattern={{major}} + type=raw,value=${{ matrix.tag_prefix }}dev,enable=${{ github.ref == 'refs/heads/main' }} + type=raw,value=${{ matrix.tag_prefix }}${{ github.ref_name }}-dev,enable=${{ startsWith(github.ref, 'refs/heads/v') }} + type=raw,value=${{ matrix.tag_prefix }}latest,enable=${{ github.event_name == 'release' || (startsWith(github.ref, 'refs/tags/') && !contains(github.ref_name, '-')) }} + type=ref,event=pr,prefix=${{ matrix.tag_prefix }} + type=semver,pattern=${{ matrix.tag_prefix }}{{version}} + type=semver,pattern=${{ matrix.tag_prefix }}{{major}}.{{minor}} + type=semver,pattern=${{ matrix.tag_prefix }}{{major}} - name: Create manifest list and push working-directory: /tmp/digests diff --git a/docker-compose.yml b/docker-compose.yml index c5994a63..04ceba40 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -103,43 +103,11 @@ services: - memoh-network browser: - image: memohai/browser:latest + image: memohai/browser:${BROWSER_TAG:-latest} container_name: memoh-browser profiles: [browser] environment: - - BROWSER_CORES=chromium,firefox - volumes: - - ${MEMOH_CONFIG:-./config.toml}:/config.toml:ro - ports: - - "8083:8083" - depends_on: - - server - restart: unless-stopped - networks: - - memoh-network - - browser-chromium: - image: memohai/browser-chromium:latest - container_name: memoh-browser - profiles: [browser-chromium] - environment: - - BROWSER_CORES=chromium - volumes: - - ${MEMOH_CONFIG:-./config.toml}:/config.toml:ro - ports: - - "8083:8083" - depends_on: - - server - restart: unless-stopped - networks: - - memoh-network - - browser-firefox: - image: memohai/browser-firefox:latest - container_name: memoh-browser - profiles: [browser-firefox] - environment: - - BROWSER_CORES=firefox + - BROWSER_CORES=${BROWSER_CORES:-chromium,firefox} volumes: - ${MEMOH_CONFIG:-./config.toml}:/config.toml:ro ports: diff --git a/docker/Dockerfile.browser b/docker/Dockerfile.browser index f26bae12..c67f49c9 100644 --- a/docker/Dockerfile.browser +++ b/docker/Dockerfile.browser @@ -17,7 +17,8 @@ RUN cd apps/browser && bun run build FROM ubuntu:noble -ENV BROWSER_CORES=chromium,firefox +ARG BROWSER_CORES=chromium,firefox +ENV BROWSER_CORES=${BROWSER_CORES} WORKDIR /app diff --git a/docker/Dockerfile.browser-chromium b/docker/Dockerfile.browser-chromium deleted file mode 100644 index 817c5b92..00000000 --- a/docker/Dockerfile.browser-chromium +++ /dev/null @@ -1,41 +0,0 @@ -# syntax=docker/dockerfile:1 -FROM --platform=$BUILDPLATFORM oven/bun:1 AS builder - -WORKDIR /build - -COPY apps/browser/package.json apps/browser/bun.lock* ./apps/browser/ -COPY packages/config/package.json ./packages/config/package.json - -RUN echo '{"name":"@memohai/monorepo","private":true,"workspaces":["apps/*","packages/*"]}' > package.json - -RUN cd apps/browser && bun install - -COPY packages/config/ ./packages/config/ -COPY apps/browser/ ./apps/browser/ - -RUN cd apps/browser && bun run build - -FROM ubuntu:noble - -ENV BROWSER_CORES=chromium - -WORKDIR /app - -RUN apt-get update && apt-get install -y unzip curl && \ - curl -fsSL https://bun.sh/install | bash && \ - ln -s /root/.bun/bin/bun /usr/local/bin/bun && \ - apt-get clean && rm -rf /var/lib/apt/lists/* - -COPY --from=builder /build/apps/browser/dist /app/dist -COPY --from=builder /build/apps/browser/node_modules /app/node_modules -COPY --from=builder /build/apps/browser/package.json /app/package.json -COPY --from=builder /build/node_modules /node_modules - -RUN bun /app/node_modules/.bin/playwright install --with-deps chromium - -EXPOSE 8083 - -HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \ - CMD curl -sf http://127.0.0.1:8083/health || exit 1 - -CMD ["bun", "run", "dist/index.js"] diff --git a/docker/Dockerfile.browser-firefox b/docker/Dockerfile.browser-firefox deleted file mode 100644 index c5410989..00000000 --- a/docker/Dockerfile.browser-firefox +++ /dev/null @@ -1,41 +0,0 @@ -# syntax=docker/dockerfile:1 -FROM --platform=$BUILDPLATFORM oven/bun:1 AS builder - -WORKDIR /build - -COPY apps/browser/package.json apps/browser/bun.lock* ./apps/browser/ -COPY packages/config/package.json ./packages/config/package.json - -RUN echo '{"name":"@memohai/monorepo","private":true,"workspaces":["apps/*","packages/*"]}' > package.json - -RUN cd apps/browser && bun install - -COPY packages/config/ ./packages/config/ -COPY apps/browser/ ./apps/browser/ - -RUN cd apps/browser && bun run build - -FROM ubuntu:noble - -ENV BROWSER_CORES=firefox - -WORKDIR /app - -RUN apt-get update && apt-get install -y unzip curl && \ - curl -fsSL https://bun.sh/install | bash && \ - ln -s /root/.bun/bin/bun /usr/local/bin/bun && \ - apt-get clean && rm -rf /var/lib/apt/lists/* - -COPY --from=builder /build/apps/browser/dist /app/dist -COPY --from=builder /build/apps/browser/node_modules /app/node_modules -COPY --from=builder /build/apps/browser/package.json /app/package.json -COPY --from=builder /build/node_modules /node_modules - -RUN bun /app/node_modules/.bin/playwright install --with-deps firefox - -EXPOSE 8083 - -HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \ - CMD curl -sf http://127.0.0.1:8083/health || exit 1 - -CMD ["bun", "run", "dist/index.js"] diff --git a/docker/docker-compose.cn.yml b/docker/docker-compose.cn.yml index c9427345..6e3ae103 100644 --- a/docker/docker-compose.cn.yml +++ b/docker/docker-compose.cn.yml @@ -10,8 +10,4 @@ services: web: image: memoh.cn/memohai/web:latest browser: - image: memoh.cn/memohai/browser:latest - browser-chromium: - image: memoh.cn/memohai/browser-chromium:latest - browser-firefox: - image: memoh.cn/memohai/browser-firefox:latest \ No newline at end of file + image: memoh.cn/memohai/browser:${BROWSER_TAG:-latest} diff --git a/scripts/install.sh b/scripts/install.sh index 077d6aaf..0e33dfd5 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -107,7 +107,7 @@ WORKSPACE="$WORKSPACE_DEFAULT" MEMOH_DATA_DIR="$MEMOH_DATA_DIR_DEFAULT" USE_CN_MIRROR="${USE_CN_MIRROR:-false}" USE_SPARSE="${USE_SPARSE:-false}" -BROWSER_PROFILE="${BROWSER_PROFILE:-browser-chromium}" +BROWSER_CORE="${BROWSER_CORE:-chromium}" if [ "$SILENT" = false ]; then echo "Configure Memoh (press Enter to use defaults):" > /dev/tty @@ -165,9 +165,9 @@ if [ "$SILENT" = false ]; then printf " Browser core [1]: " > /dev/tty read -r input < /dev/tty || true case "$input" in - 2) BROWSER_PROFILE="browser-firefox" ;; - 3) BROWSER_PROFILE="browser" ;; - *) BROWSER_PROFILE="browser-chromium" ;; + 2) BROWSER_CORE="firefox" ;; + 3) BROWSER_CORE="all" ;; + *) BROWSER_CORE="chromium" ;; esac echo "" > /dev/tty @@ -206,9 +206,6 @@ if [ "$MEMOH_DOCKER_VERSION" != "latest" ]; then sed -i.bak "s|memohai/server:latest|memohai/server:${MEMOH_DOCKER_VERSION}|g" docker-compose.yml sed -i.bak "s|memohai/agent:latest|memohai/agent:${MEMOH_DOCKER_VERSION}|g" docker-compose.yml sed -i.bak "s|memohai/web:latest|memohai/web:${MEMOH_DOCKER_VERSION}|g" docker-compose.yml - sed -i.bak "s|memohai/browser-chromium:latest|memohai/browser-chromium:${MEMOH_DOCKER_VERSION}|g" docker-compose.yml - sed -i.bak "s|memohai/browser-firefox:latest|memohai/browser-firefox:${MEMOH_DOCKER_VERSION}|g" docker-compose.yml - sed -i.bak "s|memohai/browser:latest|memohai/browser:${MEMOH_DOCKER_VERSION}|g" docker-compose.yml sed -i.bak "s|memohai/sparse:latest|memohai/sparse:${MEMOH_DOCKER_VERSION}|g" docker-compose.yml rm -f docker-compose.yml.bak echo "${GREEN}✓ Docker images pinned to ${MEMOH_DOCKER_VERSION}${NC}" @@ -232,8 +229,30 @@ export MEMOH_CONFIG=./config.toml export MEMOH_DATA_DIR mkdir -p "$MEMOH_DATA_DIR" +# Resolve browser tag and cores from BROWSER_CORE selection +case "$BROWSER_CORE" in + firefox) + BROWSER_TAG_SUFFIX="firefox-" + BROWSER_CORES="firefox" + ;; + all) + BROWSER_TAG_SUFFIX="" + BROWSER_CORES="chromium,firefox" + ;; + *) + BROWSER_TAG_SUFFIX="chromium-" + BROWSER_CORES="chromium" + ;; +esac + +if [ "$MEMOH_DOCKER_VERSION" != "latest" ]; then + BROWSER_TAG="${BROWSER_TAG_SUFFIX}${MEMOH_DOCKER_VERSION}" +else + BROWSER_TAG="${BROWSER_TAG_SUFFIX}latest" +fi + COMPOSE_FILES="-f docker-compose.yml" -COMPOSE_PROFILES="--profile qdrant --profile $BROWSER_PROFILE" +COMPOSE_PROFILES="--profile qdrant --profile browser" if [ "$USE_SPARSE" = true ]; then COMPOSE_PROFILES="$COMPOSE_PROFILES --profile sparse" echo "${GREEN}✓ Sparse memory service enabled${NC}" @@ -249,7 +268,9 @@ echo POSTGRES_PASSWORD="${PG_PASS}" >> .env echo MEMOH_CONFIG=./config.toml >> .env echo MEMOH_DATA_DIR="${MEMOH_DATA_DIR}" >> .env echo USE_SPARSE="${USE_SPARSE}" >> .env -echo "${GREEN}✓ Browser profile: ${BROWSER_PROFILE}${NC}" +echo BROWSER_TAG="${BROWSER_TAG}" >> .env +echo BROWSER_CORES="${BROWSER_CORES}" >> .env +echo "${GREEN}✓ Browser: ${BROWSER_CORE} (image tag: ${BROWSER_TAG})${NC}" echo "" echo "${GREEN}Pulling Docker images...${NC}"