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 # 设置为手动触发,让你选择时机
使用方式:
- 先触发你想要的手动作业(比如
manual-build-1),等待它完成并生成产物。 - 触发
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]
使用方式:
- 先触发你需要的手动作业(比如
manual-build-1和manual-build-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
相关产品推荐
相关产品推荐

