ワンクリックで
build-and-release
Use when reproducing SafeguardDotNet CI/CD, version stamping, signing, packaging, or release publishing.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Use when reproducing SafeguardDotNet CI/CD, version stamping, signing, packaging, or release publishing.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Use when running tests, writing tests, investigating test failures, setting up a test environment against a live Safeguard appliance, or working with the PowerShell integration test framework. Covers live appliance workflow, PKCE vs ROG, running test suites, writing new suites, assertion functions, TOTP generation, and module-to-suite mapping.
Use when working with Safeguard A2A certificate auth, credential retrieval, brokering, or A2A event listeners.
Use when making standard Safeguard Web API calls with ISafeguardConnection and related SDK helpers.
Use when working on SDK internals, authentication mechanisms, connection classes, PKCE login flow, rSTS protocol details, event listeners, A2A integration, SPS integration, or exploring the Safeguard API via Swagger. Covers the entry point, auth strategy pattern, decorator pattern, rSTS step flow, and SignalR event architecture.
| name | build-and-release |
| description | Use when reproducing SafeguardDotNet CI/CD, version stamping, signing, packaging, or release publishing. |
Use this skill for Azure Pipelines changes, local CI reproduction, package version questions, or release troubleshooting. SafeguardDotNet has a split build: legacy .NET Framework projects are built with MSBuild first, then the modern SDK-style projects are built and packed with the dotnet CLI.
| File | Purpose |
|---|---|
build.yml | Top-level pipeline definition, triggers, and job selection |
pipeline-templates\global-variables.yml | Shared semantic version and tag/prerelease flags |
pipeline-templates\job-variables.yml | Solution paths and build configuration |
pipeline-templates\build-steps.yml | Shared restore/build/pack/artifact flow used by both jobs |
pipeline-templates\versionnumber.ps1 | Replaces placeholder versions and sets Azure Pipeline variables |
Directory.Build.props | Analyzer/code-style requirements enforced during build |
build.yml runs on:
main, master, and release-*v*main, master, and release-*It deliberately ignores documentation-only changes:
**/*.mdLICENSEdocs/.github/CODEOWNERSPRValidationRuns only when Build.Reason == PullRequest.
job-variables.ymlsignFiles: falsewindows-latestpipeline-templates\build-steps.ymlBuildAndPublishRuns for non-PR builds after merges and tags.
job-variables.ymlsignFiles: truewindows-latestsigntool.exebuild-steps.ymlbuild-steps.ymlversionnumber.ps1SafeguardDotNet.Framework.sln with NuGet.exeSafeguardDotNet\SafeguardDotNet.csproj with dotnet restoresigntool.exe pathSafeguardDotNet.Framework.sln with MSBuild10.0.xSafeguardDotNet.Core.sln with dotnet builddotnet packSafeguardDotNet.GuiLogin.nuspec with NuGetpipeline-templates\global-variables.yml currently sets:
semanticVersion: '8.2.3'
The pipeline also computes:
isTagBuild -> true when Build.SourceBranch starts with refs/tags/isPrerelease -> false for tag builds, true otherwiseThe repo keeps placeholder values in source control and stamps real versions in CI:
| File(s) | Package marker | Assembly marker |
|---|---|---|
SafeguardDotNet\SafeguardDotNet.csproj | 9999.9999.9999 | 9999.9999.9999.9999 |
SafeguardDotNet.BrowserLogin\SafeguardDotNet.BrowserLogin.csproj | 9999.9999.9999 | 9999.9999.9999.9999 |
SafeguardDotNet.PkceNoninteractiveLogin\SafeguardDotNet.PkceNoninteractiveLogin.csproj | 9999.9999.9999 | 9999.9999.9999.9999 |
SafeguardDotNet.GuiLogin\SafeguardDotNet.GuiLogin.nuspec | 9999.9999.9999 | n/a |
SafeguardDotNet.GuiLogin\Properties\AssemblyInfo.cs | n/a | 9999.9999.9999.9999 |
Do not hand-edit these markers for normal development.
versionnumber.ps1 rulesThe script computes:
BuildNumber = BuildId % 65534^v\d+\.\d+\.\d+$For tag builds:
v<tagVersion>.<BuildNumber>v8.2.3)For non-tag builds:
<semanticVersion>-pre<BuildNumber><semanticVersion>.<BuildNumber>dev/v<packageVersion>The script also exports Azure variables:
AssemblyVersionPackageVersionReleaseTagFor normal SDK work, this is the common local command:
dotnet build SafeguardDotNet.Core.sln /p:SignFiles=false
Use these commands when you need something nearer to CI, while still skipping cloud signing dependencies:
nuget restore SafeguardDotNet.Framework.sln
dotnet restore SafeguardDotNet\SafeguardDotNet.csproj
msbuild SafeguardDotNet.Framework.sln /p:Configuration=Release /p:SignFiles=false
dotnet build SafeguardDotNet.Core.sln --configuration Release /p:SignFiles=false
dotnet pack SafeguardDotNet\SafeguardDotNet.csproj --configuration Release --include-symbols -p:SymbolPackageFormat=snupkg --output .\artifacts --no-build
dotnet pack SafeguardDotNet.BrowserLogin\SafeguardDotNet.BrowserLogin.csproj --configuration Release --include-symbols -p:SymbolPackageFormat=snupkg --output .\artifacts --no-build
dotnet pack SafeguardDotNet.PkceNoninteractiveLogin\SafeguardDotNet.PkceNoninteractiveLogin.csproj --configuration Release --include-symbols -p:SymbolPackageFormat=snupkg --output .\artifacts --no-build
nuget pack SafeguardDotNet.GuiLogin\SafeguardDotNet.GuiLogin.nuspec -Properties Configuration=Release -Symbols -SymbolPackageFormat snupkg -OutputDirectory .\artifacts
Important local constraints:
/p:SignFiles=false locally unless you have the exact signing setup.SafeguardDotNet.Framework.sln.Directory.Build.props enforces StyleCop and Sonar analyzers, so warning-free
builds are expected.Avoid trying to mimic these pipeline-only steps on a normal workstation unless you already own the required access:
Signing is assembly-level, not package-level.
Cert:\CurrentUser\My.signtool.exe because the eSignerCKA PKCS#11 DLL is 32-bit only.SignAssemblies target that signs $(TargetDir)*.dll
when SignFiles=true.build-steps.yml verifies every built OneIdentity.SafeguardDotNet*.dll signature.There is an explicit pipeline note that NuGet package signing is not performed:
Release builds publish four packages plus symbol packages:
| Artifact | Packaging command |
|---|---|
OneIdentity.SafeguardDotNet | dotnet pack SafeguardDotNet\SafeguardDotNet.csproj |
OneIdentity.SafeguardDotNet.BrowserLogin | dotnet pack SafeguardDotNet.BrowserLogin\SafeguardDotNet.BrowserLogin.csproj |
OneIdentity.SafeguardDotNet.PkceNoninteractiveLogin | dotnet pack SafeguardDotNet.PkceNoninteractiveLogin\SafeguardDotNet.PkceNoninteractiveLogin.csproj |
OneIdentity.SafeguardDotNet.GuiLogin | nuget pack SafeguardDotNet.GuiLogin\SafeguardDotNet.GuiLogin.nuspec |
| symbol packages | --include-symbols -p:SymbolPackageFormat=snupkg or -Symbols -SymbolPackageFormat snupkg |
After packing:
PublishBuildArtifacts@1 uploads the artifact staging directory as SafeguardDotNetNuGetCommand@2 pushes *.nupkg to https://api.nuget.org/v3/index.jsonGitHubRelease@1 creates a release in OneIdentity/SafeguardDotNet*.nupkg and *.snupkgThe release path depends on external connections and secrets that are unavailable in normal local development.
| Connection / subscription | Used for | Secrets / resource |
|---|---|---|
OneIdentity.Infrastructure.SPPCodeSigning | Access the signing vault | SPPCodeSigning Key Vault |
SafeguardOpenSource | Access release publishing secrets | SafeguardBuildSecrets Key Vault |
| Secret | Purpose |
|---|---|
SPPCodeSigning-Password | SSL.com eSignerCKA account password |
SPPCodeSigning-TotpPrivateKey | SSL.com eSignerCKA TOTP seed/private key |
NugetOrgApiKey | NuGet.org push credential |
PangaeaBuild-GitHubssl.oid.safeguardpp@groups.quest.comwindows-latest image with NuGet, MSBuild, and dotnet toolingsignFiles=true, investigate the release job,
not the default local build path.