如何从 Azure 工件中的 PR 安全地发布到 NuGet
How to Securely Publish to NuGet from PR's In Azure Artifacts
我在 GitHub repository 中使用以下 yaml 在每次提交时将 NuGet 包发布到 Azure Artifacts 和 GitHub 包,并在我使用 [=33] 时发布到官方 NuGet 存储库=]标签。
- stage: Deploy
jobs:
- deployment: AzureArtefacts
displayName: 'Azure Artefacts'
pool:
vmImage: windows-latest
environment: 'Azure Artefacts'
strategy:
runOnce:
deploy:
steps:
- task: NuGetToolInstaller@1
displayName: 'NuGet Install'
- task: NuGetAuthenticate@0
displayName: 'NuGet Authenticate'
- script: nuget push $(Agent.BuildDirectory)\Windows\*.nupkg -Source https://pkgs.dev.azure.com/serilog-exceptions/_packaging/serilog-exceptions/nuget/v3/index.json -ApiKey AzureArtifacts -SkipDuplicate
displayName: 'NuGet Push'
failOnStderr: true
- deployment: GitHub
pool:
vmImage: windows-latest
environment: 'GitHub'
strategy:
runOnce:
deploy:
steps:
- task: NuGetToolInstaller@1
displayName: 'NuGet Install'
- script: nuget source Add -Name GitHub -Source https://nuget.pkg.github.com/RehanSaeed/index.json -UserName $(GitHubUserName) -Password $(GitHubPersonalAccessToken)
displayName: 'NuGet Add Source'
failOnStderr: true
- script: nuget push $(Agent.BuildDirectory)\Windows\*.nupkg -Source GitHub -SkipDuplicate
displayName: 'NuGet Push'
failOnStderr: true
- deployment: NuGet
pool:
vmImage: windows-latest
environment: 'NuGet'
condition: startsWith(variables['Build.sourceBranch'], 'refs/tags/')
strategy:
runOnce:
deploy:
steps:
- task: NuGetToolInstaller@1
displayName: 'Install NuGet'
- script: nuget push $(Agent.BuildDirectory)\Windows\*.nupkg -Source https://api.nuget.org/v3/index.json -ApiKey $(NuGetApiKey) -SkipDuplicate
displayName: 'NuGet Push'
failOnStderr: true
这在我签入时工作正常,但当有人创建 PR 时,上述发布步骤失败,因为:
- Azure 工件 - 用户没有权限。
- GitHub - 用户无权使用秘密变量
GitHubUserName
和 GitHubPersonalAccessToken
.
- NuGet - 构建不是来自 Git 标记的 运行,因此此步骤不会 运行。
是否可以安全地 运行 Azure Artifacts 和 GitHub 从 PR 发布步骤?特别是,我不希望有人更改 azure-pipelines.yml
或我的 Cake build build.cake
文件来窃取我的秘密变量或发布他们自己的包。
如果这不可能,我想我必须从 PR 中跳过这些步骤。我该怎么做?
If this is not possible?
恐怕这是不可能做到的。由于用户没有权限,秘密变量GitHubUserName
和GitHubPersonalAccessToken
。如果你不想泄露你的秘密变量,这是这个问题的关键,无法绕过。
I guess I have to skip these steps from PR's. How can I do this?
答案是肯定的。
您可以使用表达式计算内置变量 Build.Reason 来确定任务是否正在执行构建作为拉取请求分支策略的一部分,例如:
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
那么当 PullRequest
触发构建时,这些任务将被跳过。
查看文档 Conditions 了解更多详细信息。
希望对您有所帮助。
我在 GitHub repository 中使用以下 yaml 在每次提交时将 NuGet 包发布到 Azure Artifacts 和 GitHub 包,并在我使用 [=33] 时发布到官方 NuGet 存储库=]标签。
- stage: Deploy
jobs:
- deployment: AzureArtefacts
displayName: 'Azure Artefacts'
pool:
vmImage: windows-latest
environment: 'Azure Artefacts'
strategy:
runOnce:
deploy:
steps:
- task: NuGetToolInstaller@1
displayName: 'NuGet Install'
- task: NuGetAuthenticate@0
displayName: 'NuGet Authenticate'
- script: nuget push $(Agent.BuildDirectory)\Windows\*.nupkg -Source https://pkgs.dev.azure.com/serilog-exceptions/_packaging/serilog-exceptions/nuget/v3/index.json -ApiKey AzureArtifacts -SkipDuplicate
displayName: 'NuGet Push'
failOnStderr: true
- deployment: GitHub
pool:
vmImage: windows-latest
environment: 'GitHub'
strategy:
runOnce:
deploy:
steps:
- task: NuGetToolInstaller@1
displayName: 'NuGet Install'
- script: nuget source Add -Name GitHub -Source https://nuget.pkg.github.com/RehanSaeed/index.json -UserName $(GitHubUserName) -Password $(GitHubPersonalAccessToken)
displayName: 'NuGet Add Source'
failOnStderr: true
- script: nuget push $(Agent.BuildDirectory)\Windows\*.nupkg -Source GitHub -SkipDuplicate
displayName: 'NuGet Push'
failOnStderr: true
- deployment: NuGet
pool:
vmImage: windows-latest
environment: 'NuGet'
condition: startsWith(variables['Build.sourceBranch'], 'refs/tags/')
strategy:
runOnce:
deploy:
steps:
- task: NuGetToolInstaller@1
displayName: 'Install NuGet'
- script: nuget push $(Agent.BuildDirectory)\Windows\*.nupkg -Source https://api.nuget.org/v3/index.json -ApiKey $(NuGetApiKey) -SkipDuplicate
displayName: 'NuGet Push'
failOnStderr: true
这在我签入时工作正常,但当有人创建 PR 时,上述发布步骤失败,因为:
- Azure 工件 - 用户没有权限。
- GitHub - 用户无权使用秘密变量
GitHubUserName
和GitHubPersonalAccessToken
. - NuGet - 构建不是来自 Git 标记的 运行,因此此步骤不会 运行。
是否可以安全地 运行 Azure Artifacts 和 GitHub 从 PR 发布步骤?特别是,我不希望有人更改 azure-pipelines.yml
或我的 Cake build build.cake
文件来窃取我的秘密变量或发布他们自己的包。
如果这不可能,我想我必须从 PR 中跳过这些步骤。我该怎么做?
If this is not possible?
恐怕这是不可能做到的。由于用户没有权限,秘密变量GitHubUserName
和GitHubPersonalAccessToken
。如果你不想泄露你的秘密变量,这是这个问题的关键,无法绕过。
I guess I have to skip these steps from PR's. How can I do this?
答案是肯定的。
您可以使用表达式计算内置变量 Build.Reason 来确定任务是否正在执行构建作为拉取请求分支策略的一部分,例如:
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
那么当 PullRequest
触发构建时,这些任务将被跳过。
查看文档 Conditions 了解更多详细信息。
希望对您有所帮助。