是否可以为每个分支创建 gitlab-pages
Is it possible to create gitlab-pages per branch
我在 GitLab Pages 上托管了一个普通的 JavaScript 应用程序。最近,我一直在进行更改和错误修复,这些更改和错误修复一直在破坏网站,直到已经推送更改后我才注意到。
为了减少用户接触错误的机会,我想在不同的文件夹中发布两个站点:
public/
: master
分支;官网
public/staging/
: staging
分支;每晚构建
我希望这些对应于两个不同的分支:master
和 staging
读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 来自任何分支机构,而不是来自任何工作。
为此,我需要进行两项更改:
- 我需要知道已发布数据的当前状态
- 我需要根据当前分支更改目录
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
不要忘记将页面限制为仅 staging
和 master
。
警告
我对此并不满意。
我认为最好将缓存保存在完全不同的地方并在以后复制它们,但每次都完全重写 public 文件夹。
当前的解决方案会随着时间的推移而产生问题,但基本思想是合理的。
我在 GitLab Pages 上托管了一个普通的 JavaScript 应用程序。最近,我一直在进行更改和错误修复,这些更改和错误修复一直在破坏网站,直到已经推送更改后我才注意到。
为了减少用户接触错误的机会,我想在不同的文件夹中发布两个站点:
public/
:master
分支;官网public/staging/
:staging
分支;每晚构建
我希望这些对应于两个不同的分支:master
和 staging
读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 来自任何分支机构,而不是来自任何工作。
为此,我需要进行两项更改:
- 我需要知道已发布数据的当前状态
- 我需要根据当前分支更改目录
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
不要忘记将页面限制为仅 staging
和 master
。
警告
我对此并不满意。
我认为最好将缓存保存在完全不同的地方并在以后复制它们,但每次都完全重写 public 文件夹。
当前的解决方案会随着时间的推移而产生问题,但基本思想是合理的。