You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab CI是否支持多Pages作业?手动作业产物如何部署至Pages?

嘿,这个场景我之前在项目里刚好碰到过,给你梳理下可行的解决方案和注意事项:

核心结论:不能定义多个pages作业

首先明确:GitLab Pages服务只会识别名为pages的作业来部署内容,所以你不能在CI配置里定义多个叫pages的作业——多了会导致CI冲突,要么报错要么只执行其中一个。不过我们可以通过调整作业依赖和产物处理逻辑,实现手动作业产物的部署需求。

针对手动作业的部署方案

根据你想要的部署方式(单独部署某一个手动/自动产物,或者合并多个产物),有两种常用方案:

方案1:按需部署单个手动/自动产物

这种适合你只想部署某一个作业的产出(比如只部署手动触发的文档A,或者自动生成的页面)。核心思路是用CI变量控制pages作业的产物复制逻辑,让你在触发部署时选择要部署的内容:

# 自动生成HTML的作业
auto-build:
  script:
    # 替换成你的自动构建命令,产物输出到public-auto目录
    - mkdir -p public-auto && echo "<h1>自动生成页面</h1>" > public-auto/index.html
  artifacts:
    paths: [public-auto]
  rules:
    - if: $CI_COMMIT_BRANCH == 'main'

# 手动触发的作业1:比如生成自定义文档
manual-build-1:
  script:
    - mkdir -p public-manual-1 && echo "<h1>手动文档1</h1>" > public-manual-1/index.html
  artifacts:
    paths: [public-manual-1]
  rules:
    - if: $CI_COMMIT_BRANCH == 'main'
      when: manual  # 设置为手动触发

# 手动触发的作业2:比如生成测试报告
manual-build-2:
  script:
    - mkdir -p public-manual-2 && echo "<h1>手动测试报告</h1>" > public-manual-2/index.html
  artifacts:
    paths: [public-manual-2]
  rules:
    - if: $CI_COMMIT_BRANCH == 'main'
      when: manual

# 唯一的pages部署作业
pages:
  script:
    # 先清空public目录(GitLab Pages要求产物必须在这个目录下)
    - rm -rf public
    # 根据BUILD_TYPE变量选择要部署的产物
    - case $BUILD_TYPE in
        manual1) cp -r public-manual-1 public ;;
        manual2) cp -r public-manual-2 public ;;
        auto) cp -r public-auto public ;;
      esac
  artifacts:
    paths: [public]  # 必须输出到public目录才会被Pages部署
  rules:
    - if: $CI_COMMIT_BRANCH == 'main'
      when: manual  # 设置为手动触发,让你选择时机

使用方式:

  1. 先触发你想要的手动作业(比如manual-build-1),等待它完成并生成产物。
  2. 触发pages作业时,手动设置CI变量BUILD_TYPE为manual1(对应你要部署的作业),然后启动部署。

方案2:合并部署多个产物到同一Pages站点

如果想把自动作业和手动作业的产物都部署到同一个Pages站点的不同路径(比如/auto、/manual1、/manual2),可以让pages作业依赖所有生成产物的作业,然后合并产物到public目录:

# 自动/手动作业的配置和方案1一致,这里省略

pages:
  script:
    - rm -rf public
    # 创建对应子目录
    - mkdir -p public/auto public/manual1 public/manual2
    # 复制各个作业的产物到对应子目录,加|| true避免某作业未执行时报错
    - cp -r public-auto/* public/auto/ || true
    - cp -r public-manual-1/* public/manual1/ || true
    - cp -r public-manual-2/* public/manual2/ || true
  artifacts:
    paths: [public]
  rules:
    - if: $CI_COMMIT_BRANCH == 'main'
      when: manual
      # 可选:用needs指定依赖的作业,确保只有这些作业完成后才能触发pages
      # needs: [auto-build, manual-build-1]

使用方式:

  1. 先触发你需要的手动作业(比如manual-build-1和manual-build-2)。
  2. 触发pages作业,它会把所有已生成的产物合并到public目录,部署后你可以通过your-pages-url/auto、your-pages-url/manual1访问对应内容。
关键注意事项
  • 产物必须在public目录:GitLab Pages只会部署pages作业中artifacts.paths指定的public目录下的内容,所以所有要部署的文件最终都要放到这里。
  • 手动作业的产物要保留:确保手动作业配置了artifacts,并且没有设置过短的过期时间,这样pages作业才能获取到产物。
  • 依赖控制:如果不想pages作业依赖所有作业,可以用needs字段指定只依赖某个手动作业,这样只有当该手动作业成功后,才能触发pages作业,避免无效部署。

内容的提问来源于stack exchange,提问作者Shnkc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:42:32