@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/winforms-wpf-cicd-github-actions/#article>
    schema:about <https://comcomponent.com/knowledge/desktop-app-cicd-pipeline/>, <https://comcomponent.com/knowledge/github-actions/> ;
    schema:mentions <https://comcomponent.com/knowledge/windows-forms/>, <https://comcomponent.com/knowledge/wpf/>, <https://comcomponent.com/knowledge/windows-runner/>, <https://comcomponent.com/knowledge/build-test-automation/>, <https://comcomponent.com/knowledge/tag-driven-versioning/>, <https://comcomponent.com/knowledge/github-release/>, <https://comcomponent.com/knowledge/code-signing-cert/>, <https://comcomponent.com/knowledge/hsm-key-storage/>, <https://comcomponent.com/knowledge/azure-artifact-signing/>, <https://comcomponent.com/knowledge/github-actions-environment/>, <https://comcomponent.com/knowledge/github-actions-secrets/>, <https://comcomponent.com/knowledge/signing-key-exposure-risk/>, <https://comcomponent.com/knowledge/signtool/>, <https://comcomponent.com/knowledge/code-signing-timestamp/>, <https://comcomponent.com/knowledge/msix/>, <https://comcomponent.com/knowledge/clickonce/>, <https://comcomponent.com/knowledge/msi/>, <https://comcomponent.com/knowledge/xcopy-distribution/> .

<https://comcomponent.com/knowledge/desktop-app-cicd-pipeline/> a skos:Concept ;
    skos:prefLabel "デスクトップアプリのCI/CDパイプライン"@ja ;
    skos:definition "デプロイ先が客先・現場のPCであるWinForms/WPFデスクトップアプリを対象に、ビルド・テスト・バージョン採番・署名・配布物作成を自動化する仕組み。出口は本番反映ではなく署名済み配布物の完成である。"@ja ;
    skos:altLabel "WinForms/WPFのCI/CD"@ja ;
    ks:uses <https://comcomponent.com/knowledge/build-test-automation/> ;
    ks:uses <https://comcomponent.com/knowledge/tag-driven-versioning/> .

<https://comcomponent.com/knowledge/github-actions/> a skos:Concept ;
    skos:prefLabel "GitHub Actions"@ja ;
    skos:definition "GitHubが提供する、リポジトリのイベントをトリガーにワークフローを実行するCI/CDサービス。"@ja ;
    skos:altLabel "GitHub Actions workflow" .

<https://comcomponent.com/knowledge/windows-runner/> a skos:Concept ;
    skos:prefLabel "Windowsランナー(windows-latest)"@ja ;
    skos:definition "GitHub ActionsのWindows向けホステッドランナー。ジョブごとに新しい仮想マシンが割り当てられ、WinForms/WPFのビルドとdotnet testの実行に使われる。"@ja ;
    skos:altLabel "GitHub-hosted Windows runner" .

<https://comcomponent.com/knowledge/windows-forms/> a skos:Concept ;
    skos:prefLabel "Windows Forms"@ja ;
    skos:definition "デスクトップGUIアプリケーションを構築するための.NET/.NET FrameworkのUIフレームワーク。"@ja ;
    skos:altLabel "WinForms" .

<https://comcomponent.com/knowledge/wpf/> a skos:Concept ;
    skos:prefLabel "WPF"@ja ;
    skos:definition "XAMLでUIを宣言的に記述する、Windows専用のデスクトップUIフレームワーク。ベクターベースの描画とデータバインディングを特徴とする。"@ja ;
    skos:altLabel "Windows Presentation Foundation" .

<https://comcomponent.com/knowledge/build-test-automation/> a skos:Concept ;
    skos:prefLabel "ビルド+テストの自動化"@ja ;
    skos:definition "windows-latestランナーでのdotnet build/testの実行と、actions/upload-artifactによる成果物の保存だけを行う、CI/CD導入の最小構成。"@ja ;
    skos:altLabel "最小構成のCI"@ja .

<https://comcomponent.com/knowledge/code-signing-cert/> a skos:Concept ;
    skos:prefLabel "コード署名証明書"@ja ;
    skos:definition "ソフトウェアの発行元を証明し、改ざんを検出するための証明書。"@ja ;
    skos:altLabel "Authenticode証明書"@ja .

