防止Gitlab在启动docker容器时向PowerShell添加-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

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启动容器),并重现了此问题

错误是:

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应用程序的某个步骤失败

  • 如何防止Gitlab在创建docker容器时添加-NoProfile
  • 显然你还不能

  • 使用powershell和-NoProfile有什么区别
  • PowerShell配置文件只是一个包含特定用户的自定义函数等内容的文件。例如,如果在我的PowerShell配置文件中有
    函数Banana(){Write Host“Awesome”}
    ,例如$Home[my]Documents\PowerShell\profile.ps1。每当我打开PowerShell时,它都会自动加载该功能。因此,我可以打开PowerShell,键入
    banana
    ,并将字符串
    Awesome
    写入stdout。如果我用-NoProfile启动powershell,并输入
    banana
    ,我会得到
    CommandNotFoundException

  • 如果我运行powershell-NoProfile以某种方式加载/运行默认配置文件并恢复设置-NoProfile标志的效果,有什么方法吗
  • 也许吧。我只是说可能是因为我还没有亲自测试过,但理论上它应该是有效的。如果配置文件在容器中,您所要做的就是点源文件

    . "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执行器。。。