【问题标题】:Setup scripts in Azure DevOps MS hosted container pipelineAzure DevOps MS 托管容器管道中的设置脚本
【发布时间】:2021-05-11 09:17:48
【问题描述】:

我需要使用 GCC 编译一个基于 CMake 的 C++ 项目。它依赖于 MKL,为了成功的 Cmake 配置、编译和测试执行,我需要预先运行以下命令

        source /opt/intel/bin/compilervars.sh -arch intel64
        export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

为了使用 Azure 管道运行它,我有一个容器,我可以根据来自 https://docs.microsoft.com/en-us/azure/devops/pipelines/process/container-phases?view=azure-devops 的文档运行它。

通常,上述设置脚本将在容器启动期间调用 (https://hub.docker.com/layers/vvtk/vvcoreazurelinuxdockeragent/latest/images/sha256-c5e3775546ee90a111c9ae700306eb4cd1ebc710686bda5011633c4e5e883e13?context=repo),但它似乎(如 https://stackoverflow.com/a/63643979/15128314 中所述,此启动 CMD 命令未执行,因为 Azure 管道实际上并未调用 docker run

因此,我不得不将其复制到我的管道作业的多个步骤中(基本上是配置、构建和测试的每个步骤),因为这些环境变量在不同的步骤中也不是持久的。我怎样才能更有效地解决这个问题?管道看起来很糟糕..

  - script: |
      source /opt/intel/bin/compilervars.sh -arch intel64
      export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
      (more cmds here)
    displayName: config_Linux_x64_Release

  - script: |
      source /opt/intel/bin/compilervars.sh -arch intel64
      export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
      (more cmds here)
    displayName: build_Linux_x64_Release
  
  - script: | 
        source /opt/intel/bin/compilervars.sh -arch intel64
        export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
        (more cmds here)
    displayName: test_Linux_x64_Release

【问题讨论】:

  • 嗨,您有机会查看以下答案吗?进展如何?

标签: docker azure-pipelines azure-pipelines-yaml


【解决方案1】:

您可以尝试使用日志记录命令(即##vso[task.setvariable])来设置系统变量并避免export 命令的复制。见下文:

您可以在管道变量部分定义环境变量,如下所示:

variables:
  LD_LIBRARY_PATH: /usr/local/lib:$LD_LIBRARY_PATH

或者您可以尝试在管道顶部添加脚本任务以运行以下命令:

- script: |
  
    #below script will only take effect in the following tasks. 
      
    source /opt/intel/bin/compilervars.sh -arch intel64
    echo "##vso[task.setvariable variable=LD_LIBRARY_PATH]/usr/local/lib:$LD_LIBRARY_PATH" 

  displayName: 'SetVariable'

注意:上面脚本任务中设置的变量只在后面的任务中生效。

请参考this thread

更新:

对于source 命令只适用于当前shell,每个脚本步骤都会启动一个新的shell。因此,您仍然需要在每个脚本步骤中重复 source 命令。

或者您可以在单个脚本步骤中运行配置、构建、测试以避免复制。

【讨论】:

  • 这仅适用于LD_LIBRARY_PATH,但不会保留source /opt/intel/bin/compilervars.sh -arch intel64 实际设置的任何内容,所以不,它并不能完全解决这个问题。同样对于使用 python 的虚拟环境,另请参阅medium.com/faun/…
  • @multipitch 根据stackoverflow.com/a/60664697/15128314,您可以跨不同步骤使用虚拟环境。我无法真正完成这项工作,另请参阅medium.com/faun/… - 这真的解决了您的问题吗?
  • @iv1 恐怕你必须在每个脚本步骤中重复source 命令。这是因为每个脚本步骤都会启动一个新的 shell,而之前的 shell 将被关闭。
  • 好的,我明白了 - 无论如何谢谢!我想避免将所有内容都放在同一个步骤中,因为我需要检查每个步骤是否成功,并在必要时中止执行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 2020-05-28
  • 2019-03-26
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多