<https://comcomponent.com/knowledge/tag-driven-versioning/> a skos:Concept ;
    skos:prefLabel "タグ駆動リリース(バージョン採番)"@ja ;
    skos:definition "v1.2.3のようなタグのpushをトリガーにリリースビルドを起動し、MSBuildのVersionプロパティにタグから取った値を注入するバージョン採番の方式。"@ja ;
    skos:altLabel "Tag-driven release" .

<https://comcomponent.com/knowledge/github-release/> a skos:Concept ;
    skos:prefLabel "GitHubリリース"@ja ;
    skos:definition "タグビルドの成果物を、Actionsアーティファクトの保持期限(既定90日)を超えて長期保管するための、GitHubリポジトリの恒久的な置き場所。"@ja ;
    skos:altLabel "GitHub Release" .

<https://comcomponent.com/knowledge/hsm-key-storage/> a skos:Concept ;
    skos:prefLabel "HSM/トークンでの秘密鍵保管"@ja ;
    skos:definition "2023年6月1日以降のCA/Browser Forum基準により、コード署名証明書の秘密鍵をFIPS 140-2レベル2相当以上のハードウェア(HSMやUSBトークン)で生成・保管することを義務付けたもの。"@ja ;
    skos:altLabel "FIPS 140-2レベル2"@ja .

<https://comcomponent.com/knowledge/azure-artifact-signing/> a skos:Concept ;
    skos:prefLabel "Azure Artifact Signing"@ja ;
    skos:definition "Microsoftが提供するクラウド型のコード署名サービス(旧Trusted Signing)。物理USBトークンを使わずCI/CDに組み込め、本番配布のMSIX署名で推奨される選択肢に位置付けられるが、利用可能な地域は法人が米国・カナダ・EU・英国、個人が米国・カナダに限られ、日本の開発者は利用できない。"@ja ;
    skos:altLabel "Trusted Signing" ;
    skos:altLabel "Artifact Signing" .

<https://comcomponent.com/knowledge/github-actions-environment/> a skos:Concept ;
    skos:prefLabel "GitHub Actions Environment(承認者付き環境)"@ja ;
    skos:definition "承認者やシークレットを紐づけられるGitHub Actionsのデプロイ環境の仕組み。署名鍵などの機微なシークレットを、特定のワークフロー・ジョブだけがアクセスできるように制限するために使う。"@ja ;
    skos:altLabel "Environment protection rules" ;
    ks:mitigates <https://comcomponent.com/knowledge/signing-key-exposure-risk/> .

<https://comcomponent.com/knowledge/signing-key-exposure-risk/> a skos:Concept ;
    skos:prefLabel "署名鍵の窃取リスク"@ja ;
    skos:definition "署名用シークレットをリポジトリシークレットとして直接参照する構成のままだと、書き込み権限を持つ人(または乗っ取られたアカウント)がワークフローを書き換えてタグを1本pushするだけで署名鍵を取り出せてしまうリスク。"@ja ;
    skos:altLabel "Signing key exposure" .

<https://comcomponent.com/knowledge/github-actions-secrets/> a skos:Concept ;
    skos:prefLabel "GitHub Actionsのシークレット"@ja ;
    skos:definition "PFXファイルのBase64文字列やパスワードなど、機微な値をワークフローへ安全に渡すためのGitHub Actionsの仕組み。ログでは自動的にマスクされ、フォークからのプルリクエストには渡らない。"@ja ;
    skos:altLabel "Encrypted secrets" .

<https://comcomponent.com/knowledge/signtool/> a skos:Concept ;
    skos:prefLabel "SignTool"@ja ;
    skos:definition "コード署名とRFC 3161タイムスタンプの付与、および署名の検証を行うWindows SDK付属のコマンドラインツール。"@ja ;
    skos:altLabel "signtool.exe" ;
    ks:uses <https://comcomponent.com/knowledge/code-signing-cert/> .

<https://comcomponent.com/knowledge/code-signing-timestamp/> a skos:Concept ;
    skos:prefLabel "コード署名のタイムスタンプ"@ja ;
    skos:definition "署名時刻をRFC 3161タイムスタンプサーバーで証明する付与情報。証明書の期限が切れても署名の有効性を保つ。"@ja ;
    skos:altLabel "RFC 3161タイムスタンプ"@ja .

<https://comcomponent.com/knowledge/msix/> a skos:Concept ;
    skos:prefLabel "MSIX"@ja ;
    skos:definition "package identityを持つ、Windowsのモダンなアプリパッケージング形式。"@ja ;
    skos:altLabel "MSIX" ;
    ks:requires <https://comcomponent.com/knowledge/code-signing-cert/> .

