.gitlab-ci.yml包含来自多个yml文件的多个shell函数

时间:2019-09-28 22:37:52

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

我有一个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
  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 文件时,它正在调用 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包括在内,但在这里我试图理解是否有可能尝试以上方法。

谢谢!

1 个答案:

答案 0 :(得分:1)

好吧,终于找到了一个破解程序,但不是一个完整的答案,因为yaml文件无法按照我在问题中所述的那样采取相应的行动,但是我采用了另一种方法来解决问题。

嗯,不再有maven.yml或node.yml,存储库B backend.ymlfrontend.ymlhybrid.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命令。我知道这不是正确的方法,但是我要解决的用例就足够了。

谢谢您帮助我解决这个问题!

快乐自动化:)