Автоматическая подпись ВСЕХ скомпилированных выходных файлов - PullRequest
1 голос
/ 17 июня 2020

У меня есть проект. net -core 3.1 (Microsoft. NET .Sdk.Web) в gitlab, и я настраиваю для него конвейер CI / CD. В качестве последнего шага я хочу, чтобы все выходные файлы .dll и .exe были подписаны нашим ключом. Я могу сделать это, вручную добавив некоторые команды signtool как часть файла gitlab-ci.yml, однако для этого потребуется войти в каждый проект и вручную настроить файл, чтобы отразить особенности этого проекта.

С другой стороны, я смог добавить общую цель c в файл .csproj, который вызывает signtool как команду exec / для $ (TargetDir) $ (TargetFileName). В определенной степени это работает, но не все подписывает. В этом случае он подписывает (например) cthulhu.dll, но не также cthulhu.Views.dll (оба из которых показаны в выводе CLI 'do tnet msbuild'), а также создается cthulhu.exe. но не отображается в выводе msbuild и также не подписан.

Файл csproj имеет это в качестве целевого объекта (пробовал запускать как после перестройки, так и после публикации sh):

  <Target Name="SignAssembly" AfterTargets="Rebuild">
<Message Text="Signing assembly '$(TargetDir)$(TargetFileName)'" Importance="high" />
<Exec Command="signtool sign /f &quot;mykey.pfx&quot; /p &quot;snip&quot; /tr http://timestamp.digicert.com  &quot;$(TargetDir)$(TargetFileName)&quot;" />

И файл gitlab-ci.yml выглядит так (я знаю, что использую контейнер sdk docker, но, похоже, он позволяет мне поддерживать. net -core builds в любом случае, в то время как существует ошибка, препятствующая работе указанного контейнера c. net -core):

image: mcr.microsoft.com/dotnet/framework/sdk:4.8

stages:
  - build
  - release

build:
  stage: build
  script:
    - 'dotnet build -r win-x64'

release:
    stage: release
    script:
      - 'dotnet add package signtool --version 10.0.17763.132'
      - 'dotnet msbuild cthulhu.csproj /t:"Restore;Rebuild;SignAssembly;Publish" /p:SelfContained=True /p:PublishProtocol=FileSystem /p:Configuration=Release /p:Platform=x64 /p:TargetFrameworks=netcoreapp3.1 /p:PublishDir=bin\Release\netcoreapp3.1\publish\win-x64 /p:RuntimeIdentifier=win-x64 /p:PublishReadyToRun=False /p:PublishTrimmed=True'
    artifacts:
      name: "$CI_JOB_STAGE-$CI_COMMIT_REF_NAME" 
      paths:
        - '.\bin\Release\netcoreapp3.1\publish\win-x64'

1 Ответ

0 голосов
/ 21 июня 2020

Почему бы не использовать стандартные инструменты - Directory.Build.props ?

Однако теперь вы можете добавить новое свойство в каждый проект за один шаг, определив его в один файл с именем Directory.Build.props в папке root, содержащей ваш источник. При запуске MSBuild Microsoft.Common.props ищет в вашей структуре каталогов файл Directory.Build.props (а Microsoft.Common.targets ищет Directory.Build.targets). Если он его находит, он импортирует свойство. Directory.Build.props - это определяемый пользователем файл, который предоставляет настройки для проектов в каталоге

Указывает, что сборка должна быть подписана:

<SignAssembly>true</SignAssembly>

Ключ указывается с использованием следующего property:

<AssemblyOriginatorKeyFile>key.pfx</AssemblyOriginatorKeyFile>

То есть в результате эти свойства будут импортированы в проекты и вы добьетесь желаемого результата.

...