<https://comcomponent.com/knowledge/xcopy-distribution/> a skos:Concept ;
    skos:prefLabel "xcopy配布(zip)"@ja ;
    skos:definition "dotnet publishの出力を圧縮するだけで完成する、最もCIへの組み込みが簡単な配布方式。自動更新は持たず手動展開が前提。"@ja ;
    skos:altLabel "xcopy deployment" .

<https://comcomponent.com/knowledge/clickonce/> a skos:Concept ;
    skos:prefLabel "ClickOnce"@ja ;
    skos:definition ".NETのWindowsデスクトップアプリを、利用者単位で簡単に配り、自動更新まで含めて回すための配布技術。マニフェストを中心に配布・更新・キャッシュ管理をまとめて扱う配布モデル。"@ja ;
    skos:altLabel "ClickOnce配布"@ja .

<https://comcomponent.com/knowledge/msi/> a skos:Concept ;
    skos:prefLabel "MSI(Windows Installer)"@ja ;
    skos:definition "Windowsの標準インストーラーパッケージ形式。ALLUSERSプロパティなどでインストール先の範囲を選べ、machine-wide installが一般的だがユーザー単位のインストールもできる。"@ja ;
    skos:altLabel "Windows Installer" ;
    skos:altLabel "MSI" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/desktop-app-cicd-pipeline/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/github-actions/> ;
    schema:description "本記事はGitHub Actionsを前提に、WinForms/WPFデスクトップアプリのCI/CDパイプラインをビルド・テスト・署名・配布のステップとして組み立てる。同じパイプラインはAzure DevOpsやJenkins、GitLab CIなど別のランナーでも構成でき、GitHub Actionsが必須なわけではない。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/devops/github-actions-overview> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/desktop-app-cicd-pipeline/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/windows-runner/> ;
    schema:description "UIに依存するテストやWindows専用のパッケージング・署名など、実行を伴う手順を含む場合、WinForms/WPFデスクトップアプリのCI/CDパイプラインはGitHub Actionsのwindows-latestのようなWindowsランナーを前提とする。EnableWindowsTargetingでのビルドと環境非依存のテスト、xcopy形式の成果物だけならLinuxランナーでも通る。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/project-sdk/msbuild-props-desktop> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/windows-forms/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/windows-runner/> ;
    schema:description "WinFormsプロジェクトはWindows専用TFMを対象とするが、EnableWindowsTargetingを有効にすればLinux上でもビルドできる。Windowsランナーが要るのは、UIに依存するdotnet testのように実行を伴う手順である。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/project-sdk/msbuild-props-desktop> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/wpf/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/windows-runner/> ;
    schema:description "WPFプロジェクトも同様にWindows専用TFMを対象とするが、EnableWindowsTargetingを有効にすればLinux上でもビルドできる。Windowsランナーが要るのは実行を伴う手順である。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/project-sdk/msbuild-props-desktop> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/desktop-app-cicd-pipeline/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/build-test-automation/> ;
    schema:description "CI/CD導入の第一段階は、pushのたびにwindows-latestランナーでdotnet build/testが走り成果物を取り出せる、ビルド+テストの自動化である。"@ja ;
    ks:evidence <https://docs.github.com/en/actions/reference/runners/github-hosted-runners> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/build-test-automation/> ;
    rdf:predicate ks:shouldPrecede ;
    rdf:object <https://comcomponent.com/knowledge/code-signing-cert/> ;
    schema:description "署名・配布の自動化より先に、まずビルド+テストの自動化だけを入れるのが実務の順序であり、最初から全部を組もうとすると署名周りで止まりがちになる。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/devops/github-actions-overview> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/desktop-app-cicd-pipeline/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/tag-driven-versioning/> ;
    schema:description "バージョン採番はv1.2.3のようなタグのpushをトリガーに、タグの値をMSBuildのVersionプロパティへ注入するタグ駆動リリースが実務の落としどころになる。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/assembly/set-attributes-project-file> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/tag-driven-versioning/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/github-release/> ;
    schema:description "GitHub Actionsで組んだパイプラインでは、タグビルドの成果物はActionsアーティファクトの保持期限を避けるため、GitHubリリースへ添付して長期保管する。"@ja ;
    ks:evidence <https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/using-github-cli-in-workflows> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/desktop-app-cicd-pipeline/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/code-signing-cert/> ;
    schema:description "Store外で配布するWindowsアプリにコード署名が実質必須であるため、配布物の完成を出口とするCI/CDパイプラインは公的なコード署名証明書を前提とする。ビルド+テストだけの最小段階では不要。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/apps/package-and-deploy/code-signing-options> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/code-signing-cert/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/hsm-key-storage/> ;
    schema:description "2023年6月以降にCA/Browser Forumの要件に基づき新規発行される公的なOV/EV証明書は、秘密鍵をHSMまたはハードウェアトークンで保管することが必須になった。社内CA発行や既存のPFX証明書はこの要件の対象外。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/apps/package-and-deploy/code-signing-options> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/hsm-key-storage/> ;
    rdf:predicate ks:incompatibleWith ;
    rdf:object <https://comcomponent.com/knowledge/windows-runner/> ;
    schema:description "USBトークン型のハードウェア保管はGitHubホステッドランナーに物理的に挿せないため、そのままではCIでの完全自動署名ができない。CAのクラウドHSMオプションを使えばこの制約を回避できる。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/apps/package-and-deploy/code-signing-options> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/azure-artifact-signing/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/github-actions/> ;
    schema:description "Azure Artifact Signing(旧Trusted Signing)はGitHub Actions等との連携を前提に設計されたクラウド署名サービスだが、利用可能な地域が法人は米国・カナダ・EU・英国、個人は米国・カナダに限られ、日本の開発者は対象外である。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/apps/package-and-deploy/code-signing-options> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/github-actions-environment/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/signing-key-exposure-risk/> ;
    schema:description "署名用シークレットを承認者付きのGitHub Actions Environmentに置き、リリースワークフローだけが参照できるようにすることで、ワークフローを書き換えるだけで鍵を取り出されるリスクを軽減する。"@ja ;
    ks:evidence <https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/github-actions-secrets/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/signing-key-exposure-risk/> ;
    schema:description "署名鍵をリポジトリシークレットとして直接参照する構成のままだと、書き込み権限を持つ人がワークフローを書き換えてタグを1本pushするだけで鍵を取り出せてしまう。"@ja ;
    ks:evidence <https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/code-signing-cert/> ;
    rdf:predicate ks:configuredBy ;
    rdf:object <https://comcomponent.com/knowledge/github-actions-secrets/> ;
    schema:description "GitHub ActionsでCI/CDパイプラインを組む場合、PFX形式の秘密鍵はBase64化してGitHub Actionsのシークレットに格納し、ジョブ内でファイルとして復元して使う。"@ja ;
    ks:evidence <https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/signtool/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/code-signing-cert/> ;
    schema:description "signtoolはPFXファイルなどの秘密鍵と証明書を使って、実行ファイルやDLLにコード署名を行う。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/seccrypto/signtool> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/signtool/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/code-signing-timestamp/> ;
    schema:description "signtoolでの署名で/trオプションによりタイムスタンプサーバーを明示的に指定した場合、証明書の期限が切れた後も署名時点で有効だったことを検証できる状態を保てる。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/seccrypto/signtool> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/msix/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/code-signing-cert/> ;
    schema:description "Windowsは署名されていないMSIXパッケージのインストールを許可しないため、MSIX配布ではパッケージ署名が必須になる。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/msix/package/signing-package-overview> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/xcopy-distribution/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/github-actions/> ;
    schema:description "xcopy配布(zip)はdotnet publishの出力を圧縮するだけで完成するため、4つの配布形式のうちCI/CDへの組み込みが最も簡単である。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/devops/github-actions-overview> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/tag-driven-versioning/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/clickonce/> ;
    schema:description "ClickOnceの更新判定はデプロイ側のApplicationVersion/ApplicationRevisionで行われ、コマンドラインでの発行(msbuild /target:publish)ではリビジョンが自動加算されないため、タグ駆動のバージョン注入で値を明示的に渡す設計が本記事の推奨である。IDEからの発行ではリビジョンが自動加算されるため不要で、他の採番方式でも代替できる。"@ja ;
    ks:evidence <https://learn.microsoft.com/visualstudio/deployment/building-dotnet-clickonce-applications-from-the-command-line> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/desktop-app-cicd-pipeline/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/msi/> ;
    schema:description "MSIはWiX等のツールをCIからコマンドラインで呼び出すことで自動化できる配布形式である。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/msi/windows-installer-portal> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .
