在Azure DevOps MS托管容器管道中安装脚本



我需要使用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://learn.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

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

- 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

您可以尝试使用日志命令(例如:##vso[task.setvariable])设置系统变量,避免复制forexport命令。见下文:

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

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'

注意:上述脚本任务中设置的变量只在下一个任务中生效。

请参考这篇文章

更新:

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

或者你可以在一个脚本步骤中运行config, build, test,以避免复制。

最新更新