在 Azure DevOps MS 托管容器管道中设置脚本
Setup scripts in Azure DevOps MS hosted container pipeline
我需要使用 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) however it seems (as also described in 此启动 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
您可以尝试使用日志命令(即##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'
注意:上面脚本任务中设置的变量只在下面的任务中生效
请参考。
更新:
对于 source
命令仅适用于当前 shell,并且每个脚本步骤都会启动一个新的 shell。因此您仍然需要在每个脚本步骤中重复 source
命令。
或者您可以 运行 在单个脚本步骤中配置、构建、测试以避免复制。
我需要使用 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) however it seems (as also described in 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
您可以尝试使用日志命令(即##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'
注意:上面脚本任务中设置的变量只在下面的任务中生效
请参考
更新:
对于 source
命令仅适用于当前 shell,并且每个脚本步骤都会启动一个新的 shell。因此您仍然需要在每个脚本步骤中重复 source
命令。
或者您可以 运行 在单个脚本步骤中配置、构建、测试以避免复制。