GitLab中Windows容器nmake未识别,如何配置VS环境变量?
问题
我尝试在GitLab中创建包含C++编译器与库的Windows容器以构建软件,编写了如下Dockerfile用于构建windows-build-base容器:
# escape=` # based on Microsoft official docs example FROM mcr.microsoft.com/windows/servercore:ltsc2022 SHELL ["cmd", "/S", "/C"] USER ContainerAdministrator RUN ` curl -SL --output vs_buildtools.exe https://aka.ms/vs/15/release/vs_buildtools.exe ` ` && (start /w vs_buildtools.exe --quiet --wait --norestart --nocache ` --installPath "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\BuildTools" ` --add Microsoft.VisualStudio.Component.Roslyn.Compiler ` --add Microsoft.Component.MSBuild ` --add Microsoft.VisualStudio.Component.CoreBuildTools ` --add Microsoft.VisualStudio.Workload.MSBuildTools ` --add Microsoft.VisualStudio.Component.Windows10SDK ` --add Microsoft.VisualStudio.Component.VC.CoreBuildTools ` --add Microsoft.VisualStudio.Component.Static.Analysis.Tools ` --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 ` --add Microsoft.VisualStudio.Component.VC.Redist.14.Latest ` --add Microsoft.VisualStudio.Component.Windows10SDK.17763 ` --add Microsoft.VisualStudio.Component.VC.CMake.Project ` --add Microsoft.VisualStudio.Component.TestTools.BuildTools ` --add Microsoft.VisualStudio.Component.VC.ATL ` --add Microsoft.VisualStudio.Component.VC.ATLMFC ` --add Microsoft.Net.Component.4.6.1.SDK ` --add Microsoft.Net.Component.4.6.1.TargetingPack ` --add Microsoft.VisualStudio.Component.VC.CLI.Support ` --add Microsoft.VisualStudio.Workload.VCTools ` || IF "%ERRORLEVEL%"=="3010" EXIT 0) ` ` && del /q vs_buildtools.exe RUN tree /f C:\BuildTools RUN ` curl -SL --output git.exe "https://github.com/git-for-windows/git/releases/download/v2.41.0.windows.3/Git-2.41.0.3-64-bit.exe" ` && (start /w git.exe /SP- /VERYSILENT /NORESTART /NOCANCEL /CLOSEAPPLICATIONS /RESTARTAPPLICATIONS) ` && del /q git.exe RUN setx /M PATH "%PATH%;C:\Program Files\Git\bin" USER ContainerUser ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]
对应的GitLab作业配置如下:
build: image: registry.my.company.com/windows-build-base:1.0 stage: build tags: - windows-agent variables: BZ2_SRC_DIR: C:\bin\src\bzip2 script: - git clone --branch=$BZ2_VERSION git://sourceware.org/git/bzip2.git $BZ2_SRC_DIR - cd $BZ2_SRC_DIR - nmake -f makefile.msc
执行作业时提示nmake : The term 'nmake' is not recognized,已确认容器内存在nmake,但容器入口点的VsDevCmd.bat未生效,直接在GitLab流水线脚本中调用该脚本也无效。请问如何无需启动新Shell,让VS环境变量在GitLab作业脚本中生效?
解决方案
方案1:修正Dockerfile的ENTRYPOINT写法
当前ENTRYPOINT的拼接方式错误,VsDevCmd.bat的环境变量无法传递给后续的powershell。需要让VsDevCmd.bat执行完成后,在同一个进程中启动powershell,修改后的ENTRYPOINT如下:
ENTRYPOINT ["cmd", "/S", "/C", "\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\BuildTools\\Common7\\Tools\\VsDevCmd.bat\" && powershell.exe -NoLogo -ExecutionPolicy Bypass"]
这样GitLab作业的所有脚本都会在已加载VS环境变量的powershell中执行。
方案2:在GitLab脚本中统一调用VsDevCmd与构建命令
如果不想修改镜像,可以在作业脚本中将VsDevCmd.bat和所有构建命令放在同一个cmd进程中执行,确保环境变量不丢失:
script: - cmd /S /C "\"C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\Tools\VsDevCmd.bat\" && git clone --branch=$BZ2_VERSION git://sourceware.org/git/bzip2.git $BZ2_SRC_DIR && cd $BZ2_SRC_DIR && nmake -f makefile.msc"
方案3:将VS环境变量持久化到系统(不推荐)
可以在Dockerfile中执行VsDevCmd.bat后,提取环境变量并写入系统持久化变量,但这种方式会引入冗余变量,维护成本高,示例写法如下:
RUN cmd /S /C "\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\BuildTools\\Common7\\Tools\\VsDevCmd.bat\" && set > C:\vs_env.txt" RUN for /f "tokens=1* delims==" %%a in (C:\vs_env.txt) do setx /M %%a "%%b" RUN del C:\vs_env.txt
内容的提问来源于Stack Exchange,提问作者Apollo
相关产品推荐
相关产品推荐

