为不同分支部署 GitLab 页面
Deploying GitLab pages for different branches
我正在使用 GitLab Pages 部署我的 React 应用程序,它运行良好。
这是我的 gitlab-ci.yml
:
# Using the node alpine image to build the React app
image: node:alpine
# Announce the URL as per CRA docs
# https://github.com/facebook/create-react-app/blob/master/packages/react-scripts/template/README.md#advanced-configuration
variables:
PUBLIC_URL: /
# Cache node modules - speeds up future builds
cache:
paths:
- client/node_modules
# Name the stages involved in the pipeline
stages:
- deploy
# Job name for gitlab to recognise this results in assets for Gitlab Pages
# https://docs.gitlab.com/ee/user/project/pages/introduction.html#gitlab-pages-requirements
pages:
stage: deploy
script:
- cd client
- npm install # Install all dependencies
- npm run build --prod # Build for prod
- cp public/index.html public/404.html # Not necessary, but helps with https://medium.com/@pshrmn/demystifying-single-page-applications-3068d0555d46
- mv public _public # CRA and gitlab pages both use the public folder. Only do this in a build pipeline.
- mv build ../public # Move build files to public dir for Gitlab Pages
artifacts:
paths:
- public # The built files for Gitlab Pages to serve
only:
- master # Only run on master branch
现在,我刚刚基于我的分支创建了一个开发版本 develop
我想要有 2 个版本的 React 应用程序和 2 个不同的 URL。我该怎么做?
例如现在,我有:
my-react-app.com
链接到 master
分支
我应该怎么吃
dev.my-react-app.com
甚至 my-react-app.gitlab.io
链接到 develop
分支?<
每个 GitLab 项目最多只能有一个 Pages 站点。我找不到对此的明确参考,但 the documentation for .gitlab-ci.yml
说:
Be aware that Pages are by default branch/tag agnostic and their deployment relies solely on what you specify in .gitlab-ci.yml
. If you don’t limit the pages
job with the only
parameter, whenever a new commit is pushed to whatever branch or tag, the Pages will be overwritten.
没有 only
参数,任何分支的更新都会发布到 same 页面站点,覆盖那里的任何内容。使用 only
参数,只有提供的分支会触发页面构建。
为此,我成功使用了可浏览的工件。在您的示例中,您将为开发分支创建一个作业并将 PUBLIC_URL
设置为 gitlab.io
上发布作业工件的路径:
develop:
artifacts:
paths:
- public
environment:
name: Develop
url: "https://$CI_PROJECT_NAMESPACE.gitlab.io/-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/public/index.html"
script: |
# whatever
stage: deploy
variables:
PUBLIC_URL: "/-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/public"
按照指示设置 environment
会在相关合并请求中生成 »Review 应用程序« link,让您只需单击一下即可访问工件。
注意:如果你的仓库在subgroup,你需要在上面的/-/
和[=之间的两个地方插入子组名称15=] 使生成的 URL 起作用。
可以针对不同的 pipelines/branches.
发布多个页面
为此,您需要将页面内容(主要是测试报告,或任何需要发布的内容)复制到 public 文件夹中的特定唯一目录。
例如,目录的名称可以是管道的 id (CI_PIPELINE_ID)。所以页面源的路径就像 public/$CI_PIPELINE_ID/.
那么整个 public 文件夹应该被定义为具有 特定唯一名称 的工件(这里再次可以使用“$CI_PIPELINE_ID”)。
需要工件的唯一名称才能在下一次管道执行时不覆盖工件(如果未指定名称,将采用默认名称https://docs.gitlab.com/ee/ci/yaml/#artifactsname) .
然后您可以通过 link:
访问已发布的报告
https://yourGitlab/yourNamespace/yourProjectName/{CI_PIPELINE_ID}/index.html
,
这意味着您可以通过更改管道 ID 访问所有已保存的报告。
我的例子:
stages:
- publish
cache:
# Required to keep artifacts from old builds, e.g. from master
paths:
- public
pages:
stage: publish
script:
- mkdir -p public/$CI_PIPELINE_ID
- cp target/site/allure-maven-plugin/* public/$CI_PIPELINE_ID/ -R
artifacts:
name: "$CI_PIPELINE_ID"
paths:
- public
expire_in: 5 days
when: always
我正在使用 GitLab Pages 部署我的 React 应用程序,它运行良好。
这是我的 gitlab-ci.yml
:
# Using the node alpine image to build the React app
image: node:alpine
# Announce the URL as per CRA docs
# https://github.com/facebook/create-react-app/blob/master/packages/react-scripts/template/README.md#advanced-configuration
variables:
PUBLIC_URL: /
# Cache node modules - speeds up future builds
cache:
paths:
- client/node_modules
# Name the stages involved in the pipeline
stages:
- deploy
# Job name for gitlab to recognise this results in assets for Gitlab Pages
# https://docs.gitlab.com/ee/user/project/pages/introduction.html#gitlab-pages-requirements
pages:
stage: deploy
script:
- cd client
- npm install # Install all dependencies
- npm run build --prod # Build for prod
- cp public/index.html public/404.html # Not necessary, but helps with https://medium.com/@pshrmn/demystifying-single-page-applications-3068d0555d46
- mv public _public # CRA and gitlab pages both use the public folder. Only do this in a build pipeline.
- mv build ../public # Move build files to public dir for Gitlab Pages
artifacts:
paths:
- public # The built files for Gitlab Pages to serve
only:
- master # Only run on master branch
现在,我刚刚基于我的分支创建了一个开发版本 develop
我想要有 2 个版本的 React 应用程序和 2 个不同的 URL。我该怎么做?
例如现在,我有:
my-react-app.com
链接到 master
分支
我应该怎么吃
dev.my-react-app.com
甚至 my-react-app.gitlab.io
链接到 develop
分支?<
每个 GitLab 项目最多只能有一个 Pages 站点。我找不到对此的明确参考,但 the documentation for .gitlab-ci.yml
说:
Be aware that Pages are by default branch/tag agnostic and their deployment relies solely on what you specify in
.gitlab-ci.yml
. If you don’t limit thepages
job with theonly
parameter, whenever a new commit is pushed to whatever branch or tag, the Pages will be overwritten.
没有 only
参数,任何分支的更新都会发布到 same 页面站点,覆盖那里的任何内容。使用 only
参数,只有提供的分支会触发页面构建。
为此,我成功使用了可浏览的工件。在您的示例中,您将为开发分支创建一个作业并将 PUBLIC_URL
设置为 gitlab.io
上发布作业工件的路径:
develop:
artifacts:
paths:
- public
environment:
name: Develop
url: "https://$CI_PROJECT_NAMESPACE.gitlab.io/-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/public/index.html"
script: |
# whatever
stage: deploy
variables:
PUBLIC_URL: "/-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/public"
按照指示设置 environment
会在相关合并请求中生成 »Review 应用程序« link,让您只需单击一下即可访问工件。
注意:如果你的仓库在subgroup,你需要在上面的/-/
和[=之间的两个地方插入子组名称15=] 使生成的 URL 起作用。
可以针对不同的 pipelines/branches.
发布多个页面为此,您需要将页面内容(主要是测试报告,或任何需要发布的内容)复制到 public 文件夹中的特定唯一目录。 例如,目录的名称可以是管道的 id (CI_PIPELINE_ID)。所以页面源的路径就像 public/$CI_PIPELINE_ID/.
那么整个 public 文件夹应该被定义为具有 特定唯一名称 的工件(这里再次可以使用“$CI_PIPELINE_ID”)。
需要工件的唯一名称才能在下一次管道执行时不覆盖工件(如果未指定名称,将采用默认名称https://docs.gitlab.com/ee/ci/yaml/#artifactsname) .
然后您可以通过 link:
访问已发布的报告https://yourGitlab/yourNamespace/yourProjectName/{CI_PIPELINE_ID}/index.html
, 这意味着您可以通过更改管道 ID 访问所有已保存的报告。
我的例子:
stages:
- publish
cache:
# Required to keep artifacts from old builds, e.g. from master
paths:
- public
pages:
stage: publish
script:
- mkdir -p public/$CI_PIPELINE_ID
- cp target/site/allure-maven-plugin/* public/$CI_PIPELINE_ID/ -R
artifacts:
name: "$CI_PIPELINE_ID"
paths:
- public
expire_in: 5 days
when: always