Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Azure Pipelines můžete použít k vytváření automatizovaných buildů pro projekty UPW. V tomto článku se podíváme na různé způsoby, jak to udělat. Ukážeme vám také, jak tyto úlohy provádět pomocí příkazového řádku, abyste se mohli integrovat s jakýmkoli jiným systémem sestavení.
Vytvoření nového kanálu Azure Pipeline
Začněte tím, že registraci ke službě Azure Pipelines, pokud jste to ještě neudělali.
Dále vytvořte kanál, který můžete použít k sestavení zdrojového kódu. Kurz vytvoření kanálu pro sestavení úložiště GitHub najdete v tématu Vytvoření prvního kanálu. Azure Pipelines podporuje typy úložišť uvedené v tomto článku.
Nastavení automatizovaného sestavení
Začneme s výchozí definicí sestavení UPW, která je dostupná v Azure Dev Ops, a ukážeme vám, jak kanál nakonfigurovat.
V seznamu šablon definic sestavení zvolte šablonu Univerzální platforma Windows.
Tato šablona obsahuje základní konfiguraci pro sestavení projektu UPW:
trigger:
- master
pool:
vmImage: 'windows-latest'
variables:
solution: '**/*.sln'
buildPlatform: 'x86|x64|ARM'
buildConfiguration: 'Release'
appxPackageDir: '$(build.artifactStagingDirectory)\AppxPackages\\'
steps:
- task: NuGetToolInstaller@1
- task: NuGetCommand@2
inputs:
restoreSolution: '$(solution)'
- task: VSBuild@1
inputs:
platform: 'x86'
solution: '$(solution)'
configuration: '$(buildConfiguration)'
msbuildArgs: '/p:AppxBundlePlatforms="$(buildPlatform)" /p:AppxPackageDir="$(appxPackageDir)" /p:AppxBundle=Always /p:UapAppxPackageBuildMode=StoreUpload'
Výchozí šablona se pokusí podepsat balíček certifikátem zadaným v souboru .csproj. Pokud chcete balíček podepsat během sestavování, musíte mít přístup k privátnímu klíči. V opačném případě můžete podepisování zakázat přidáním parametru /p:AppxPackageSigningEnabled=false do oddílu msbuildArgs v souboru YAML.
Přidání certifikátu projektu do knihovny zabezpečených souborů
Pokud je to možné, měli byste se vyhnout odesílání certifikátů do úložiště a Git je ve výchozím nastavení ignoruje. Pro správu bezpečného zpracování citlivých souborů, jako jsou certifikáty, podporuje Azure DevOps funkci zabezpečených souborů.
Chcete-li nahrát certifikát pro automatizované sestavení:
V Azure Pipelines rozklikněte Pipelines v navigačním podokně a klikněte na Knihovna.
Klikněte na kartu Zabezpečené soubory a potom klikněte na + Zabezpečit soubor.
Přejděte do souboru certifikátu a klikněte na OK.
Po nahrání certifikátu ho vyberte a zobrazte jeho vlastnosti. V části Oprávnění potrubípovolte přepínač Autorizovat pro použití ve všech potrubích.
Pokud má privátní klíč v certifikátu heslo, doporučujeme uložit heslo do služby Azure Key Vault a pak heslo propojit se skupinou proměnných . Proměnnou můžete použít pro přístup k heslu z pipeline. Mějte na paměti, že heslo je podporováno pouze pro privátní klíč; použití souboru certifikátu, který je sám o sobě chráněný heslem, se v současné době nepodporuje.
Poznámka:
Od sady Visual Studio 2019 se v projektech UPW už negeneruje dočasný certifikát. K vytvoření nebo exportu certifikátů použijte rutiny PowerShellu popsané v tomto článku.
Konfigurujte úlohu sestavení řešení
Tato úloha zkompiluje jakékoli řešení, které je v pracovní složce, do binárních souborů a vytvoří výstupní soubor balíčku aplikace. Tato úloha používá argumenty MSBuild. Budete muset zadat hodnotu těchto argumentů. Jako vodítko použijte následující tabulku.
| Argument pro MSBuild | Hodnota | Popis |
|---|---|---|
| AppxPackageDir | $(Build.ArtifactStagingDirectory)\AppxPackages | Definuje složku pro uložení vygenerovaných artefaktů. |
| AppxBundlePlatforms | $(Build.BuildPlatform) | Umožňuje definovat platformy, které se mají zahrnout do sady. |
| AppxBundle | Vždy | Vytvoří soubor .msixbundle/.appxbundle se soubory .msix/.appx pro zadanou platformu. |
| UapAppxPackageBuildMode (režim vytváření balíčku) | StoreUpload | Vygeneruje soubor .msixupload/.appxupload a složku _Test pro postranní načtení. |
| UapAppxPackageBuildMode | CI | Vygeneruje pouze soubor .msixupload/.appxupload. |
| UapAppxPackageBuildMode | SideloadOnly | Vygeneruje složku _Test pouze pro zkušební načtení. |
| Povolení podepisování balíčku Appx | pravda | Povolí podepisování balíčků. |
| OtiskCertifikátuBalíčku | Otisk certifikátu | Tato hodnota musí odpovídat kryptografickému otisku v podpisovém certifikátu nebo musí být prázdný řetězec. |
| SouborKlíčeCertifikátuBalíčku | Cesta | Cesta k certifikátu, který se má použít. Tato hodnota se načte z metadat zabezpečených souborů. |
| Heslo balíčku certifikátu | Heslo | Heslo pro privátní klíč v certifikátu. Doporučujeme uložit heslo ve službě Azure Key Vault a propojit ho se skupinou proměnných. Proměnnou můžete předat do tohoto argumentu. |
Konfigurujte sestavení
Pokud chcete sestavit řešení pomocí příkazového řádku nebo pomocí jakéhokoli jiného systému sestavení, spusťte nástroj MSBuild s těmito argumenty.
/p:AppxPackageDir="$(Build.ArtifactStagingDirectory)\AppxPackages\\"
/p:UapAppxPackageBuildMode=StoreUpload
/p:AppxBundlePlatforms="$(Build.BuildPlatform)"
/p:AppxBundle=Always
Konfigurace podepisování balíčků
Pokud chcete podepsat balíček MSIX (nebo .appx), musí pipelina načíst podpisový certifikát. Uděláte to tak, že před úlohu VSBuild přidáte úlohu DownloadSecureFile.
Tím získáte přístup k podpisovém certifikátu prostřednictvím signingCert.
- task: DownloadSecureFile@1
name: signingCert
displayName: 'Download CA certificate'
inputs:
secureFile: '[Your_Pfx].pfx'
Dále aktualizujte úlohu VSBuild tak, aby odkazovala na podpisový certifikát.
- task: VSBuild@1
inputs:
platform: 'x86'
solution: '$(solution)'
configuration: '$(buildConfiguration)'
msbuildArgs: '/p:AppxBundlePlatforms="$(buildPlatform)"
/p:AppxPackageDir="$(appxPackageDir)"
/p:AppxBundle=Always
/p:UapAppxPackageBuildMode=StoreUpload
/p:AppxPackageSigningEnabled=true
/p:PackageCertificateThumbprint=""
/p:PackageCertificateKeyFile="$(signingCert.secureFilePath)"'
Poznámka:
Argument PackageCertificateThumbprint je záměrně nastaven na prázdný řetězec jako preventivní opatření. Pokud je v projektu nastaven otisk prstu, ale neodpovídá podpisovému certifikátu, dojde k chybě sestavení: Certificate does not match supplied signing thumbprint.
Kontrola parametrů
Parametry definované pomocí syntaxe $() jsou proměnné definované v definici sestavení a změní se v jiných systémech sestavení.
Pokud chcete zobrazit všechny předdefinované proměnné, podívejte se na Předdefinované proměnné sestavení.
Nakonfigurujte úlohu Zveřejnění artefaktů sestavení
Výchozí kanál UPW neukládá vygenerované artefakty. Pokud chcete do definice YAML přidat možnosti publikování, přidejte následující úlohy.
- task: CopyFiles@2
displayName: 'Copy Files to: $(build.artifactstagingdirectory)'
inputs:
SourceFolder: '$(system.defaultworkingdirectory)'
Contents: '**\bin\$(BuildConfiguration)\**'
TargetFolder: '$(build.artifactstagingdirectory)'
- task: PublishBuildArtifacts@1
displayName: 'Publish Artifact: drop'
inputs:
PathtoPublish: '$(build.artifactstagingdirectory)'
Vygenerované artefakty můžete zobrazit v možnosti Artefakty na stránce výsledků sestavení.
Vzhledem k tomu, že jsme nastavili argument UapAppxPackageBuildMode na StoreUpload, obsahuje složka artefaktů balíček pro odeslání do Storu (.msixupload/.appxupload). Mějte na paměti, že do Storu můžete odeslat také běžný balíček aplikace (.msix/.appx) nebo sadu aplikací (.msixbundle/.appxbundle/). Pro účely tohoto článku použijeme soubor .appxupload.
Řešení chyb balíčku
Pokud do řešení přidáte více než jeden projekt UPW a pak se pokusíte vytvořit sadu, může se zobrazit chyba podobná této.
MakeAppx(0,0): Error : Error info: error 80080204: The package with file name "AppOne.UnitTests_0.1.2595.0_x86.appx" and package full name "8ef641d1-4557-4e33-957f-6895b122f1e6_0.1.2595.0_x86__scrj5wvaadcy6" is not valid in the bundle because it has a different package family name than other packages in the bundle
Tato chyba se zobrazí, protože na úrovni řešení není jasné, která aplikace by se měla v sadě zobrazit. Pokud chcete tento problém vyřešit, otevřete každý soubor projektu a na konec prvního prvku <PropertyGroup> přidejte následující vlastnosti.
| Projekt | Vlastnosti |
|---|---|
| Aplikace | <AppxBundle>Always</AppxBundle> |
| UnitTests | <AppxBundle>Never</AppxBundle> |
Poté odeberte argument AppxBundle MSBuild z kroku sestavení.