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

Is it possible to create gitlab-pages per branch

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

为了减少用户接触错误的机会,我想在不同的文件夹中发布两个站点:

我希望这些对应于两个不同的分支: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

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

正如您所描述的,您只能通过您的 master 分支发布对 GitLab 页面的更改。不过,GitLab 页面唯一做的就是将文件放在名为 pages 的作业中的 public 文件夹中。这些文件可以是任何你想要的文件,只要你设法通过 GitLab 作业将它们放到这个文件夹中即可。

您可以尝试这样的操作:

pages:
  ...
  script:
    - mkdir -p public
    - cp -r www public
    - git checkout origin/staging
    - mkdir -p public/staging
    - cp -r www public/staging

我还没有测试过,所以如果它不起作用请告诉我!

如果您 运行 一个 GitLab 作业,它通常包含您的回购的所有 git 历史记录。不过,在 git 和 GitLab 中都有一些设置可以更改此设置,因此您必须确保始终将所有 git 历史记录都放到 pages 作业中。如果您有一个尚未添加到 git 的文件夹,例如 public,当您签出另一个分支时,git 不应更改其中的任何内容。

我认为你也应该能够设置 GitLab 页面作业的时间表,这样 pages 作业是 运行 即使只有 staging 分支有已更新,但 master 分支未更新。

有趣的是,可以 post 来自任何分支机构,而不是来自任何工作。

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

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

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

cache:
  paths:
  - public

下一个技巧是将页面发布到适当的文件夹,具体取决于当前正在构建的分支。为此,我们可以参考 GitLab CI/CD Environment Variables;特别是:

  • 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

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

警告

我对此并不满意。

我认为最好将缓存保存在完全不同的地方并在以后复制它们,但每次都完全重写 public 文件夹。

当前的解决方案会随着时间的推移而产生问题,但基本思想是合理的。