是否可以为每个分支创建 gitlab-pages

Jef*_*ave 3 gitlab gitlab-pages

我有一个在 GitLab Pages 上托管的普通 JavaScript 应用程序。最近,我一直在进行更改和错误修复,这些更改和错误修复已经破坏了网站,直到推送更改后我才注意到。

为了减少用户遇到错误的机会,我想在单独的文件夹中发布两个站点:

  • public/master分支; 官方网站
  • public/staging/staging分支; 每晚构建

我希望它们对应于两个不同的分支:masterstaging

阅读GitLab CI for GitLab Pages 后,听起来这甚至是不可能的。我希望我读错了。

default:
  image: node:latest

test:
  stage: test
  script:
  - npm install
  - node test.js
  only:
  - staging
  - master

staging:
  stage: deploy
  environment: staging
  script:
  - mkdir -p public/staging
  - cp -r www public/staging
  artifacts:
    paths:
    - public
  only:
  - staging

pages:
  stage: deploy
  environment: production
  script:
  - mkdir -p public
  - cp -r www public
  artifacts:
    paths:
    - public
  only:
  - master
Run Code Online (Sandbox Code Playgroud)

这可能吗?是否可以从两个不同的分支部署两个不同的文件夹?

Jef*_*ave 5

有趣的是,可以从任何分支机构发帖,但不能从任何工作发帖。

为此,我需要进行两项更改:

  1. 我需要知道已发布数据的当前状态
  2. 我需要根据当前分支更改目录

GitLab 具有缓存文件夹的能力。通常,这用于通过缓存下载的驱动程序来加速构建。我没有理由不能使用它来存储public文件夹。这样,当我对 进行更改时staging,我会记住应用程序的状态root

cache:
  paths:
  - public
Run Code Online (Sandbox Code Playgroud)

下一个技巧是将页面发布到适当的文件夹,具体取决于当前正在构建的分支。为此,我们可以查看GitLab CI/CD 环境变量;尤其:

  • CI_COMMIT_REF_SLUG: 当前分支
  • CI_DEFAULT_BRANCH:默认分支(master)

知道这两个值后,我们可以做一些事情bash来确定将内容写入的正确位置。

pages:
  stage: deploy
  script:
  - dir="$CI_COMMIT_REF_SLUG"
  - if [ "$CI_COMMIT_REF_SLUG" == "$CI_DEFAULT_BRANCH" ]; then dir=""; fi;
  - dir="public/$dir"
  - echo "Deploying to $dir"
  - mkdir -p $dir
  - cp -r www $dir
  artifacts:
    paths:
    - public
  only:
  - staging
  - master
Run Code Online (Sandbox Code Playgroud)

不要忘记将页面限制为仅stagingmaster

警告

我对此并不满意。

我认为最好将缓存维护在完全不同的地方,并在稍后阶段将它们复制进去,但每次都完全重写公共文件夹。

当前的解决方案会随着时间的推移而变得臃肿,但基本思想是合理的。

  • 感谢分享!这确实是[另一篇文章](/sf/answers/4124084051/)中也提供的解决方案..但正如您所说,该解决方案并不完美。此时,我更喜欢使用 Netlify 这样的工具来部署干净页面和部署预览。 (2认同)