Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ビルドシステムを C# 大統一したお話

ビルドシステムを C# 大統一したお話

2024/08/02 (Fri) に開催された「Unity CI/CD 完全に理解した勉強会」にて発表しました。
Unity のビルドシステムを C# 大統一した際に得られた知見を紹介しています。

Tetsuya Mori

August 02, 2024
Tweet

More Decks by Tetsuya Mori

Other Decks in Programming

Transcript

  1. w6OJUZ5FTU3VOOFSΛίϚϯυϥΠϯ͔Β࣮ߦ 15 ΋͏ͪΐ͍LXTL$* 6OJUZʹԙ͚Δ$*$% /path/to/Unity \ -runTests \ -batchmode \

    -projectPath /path/to/project \ -testResults /path/to/result \ -logFile /path/to/log
  2. w1MBZFSϏϧυ 16 ΋͏ͪΐ͍LXTL$% 6OJUZʹԙ͚Δ$*$% using UnityEngine; BuildPipeline.BuildPlayer( new BuildPlayerOptions {

    scenes = EditorBuildSettings.scenes.Select(x => x.path).ToArray(), options = BuildOptions.Development | BuildOptions.AllowDebugging | BuildOptions.ConnectWithProfiler, locationPathName = "/path/to/export", target = EditorUserBuildSettings.activeBuildTarget, targetGroup = BuildPipeline.GetBuildTargetGroup( EditorUserBuildSettings.activeBuildTarget ), } );
  3. wύϥϝʔλఆٛΛू໿ wύϥϝʔλͷݩωλຖʹ IParameterSourceΛ࣮૷ w౷Ұతͳ*'ͰύϥϝʔλΞΫηε 32 $େ౷ҰͷϙΠϯτ ϏϧυγεςϜΛ$େ౷Ұ͓ͨ͠࿩ public readonly partial

    record struct Parameter( string Name, ParameterType ParameterType, InputCondition InputCondition, string EnvironmentVariableName, string GitHubKey, string SlackKey, string InfoPlistKey, string? Label = default, Func<ParameterProvider, object>? ValueFactory = default, object? DefaultValue = default ) public interface IParameterSource { bool TryGetValue(Parameter parameter, out object? value); } public partial record UnityProjectSettings( UnityPlayerSettings PlayerSettings ) : IParameterSource {} public sealed class EnvironmentVariable( IConfiguration configuration ) : IParameterSource {} public sealed class ParameterProvider { public T? GetValue<T>( Parameter parameter, T? defaultValue = default ) { // 登録済の IParameterSource 達から値を取得 } }
  4. wΈΜͳେ޷͖J04ͷ1SPWJTJPOJOH1SP fi MFT͸"QQ4UPSF $POOFDUʹ؅ཧͯ͠΋Β͍·͠ΐ͏ w*TTVFS*%,FZ*%1SJWBUF,FZΛద੾ʹઃఆ͢Ε͹ "E)PDϏϧυͱ͔΋Ϥγφʹ࡞Ε·͢ w1SJWBUF,FZ͸#BTF &ODPEFEͳจࣈྻΛ 4FDSFUTʹஔ͍ͱ͍ͯɺ ࣮ߦ࣌ʹbase64

    -d͢Δײ͡Ͱ 42 $MPVE.BOBHFE$FSUJ fi DBUFT $େ౷Ұͨ͠ࡍʹಘΒΕͨ஌ݟ $ xcodebuild -exportArchive \ -archivePath /path/to/archive \ -exportPath /path/to/export_directory \ -exportOptionsPlist ExportOptions.plist \ -allowProvisioningUpdates \ -authenticationKeyIssuerID <IssuerID> \ -authenticationKeyID <API Key ID> \ -authenticationKeyPath <API Key Path>
  5. w4FMGIPTUFE3VOOFS͸ৗறϓϩηεͱͯ͠ಈ͘/&5"QQMJDBUJPO wϙʔϦϯάର৅ͷSFQPPSHͱࣗ਎ͷ-BCFM T Λઃఆ͢Δ w؂ࢹର৅ͷSFQPPSHʹ+PC͕&ORVFVF͞Εɺ 自身の全 Label ⊇ Job の

    runs-on に列挙された全 Label ͱͳ͍ͬͯΔ৔߹ʹ+PCΛ%FRVFVFͯ͠:".-ʹॻ͔Ε͍ͯΔ 4UFQ T Λ࣮ߦ͢Δ w୯ҰͷδϣϒͷΈ࣮ߦՄೳ w-BCFMઃܭΛϛεΔͱौ଺͕ൃੜ͢Δ 53 4FMGIPTUFE3VOOFSͷ-BCFMେࣄ $େ౷Ұͨ͠ࡍʹಘΒΕͨ஌ݟ
  6. w࣮ߦ͢Δ3VOOFSͷ-BCFMΛ8PSL fl PXͷύϥ ϝʔλͱͯ͠ड͚෇͚ΔΑ͏ʹ͢Δͱ։ൃ࣌ʹศར 54 4FMGIPTUFE3VOOFS΋։ൃ༻Λ༻ҙ $େ౷Ұͨ͠ࡍʹಘΒΕͨ஌ݟ name: Build Player

    on: workflow_dispatch: inputs: runner-label: description: 'Runner のラベル' required: false type: string default: 'buildpipeline-runner' jobs: build_player: name: "Build Player" runs-on: - self-hosted - ${{ inputs.runner-label }}
  7. wࣄલʹϏϧυͨ͠όΠφϦΛϦϙδτϦʹؚΊΔ͜ͱ Ͱ࣮ߦ࣌ؒઅ໿ 55 $POTPMF"QQ͸ࣄલϏϧυ͓ͯ͘͠ $େ౷Ұͨ͠ࡍʹಘΒΕͨ஌ݟ <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net8.0</TargetFramework>

    <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <RootNamespace>BuildPipeline</RootNamespace> <!-- シェルからキックされるバイナリとして単一バイナリを Publish する --> <PublishSingleFile>false</PublishSingleFile> <!-- Self-hosted Runner 端末上に .NET がインストールされていることを期待する --> <SelfContained>false</SelfContained> <!-- ビルドする OS を指定する --> <RuntimeIdentifiers>osx-arm64;win-x64</RuntimeIdentifiers> <!-- Default Runtime は Apple Silicon な macOS とする --> <RuntimeIdentifier>osx-arm64</RuntimeIdentifier> <!-- pdb を埋め込む --> <DebugType>embedded</DebugType> <!-- 単一バイナリの出力先 --> <ArtifactsDir>.github/actions/bin/</ArtifactsDir> <!-- UserSecrets の ID --> <UserSecretsId>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</UserSecretsId> <!-- Root 名前空間 --> <RootNamespace>KidsStar.BuildPipeline.Console</RootNamespace> </PropertyGroup>
  8. w6OJUZΤσΟλʔͷίϚϯυϥΠϯҾ਺ 6OJUZ%PDVNFOUBUJPO  w6OJUZ5FTU'SBNFXPSL 6OJUZ1BDLBHF%PDVNFOUBUJPO  w6OJUZ5FTU'SBNFXPSL׬શ߈ུΨΠυୈ൛ #005)͍͔খ԰  wδϣϒʹϚτϦοΫεΛ࢖༻͢Δ

    (JU)VC"DUJPOT%PDT  wDMPVEQPTTFHJUIVCBDUJPONBUSJYPVUQVUTXSJUF!W wDMPVEQPTTFHJUIVCBDUJPONBUSJYPVUQVUTSFBE!W w$MPVE.BOBHFE$FSUJ fi DBUFT "QQMF%FWFMPQFS)FMQ 58 "QQFOEJY ·ͱΊ