防止Gitlab在启动docker容器时向PowerShell添加-NoProfile
1。如何防止Gitlab在创建docker容器时添加-NoProfile? 2。带-NoProfile和不带-NoProfile使用powershell有什么区别? 3。如果我运行powershell-NoProfile以某种方式加载/运行默认配置文件并恢复设置-NoProfile标志的效果,有什么方法吗? 下面是这些问题背后的故事: MSBuild(Visual Studio生成工具命令)在Gitlab使用Powershell-NoProfile启动的docker容器中使用时无法生成Xamarin应用程序 我为CI purspose创建了一个docker映像,如果我手动运行容器,一切都正常工作,但是当它在Gitlab runner作业期间运行时,它失败了(更确切地说,msbuild/t:SignAndroidPackage失败,因为某些文件未生成)。我对此进行了检查(在gitlab-ci.yml中休眠1小时,并将其连接到runner机器上的容器),发现gitlab使用PowerShell-NoProfile启动容器…我手动尝试了(使用-NoProfile启动容器),并重现了此问题 错误是:防止Gitlab在启动docker容器时向PowerShell添加-NoProfile,powershell,docker,xamarin,msbuild,gitlab,Powershell,Docker,Xamarin,Msbuild,Gitlab,1。如何防止Gitlab在创建docker容器时添加-NoProfile? 2。带-NoProfile和不带-NoProfile使用powershell有什么区别? 3。如果我运行powershell-NoProfile以某种方式加载/运行默认配置文件并恢复设置-NoProfile标志的效果,有什么方法吗? 下面是这些问题背后的故事: MSBuild(Visual Studio生成工具命令)在Gitlab使用Powershell-NoProfile启动的docker容器中使用时无法生成Xamar
Could not find a part of the path 'C:\builds\gitlab\HMI.Framework\KDI\sub\HostApplicationToolkit\sub\KBle\KBle\sub\XamarinBluetooth\Source\Plugin.BLE.Android\Resources\Resource.Designer.cs'
此处缺少Resource.Designer.cs(它应该在构建过程中自动生成)
这是dockerFile:
# escape=`
# Use the latest Windows Server Core image with .NET Framework 4.8.
FROM mcr.microsoft.com/dotnet/framework/sdk:3.5-windowsservercore-ltsc2019
ENV VS_STUDIO_INSTALL_LINK=https://download.visualstudio.microsoft.com/download/pr/befdb1f9-8676-4693-b031-65ee44835915/c541feeaa77b97681f7693fc5bed2ff82b331b168c678af1a95bdb1138a99802/vs_Community.exe
ENV VS_INSTALLER_PATH=C:\TEMP\vs2019.exe
ENV ANDROID_COMPILE_SDK=29
# Restore the default Windows shell for correct batch processing.
SHELL ["cmd", "/S", "/C"]
ADD $VS_STUDIO_INSTALL_LINK $VS_INSTALLER_PATH
RUN %VS_INSTALLER_PATH% --quiet --wait --norestart --nocache --includeRecommended --includeOptional`
--add Microsoft.VisualStudio.Workload.NetCrossPlat `
--add Microsoft.VisualStudio.Workload.XamarinBuildTools `
|| IF "%ERRORLEVEL%"=="3010" EXIT 0
RUN del %VS_INSTALLER_PATH%
# set some util paths
RUN setx JAVA_HOME "c:\Program Files\Android\jdk\microsoft_dist_openjdk_1.8.0.25\"
RUN setx path "%path%;c:\Program Files (x86)\Android\android-sdk\tools\bin;c:\Program Files (x86)\Android\android-sdk\platform-tools"
# update android SDK with API 29
RUN echo y| sdkmanager "platforms;android-%ANDROID_COMPILE_SDK%"
#ENTRYPOINT ["powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]
这是gitlab-ci.yml
image: visualstudio2019-xamarin-ci:1.0-windowsservercore-ltsc2019
stages:
- build
- test
variables:
GIT_SUBMODULE_STRATEGY: 'recursive'
build_kdi:
stage: build
only:
- CI_CD
tags:
- docker-windows
script:
- '& "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe" ./src/KDI/KDI.sln /t:Restore /p:AndroidBuildApplicationPackage=true /p:Configuration=Release'
- '& "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe" /p:Configuration=Release /t:SignAndroidPackage /property:SolutionDir="C:\builds\gitlab\HMI.Framework\KDI\src\KDI\" /p:AndroidSigningKeyStore="C:\builds\gitlab\HMI.Framework\KDI\distribution\Android\KrohneAndroidKeystore.keystore" .\src\KDI\KDI\KDI.Android\KDI.Android.csproj'
run_bb_tests:
stage: test
only:
- CI_CD
tags:
- docker-windows
script:
- docker-ci/install_and_run_bb_tests.bat "phone_ip" "5555" arg1 arg2 || true
- adb pull /storage/emulated/0/Android/data/myApp/files/Exports/BBT_Exports/BBTests_CI C:\test_results
artifacts:
paths:
- c:\test_results\BBTests_CI #expire in 1 month by default
如果我使用:docker run-it myImage powershell启动此映像,一切正常,但如果我运行它docker run-it myImage powershell-NoProfile,则msbuild在构建xamarin应用程序的某个步骤失败
函数Banana(){Write Host“Awesome”}
,例如$Home[my]Documents\PowerShell\profile.ps1。每当我打开PowerShell时,它都会自动加载该功能。因此,我可以打开PowerShell,键入banana
,并将字符串Awesome
写入stdout。如果我用-NoProfile启动powershell,并输入banana
,我会得到CommandNotFoundException
。
. "C:\path\to\powershell\profile.ps1"
点源.ps1文件将在当前范围内运行其中的任何内容,包括加载函数(如果存在)。
我在Gitlab方面的专业知识有限,但由于我对Windows容器、PowerShell的总体经验以及PowerShell配置文件的性质,我怀疑配置文件是否是这个问题的根本原因,但我没有足够的信息/证据来明确说明。希望这对你有所帮助 谢谢,关于-NoProfile不是“有罪”的说法似乎你是对的,我发现当我在没有docker的情况下运行CI,但使用powershell作为docker执行器时(powershell由Gitlab启动,与在docker容器中启动的方式相同,使用-NoProfile),构建就可以正常工作,因此-NoProfile不是原因。docker continaer中发生了一些事情,-NoProfile起了作用,但不知道为什么,我将暂时离开docker,继续使用CI机器的powershell作为gitlab执行器。。。