是否可以为每个分支创建gitlab页面

是否可以为每个分支创建gitlab页面,gitlab,gitlab-pages,Gitlab,Gitlab Pages,我在GitLab页面上托管了一个普通的JavaScript应用程序。最近,我一直在做一些改变和错误修复,这些改变破坏了网站,直到我已经推动了这些改变,我才注意到 为了减少用户暴露于bug的风险,我想在单独的文件夹中发布两个站点: public/:master分支机构;官方网站 public/staging/:staging分支机构;夜间建造 我希望它们对应于两个不同的分支:master和staging 阅读,听起来这是不可能的。我希望我看错了 default: image: node:l

我在GitLab页面上托管了一个普通的JavaScript应用程序。最近,我一直在做一些改变和错误修复,这些改变破坏了网站,直到我已经推动了这些改变,我才注意到

为了减少用户暴露于bug的风险,我想在单独的文件夹中发布两个站点:

  • public/
    master
    分支机构;官方网站
  • public/staging/
    staging
    分支机构;夜间建造
我希望它们对应于两个不同的分支:
master
staging

阅读,听起来这是不可能的。我希望我看错了

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

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

您只能通过主分支发布对GitLab页面的更改,正如您所描述的。GitLab pages所做的唯一一件事是将文件放在名为
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历史记录都保存到
页面
作业中。如果您有一个尚未添加到git的文件夹,如
public
,git在签出另一个分支时不应更改其中的任何内容


我认为您还应该能够使用时间表设置GitLab pages作业,这样即使只更新了
staging
分支,但没有更新
master
分支,
pages
作业也可以运行。

有趣的是,可以从任何分支发布,而不是从任何作业发布

为此,我需要做两个更改:

  • 我需要知道发布数据的当前状态
  • 我需要根据当前分支更改目录
  • GitLab能够缓存文件夹。通常,这是通过缓存下载的驱动程序来加速构建的。我没有理由不能使用它来存储
    public
    文件夹。这样,当我对
    staging
    进行更改时,我将记住
    根应用程序的状态:

    cache:
      paths:
      - public
    
    下一个技巧是根据当前正在构建的分支将页面发布到适当的文件夹。要做到这一点,我们可以期待;特别是:

    • CI\u COMMIT\u REF\u SLUG
      :当前分支
    • CI\u DEFAULT\u分支
      :默认分支(主分支)
    知道了这两个值,我们可以做一些
    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
    
    别忘了将页面限制为仅
    staging
    master

    警告

    我对此不满意

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


    当前的解决方案将随着时间的推移构建cruft,但基本思想是合理的。

    据我所知,GitLab pages每个repo仅限于一个实例,而不是分支:(好主意,但它向我建议了一些我认为可能更干净的东西(使用缓存)谢谢分享!这确实是一个在中提供的解决方案。但是正如你所说,这个解决方案并不完美。在这一点上,我更喜欢使用Netlify这样的工具来部署干净的页面和部署预览。这确实是同一个解决方案,将问题标记为重复