원클릭으로
build-and-release
Use when working on Azure Pipelines builds, version stamping, signing, publishing, or release artifacts for safeguard-ps.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Use when working on Azure Pipelines builds, version stamping, signing, publishing, or release artifacts for safeguard-ps.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
Use when making Safeguard API calls, working with Invoke-SafeguardMethod, using filters or query parameters, exploring the API via Swagger, or troubleshooting API errors. Covers REST conventions, cmdlet preference, query/filter syntax, and common pitfalls.
Use when setting up test objects on a Safeguard appliance for integration testing. Covers the creation sequence for users, assets, accounts, certificates, A2A registrations, and cleanup.
Use when working on safeguard-ps A2A registrations, certificate authentication, credential retrieval, brokering, or A2A event listeners.
Use when working on module internals, understanding the module manifest, SignalR event listeners, dynamic groups, custom platform scripts, or tracing how feature modules interact with the root module and global state.
Use when creating a new PowerShell feature module (.psm1), adding new exported cmdlets, or extending the module manifest. Includes step-by-step checklists, file templates, and manifest update procedures.
Use when running tests, writing tests, investigating test failures, or setting up a test environment against a live Safeguard appliance. Covers the integration test framework, test runner commands, suite structure, assertion patterns, and module-to-suite mapping.
SOC 직업 분류 기준
| name | build-and-release |
| description | Use when working on Azure Pipelines builds, version stamping, signing, publishing, or release artifacts for safeguard-ps. |
Use this skill when you need to reproduce CI locally, reason about version numbers, update Azure Pipelines, or troubleshoot how safeguard-ps is signed and published.
The release flow is driven by Azure Pipelines, not GitHub Actions.
build.yml -- only pipeline entry pointpipeline-templates/global-variables.yml -- shared variables such as the base semantic version and publish flagspipeline-templates/build-windows-steps.yml -- Windows validation and module packaging stepspipeline-templates/build-linux-steps.yml -- Linux validation plus Docker image build stepspipeline-templates/versionnumber.ps1 -- Windows version variable derivationpipeline-templates/versionnumber.sh -- Linux version variable derivationpipeline-templates/install-forpipeline.ps1 -- manifest stamping, local install into PSModulePath, catalog creation, and strict lintingbuild.yml runs for:
main, master, and release-*v*main, master, and release-*It skips docs-only changes under these path exclusions:
**/*.mdLICENSEsamples.githubThere are four top-level jobs, no YAML stages: block:
PRValidation_Windows
Build.Reason == PullRequestwindows-latestbuild-windows-steps.ymlPRValidation_Linux
Build.Reason == PullRequestubuntu-latestbuild-linux-steps.ymlBuildAndPublish_Windows
windows-latestbuild-windows-steps.ymlBuildAndPublish_Linux
ubuntu-latestbuild-linux-steps.ymlshouldPublishDocker is truebuild-windows-steps.yml:
VersionString, PrereleaseSuffix, and ReleaseTag with versionnumber.ps1PSModulePathinstall-forpipeline.ps1 <ModuleDir> <VersionString> <IsPrerelease> <PrereleaseSuffix>safeguard-ps to prove the staged module loadssrc\*.ps1, src\*.psm1, and src\*.psd1 file under Windows PowerShell 5.1build-linux-steps.yml:
versionnumber.shPSModulePathinstall-forpipeline.ps1 stamping/install/lint flow under PowerShellubuntu, azurelinux, and alpineoneidentity/safeguard-ps:latestThe base released version lives in pipeline-templates/global-variables.yml:
variables:
- name: version
value: "8.4.3"
The source manifest mirrors that base version with a 99999 build placeholder:
ModuleVersion = '8.4.3.99999'
CI replaces the 99999 portion (and adds the prerelease suffix) at build time -- do not hand-edit 99999 for normal development work. The <major>.<minor>.<patch> portion is hand-bumped between release cycles (see "Bumping the version" below).
After cutting a release tag (e.g. v8.4.2), main keeps producing prereleases against that same base version (dev/v8.4.2-preNNNNNN) until the base is bumped. To start a new cycle (e.g. moving to 8.4.3 prereleases so a future v8.4.3 tag can ship):
pipeline-templates/global-variables.yml -- update the version value (e.g. "8.4.2" -> "8.4.3").src/safeguard-ps.psd1 -- update ModuleVersion to match (e.g. '8.4.2.99999' -> '8.4.3.99999'). Keep the .99999 placeholder.Bump version to <new> for next prerelease cycle.dev/v<new>-preNNNNNN prereleases. When ready to ship, push a v<new> tag and the tag build will publish a non-prerelease release.The two files must stay in sync -- install-forpipeline.ps1 substitutes <major>.<minor>.99999 based on the pipeline version variable, so a mismatched manifest will fail stamping.
Tag builds are detected when Build.SourceBranch starts with refs/tags/.
versionnumber.ps1 and versionnumber.sh both require tags to match:
v<major>.<minor>.<patch>
For a valid tag build:
VersionString becomes the tag without the leading vPrereleaseSuffix becomes emptyReleaseTag stays equal to the Git tag, for example v8.3.0isPrerelease is falseshouldPublishDocker is trueFor branch and PR builds:
VersionString stays at the base version from global-variables.ymlBuildNumber is computed as Build.BuildId - 250000PrereleaseSuffix becomes pre<BuildNumber>ReleaseTag becomes dev/v<version>-pre<BuildNumber>isPrerelease is trueshouldPublishDocker is falseExample from the scripts:
version = 8.4.3
Build.BuildId = 367659
BuildNumber = 117659
PrereleaseSuffix = pre117659
ReleaseTag = dev/v8.4.3-pre117659
install-forpipeline.ps1 converts the source manifest to the build version by:
<major>.<minor>.99999 with VersionStringPrerelease = 'pre' with the computed prerelease suffix on non-tag buildssrc\safeguard-ps.cat on Windows with New-FileCatalogPSModulePath./Invoke-PsLint.ps1 -StrictThe repo has no compile step; the build is a staged module install from source.
Remove-Module safeguard-ps -ErrorAction SilentlyContinue
./cleanup-local.ps1
./install-local.ps1
Import-Module safeguard-ps
Get-SafeguardCommand Get Asset
If you want local linting during install:
./install-local.ps1 -WithLinting
./Invoke-PsLint.ps1 -Strict
To mimic what CI does on Windows:
$moduleDir = (($env:PSModulePath -split ';') | Where-Object { Test-Path $_ })[0]
./pipeline-templates/versionnumber.ps1 8.3.0 102745 feature-branch False
./pipeline-templates/install-forpipeline.ps1 $moduleDir 8.3.0 $true pre245
Import-Module safeguard-ps -Force
To mimic the Linux template logic from PowerShell or pwsh:
$moduleDir = (($env:PSModulePath.Split([System.IO.Path]::PathSeparator)) | Where-Object { Test-Path $_ })[0]
./pipeline-templates/install-forpipeline.ps1 $moduleDir 8.3.0 $true pre245
To reproduce the Docker portion locally:
bash ./docker/build-docker.sh ubuntu 8.3.0
bash ./docker/build-docker.sh azurelinux 8.3.0
bash ./docker/build-docker.sh alpine 8.3.0
The Windows pipeline explicitly validates:
src files under Windows PowerShell 5.1If you touch src/, keep those checks mentally in scope even for seemingly small syntax changes.
The Windows publish job retrieves PowerShellGalleryApiKey and runs:
Publish-Module -Name safeguard-ps -NuGetApiKey "$(PowerShellGalleryApiKey)" -Verbose -SkipAutomaticTags -Force
The published artifact is the staged module that install-forpipeline.ps1 installed into the agent's module path.
The module is signed before publish by:
eSignerCKACert:\CurrentUser\Mysafeguard-ps.catsigntool.exe under C:\Program Files (x86)\Windows Kitshttp://ts.ssl.comGet-AuthenticodeSignatureThis pipeline signs the catalog file, not every source file individually.
After publish, the Windows job zips the installed module directory into:
safeguard-ps-$(VersionString).zip
Then GitHubRelease@1 creates a release in OneIdentity/safeguard-ps using $(ReleaseTag) and uploads the zip as the release asset.
The Linux publish job pushes:
oneidentity/safeguard-ps:$(VersionString)-ubuntuoneidentity/safeguard-ps:$(VersionString)-azurelinuxoneidentity/safeguard-ps:$(VersionString)-alpineoneidentity/safeguard-ps:latestDocker pushes only happen when shouldPublishDocker is true, which today means tag builds only.
build.yml depends on these Azure DevOps connections:
SafeguardOpenSource
SafeguardBuildSecretsPowerShellGalleryApiKey, DockerHubAccessToken, DockerHubPasswordOneIdentity.Infrastructure.SPPCodeSigning
SPPCodeSigningSPPCodeSigning-Password, SPPCodeSigning-TotpPrivateKeyPangaeaBuild-GitHubdocker loginssl.oid.safeguardpp@groups.quest.cominstall-forpipeline.ps1 always runs strict linting; pipeline failures there are usually real release blockers.eSignerCKATool.exe load populated Cert:\CurrentUser\My.global-variables.yml, the incoming Git tag, and the VersionString/PrereleaseSuffix variables emitted by the versionnumber scripts.