我有一个Gitlab mono存储库,其中包含一些后端Java和前端Node.js代码。为了创建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
---
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
.maven_build: &maven_build |-
function backend_build {
cd backendapi
mvn clean package -DskipTests
}
before_script:
- *maven_build
.node_build: &node_build |-
function frontend_build {
cd ui
npm install
npm build
}
before_script:
- *node_build
运行存储库“ A”中的 .gitlab-ci.yml 文件时,它正在调用 top-level.yml , maven.yml 和 node.yml 文件来自存储库“ B”,很好。
这里的问题是,当它运行 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文件中,并在存储库“ A”中将.gitlab-ci.yml包括在内,但在这里我试图理解是否有可能尝试以上方法。
谢谢!
答案 0 :(得分:1)
好吧,终于找到了一个破解程序,但不是一个完整的答案,因为yaml文件无法按照我在问题中所述的那样采取相应的行动,但是我采用了另一种方法来解决问题。
嗯,不再有maven.yml或node.yml,存储库B
backend.yml
,frontend.yml
,hybrid.yml
和{{ 1}}。
backend.yml具有所需的所有功能(build_app,lint_app,unit_test_app等),并且在frontend.yml之后的功能相同,但具有不同的命令。
ex:在backend.yml build_app函数中,我将同时在top-level.yml
build_app函数中获得maven命令,在此我将拥有nom命令。这里的build_app函数名称在frontend.yml和backend.yml中都是通用的,但是功能不同。
在top.level yml阶段,我在脚本键中将通用函数名称指定为build_app。
frontend.yml
但是在.gitlab-ci.yml中,根据我需要做的构建,我包括了那个特定的yml文件。在下面的示例中,我要构建后端并包含backend.yml,同样适用于前端。
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
如果必须同时构建后端和前端,则我将使用hybrid.yml,其功能名称与build_app相同,但同时包含maven和npm命令。我知道这不是正确的方法,但是我要解决的用例就足够了。
谢谢您帮助我解决这个问题!
快乐自动化:)