Gitlab 的 "pages" 工作在内部是如何工作的?
How does Gitlab's "pages" job work internally?
我有一个这样的 Gitlab 项目 (.gitlab-ci.yml):
# Sub-jobs listed as comments
stages:
- check-in-tests
# shellcheck
# pylint
# unit-tests
- several-other-things
# foo
# bar
# baz
- release
# release
# Run some shell code static tests and generate logs/badges
shellcheck:
stage: check-in-tests
script:
- bash run_shellcheck.sh
artifacts:
paths:
- logs/shellcheck.log
- logs/shellcheck.svg
# Run some python code static tests and generate logs/badges
pylint:
stage: check-in-tests
script:
- bash run_pylint.sh
artifacts:
paths:
- logs/pylint.log
- logs/pylint.svg
# <snip>
在我的项目页面上,我想将签入测试期间生成的 .svg 文件呈现为 badges。
Gitlab 徽章工具需要 URL 图像文件。它无法使用查询字符串从 URLs 加载图像。不幸的是,用于访问特定作业工件的语法 ends in a query string。这实际上意味着我们不能 link 将工作工件作为徽章。
最流行的解决方法是滥用 Gitlab 的 pages 功能将工件存储为静态内容。从那里我们可以得到干净的 URL 到我们不包含查询字符串的工件。
我的困惑涉及 .gitlab-ci.yml 中定义的 "pages" 作业背后的底层机制。 official documentation here is very sparse. There are a million examples 用于部署具有各种框架的实际网页,但我对其中任何一个都不感兴趣,因为我只是使用我项目的 "page" 进行文件托管。
假设我想在管道的末端部署我的页面。但是,我想在管道的 beginning 附近上传 shellcheck 和 pylint 工件。此外,即使管道阶段失败,我也希望上传这些工件。
页面作业在句法上看起来与任何其他作业相同。没有什么可以描述它是如何被 Gitlab 的内部结构神奇地拾取的。这给我留下了以下问题:
- 我可以将阶段从 "deploy" 更改为 "check-in-tests",还是部署阶段是 Gitlab 在解析页面作业时寻找的隐藏魔法的一部分?
- 如果我受制于部署阶段,我能否重新安排这些阶段以使其在管道中更早出现而不破坏魔力?
- 页面作业是从本地机器部署工件(作业的默认行为),还是列出的路径来自已经由早期作业上传到 Gitlab 管道的工件?
- 如果页面作业仅在本地查找工件,我如何确保它 运行 与之前的作业位于同一台机器上,以便找到它们生成的工件?假设 Gitlab 执行程序都来自具有相同标签的池,并且没有单独标记。
- 是否有机会在最初生成工件的同一 Docker 容器中将页面作业发送到 运行?
GitLab 页面的魔力在于工作的名称。它必须命名为 "pages",除此之外别无其他。可以将工作移动到不同的阶段。一旦作业 "pages" 成功完成,就会出现一种特殊类型的作业,称为 "pages:deploy"。即使您更改 "pages" 作业在 运行 中的阶段,此作业也会显示在部署阶段。
如果您在早期阶段有页面作业,后期阶段的作业可能会失败,但 "pages:deploy" 作业仍会 运行 并更新 GitLab 页面。
除此之外,"pages" 作业就像 GitLab 中的普通作业一样。如果您需要来自其他工作的工件,您可以通过使用工件和依赖项来获取这些工件:
https://docs.gitlab.com/ee/ci/yaml/#dependencies
"pages" 作业应创建一个名为 "public" 的文件夹,并将该文件夹作为工件。
我有一个这样的 Gitlab 项目 (.gitlab-ci.yml):
# Sub-jobs listed as comments
stages:
- check-in-tests
# shellcheck
# pylint
# unit-tests
- several-other-things
# foo
# bar
# baz
- release
# release
# Run some shell code static tests and generate logs/badges
shellcheck:
stage: check-in-tests
script:
- bash run_shellcheck.sh
artifacts:
paths:
- logs/shellcheck.log
- logs/shellcheck.svg
# Run some python code static tests and generate logs/badges
pylint:
stage: check-in-tests
script:
- bash run_pylint.sh
artifacts:
paths:
- logs/pylint.log
- logs/pylint.svg
# <snip>
在我的项目页面上,我想将签入测试期间生成的 .svg 文件呈现为 badges。
Gitlab 徽章工具需要 URL 图像文件。它无法使用查询字符串从 URLs 加载图像。不幸的是,用于访问特定作业工件的语法 ends in a query string。这实际上意味着我们不能 link 将工作工件作为徽章。
最流行的解决方法是滥用 Gitlab 的 pages 功能将工件存储为静态内容。从那里我们可以得到干净的 URL 到我们不包含查询字符串的工件。
我的困惑涉及 .gitlab-ci.yml 中定义的 "pages" 作业背后的底层机制。 official documentation here is very sparse. There are a million examples 用于部署具有各种框架的实际网页,但我对其中任何一个都不感兴趣,因为我只是使用我项目的 "page" 进行文件托管。
假设我想在管道的末端部署我的页面。但是,我想在管道的 beginning 附近上传 shellcheck 和 pylint 工件。此外,即使管道阶段失败,我也希望上传这些工件。
页面作业在句法上看起来与任何其他作业相同。没有什么可以描述它是如何被 Gitlab 的内部结构神奇地拾取的。这给我留下了以下问题:
- 我可以将阶段从 "deploy" 更改为 "check-in-tests",还是部署阶段是 Gitlab 在解析页面作业时寻找的隐藏魔法的一部分?
- 如果我受制于部署阶段,我能否重新安排这些阶段以使其在管道中更早出现而不破坏魔力?
- 页面作业是从本地机器部署工件(作业的默认行为),还是列出的路径来自已经由早期作业上传到 Gitlab 管道的工件?
- 如果页面作业仅在本地查找工件,我如何确保它 运行 与之前的作业位于同一台机器上,以便找到它们生成的工件?假设 Gitlab 执行程序都来自具有相同标签的池,并且没有单独标记。
- 是否有机会在最初生成工件的同一 Docker 容器中将页面作业发送到 运行?
GitLab 页面的魔力在于工作的名称。它必须命名为 "pages",除此之外别无其他。可以将工作移动到不同的阶段。一旦作业 "pages" 成功完成,就会出现一种特殊类型的作业,称为 "pages:deploy"。即使您更改 "pages" 作业在 运行 中的阶段,此作业也会显示在部署阶段。
如果您在早期阶段有页面作业,后期阶段的作业可能会失败,但 "pages:deploy" 作业仍会 运行 并更新 GitLab 页面。
除此之外,"pages" 作业就像 GitLab 中的普通作业一样。如果您需要来自其他工作的工件,您可以通过使用工件和依赖项来获取这些工件:
https://docs.gitlab.com/ee/ci/yaml/#dependencies
"pages" 作业应创建一个名为 "public" 的文件夹,并将该文件夹作为工件。