【问题标题】:Enabling parallel builds in Gitlab-CI在 Gitlab-CI 中启用并行构建
【发布时间】:2022-01-17 05:20:12
【问题描述】:

目前我有一个构建 C++ 程序的管道,目前如下:

build:
  stage: build
  script:
    - rm -rf .git/modules/docs .git/modules/libraries/fc ./docs ./libraries/fc
    - git submodule sync
    - git submodule update --init --recursive
    - rm -rf build
    - mkdir build
    - cd build
    - cmake -DCMAKE_BUILD_TYPE=Release ..
    - make -j$(nproc)

这个构建必须仍然构建,但我也想并行构建它,但使用不同的 cmake 选项;
cmake -DBOOST_ROOT="$BOOST_ROOT" -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTNET=1

我已经阅读了 gitlab-ci 中包含的并行选项,但没有成功整合它。

任何见解都非常感谢!如果在答案之前解决,将更新

【问题讨论】:

    标签: cmake build devops gitlab-ci


    【解决方案1】:

    你需要有两份工作。 This article 有一些关于如何设置的好主意。

    现在,Gitlab 推断依赖关系并假设您希望按顺序运行它们,因此如果您添加一个 needs: [] 列表,它会帮助它构建一个图表。如果您希望它们中的两个同时运行,那么您需要删除它们的依赖关系。

    如果您在此构建之前有一些东西,例如测试或比较,您可以使用 needs: ["test"]needs: ["prepare"] 或您想要在此构建步骤之前运行的任何作业,但您可以使用 [] 告诉 CI不需要依赖项并尽快运行它们。

    build:
      stage: build
      needs: []
      script:
        - .. common stuff
        - cmake -DCMAKE_BUILD_TYPE=Release ..
        - make # I'd probably remove this in a CI situation -j$(nproc)
    
    build2:
      stage: build
      needs: []
      script:
        - .. common stuff
        - cmake -DCMAKE_BUILD_TYPE=Release AND OTHER OPTIONS ..
        - make # I'd probably remove this in a CI situation -j$(nproc)
    

    【讨论】:

    • 我明白了,但这只是在构建阶段增加了另一个工作;但我希望这两者同时构建;目前它只是等待构建完成,然后运行 ​​build2
    【解决方案2】:

    您可以使用parallel:matrix 工作。此功能多次运行一项作业,但每次设置不同的变量。 在您的情况下,它看起来类似于:

    build:
      stage: build
      script:
        - rm -rf .git/modules/docs .git/modules/libraries/fc ./docs ./libraries/fc
        - git submodule sync
        - git submodule update --init --recursive
        - rm -rf build
        - mkdir build
        - cd build
        - cmake -DCMAKE_BUILD_TYPE=${DCMAKE_BUILD_TYPE}
        - make -j$(nproc)
      parallel:
        matrix:
          # Initial state of your job
          - DCMAKE_BUILD_TYPE="Release .."
            # Other options...
          - DCMAKE_BUILD_TYPE=Release 
            DBOOST_ROOT="$BOOST_ROOT" 
            DBUILD_TESTNET=1
    

    此技术假定您的作业使用相同的变量子集,但每次执行使用不同的值。

    你可以在官方docshere中找到更多信息,另一个例子,docker构建在这种情况下,但原理应该很清楚。

    【讨论】:

    • 您能否详细说明变量子集的含义?
    • 这里的子集是指原始问题的两个作业都将使用相同的变量,但可能具有不同的值。
    猜你喜欢
    • 2016-02-25
    • 2016-04-10
    • 2016-08-27
    • 2022-08-05
    • 2015-10-07
    • 1970-01-01
    • 2018-07-24
    • 2014-09-16
    • 1970-01-01
    相关资源
    最近更新 更多