From b30a4da660f1c17a5a9e2300a6ec83423beb2414 Mon Sep 17 00:00:00 2001 From: keyldev Date: Thu, 28 May 2026 21:38:02 +0300 Subject: [PATCH 1/3] =?UTF-8?q?Added=20OpenIPC.Viewer.Desktop.slnx=20?= =?UTF-8?q?=E2=80=94=20same=20projects=20as=20the=20full=20solution=20minu?= =?UTF-8?q?s=20the=20two=20mobile=20heads.=20Pointed=20the=20desktop=20job?= =?UTF-8?q?'s=20restore/build/test=20at=20it=20in=20.github/workflows/buil?= =?UTF-8?q?d.yml:51.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 9 ++++++--- OpenIPC.Viewer.Desktop.slnx | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 OpenIPC.Viewer.Desktop.slnx diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b200935..da713b5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -48,14 +48,17 @@ jobs: shell: pwsh run: ./tools/fetch-ffmpeg.ps1 + # Mobile heads (Android/iOS) need workloads not installed on these + # runners and build in their own jobs — so the desktop matrix uses a + # solution that excludes them. - name: Restore - run: dotnet restore OpenIPC.Viewer.slnx + run: dotnet restore OpenIPC.Viewer.Desktop.slnx - name: Build - run: dotnet build OpenIPC.Viewer.slnx --configuration Release --no-restore /warnaserror + run: dotnet build OpenIPC.Viewer.Desktop.slnx --configuration Release --no-restore /warnaserror - name: Test - run: dotnet test OpenIPC.Viewer.slnx --configuration Release --no-build --verbosity normal + run: dotnet test OpenIPC.Viewer.Desktop.slnx --configuration Release --no-build --verbosity normal - name: Publish run: dotnet publish src/OpenIPC.Viewer.Desktop/OpenIPC.Viewer.Desktop.csproj -c Release -r ${{ matrix.rid }} --self-contained true /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true -o publish/${{ matrix.rid }} diff --git a/OpenIPC.Viewer.Desktop.slnx b/OpenIPC.Viewer.Desktop.slnx new file mode 100644 index 0000000..01fc2bf --- /dev/null +++ b/OpenIPC.Viewer.Desktop.slnx @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + From 08957773796544832db9455854d32899a1e48fdd Mon Sep 17 00:00:00 2001 From: keyldev Date: Thu, 28 May 2026 22:21:36 +0300 Subject: [PATCH 2/3] Fixed root cause: NETSDK1047 fires when a project is built for a runtime identifier that wasn't included in the restore. In the committed workflow (HEAD), the iOS job restored without a RID --- .github/workflows/build.yml | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index da713b5..8f285d3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -50,18 +50,20 @@ jobs: # Mobile heads (Android/iOS) need workloads not installed on these # runners and build in their own jobs — so the desktop matrix uses a - # solution that excludes them. + # solution that excludes them. The shared App project still multi-targets + # the mobile TFMs, so IncludeMobileTargets=false strips them to net9.0 for + # these builds (a solution build / restore evaluates every TFM otherwise). - name: Restore - run: dotnet restore OpenIPC.Viewer.Desktop.slnx + run: dotnet restore OpenIPC.Viewer.Desktop.slnx -p:IncludeMobileTargets=false - name: Build - run: dotnet build OpenIPC.Viewer.Desktop.slnx --configuration Release --no-restore /warnaserror + run: dotnet build OpenIPC.Viewer.Desktop.slnx --configuration Release --no-restore /warnaserror -p:IncludeMobileTargets=false - name: Test - run: dotnet test OpenIPC.Viewer.Desktop.slnx --configuration Release --no-build --verbosity normal + run: dotnet test OpenIPC.Viewer.Desktop.slnx --configuration Release --no-build --verbosity normal -p:IncludeMobileTargets=false - name: Publish - run: dotnet publish src/OpenIPC.Viewer.Desktop/OpenIPC.Viewer.Desktop.csproj -c Release -r ${{ matrix.rid }} --self-contained true /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true -o publish/${{ matrix.rid }} + run: dotnet publish src/OpenIPC.Viewer.Desktop/OpenIPC.Viewer.Desktop.csproj -c Release -r ${{ matrix.rid }} --self-contained true /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true -p:IncludeMobileTargets=false -o publish/${{ matrix.rid }} - name: Package (zip) if: matrix.archive == 'zip' @@ -177,11 +179,14 @@ jobs: - name: Install ios workload run: dotnet workload install ios + # iOS Release builds for the device RID (ios-arm64), so restore must be + # RID-specific or the assets file won't have a net10.0-ios/ios-arm64 + # target and the --no-restore build fails with NETSDK1047. - name: Restore - run: dotnet restore src/OpenIPC.Viewer.iOS/OpenIPC.Viewer.iOS.csproj + run: dotnet restore src/OpenIPC.Viewer.iOS/OpenIPC.Viewer.iOS.csproj -r ios-arm64 - name: Build (Release, warnings as errors) - run: dotnet build src/OpenIPC.Viewer.iOS/OpenIPC.Viewer.iOS.csproj -c Release --no-restore -p:TreatWarningsAsErrors=true + run: dotnet build src/OpenIPC.Viewer.iOS/OpenIPC.Viewer.iOS.csproj -c Release -r ios-arm64 --no-restore -p:TreatWarningsAsErrors=true # Unsigned IPA — TestFlight signing is post-MVP (Phase 11). The artifact # is a Release-published app bundle suitable for ad-hoc install via Xcode From 50ffc8603ae70463f06ce1241b396387ccab9884 Mon Sep 17 00:00:00 2001 From: keyldev Date: Thu, 28 May 2026 22:26:48 +0300 Subject: [PATCH 3/3] =?UTF-8?q?fix(CI):=20ios=20job=20=E2=80=94=20added=20?= =?UTF-8?q?continue-on-error:=20true=20so=20an=20Xcode-version=20failure?= =?UTF-8?q?=20no=20longer=20fails=20the=20workflow=20run.=20release=20job?= =?UTF-8?q?=20=E2=80=94=20changed=20the=20gate=20to=20always()=20&&=20=20&&=20build=3D=3Dsuccess=20&&=20android=3D=3Dsuccess,=20so?= =?UTF-8?q?=20tagged=20releases=20still=20go=20out=20without=20iOS,=20and?= =?UTF-8?q?=20any=20iOS=20artifact=20that=20does=20build=20still=20gets=20?= =?UTF-8?q?merged=20via=20download-artifact.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8f285d3..177b43a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -168,6 +168,11 @@ jobs: ios: runs-on: macos-14 name: build (ios) + # Non-blocking: the .NET 10 iOS workload pins to an Xcode version the + # GitHub macOS runners don't ship yet (workload 26.5 needs Xcode 26.5). + # Keep iOS best-effort until a matching runner image is available, rather + # than failing the whole workflow. See aka.ms/xcode-requirement. + continue-on-error: true steps: - uses: actions/checkout@v4 @@ -205,7 +210,10 @@ jobs: release: needs: [build, android, ios] - if: startsWith(github.ref, 'refs/tags/v') + # iOS is best-effort (see continue-on-error above), so don't gate releases + # on it — require only the desktop matrix + android to succeed. Any iOS + # artifact that did build still gets merged in via download-artifact. + if: always() && startsWith(github.ref, 'refs/tags/v') && needs.build.result == 'success' && needs.android.result == 'success' runs-on: ubuntu-latest permissions: contents: write