【问题标题】:Prevent Gitlab adding -NoProfile to PowerShell when starting a docker container启动 docker 容器时防止 Gitlab 将 -NoProfile 添加到 PowerShell
【发布时间】:2021-01-17 23:06:43
【问题描述】:

1.如何防止Gitlab在创建docker容器时添加-NoProfile?

2。使用带 -NoProfile 和不带 -NoProfile 的 powershell 有什么区别?

3.如果我运行 powershell -NoProfile 以某种方式加载/运行默认配置文件并恢复设置 -NoProfile 标志的效果,有什么办法吗?

现在这些问题背后的故事:

在 Gitlab 使用 Powershell -NoProfile 启动的 docker 容器中使用时,MSBuild(Visual Studio 构建工具命令)无法构建 Xamarin 应用程序。

我为 CI 目的创建了一个 docker 映像,如果我手动运行容器,一切都可以正常工作,但是当它在 Gitlab 运行程序作业期间运行时,它会失败(更确切地说是 msbuild /t:SignAndroidPackage 失败,因为某些文件确实不会生成)。我检查了这个(在 gitlab-ci.yml 中休眠 1 小时并附加到运行器机器上的容器),发现 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 应用程序的某个步骤

【问题讨论】:

    标签: powershell docker xamarin msbuild gitlab


    【解决方案1】:
    1. 如何防止 Gitlab 在创建 docker 容器时添加 -NoProfile?

    显然你还不能……but there is a feature request in place

    1. 使用带有 -NoProfile 和不带 -NoProfile 的 powershell 有什么区别?

    PowerShell 配置文件只是一个包含特定用户的内容(例如自定义函数)的文件。例如,如果我的 PowerShell 配置文件中包含 Function Banana(){Write-Host "Awesome"},例如 $Home[My ]Documents\PowerShell\Profile.ps1。每当我打开 PowerShell 时,它都会自动加载该功能。所以我可以打开 PowerShell,输入 banana 并将字符串 Awesome 写入标准输出。如果我要使用 -NoProfile 启动 powershell,然后输入 banana,我会得到 CommandNotFoundExceptionsource

    1. 如果我运行 powershell -NoProfile 以某种方式加载/运行默认配置文件并恢复设置 -NoProfile 标志的效果,有什么办法吗?

    也许吧。我只是说也许是因为我没有亲自测试过它,但理论上它应该可以工作。如果配置文件在容器中,您所要做的就是点源它。

    . "C:\path\to\powershell\profile.ps1"
    

    点源 .ps1 文件将在当前范围内运行其中的任何内容,包括加载函数(如果存在)。 dot source docs

    我在 Gitlab 方面的专业知识有限,但由于我在 Windows 容器、PowerShell 以及 PowerShell 配置文件的性质方面的整体经验,我怀疑分析是这个问题的根本原因,但我不有足够的信息/证据来明确地说。希望这在某种程度上有所帮助!

    【讨论】:

    • 谢谢,看来你是对的 -NoProfile 不是“有罪”的,我发现当我在没有 docker 的情况下运行 CI 时,但使用 powershell 作为 docker executor(powershell 已启动通过 Gitlab 与在 docker 容器中启动的方式相同,使用 -NoProfile) 构建工作正常,因此 -NoProfile 不是原因。 docker continaer 中发生了一些事情,-NoProfile 有所作为,但不知道为什么,我现在将离开 docker,并坚持使用 CI 机器中的 powershell 作为 gitlab 执行器......
    猜你喜欢
    • 2023-01-25
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2020-06-17
    • 1970-01-01
    相关资源
    最近更新 更多