2

我有一个带有一些后端 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. maven.yml,具有 mvn 构建功能,
.maven_build: &maven_build |-
  function backend_build {
    cd backendapi
    mvn clean package -DskipTests
  }

before_script:
  - *maven_build
  1. node.yml,其中包含节点功能,
.node_build: &node_build |-
  function frontend_build {
    cd ui
    npm install
    npm build
  }

before_script:
  - *node_build 

当存储库“A”中的.gitlab-ci.yml文件运行时,它会调用存储库“B”中的top-level.ymlmaven.ymlnode.yml文件,这很好。

这里的问题是,当它运行java_build时,它无法从 maven.yml 找到backend_build函数,而是似乎只从 node.yml 文件加载frontend_build函数或从maven.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”中,但在这里我试图了解是否可以尝试上述方法。

提前致谢!

4

1 回答 1

1

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

好吧,没有更多的 maven.yml 或 node.yml,存储库中只有四个B backend.yml文件frontend.yml,hybrid.ymltop-level.yml.

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

例如:在 backend.yml build_app 函数中,我将同时在frontend.ymlbuild_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。我知道这不是正确的方法,但我足以满足我试图解决的用例。

谢谢你帮我解答这个问题!

快乐自动化:)

于 2019-10-17T15:11:24.893 回答