いい加減にCI/CDに取り組もうといろいろ試行錯誤中…
単一のリポジトリなら楽なんだけど、複数ってなるといろいろ躓く。大変。
pipelines.ymlを頑張って書く
最初はテンプレから起こす。
複数リポジトリからのビルド
次はこれ。
例えば、メインプロジェクトAがフォルダーが違うプロジェクトBを参照しているような時
├── A
│ ├── ~~~~
├── B
│ ├── ~~~~
公式にあるように複数リポジトリの定義を追加
resources:
repositories:
- repository: sampleLib
type: git
name: sampleLib/sampleLib
ref: master
steps:
- checkout: self
- checkout: sampleLib
複数リポジトリにする場合はcheckout: self
もしておかないとメインがCheckoutされないので注意
参考)https://github.com/microsoft/azure-pipelines-yaml/blob/master/design/multi-checkout.md
はまったところ
セルフホステッドのAgent使っていると、途中のビルド失敗などでチェックアウトしたソースが残ってたりする。
そのため変な場所にある*.sln
を読み込んだりしてビルドに失敗する。
そういう場合はAgentのワークフォルダ(_work
)をまるごと削除してしまう。(リネームでもOK)
変なファイルを読み込んでいないかはビルドログを詳細に見ればわかる。
nugetでとれていないパッケージがある?
Build
ステージで失敗する。
単一のときは失敗しなかったのになんで?
##[error]C:\Program Files\dotnet\sdk\6.0.201\Sdks\Microsoft.NET.Sdk\targets\Microsoft.PackageDependencyResolution.targets(267,5):
Error NETSDK1064: パッケージ Microsoft.AspNetCore.Components.Analyzers、バージョン 3.1.6 が見つかりませんでした。
NuGet の復元により、削除された可能性があります。それ以外の場合、NuGet の復元が最大パス長の制限のために一部分しか完了していない可能性があります。
Nugetの復元がうまくいってない?と思って、以下のコードを追加した(がこれもうまくいかなかった)
参考にしたURL)https://github.com/MicrosoftDocs/azure-devops-docs/blob/main/docs/pipelines/packages/nuget-restore.md
- task: DotNetCoreCLI@2
displayName: dotnet restore
inputs:
command: restore
projects: '**/*.csproj'
feedsToUse: 'select'
vstsFeed: '<projectName>/<feedName>'
includeNuGetOrg: true
これを入れるとむしろ別のエラーが…
2022-04-11T15:14:47.5379548Z NuGet.Configuration.NuGetConfigurationException:
NuGet.Config が妥当な XML ではありません。
パス: 'C:\Users\hoge\source\vsts-agent-win-x64-2.202.0\_work\1\Nuget\tempNuGet_82.config'。
これもググれば出るような方法をやったがだめ。
なので上記のtaskは消した。
うまくいった方法
https://docs.microsoft.com/ja-jp/dotnet/core/tools/sdk-errors/netsdk1064
なんとかこのページに行き着いた。
やはりNugetの復元まわりみたい。なんで上のtaskだとうまくいかないのかわけわからん。
もう一行ビルドタスクを追加して、restoreさせた。
(restoreだけ追加したらビルドされずrestoreだけさせたので、別のタスクとして定義)
- task: VSBuild@1
inputs:
solution: '$(solution)'
msbuildArgs: '/t:restore'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
msbuildArgs
のところに/t:restore
を指定している。
これでうまくいった。やっとできた。