GitLab CI/CD部署多版本静态页:旧产物被清除问题求助
问题分析
你遇到的核心问题是GitLab Pages的部署机制是完全覆盖式:每次pages任务执行完成后,GitLab会用该任务生成的public目录,直接替换线上Pages站点的全部内容。哪怕你每次只新增一个版本子目录,旧版本的内容也会因为不在新的public目录里而被清除,导致旧路径返回404。
你尝试的artifacts.name和expire_in仅控制CI产物的存储周期与命名,完全不影响Pages的部署逻辑,所以无法解决问题。
解决方案
最可靠的方式是用一个专门分支维护所有版本的Pages内容,确保每次部署时都包含历史版本的文件:
修改后的.gitlab-ci.yml配置
stages: - build-pdf - deploy-html default: tags: - small build-pdf-doctoolchain: stage: build-pdf artifacts: paths: - build/pdf/*.pdf - build/html5/*.html image: doctoolchain/doctoolchain:v3.2.2 script: - doctoolchain . generatePDF generateHTML pages: stage: deploy-html variables: DEPLOY_DIR: "default" # 用于存储所有Pages版本内容的专门分支 PAGES_CONTENT_BRANCH: "pages-content" rules: - if: $CI_COMMIT_TAG != null variables: DEPLOY_DIR: $CI_COMMIT_TAG - if: $CI_COMMIT_BRANCH != null variables: DEPLOY_DIR: $CI_COMMIT_BRANCH script: # 配置Git身份,用于提交推送 - git config --global user.name "GitLab CI/CD" - git config --global user.email "$GITLAB_USER_EMAIL" # 拉取专门的Pages内容分支,首次运行则创建空目录 - git clone -b $PAGES_CONTENT_BRANCH --depth 1 $CI_REPOSITORY_URL public || mkdir -p public # 创建当前版本的目录并复制构建产物 - mkdir -p "public/$DEPLOY_DIR" - cp -v build/html5/*.html "public/$DEPLOY_DIR" # 提交并推送更新到内容分支 - cd public - git add . # 如果没有文件变化则跳过提交 - git commit -m "Deploy version: $DEPLOY_DIR" || echo "No changes to commit" - git push origin $PAGES_CONTENT_BRANCH artifacts: paths: - public
配置注意事项
- 权限设置:需要给CI Runner配置仓库推送权限,可以在项目
Settings > CI/CD > Variables中添加GITLAB_USER_EMAIL变量;或者使用项目部署令牌(Deploy Token),替换克隆命令中的$CI_REPOSITORY_URL为包含令牌的地址。 - 分支初始化:首次运行前需要手动创建
pages-content分支(可以是一个空分支)。
替代方案(不推荐)
如果不想维护专门分支,也可以通过GitLab API下载历史流水线的pages产物,合并到当前public目录后再部署。但这种方式需要追踪所有已部署的版本,随着版本增多会越来越慢,维护成本极高,仅适合临时场景。
内容的提问来源于stack exchange,提问作者mefiX
相关产品推荐
相关产品推荐

