【问题标题】:.gitlab-ci.yml to include multiple shell functions from multiple yml files.gitlab-ci.yml 包含来自多个 yml 文件的多个 shell 函数
【发布时间】:2020-01-28 17:46:40
【问题描述】:

我有一个带有一些后端 Java 和前端 Node.js 代码的 Gitlab 单声道存储库。为了创建 CI,我正在采用一种共享方法来构建这两个应用程序。

在应用程序存储库中,我们称它为“A”,我有源代码以及 .gitlab-ci.yml 文件,如下所示,

A
├── .gitlab-ci.yml
├── backendapi
└── ui

.gitlab-ci.yml 文件,

---
include: 
  - project: 'root/B'
    ref: master
    file: 'top-level.yml'

  - project: 'root/B'
    ref: master
    file: 'maven.yml'

  - project: 'root/B'
    ref: master
    file: 'node.yml'

我有另一个名为“B”的存储库,其中我的所有 CI 功能在三个不同的文件中。

B
├── maven.yml
├── node.yml
└── top-level.yml
  1. top-level.yml 文件,其中包含我的构建阶段,
---
stages:
  - build

variables:
  GIT_SSL_NO_VERIFY: "1"

.build_script: &build_script
  stage: build
  tags:
    - default
    - docker

java_build:
  <<: *build_script
  image: 
    name: maven:latest
  script:
    - backend_build

node_build:
  <<: *build_script
  image: 
    name: node:slim
  script:
    - frontend_build
  1. ma​​ven.yml,具有 mvn 构建功能,
.maven_build: &maven_build |-
  function backend_build {
    cd backendapi
    mvn clean package -DskipTests
  }

before_script:
  - *maven_build
  1. node.yml,里面有node函数,
.node_build: &node_build |-
  function frontend_build {
    cd ui
    npm install
    npm build
  }

before_script:
  - *node_build 

当存储库“A”中的.gitlab-ci.yml文件运行时,它调用的是top-level.ymlma​​ven.yml node.yml 文件来自存储库“B”,这很好。

这里的问题是,当它运行 java_build 时,它无法从 ma​​ven.yml 中找到 backend_build 函数,而是看起来像仅从 node.yml 文件加载 frontend_build 函数或从 ma​​ven.yml 文件覆盖 backend_build 函数。 node_build 按预期工作,因为它可以找到 frontend_build 函数。

the Skipping Git submodules setup
Authenticating with credentials from /root/.docker/config.json
Authenticating with credentials from /root/.docker/config.json
Authenticating with credentials from /root/.docker/config.json
$ function frontend_build { # collapsed multi-line command
$ backend_build
/bin/bash: line 90: backend_build: command not found

我知道我可以将所有函数复制到存储库“B”中的一个大 yml 文件中,并将 .gitlab-ci.yml 中的内容包含在存储库“A”中,但在这里我试图了解它是否可能尝试上述方法。

提前致谢!

【问题讨论】:

  • 这名字很奇怪。 node.yml -> node_build -> before_script -> frontend_build(仅声明)-> script ->`fontend_build`(调用),为什么有这么多链?为什么不在.frontend_build: &amp;frontend_build |- 里面node.yml 然后script: - *frontend_build
  • 给定阶段的作业倾向于并行运行,因此如果您的作业依赖于先前作业的完成,我建议将作业 (java_build) 移动到build2 阶段或任何你想命名的东西
  • @KamilCuk 我在下面发布了答案或破解。感谢您的回复。
  • @Arty-chan 我在下面发布了答案或破解。感谢您的回复。

标签: gitlab gitlab-ci gitlab-ci-runner gitlab-omnibus gitlab-ce


【解决方案1】:

好的,终于找到了一个 hack,但不是一个完整的答案,因为 yaml 文件不能像我在问题中所说的那样采取相应的行动,但我采取了不同的方法来解决问题。

好吧,没有更多的 maven.yml 或 node.yml,存储库中只有四个文件Bbackend.ymlfrontend.ymlhybrid.ymltop-level.yml

backend.yml 包含所有必需的函数(build_app、lint_app、unit_test_app 等),并且在 frontend.yml 之后也是如此,函数中的命令不同。

ex:在 backend.yml build_app 函数中,我将同时在 frontend.yml build_app 函数中拥有 maven 命令,我将拥有 nom 命令。这里 build_app 函数名在 frontend.yml 和 backend.yml 中都是通用的,但功能不同。

在 top-level.yml 阶段,我在脚本键中指定了公共函数名称为 build_app。

stages:
  - build

variables:
  GIT_SSL_NO_VERIFY: "1"

.build_script: &build_script
  stage: build
  tags:
    - default
    - docker

build:
  <<: *build_script
  image: maven:latest
  script:
    - build_app

但是在 .gitlab-ci.yml 中,根据我需要做的构建,我包含了那个特定的 yml 文件。在下面的示例中,我想构建后端并包含 backend.yml,这同样适用于前端。

include: 
  - project: 'root/B'
    ref: master
    file: 'top-level.yml'

  - project: 'root/B'
    ref: master
    file: 'backend.yml'

如果我必须同时构建后端和前端,我将使用函数名称与 build_app 相同但同时包含 maven 和 npm 命令的 hybrid.yml。我知道这不是正确的方法,但我足以满足我要解决的用例。

感谢您帮助我解决问题!

快乐的自动化 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    相关资源
    最近更新 更多